2017-06-10 7 views
2

Ich möchte nur GNU make verwenden, um einige Dateien zu komprimieren. Also schrieb ich das Makefile wie folgt:Stop GNU make von kompilieren standardmäßig

lib.tar.lzma: $(shell find ~/lib -name "*") 
    rm -f lib.tar.lzma 
    tar -cavf lib.tar.lzma -C ~/ lib/ 

Doch nachdem ich laufen zu lassen, wird es automatisch die C++ Quellcode in diesem Verzeichnis erstellen.

Wie kann ich aufhören, sie zu kompilieren? Ich möchte sie nur komprimieren.

Update:

Ich habe folgende Fehlermeldung:

<builtin>: recipe for target '/home/xxx/lib/app' failed 

Es scheint ein Einbau-Rezept.

Antwort

2

(Wir wissen nicht, Ihre gesamteMakefile und Ihr voll Dateibaum, so ist dies nur eine Vermutung, ich nehme an, dass Sie uns ein Fragment gezeigt haben Ihre viel größer Makefile)

However, after I run make, it automatically compile the c++ source code in that directory.

Dies passiert wahrscheinlich, weil Ihre $(shell find ~/lib -name "*") zu etwas erweitert wird, das Ihre Objektdateien enthält. Da sie in Ihren Abhängigkeiten sind, wird ihre Quelldatei neu kompiliert, wenn sie neuer ist. BTW möchten Sie vielleicht stattdessen $(shell cd .. ; find lib -name "*") verwenden oder wenn lib kein Unterverzeichnis hat sogar $(wildcard ../lib/*)

Sie wahrscheinlich brauchen keine Abhängigkeit für das lib.tar.lzma Ziel, so einfach haben:

lib.tar.lzma: 
    rm -f lib.tar.lzma 
    tar -cavf lib.tar.lzma -C ~/ lib/ 

BTW, dass -C ~/ vielleicht sollte -C $$HOME seit make verwenden /bin/sh Befehle ausführen, und dass POSIX-Shell nicht über ~ wissen; vielleicht könnte ein -C .. besser ...

Vielleicht könnten Sie einige Shell-Skript schreiben make-backup.sh ein gescheiter tar zu tun, und Sie würden dann Code

lib.tar.lzma: make-backup.sh 
     ./make-backup.sh [email protected] 

Aber vielleicht Sie Abhängigkeiten tun (zB wenn Sie einige generierte Dateien archivieren müssen). Dann müssen Sie sie explizit und weise auflisten (Sie wollen sicher nicht auf alle Dateien angewiesen sein; vielleicht nur auf die Quelldateien). Außerdem müssen Sie möglicherweise keine Objektdateien archivieren *.o, wenn Sie einige (aber YMMV) haben.

Ich empfehle die Verwendung von make --trace oder remake-x, um Ihr Makefile zu debuggen.

BTW, mit einem Makefilenur für ein Backup ist nutzlos; schreibe stattdessen ein Shell-Skript.

Ich empfehle auch dringend einige Versionskontrollsystem (wie git) zu verwenden, wenn Sie keine verwenden. Beachten Sie, dass git einen Unterbefehl archive hat, der ein clevereres Backup sein könnte.

+0

Vielen Dank für Ihre Antwort. Eigentlich muss ich Abhängigkeiten haben, um das Archiv zu aktualisieren. BTW, ich habe den folgenden Fehler: : Rezept für Ziel '/ home/xxx/lib/app' fehlgeschlagen –

+0

Eigentlich gibt es implizite Regeln, und ich sollte eine Zeile .SUFFIXES hinzufügen, um sie zu deaktivieren. –