wie zu verhindern in einem Makefile „Verzeichnis bereits Fehler vorhanden ist“, wenn mkdir mit

StackOverflow https://stackoverflow.com/questions/99132

  •  01-07-2019
  •  | 
  •  

Frage

Ich brauche ein Verzeichnis in meiner Make-Datei zu erzeugen, und ich möchte nicht das bekommen „Verzeichnis existiert bereits Fehler“ immer und immer wieder, obwohl ich es einfach ignorieren kann.

ich hauptsächlich mingw / msys verwenden würde aber etwas, das auch über andere shells / Systemen.

Ich habe versucht, aber es hat nicht funktioniert, irgendwelche Ideen?

ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
War es hilfreich?

Lösung

Unter UNIX Nur soviel verwenden:

mkdir -p $(OBJDIR)

Die Option -p mkdir verhindert, dass die Fehlermeldung, wenn das Verzeichnis vorhanden ist.

Andere Tipps

die offizielle make Dokumentation , hier ist ein guter Weg zu es tut:

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 Nutzung der sehen | Rohr Bediener nur Voraussetzung einen Auftrag definieren. Was bedeutet, dass das $(OBJDIR) Ziel existent werden soll (anstelle von aktuellere ), um das aktuelle Ziel zu bauen.

Beachten Sie, dass ich verwendet mkdir -p. Die -p Flagge wurde hinzugefügt, verglichen mit dem Beispiel der Doc. Andere Antworten für eine andere Alternative.

Sie können den Test Befehl:

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

Hier ist ein Trick, den ich mit GNU-Compiler für die Erstellung von Ausgabe-Verzeichnisse verwenden. Zuerst definieren Sie diese Regel:

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

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

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

Hinweis Verwendung von $

verhindern Schließlich die .d Dateien automatisch entfernt werden:

 .PRECIOUS: %/.d

Skipping die .d-Datei und in Abhängigkeit direkt auf dem Verzeichnis, wird nicht funktionieren, da die Verzeichnisänderungszeit jedes Mal, wenn eine Datei in diesem Verzeichnis geschrieben wird, aktualisiert wird, die bei jedem Aufruf von make wieder aufzubauen zwingen würde.

das Verzeichnis bereits vorhanden Wenn aufweist, ist kein Problem für Sie, könnten Sie einfach umleiten stderr für diesen Befehl, der Fehlermeldung loszuwerden:

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

In Ihrer Make-Datei:

target:
    if test -d dir; then echo "hello world!"; else mkdir dir; fi

Unter Windows

if not exist "$(OBJDIR)" mkdir $(OBJDIR)

Auf Unix | Linux

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi
ifeq "$(wildcard $(MY_DIRNAME) )" ""
  -mkdir $(MY_DIRNAME)
endif
$(OBJDIR):
    mkdir $@

, die auch für mehrere Verzeichnisse funktionieren, z ..

OBJDIRS := $(sort $(dir $(OBJECTS)))

$(OBJDIRS):
    mkdir $@

Hinzufügen $(OBJDIR) als das erste Ziel gut funktioniert.

Es funktioniert unter mingw32 / msys / Cygwin / linux

ifeq "$(wildcard .dep)" ""
-include $(shell mkdir .dep) $(wildcard .dep/*)
endif

Wenn Sie explizit den Return-Code ignorieren und Dump des Fehlerstrom dann macht die Fehler ignorieren, wenn sie auftritt:

mkdir 2>/dev/null || true

Dies sollte kein Rennen Gefahr in einem parallelen machen verursachen - aber ich habe es getestet nicht sicher sein,

.

Ein wenig einfacher als Lars' Antwort:

something_needs_directory_xxx : xxx/..

und allgemeine Regel:

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

Keine Touch-Dateien zu bereinigen, oder .PRECIOUS machen: -)

Wenn Sie eine andere kleine generische gmake Trick sehen wollen, oder wenn Sie daran interessiert sind in nicht-rekursive machen mit minimalem Gerüst, können Sie kümmern a href check out <= "https://mischasan.wordpress.com/ 2012/07/05 / zwei~~POS=TRUNC mehr billige-gmake-Tricks-Erstellen-Verzeichnisse-und-Druck-Variablen /“rel = "nofollow noreferrer"> zwei weitere günstige gmake Tricks und die anderen Make-related posts in diesem Blog.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top