Ich habe eine Regel, die ein Verzeichnis erstellt
%Vor%Aber nach dem ersten Mal, dass das Verzeichnis generiert wurde, erhalte ich folgende Ausgabe:
%Vor%Gibt es eine Möglichkeit, die Regel nur auszuführen, wenn das Verzeichnis nicht existiert, oder die Ausgabe zu unterdrücken, wenn das Verzeichnis bereits existiert?
Die traditionelle Methode zur Erstellung von Verzeichnissen besteht darin, eine Stempeldatei zu verwenden, von der abhängig ist, und das Verzeichnis als Nebeneffekt zu erstellen. Entfernen Sie die Stempeldatei, wenn Sie distclean
oder was auch immer Ihr "wirklich sauberes" Ziel ist:
Der Grund dafür ist wie folgt: Immer wenn eine Datei in bin
erstellt / entfernt wird, wird die mtime des enthaltenden Verzeichnisses aktualisiert. Wenn ein Ziel von bin
abhängig ist, wird das nächste Mal, wenn make
ausgeführt wird, Dateien neu erstellen, die es nicht benötigt.
Eine andere Möglichkeit, die Ausgabe make: error ... (ignored)
zu unterdrücken, besteht darin, || true
an einen Befehl anzuhängen, der fehlschlagen könnte. Beispiel mit grep, das nach Fehlern in einer LaTeX-Protokolldatei sucht:
Ohne die || true
, meckern Sie, wenn grep keine Übereinstimmung findet.
Dies funktioniert für alle Befehle, nicht nur für mkdir; Deshalb habe ich diese Antwort hinzugefügt.
Der Fehler wird bereits von der führenden ' -
' in der Befehlszeile ignoriert. Wenn Sie die Fehlermeldungen von mkdir
wirklich verlieren möchten, verwenden Sie die I / O-Umleitung:
Sie erhalten jedoch immer noch die Warnung 'ignored' von make
. Daher ist es möglicherweise besser, die Option mkdir
zu verwenden, die nicht zu einem Fehler führt, wenn das Ziel bereits vorhanden ist. Option co_de%:
Die Option -p
erzeugt tatsächlich alle Verzeichnisse, die auf den angegebenen Pfaden fehlen, so dass sie eine Anzahl von Verzeichnissen in einem Aufruf erzeugen kann, aber ein Nebeneffekt ist, dass sie keinen Fehler für bereits existierende Verzeichnisse erzeugt . Dies setzt eine POSIX-ische Implementierung von -p
voraus; ältere Maschinen unterstützen es möglicherweise nicht (obwohl es seit langem Standard ist).
Nun, ich endete mit diesem Konstrukt, vielleicht wird jemand es nützlich finden oder kann es kommentieren:
%Vor%Ihre Regel sollte nicht ausgeführt werden, es sei denn, ihr Ziel existiert nicht oder ist aufgrund ihrer Abhängigkeiten veraltet. Mit anderen Worten, Sie sollten nie auf diesen Fehler stoßen.
[Beispiel hinzugefügt]
%Vor%Hängt Ihr Ordner von irgendetwas ab? Ist Ihr Ordner ein falsches Ziel?
Make nimmt an, dass das erste Ziel das Standardziel ist. Wenn das Ihr komplettes Makefile ist, dann muss es immer versuchen, das Standardziel, das Bin, neu zu erstellen. Fügen Sie die folgenden Zeilen an den Anfang Ihres Makefile ein:
%Vor%