Estoy usando GNU make 3.81. Aquí es un makefile prueba que demuestra el problema:¿Cómo puedo usar macros para generar múltiples objetivos/reglas de Makefile dentro de foreach? Comportamiento misterioso
define BOZO
a$(1): b c
touch a$(1)
endef
$(foreach i,1 2 3,$(call BOZO,$(i)))
La idea aquí es utilizar una plantilla de macro (BOZO) para generar reglas que siguen un patrón predecible.
Problema: cuando corro hacer en este archivo make me sale un error diciendo:
Makefile.fake:10: *** multiple target patterns. Stop.
(donde la línea 10 es la línea con el foreach).
Ahora, sé lo que ese error normalmente indica. Veamos a qué se extiende esa línea utilizando la función info
para enviar la expansión a la salida estándar. Cómo cambio la línea 10 para ser:
$(info $(foreach i,1 2 3,$(call BOZO,$(i))))
y corro:
$ make -n
a1: b c
touch a1
a2: b c
touch a2
a3: b c
touch a3
make: *** No targets. Stop.
Tenga en cuenta que los "no blancos" Se espera que el mensaje, ya que el $ (info ...) evalúa la función de vaciar, pero hace que imprima las reglas generadas.
Vamos a ejecutar esas reglas, ¿o sí?
$make -n > out.txt
make: *** No targets. Stop.
$make -f out.txt a1 a2 a3
touch a1
touch a2
touch a3
$
AAARGH! Las reglas funcionan bien. Entonces ... ¿está el error en la marca, o en mi entendimiento?
Una última pista que podría ayudar a diagnosticar: si cambio de la línea foreach para:
$(foreach i,1,$(call BOZO,$(i)))
(de manera que foreach tiene sólo una iteración)
y luego hacer
$make a1
Me sale un error diferente:
make: *** No rule to make target `a1'. Stop.
No sé de ninguna manera para "ver" la expansión de $(foreach)
que hace que vea a excepción de $(info)
, y su salida es legal, así que estoy bastante perplejo.
D'OH! Bien, soy nuevo en Macros de Makefile. Todavía no entiendo muy bien por qué es necesario, pero funciona, así que meditaré en ello. ¡Gracias! – Joe