2012-04-15 17 views
6

Ecco un Makefile semplificata:Come impostare le variabili d'ambiente nella ricetta del makefile?

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

Suppongo che il valore di "var" è "0 1 2 3 4", ma l'uscita è:

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

Come si può vedere l'ultima l'eco è "NULLA". Che c'è?

+0

sospetto che ogni comando ricetta viene richiamato in una subshell, quindi il "var" definito nella prima ricetta non può essere definito nella seconda riga. È giusto? –

risposta

10

Da here:

Quando è il momento di eseguire le ricette per aggiornare un bersaglio, vengono eseguiti invocando un nuovo subshell per ciascuna linea della ricetta ...

Si prega di notare: ciò implica che l'impostazione delle variabili di shell e il richiamo di comandi di shell come cd che impostano un contesto locale per ogni processo non influenzeranno le seguenti righe nella ricetta. Se si desidera utilizzare cd per applicare l'istruzione successiva, inserire entrambe le istruzioni in una singola riga di ricette. Quindi make invocherà una shell per eseguire l'intera riga e la shell eseguirà le istruzioni in sequenza.

provare:

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

Sì, funziona! Grazie! Ci sono così tante trappole in Makefile ~ –

+0

@Li, prego –

Problemi correlati