2014-02-22 3 views
7

ich zu vermeiden hat ein Makefile, die zur Reinigung .o Dateien und ausführbaren Dateien eines .PHONY sauber Ziel definiert, das Ziel wie folgt aussieht:Wie „Keine solche Datei oder das Verzeichnis“ Fehler bei make clean` Makefile-Target

... 
.PHONY : clean 
clean: 
    rm $(addprefix $(vq_DIR),$(vq_OBJS)) \ 
     $(addprefix $(vq_DIR),vq) \ 
     $(addprefix $(covq_DIR),$(covq_OBJS)) \ 
     $(addprefix $(covq_DIR),covq) \ 
     $(addprefix $(covq_2_DIR),$(covq_2_OBJS)) \ 
     $(addprefix $(covq_2_DIR),covq_2) \ 
     $(addprefix $(covq_2_DIR),$(test_OBJS)) \ 
     $(addprefix $(covq_2_DIR),test) 

Alles funktioniert, wie es sollte, aber wenn einige dieser Dateien nicht existieren, löst rm einen Fehler (keine solche Datei oder Verzeichnis), und die Ausgabe sagt, dass das Makefile Ziel fehlgeschlagen ist, wenn es eindeutig getan hat, was ich wollte.

Gibt es eine gute Möglichkeit, im Grunde die rm Befehl zu "entfernen Sie diese Dateien, wenn sie existieren, und nicht beschweren, wenn sie nicht"? Ich habe die Manpage für rm gesucht und keine solche Markierung gefunden.

Edit: Ich eigentlich nicht die Beschreibung der -f Flagge in der Manual-Page bemerkte, ist dies die Lösung ist.

Antwort

15

Verwendung rm -f (oder noch besser $(RM), zur Verfügung gestellt von Einbau-make Regeln, die herausgefunden werden können make -p verwendet wird) anstelle von rm in Ihrer clean Regel.

+0

Danke: Glücklicherweise kann dieses Problem, indem ein Minuszeichen vor dem Befehl, dessen Status ignoriert leicht genug gelöst werden soll! Ich muss diese Option tatsächlich überflogen haben. Die Manpage sagt genau, was ich brauche, d. H. "Nicht existierende Dateien und Argumente ignorieren, niemals auffordern" – jameh

+1

Noch besser: benutze '$ (RM)', was automatisch von GNU Makefile definiert wird. – thiagowfx

4

rm -f

wird FORCE und nicht ausgegeben jeder Fehler

0

Ich habe mit rm aufgegeben. Der folgende Befehl löscht Dateien und Verzeichnisse.

find . -delete 

nur Dateien oder nur dirs zu entfernen, gibt es die Option Typ:

# remove only files 
find . -type f -delete 


# remove only dirs 
find . -type d -delete 

Eigentlich habe ich ein kleines Skript erstellen haben (auf der Grundlage dieses Snippet) genannt Bombe, die ohne Dateien entfernt beschweren: https://github.com/lingtalfi/bomb

2

Wenn Ziele ausfallen

Wenn ein Ziel ausgeführt wird, gibt es eine Statistik uns basierend darauf, ob es war erfolgreich - wenn ein Ziel fehlschlägt, dann wird make keine Ziele ausführen, die davon abhängen. Zum Beispiel, im obigen Beispiel, wenn "sauber" fehlschlägt, dann wird Wiederaufbau das "Build" -Ziel nicht ausführen. Leider ist dies passieren könnte, wenn es keine Core-Datei zu entfernen ist.

clean: 
     -rm -f *.o core 

~ http://www.cprogramming.com/tutorial/makefiles.html

+0

Es wird nicht ignoriert, wenn Sie 'make clean' ausführen. Es scheint mir, dass es nur ignoriert wird, wenn dieses Ziel eine Abhängigkeit von einem anderen Ziel war. –

Verwandte Themen