2016-08-02 10 views
0

Ich möchte a.txt von a.tar.gz im Verzeichnis produzieren. Ich habe versucht, das folgende Ziel in Makefile zu schreiben:makefile Ziel, das nur einmal ausgeführt werden muss

a.txt: a.tar.gz 
    tar xvf a.tar.gz 

Dies funktioniert, aber nachdem es einmal läuft a.tar.gz unkomprimiert und nicht mehr existiert. Und nachfolgende make schlägt fehl. Wie kann ich ein Ziel schreiben, das überprüft, ob a.txt nicht existiert, und wenn ja, führen Sie tar, aber sonst nichts tun?

+1

'tar' löscht normalerweise weder die TAR-Datei, noch erstellt sie eine dekomprimierte Version. Gibt es keine andere Option oder einen anderen Befehl, den Sie ausführen? – rici

+0

Auch ohne das 'z'-Flag kann' tar' die Datei nicht korrekt entpacken (es sei denn, die Dateinamenerweiterung ist falsch, und es ist nicht wirklich eine '.gz' Datei). – tripleee

+0

@tripleee: gnu tar kann Komprimierungsformate automatisch erkennen, sodass die z (und andere) Flags normalerweise nicht benötigt werden. – rici

Antwort

0

wildcard wird nur etwas erweitern, wenn es mindestens eine Datei finden:

a.txt: $(wildcard a.tar.gz) 
    tar xvmf $< 

Hinzufügen der m Flagge unnötige Remakes wird vermieden.

Die Regel schlägt fehl, wenn keine Datei existiert, aber ohne zu wissen, was genau Sie vorhaben, ist es schwierig, eine umfassende Lösung bereitzustellen.

0

Der 'Test' oder '[' und ']' können dies tun.

a.txt: 
    if [ -e a.tar.gz ]; then \ 
    tar xvf a.tar.gz \ 
    fi 
+0

Dies entfernt die Abhängigkeit von Make's Ansicht, die möglicherweise eine schlechte Sache scheint. – tripleee

+0

Er schrieb "überprüft, ob a.txt nicht existiert, und wenn ja, tar, aber sonst nichts tun?" Es ist also keine * Abhängigkeit * an sich. –

Verwandte Themen