2012-01-27 15 views
5

Attualmente sto affrontando un problema con il mio Makefile causato dalla valutazione di una variabile make. Ho ridotto la complessità, restano solo gli elementi essenziali che producono il problema.Espansione/valutazione variabili makefile

  • $ (LIST) viene valutato come un elenco di file quando il Makefile viene letto.
  • Durante step1 uno di questi file viene eliminato.
  • Quando si utilizza la variabile in step2, non viene valutata nuovamente e quindi non è più valida e causa un errore durante il comando di copia.
  • Sarebbe bello se la variabile fosse valutata al momento in cui viene utilizzata, qui durante step2.

Qualche idea su come risolvere o aggirare questo problema?


Makefile:

LIST=$(wildcard src/*.txt) 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 

la registrazione di esecuzione:

$ make 
---------- step1 ---------- 
src/q1.txt src/q2.txt 
rm src/q1.txt 
ls src 
q2.txt 
---------- step2 ---------- 
src/q1.txt src/q2.txt 
cp src/q1.txt src/q2.txt ./dst 
cp: cannot stat `src/q1.txt': No such file or directory 
make: *** [step2] Error 1 

risposta

7

Non utilizzare la funzione di jolly.

LIST = src/*.txt 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 
+2

Il motivo per cui funziona è che la stringa "src/*. Txt" posto testualmente nella '' echo' e comandi cp', dove la shell espande nuovamente per ogni comando (invece di 'make' , che ha fatto l'espansione di '$ (carattere jolly)'). –

+3

poiché la variabile viene espansa quando viene invocata la ricetta (usato "=" per l'espansione differita non ": =" per l'espansione immediata o semplice) ci si aspetterebbe che il makefile originale funzioni. Ecco il problema: per l'efficienza GNU fa in cache il contenuto delle directory come va. Quindi, se apporti modifiche alla struttura delle directory in un modo che make non riconosce, puoi entrare in queste situazioni in cui l'idea di make di quali file esistono non corrisponde alla realtà. – MadScientist