Paralleles Makefile erfordert Abhängigkeitsreihenfolge
Habe ich das folgende Stück makefile:
CXXFLAGS = -std=c++0x -Wall
SRCS = test1.cpp test2.cpp
OBJDIR = object
OBJS = $(SRCS:%.cpp=$(OBJDIR)/%.o)
all: test1
release: clean test1
test1: $(OBJS)
$(CXX) -o $@ $(OBJS)
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -MD -c -o $@ $<
-include $(SRCS:.cpp=.d)
clean:
rm -rf $(OBJDIR)/*
.PHONY: all clean release
Nun, wenn ich versuche zu aufrufen von "make-j4-release" das clean-Ziel wird oft ausführen, in der Mitte des Gebäudes Dateien, die bewirkt, dass die Kompilierung fehlschlägt. Meine Frage ist, wie um sicherzustellen, dass das clean-Ziel abgeschlossen hat, bevor der release-build.
InformationsquelleAutor der Frage kyku | 2011-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Vorliebe für
Diese Kräfte die beiden Ziele gemacht werden nacheinander ohne Störung Ihrer inneren Parallelität (falls vorhanden).
InformationsquelleAutor der Antwort Neil
Können Sie split-Ausführung in nicht-parallelen (für
release
) und parallel (für den rest targets) Phasen..NOTPARALLEL
Gegner werden unterdrückt, parallele Ausführung, wennrelease
Ziel ist bereits in der Befehlszeile. Dierelease
sich selbst als Ziel wird erneut ausführen, Stellen Sie nach der Reinigung und bauentest1
parallel.UPD.
Mehr clevere Lösung würde auch reinvoke Stellen Sie für jedes einzelne Ziel-im Falle dass, wenn es mehr als eine Ziele auf der Befehl-Linie, so dass ein Vorhandensein von
release
Ziel nicht zwingen, die Ruhe zu führen, die nicht-parallel zu.Update von James Johnston
Die clevere Lösung oben funktioniert nicht bei Versionen von GNU make, die keine Unterstützung für job Server. Zum Beispiel, veröffentlicht MinGW/native Versionen von GNU make, die vor der version 4.0 nicht unterstützt job-Server. (Cygwin/MSYS Versionen von GNU make zu tun.) Der folgende code verwendet die
.FUNKTIONEN
- Variablen eingeführt in make 3.81, um zu erkennen, ob der job Server unterstützt werden. Das symptom, nicht verwenden diese Problemumgehung, wenn es erforderlich ist, dass Ihre "parallele" bauen wird serialisiert werden.InformationsquelleAutor der Antwort Eldar Abusalimov
In der release Fall, müssen Sie sicherstellen, dass
clean
abgeschlossen ist, bevor alle kompilieren. Damit Sie (nur) fügen Sie es als eine Abhängigkeit zum kompilieren der Regel (und nicht zu den falschen Gegner). Mehrere Möglichkeiten, dies zu tun, wie target-spezifischen Variablen, oder:InformationsquelleAutor der Antwort bobbogo
Ich bin mir nicht genau sicher, welche Versionen dieses feature unterstützt, aber Sie können die
order-only
feature:Alle Abhängigkeiten, die Links von der
|
Zeichen verarbeitet werden als normale. Die Abhängigkeiten zu den rechten von|
sind ausführen", um nur'Diese Funktion ist beschrieben unter:
https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html
In Ihrem Fall, die folgenden Regeln definition genügen würde:
InformationsquelleAutor der Antwort theorifice
Für eine Lösung ohne einen rekursiven Aufruf machen, könnten Sie versuchen, diese.
InformationsquelleAutor der Antwort eriktous