Estoy tratando de crear una plantilla de compilación genérica para mis Makefiles, algo así como lo discuten en el eval documentation.
Parece que la función de comodín no funciona en una evaluación. El código básico con el que estoy teniendo problemas se ve así.
SRC_DIR = ./src/
PROG_NAME = test
define PROGRAM_template
$(1)_SRC_DIR = $(join $(SRC_DIR), $(1)/)
$(1)_SRC_FILES = $(wildcard $$($(1)_SRC_DIR)*.c)
endef
$(eval $(call PROGRAM_template, $(PROG_NAME)))
all:
@echo $(test_SRC_DIR)
@echo $(test_SRC_FILES)
@echo $(wildcard $(wildcard $(test_SRC_DIR)*.c)
Cuando corro hacer con esto, la salida es
./src/test
[correct list of all .c files in ./src/test/]
Básicamente, la llamada comodín dentro PROGRAM_template no está siendo eval'd como yo esperaba. La llamada da como resultado una lista vacía.
Sin embargo, la llamada de unión se evalúa correctamente.
Entonces, ¿qué estoy haciendo mal? Supongo que
$$($(1)_SRC_DIR)
no es correcto, pero no puedo encontrar la manera correcta de hacerlo.
EDIT Una vez que esto fue resuelto, no me llevó mucho tiempo dar con otro problema con eval. lo publicado como una nueva cuestión en Workaround for GNU Make 3.80 eval bug
¡Gracias! Estaba a punto de comentar que no funcionó, luego volví y vi su edición. Parece que la línea $ (1) _SRC_DIR = $$ ($$ unen (SRC_DIR), $ (1) /) también funciona de la manera que lo tenía, pero para la línea de $ (comodín), debe el $$. – bengineerd
@bengineerd: Sí, desde entonces he aclarado mi respuesta un poco. No necesita los dobles escapes en 'join' y' SRC_DIR' porque estos se * completamente * expandidos después de una sola expansión. Pero, como digo, hace la vida más fácil simplemente usar el doble escape. No dañarán nada cuando no sean necesarios. –