2016-03-22 6 views
1

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:

obwohl
lst := $(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.

Antwort

2

Ich glaube, dies ist eine Folge dieses Bits aus dem Handbuch

nach unten zu übergeben, oder zu exportieren, eine Variable machen fügt die Variable und ihren Wert für die Umwelt für jede Zeile des Rezeptes läuft. Die Untermarke wiederum verwendet die Umgebung zum Initialisieren ihrer Tabelle mit Variablenwerten. Siehe Variablen aus der Umgebung.

Das ist in der Communicating Variables to a Sub-make Abschnitt, den Sie in Ihrem Beitrag verlinkt.

Insbesondere gibt es keinen Weg (über die Umgebung) zu zeigen, welche Variablen rekursiv erweitert werden und welche einfach erweitert werden. (Nicht ohne anderen Markierungsmechanismus.)

Contrast dies

machen gibt automatisch Variablenwerte, die unten in der Befehlszeile definiert wurden, indem man sich in der MAKEFLAGS Variable setzen.

und die Tatsache, dass die Variable (oder MAKEOVERRIDES oder der -*-command-variables-*- Variable, wie der Fall sein kann), können die tatsächlich enthalten =/:= den Geschmack bezeichnet.

+0

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

+0

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. –

+0

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

Verwandte Themen