2012-05-03 13 views
5

Nel manuale:Come si può usare la funzione eval nel makefile?

La funzione eval è molto speciale: consente di definire nuovi costrutti makefile che non sono costanti; che sono il risultato di che valuta altre variabili e funzioni. L'argomento della funzione eval viene espanso, quindi i risultati di tale espansione vengono analizzati come sintassi del makefile .

È importante rendersi conto che l'argomento di valutazione viene espanso due volte; prima dalla funzione eval, quindi i risultati di tale espansione sono nuovamente espansi quando vengono analizzati come sintassi del makefile. Ciò significa che è possibile che fornisca livelli di escape extra per i caratteri "$" quando utilizza eval.

il "espanso due volte" mi confonde.

per esempio, creo un makefile:

define func 
    tmp = $(OBJPATH)/$(strip $1) 
    objs += $$(tmp) 
    $$(tmp) : $2 
     gcc $$^ -o [email protected] 
endef 

all : foo 

$(eval $(call func, foo, 1.c))  

come sarà la funzione eval essere ampliato?

+0

"Come verrà estesa la funzione eval?" L'hai provato? – Beta

risposta

15

Il modo più semplice per capire che è quello di sostituire l'eval con info:

$(info $(call func, foo, 1.c)) 

che mostrerà come output il risultato della prima espansione, in modo da poter vedere ciò che rendono saranno effettivamente l'analisi. non ha fornito i valori per la variabile OBJPATH, ma se fosse obj per esempio, allora nel tuo caso la prima espansione (della funzione di chiamata) si traduce in:

tmp = obj/foo 
objs += $(tmp) 
$(tmp) : 1.c 
    gcc $^ -o [email protected] 

Poi il make parser valuterà questo, e nel processo lo espande nuovamente, quindi vengono espanse le cose come $(tmp).

Problemi correlati