2012-05-03 25 views
5

En el manual:¿Cómo se puede usar la función eval en makefile?

La función eval es muy especial: le permite definir nuevas construcciones makefile que no son constantes; que son el resultado de evaluando otras variables y funciones. El argumento para la función eval se expande, luego los resultados de esa expansión se analizan como sintaxis makefile.

Es importante darse cuenta de que el argumento eval se expande dos veces; primero por la función eval, luego los resultados de esa expansión son expandidos nuevamente cuando se analizan como sintaxis de archivo MAKE. Esto significa que es posible que necesite proporcionar niveles adicionales de escape para los caracteres "$" al utilizando eval.

"me expandí dos veces" me confunde.

por ejemplo, i crear 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))  

cómo se ampliará la función eval?

+0

"¿Cómo se ampliará la función eval?" ¿Lo has probado? – Beta

Respuesta

15

La forma más fácil de entender que es reemplazar la función eval con Info:

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

que mostrará como salida el resultado de la primera expansión, para que pueda ver lo que hacen en realidad será el análisis. No ha proporcionado los valores de la variable OBJPATH, pero si era obj por ejemplo, a continuación, en su caso, la primera expansión (de la función de llamada) da como resultado:

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

A continuación, el analizador de maquillaje evaluará esto, y en el proceso lo expandirá nuevamente, por lo que se expanden cosas como $(tmp).

Cuestiones relacionadas