Nach eine vereinfachte Version des Problems ist, ich habe:GNU Make: Exportieren eine einfach Expanded Variable
main.mk:
export lst :=
tmp := a
lst += $(tmp)
$(warning lst is $(lst))
tmp := b
lst += $(tmp)
$(warning lst is $(lst))
all:
$(MAKE) -f sub.mk
sub.mk:
tmp := c
lst += $(tmp)
$(warning lst is $(lst))
tmp := d
lst += $(tmp)
$(warning lst is $(lst))
Das Ausführen von make -f main.mk gibt Folgendes aus:
main.mk:7: lst is a
main.mk:11: lst is a b
make -f sub.mk
sub.mk:4: lst is a b c
sub.mk:8: lst is a b d d
Ich definierte lst als einfach expandierte Variable in main.mk, warum hat man es in eine rekursiv expandierte Variable im Submake umgewandelt?
las ich folgendes:
https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_6.html#SEC59 https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html
Weder besagt, dass eine Variable ihren "Geschmack" verliert, wenn sie einem submake Exportd.
Ich bin in der Lage, dies zu leicht zu beheben, indem diese sub.mk Zugabe:
obwohllst := $(lst)
scheint wie ein Hack. Mache ich etwas falsch?
Ich benutze GNU Make v4.1 in Cygwin, ich bestätigte dieses Verhalten auch in Linux mit GNU Make v3.81.
Ich sehe Ihren Punkt, macht verwendet die Umgebung des Systems, um Variablen zu exportieren, und diese Informationen sind in der Umgebung verloren. Scheint so, dass diese Tatsache zusammen mit dem Standard-Flavour, der verwendet werden soll, explizit angegeben werden sollte. Ich habe bestätigt, dass die Verwendung von: = in der Befehlszeile den Flavor beibehalten hat, aber ich konnte die lst-Variable nicht akkumulieren, sie wird bei jedem Sub-Make-Aufruf zurückgesetzt. Das ist ein anderer Anwendungsfall, danke für die Klärung. – Samuel
Ich stimme zu, dass dies möglicherweise genauer gesagt werden könnte. Sie haben im Makefile "lst" -Werte mit "override" angesammelt, und der übergebene Wert für die untergeordnete Makefunktion war der ursprüngliche Befehlszeilenwert? Denn ohne 'override' make Zuweisungen werden die der Befehlszeile zugewiesene Variable nicht berühren. Aber ich würde erwarten, dass mit "override 1st + = c" usw. der modifizierte Wert an die Untermarken weitergegeben wird. –
Ja, ich habe den Export lst entfernt und Overd vor jeder lst + = Anweisung hinzugefügt. Ich habe diese Artikel gelesen: gnu.org/software/make/manual/html_node/Options_002fRecursion.html, gnu.org/software/make/manual/html_node/Overriding.html und gnu.org/software/make/manual/html_node/ Override-Directive.html, und sie geben das Verhalten nicht explizit an. Ich habe MAKEOVERRIDES in beiden Dateien geprüft und es ist immer gleich dem Kommandozeilenwert (bestätigt in Cygwin make v4.1 und Linux make v3.81). Ich könnte wahrscheinlich MAKEOVERRIDES manuell reparieren, um das erwartete Verhalten zu erhalten, oder lst: = $ (lst) an Untermarken übergeben. – Samuel