Ich muss ein Verzeichnis in meinem Makefile generieren und möchte nicht immer wieder den Fehler "Verzeichnis existiert bereits" erhalten, obwohl ich ihn leicht ignorieren kann.
Ich benutze hauptsächlich mingw / msys, möchte aber etwas, das auch für andere Shells / Systeme funktioniert.
Ich habe es versucht, aber es hat nicht funktioniert, irgendwelche Ideen?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
-p
funktioniert nicht unter Windows, was vermutlich die Frage ist. Ich bin mir nicht sicher, wie dies jemals akzeptiert wurde.make -p
Unix oder Linux?Wenn Sie sich die offizielle Make-Dokumentation ansehen, ist hier ein guter Weg, dies zu tun:
Sie sollten hier die Verwendung des | sehen Rohrbetreiber, der nur eine Auftragsvoraussetzung definiert. Dies bedeutet, dass das
$(OBJDIR)
Ziel vorhanden sein sollte (anstatt neuer ), um das aktuelle Ziel zu erstellen.Beachten Sie, dass ich verwendet habe
mkdir -p
. Das-p
Flag wurde im Vergleich zum Beispiel der Dokumente hinzugefügt. Weitere Antworten finden Sie in anderen Antworten.quelle
$(OBJDIR)
Ziel sollte existieren " . Überprüfen Sie das Vorhandensein von Dateien (und Zeitstempel), um zu entscheiden, ob das Ziel erstellt werden muss. Daher hier, wenn$(OBJDIR)
nicht vorhanden ist wird es sie bauen, so dass es existiert , um das aktuelle Ziel zu bauen$(OBJS)
, die innerhalb erstellt werden.Sie können den Testbefehl verwenden:
quelle
make -j
) aufgrund einer Race-Bedingung zwischen dem Testen des Verzeichnisses auf Existenz und dem Erstellen des Verzeichnisses beschädigt werden kann. Ein Job kann testen, ob er nicht vorhanden ist, aber bevor er erstellt wird, erstellt ein anderer Job das Verzeichnis. Wenn der erste versucht, es zu schaffen, schlägt dies fehl, da das Verzeichnis bereits vorhanden ist. Die beste Lösung in diesem Fall besteht darin, nur die in der Antwort von @ TeKa genannten Bestellvoraussetzungen zu verwenden (dies sollte die akzeptierte Antwort sein).Hier ist ein Trick, den ich mit GNU make zum Erstellen von Compiler-Ausgabeverzeichnissen verwende. Definieren Sie zuerst diese Regel:
Machen Sie dann alle Dateien, die in das Verzeichnis verschoben werden, von der D-Datei in diesem Verzeichnis abhängig:
Beachten Sie die Verwendung von $ <anstelle von $ ^.
Verhindern Sie schließlich, dass die .d-Dateien automatisch entfernt werden:
Das Überspringen der D-Datei und abhängig vom Verzeichnis funktioniert nicht, da die Verzeichnisänderungszeit jedes Mal aktualisiert wird, wenn eine Datei in dieses Verzeichnis geschrieben wird, was bei jedem Aufruf von make eine Neuerstellung erzwingen würde.
quelle
Wenn es für Sie kein Problem ist, das Verzeichnis bereits zu haben, können Sie stderr einfach für diesen Befehl umleiten und die Fehlermeldung entfernen:
quelle
In Ihrem Makefile:
quelle
Unter Windows
Unter Unix | Linux
quelle
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
quelle
Das funktioniert auch für mehrere Verzeichnisse, z.
Das Hinzufügen
$(OBJDIR)
als erstes Ziel funktioniert gut.quelle
Es funktioniert unter mingw32 / msys / cygwin / linux
quelle
Wenn Sie den Rückkehrcode explizit ignorieren und den Fehlerstrom ausgeben, ignoriert Ihr make den Fehler, wenn er auftritt:
Dies sollte keine Renngefahr in einer parallelen Marke verursachen - aber ich habe es nicht getestet, um sicherzugehen.
quelle
Ein bisschen einfacher als Lars 'Antwort:
und generische Regel:
Keine Touch-Dateien zum Aufräumen oder Erstellen .PRECIOUS :-)
Wenn Sie einen weiteren kleinen generischen Gmake-Trick sehen möchten oder wenn Sie an nicht rekursivem Make mit minimalem Gerüst interessiert sind, sollten Sie sich zwei weitere billige Gmake-Tricks und die anderen Make-bezogenen Beiträge in diesem Blog ansehen.
quelle