Función de evaluación de makefile detallada

Función función: La función "eval" es una función especial. Úselo para construir una relación de estructura de regla variable (cadena de dependencia) en Makefile, en la que se pueden usar otras variables y funciones. La función "eval" expande sus parámetros, y el resultado expandido se usa como parte del Makefile, y make puede analizar el contenido expandido. El resultado de la expansión puede incluir una nueva variable, objetivo, regla implícita o explícita, etc. Es decir, la función de esta función es principalmente reemplazarlos y expandirlos según la relación y estructura de sus parámetros.

Valor de retorno: el valor de retorno de la función "eval" es espacio-tiempo, o se puede decir que no hay valor de retorno.
Descripción de la función: Cuando se ejecuta la función "eval", sus parámetros se expandirán dos veces. La primera expansión la realiza la función en sí, y la segunda es cuando el resultado de la expansión de la función se usa como contenido del Makefile cuando es analizado por make. Conocer este proceso es muy importante para usar la función "eval". Después de comprender la segunda expansión de la función "eval". En el uso real, si hay una referencia en el resultado de expansión de la función (formato: (x)), entonces "(x)) debe usarse en el parámetro de función, luego" (x)) debe usarse en el parámetro de función.( X ) ) , que es en función de la cantidad de parámetros el número de la que sea la causa por " " en lugar de "" en lugar de "" Por la sustitución de " . "Debido

Pensé en un ejemplo extremadamente simple para aclarar la evaluación en
Makefile . Makefile:

 2 pointer := pointed_value
 3 
 4 define foo 
 5 var := 123
 6 arg := $1
 7 $$($1) := ooooo
 8 endef 
 9 
10 $(info $(call foo,pointer))
11 #$(eval $(call foo,pointer))
12 
13 target:
14         @echo -----------------------------
15         @echo var: $(var), arg: $(arg)
16         @echo pointer: $(pointer), pointed_value: $(pointed_value)
17         @echo done.
18         @echo -----------------------------
19 

Tenga en cuenta que en el ejemplo anterior, se comenta la línea $ (eval $ (call foo, pointer)). Ejecute el Makefile con la línea comentada primero, y los resultados son los siguientes:

var := 123
arg := pointer
$(pointer) := ooooo
-----------------------------
var: , arg:
pointer: pointed_value, pointed_value:
done.
-----------------------------

Tenga en cuenta que
var: = 123
arg: = pointer
$ (pointer): = ooooo
estas líneas son el resultado de $ (llamar a foo, pointer) (o llamar a foo a esta "función" (porque el nombre oficial en el Makefile se llama paquete macro ) El valor de retorno). Al mismo tiempo, observe que var, arg, point_value son todos valores vacíos, porque en realidad solo uso la función $ (info) para reemplazar el cuerpo de la función foo después de los parámetros, o el valor de retorno de $ (call foo, pointer) se imprime en el estándar La salida es solo ($ 1 es un puntero, llame a la función, simplemente reemplace los parámetros directamente), por lo que estas pocas líneas de código no se ejecutan realmente.

Tenga en cuenta que este $ (llamar a foo, puntero) es la primera evaluación de la función foo por el Makefile. Como puede ver arriba, el resultado de la evaluación es en realidad el código Makefile.

Entonces viene el problema. Dado que el resultado de la evaluación sigue siendo el código Makefile, ¿cómo se ejecuta este código? La respuesta es empaquetar otra evaluación, por lo que eval se evalúa por segunda vez.
Por lo tanto, si descomenta la línea $ (eval $ (all foo, pointer)), el resultado de ejecución es el siguiente:

var := 123
arg := pointer
$(pointer) := ooooo
-----------------------------
var: 123, arg: pointer
pointer: pointed_value, pointed_value: ooooo
done.
-----------------------------

Bien. Tenga en cuenta que var, arg y valor_puntado son todos valores asignados. Esta operación de asignación es el resultado de la ejecución del código para la primera evaluación.

Entonces, ¿por qué es necesario escribir $$ ($ 1): = ooooo al escribir el paquete foo?

Debido a que $ en el Makefile es un meta carácter (meta-chara ...), es decir, tiene un significado especial. Luego tienes que usar $$ para expresar "caracteres" en el Makefile Puedes ver el resultado de la primera evaluación, y no hace falta decirlo.

Supongo que te gusta

Origin blog.csdn.net/xingzhibo/article/details/108000123
Recomendado
Clasificación