123 Stimmen

wie verhindert man den "directory already exists error" in einem makefile, wenn man mkdir benutzt

Ich muss ein Verzeichnis in meinem Makefile erzeugen und möchte nicht immer wieder die Fehlermeldung "Verzeichnis existiert bereits" erhalten, obwohl ich sie leicht ignorieren kann.

Ich benutze hauptsächlich mingw/msys, würde aber gerne etwas haben, das auch mit anderen Shells/Systemen funktioniert.

Ich habe es versucht, aber es hat nicht funktioniert. Irgendwelche Ideen?

ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif

129voto

ofavre Punkte 3878

Blick auf die offizielle Dokumentation der Marke ist dies ein guter Weg, dies zu tun:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir -p $(OBJDIR)

Sie sollten hier die Verwendung des Pipe-Operators | sehen, der nur die Voraussetzung für eine Bestellung definiert. Das bedeutet, dass die $(OBJDIR) Ziel sollte vorhanden sein (anstelle von neuere ), um das aktuelle Ziel zu erstellen.

Beachten Sie, dass ich mkdir -p . Die -p Flagge wurde im Vergleich zum Beispiel in der Dokumentation hinzugefügt. Siehe andere Antworten für eine andere Alternative.

127voto

tchen Punkte 2121

Unter UNIX verwenden Sie einfach dies:

mkdir -p $(OBJDIR)

Die Option -p für mkdir verhindert die Fehlermeldung, wenn das Verzeichnis existiert.

72voto

skymt Punkte 3109

Sie können den Befehl test verwenden:

test -d $(OBJDIR) || mkdir $(OBJDIR)

19voto

Northern Stream Punkte 371

Hier ist ein Trick, den ich mit GNU make verwende, um Compiler-Ausgabeverzeichnisse zu erstellen. Definieren Sie zunächst diese Regel:

  %/.d:
          mkdir -p $(@D)
          touch $@

Dann machen Sie alle Dateien, die in das Verzeichnis gehen, von der .d-Datei in diesem Verzeichnis abhängig:

 obj/%.o: %.c obj/.d
    $(CC) $(CFLAGS) -c -o $@ $<

Beachten Sie die Verwendung von $< anstelle von $^.

Verhindern Sie schließlich, dass die .d-Dateien automatisch entfernt werden:

 .PRECIOUS: %/.d

Das Überspringen der .d-Datei und die direkte Abhängigkeit vom Verzeichnis wird nicht funktionieren, da die Änderungszeit des Verzeichnisses jedes Mal aktualisiert wird, wenn eine Datei in dieses Verzeichnis geschrieben wird, was einen Neuaufbau bei jedem Aufruf von make erzwingen würde.

13voto

andrewdotnich Punkte 15233

Wenn es für Sie kein Problem ist, dass das Verzeichnis bereits existiert, können Sie einfach stderr für diesen Befehl umleiten, um die Fehlermeldung loszuwerden:

-mkdir $(OBJDIR) 2>/dev/null

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X