2011-09-13 19 views
40

que tienen un makefile que tiene este aspecto:¿Qué hace un símbolo de porcentaje en un archivo MAKE?

include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

%-test: 
     Something here 

entiendo lo que se pretende en la línea de normas de destino. ¿Qué está haciendo el signo % en la primera línea? ¿Tiene algo que ver el signo de porcentaje en la línea de regla objetivo?

Cuando escribo make sometarget, ¿las líneas del archivo MAKE que no están escritas como parte de ninguna regla (como la primera línea de este archivo MAKE) se ejecutan? Si es así, ¿cuál es el orden de ejecución?

Respuesta

33

Como puede leer en the GNU make manual, el porcentaje actúa como un comodín. El primer argumento de patsubstfunction forma el patrón. Cada elemento/palabra en el último argumento se compara con este patrón, y si coincide, se reemplaza con el segundo argumento. Si hay un símbolo de comodín (%) en el patrón, esto coincidirá con cualquier número de caracteres, y estos caracteres se copian en la cadena de reemplazo en el lugar del% en el segundo argumento.

En su ejemplo, el patrón es simplemente el símbolo comodín, por lo que coincidirá con cualquier palabra en el último argumento de la función, y esta palabra se copiará en la cadena de reemplazo (el segundo argumento) en el lugar del% .

Un ejemplo puede aclarar las cosas. Supongamos TEST_SUBDIRS contiene dos nombres.

TEST_SUBDIRS := test1 test2 
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

Esto es equivalente a lo siguiente.

include $(src)/test1/Make.tests $(src)/test2/Make.tests 

Un archivo MAKE se procesa secuencialmente, línea por línea. Las asignaciones de variables se "internalizan", y las instrucciones de inclusión hacen que los contenidos de otros archivos se inserten literalmente en esa ubicación después de la cual ese contenido se procesa como parte del archivo MAKE.
Un gráfico de dependencia se forma a partir de las reglas a medida que se leen, y después de que se procesa todo el archivo, se ejecutan las recetas necesarias para actualizar el objetivo solicitado.

Cuestiones relacionadas