2012-04-15 12 views
6

Hier ist ein vereinfachtes Makefile:Wie setze ich Umgebungsvariablen im Makefile-Rezept?

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done 
    @echo $$var 

ich den Wert von "var" annehmen "0 1 2 3 4", aber der Ausgang ist:

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
       <--- NOTHING!!! 

Wie Sie die letzte sehen echo ist "NICHTS". Was ist falsch?

+0

Ich nehme an, dass jedes Rezept Befehl in einer Subshell aufgerufen wird, so dass die „var“ in der ersten Rezeptur definiert ist, kann nicht in der zweiten Zeile bezeichnet werden. Ist das richtig? –

Antwort

10

Von here:

Wenn es Zeit Rezepte auszuführen ist, ein Ziel zu aktualisieren, sie ausgeführt werden, indem eine neue Sub-Shell für jede Zeile des Rezeptes Aufruf ...

Bitte beachten Sie: Dies bedeutet, dass das Setzen von Shell-Variablen und das Aufrufen von Shell-Befehlen wie cd, die für jeden Prozess einen lokalen Kontext festlegen, die folgenden Zeilen im Rezept nicht beeinflusst. Wenn Sie cd verwenden möchten, um die nächste Anweisung zu beeinflussen, setzen Sie beide Anweisungen in eine einzige Rezeptzeile. Dann ruft make eine Shell auf, um die gesamte Zeile auszuführen, und die Shell führt die Anweisungen nacheinander aus.

Versuche folgend:

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done; \ 
    echo $$var 
+0

Ja, es funktioniert! Vielen Dank! Es gibt so viele Fallen in Makefile ~ –

+0

@Li, gern geschehen –

Verwandte Themen