2017-06-10 3 views
1

Für ein Projekt über mehrere Unterverzeichnisse verwenden wir GNU make für die Builds. Entwickler können mit dem Flag die Build-Aufgaben parallelisieren und eine Nummer auswählen, die zur Hardware ihrer Maschinen passt.Beschränken der Nebenläufigkeit in Sub-Maker

Allerdings sind die Makefiles einer von uns verwendeten Bibliothek von Drittanbietern nicht sicher zu parallelisieren - sie beruhen offensichtlich auf impliziter Reihenfolge der Ziele anstelle expliziter Abhängigkeitsregeln zwischen allen abhängigen Zielen.

Da ich keine Lust habe, Makefiles von Drittanbietern zu reparieren, rufen wir derzeit ihre Makefiles mit einem expliziten -j 1 Parameter auf, um die Anzahl der Jobs auf 1 zu beschränken, um diese Bibliothek zu erstellen. Die Regel sieht wie folgt aus:

third_party_lib: 
    $(MAKE) -j 1 -C [email protected] 

Dies funktioniert wie gewünscht, machen jedoch eine Warnung für diese aussendet:

make[1]: warning: -jN forced in submake: disabling jobserver mode. 

, die mich führt hier zu fragen, ob es einen besseren Weg, um die Zahl zu beschränken von parallelen Jobs in einem Sub-make.

Antwort

2

Sie können das Sonderziel .NOTPARALLEL: zu den Makefiles hinzufügen, die nicht parallelisiert werden sollen.

Wenn Sie nicht wollen, diese Makefiles ändern Sie die --eval Option in der Befehlszeile verwenden können (beachten Sie --eval in GNU 3.82 machen hinzugefügt wurde):

third_party_lib: 
     $(MAKE) --eval .NOTPARALLEL: -C [email protected] 
+0

Danke für die Anregung. Die Dokumentation besagt: "Jeder rekursiv aufgerufene make-Befehl führt immer noch Rezepte parallel aus ...", also muss ich vielleicht die Variable MAKE ändern, um --eval einzufügen, damit dies funktioniert. Wir werden eine Weile in unseren Jenkins und vor Ort testen und auf diese Antwort zurückkommen. –

+0

Sagst du, dieser Vorschlag hat nicht funktioniert, als du es ausprobiert hast? Ich bin mir nicht sicher, ob ich Ihren Hinweis auf die Dokumentation verstehe. Die rekursive Marke wird gestartet und die übergeordnete Marke wird sie so konfigurieren, dass sie parallel abläuft. Das '--eval' wird dann vom rekursiven make ausgeführt und das' .NOTPARALLEL: 'spezielle target deaktiviert die Parallelität, so als ob Sie das Makefile des rekursiven make so bearbeitet hätten, dass es diesen Wert enthält. Sie wollen den Inhalt der 'MAKE'-Variablen sicher nicht ändern. – MadScientist

+0

Ich beziehe mich auf "Jeder rekursiv aufgerufene Make-Befehl wird immer noch Rezepte parallel laufen" von https://www.gnu.org/software/make/manual/html_node/Special-Targets.html, was, ich nehme, bedeutet, dass Tasks von third_party_lib/Makefile werden jeweils nur einzeln ausgeführt, aber Tasks in Makefiles in ihren Unterverzeichnissen können wiederum parallel ausgeführt werden. Ja, die ersten Tests haben funktioniert, aber dann ist der Nebenläufigkeitsfehler nur gelegentlich aufgetaucht, deshalb braucht es mehr Testläufe, um sicher zu gehen. –