significado - GNU hace diferencias en declaraciones de variables multilínea
que es declaracion de variables (2)
Desde CHANGELOG en 3.82:
* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.)
after a define, to create variables with those flavors.
Parece que usar ''='' no es compatible antes de eso en declaraciones definidas
Leí esta pregunta y me sorprendió que no funcionara:
¿Por qué la receta enlatada GNU Make no funciona?
Así que lo intenté yo mismo y obtuve los mismos resultados. Aquí hay un archivo MAKE de ejemplo:
define foo
bar
baz
endef
define bar =
foo
baz
endef
$(info foo: $(foo))
$(info bar: $(bar))
all:
Y aquí está el resultado de ejecutarlo:
$ make
foo: bar
baz
bar:
make: Nothing to be done for `all''.
¿Que esta pasando aqui? El manual de GNU make parece indicar que estas dos declaraciones de variables deberían ser las mismas: ¿qué es lo que me falta aquí?
Editar:
Algunas citas del manual al que me refería:
3.7 Cómo hacer Lee un Makefile
define immediate deferred endef define immediate = deferred endef
5.8 Definición de recetas enlatadas
Aquí hay un ejemplo de definición de una receta enlatada:
define run-yacc = yacc $(firstword $^) mv y.tab.c $@ endef
6.8 Definición de variables de línea múltiple
... Puede omitir el operador de asignación de variables si lo prefiere. Si se omite, make asume que es ''='' y crea una variable expandida recursivamente ...
Como puede ver, la sección de recetas enlatadas usa explícitamente el caso =
. Estoy usando GNU Make 3.81.
Probablemente sea tu versión de make
. Probé ese makefile en mi máquina usando make 3.81 en Cygwin y obtuve:
$ make
foo: bar
baz
bar:
make: Nothing to be done for `all''.
Probé el mismo archivo make utilizando make 3.82 (compilación nativa de Windows) y obtuve:
C:/>C:/make/make.exe
foo: bar
baz
bar: foo
baz
make: Nothing to be done for `all''.
Creo que el manual de creación en línea es para v3.82.