makefile: foreach "make-C" nennen
hier ist ein Teil meiner makefile:
PATH := $(shell pwd)
EDIR := impl
EFFECTS := $(filter-out $(EDIR), $(shell find $(EDIR) -maxdepth 1 -type d))
ALLMAKES := $(patsubst %, $(PATH)/%, $(EFFECTS))
all:
$(foreach c,$(ALLMAKES),$(MAKE) -C $(c))
Also im Grunde genommen, möchte ich nennen, machen für alle Verzeichnisse im "impl" - Verzeichnis ohne "impl" selbst. Ich verstehe, dass stellen Sie erinnern sich an das Letzte Verzeichnis war es beim letzten Aufruf mit der Option-C argument, das ist, warum ich geben Sie den absoluten Pfad jedes mal. Was machen echos zu sein scheint, was ich will:
make -C <projectdir>/impl/thing1 make -C <projectdir>/impl/thing2 make -C <projectdir>/impl/thing3
Das Problem ist, dass stellen nicht erreichen, der Befehl und druckt einfach:
make: make: Command not found.
Kann ich nennen "make-C <Pfad>" für jedes der Verzeichnisse einzeln außerhalb des makefile, aber es funktioniert nicht in der foreach-Aufruf. Ich habe versucht, das anstelle, aber es klappt nicht, entweder:
$(foreach c,$(ALLMAKES),$(shell make -C $(c)))
Irgendwelche Ideen?
- Die person, die gepostet, der Kommentar aber gelöscht...es funktioniert nicht aufrufen, die genau die gleiche make-Befehl aus dem makefile als aus der Schale, so dass Sie hilfreich waren...
- Ich löschte meinen Kommentar, weil ich dachte, ich war auf der falschen Spur. Ich arbeite auf eine bessere Antwort...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie den Aufruf einer einzigen
make
mit vielen der Argumente, die auch für die anschließendemake
Befehle. Benötigen Sie einen shell-Befehl ein Trennzeichen zwischen die Aufrufe von make. So etwas wie dies funktionieren wird:Auf den zweiten Blick, gibt es andere Probleme mit dem makefile. Sie sollten nicht legen Sie eine variable namens
PATH
, weil das überschreiben der subshell ist$PATH
variable. Sie können einfach verwenden Sie die make-variable$(CURDIR)
anstatt$(shell pwd)
. Sie nicht wirklich brauchen, müssen Ihre Verzeichnisse mit dem Pfad, da läuft$(MAKE) -C ...
ändert nicht die shell Arbeitsverzeichnis, nur machen Sie ' s, und wenn beendet, wird es wieder zurückgesetzt werden, so können Sie einfach einen relativen Pfad verwenden.Ebenfalls aufrufen von sub-macht in einer Schleife einige Probleme hat. Erstens, reduzieren Sie die Menge der Parallelisierung, die Sie bekommen können. Zweitens, die
-k
option nicht richtig unterstützt (ohne viele unangenehme Anstrengung). Eine bessere Möglichkeit zum behandeln dieses Problems ist die Tatsache zunutze machen, dass bereits weiß wie baut man viele Ziele:Falls Sie spezifische Probleme mit der Anordnung zwischen den verschiedenen Unterverzeichnissen, können Sie definieren Sie als gut:
etc. Dies gewährleistet eine maximale Parallelisierung Möglichkeiten, während immer noch die Erhaltung wichtig bestellen.
Hinzufügen, alternative Regeln, sagen
clean
können Sie etwas wie das hier tun:Dies ist schön, da können Sie auch bauen Sie ein einzelnes Verzeichnis (und alle seine Voraussetzungen) durch ausführen
make impl/thing1
zum Beispiel. Oder reinigen Sie Sie durch ausführenmake impl/thing1.clean
Wenn du mehr von diesen bekommen Sie auch Lust mit Muster, Regeln, etc. zu vermeiden wiederholen Sie dies für jede Art von Ziel. Es wird mehr lästig.
-j
und (b) es ist fast unmöglich, damit es funktioniert korrekt in Bezug auf die-k
option. Aber, es ist eine quick-and-dirty-Lösung, die Antworten auf die spezifische Frage und arbeiten. Ich werde das hinzufügen einer alternative, die ist "cleaner".