Set perezoso
VARIABLE = value
Configuración normal de una variable, pero cualquier otra variable mencionada con el value
campo se expande recursivamente con su valor en el punto en el que se usa la variable, no la que tenía cuando se declaró
Conjunto inmediato
VARIABLE := value
Configuración de una variable con expansión simple de los valores internos: los valores internos se expanden en el momento de la declaración.
Conjunto perezoso si está ausente
VARIABLE ?= value
Configuración de una variable solo si no tiene un valor. value
siempre se evalúa cuando VARIABLE
se accede. Es equivalente a
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Consulte la documentación para más detalles.
Adjuntar
VARIABLE += value
Agregar el valor suministrado al valor existente (o establecer ese valor si la variable no existiera)
El uso
=
hace que a la variable se le asigne un valor. Si la variable ya tenía un valor, se reemplaza. Este valor se expandirá cuando se use. Por ejemplo:Usar
:=
es similar a usar=
. Sin embargo, en lugar de que el valor se expanda cuando se usa, se expande durante la asignación. Por ejemplo:El uso
?=
asigna a la variable un valor si la variable no se asignó previamente. Si a la variable se le asignó previamente un valor en blanco (VAR=
), todavía se considera un conjunto , creo . De lo contrario, funciona exactamente como=
.Usar
+=
es como usar=
, pero en lugar de reemplazar el valor, el valor se agrega al actual, con un espacio en el medio. Si la variable se estableció previamente con:=
, creo que se expande . El valor resultante se expande cuando se usa , creo . Por ejemplo:Si
HELLO_WORLD = $(HELLO_WORLD) world!
se usara algo así , se produciría una recursión, que probablemente terminaría con la ejecución de su Makefile. SiA := $(A) $(B)
se usaran, el resultado no sería exactamente el mismo que usar+=
porqueB
se expande con,:=
mientras+=
que no provocaríaB
que se expanda.fuente
VARIABLE = literal
yVARIABLE := literal
es siempre equivalente. ¿Lo entendí bien?Te sugiero que hagas algunos experimentos usando "make". Aquí hay una demostración simple, que muestra la diferencia entre
=
y:=
.make test
huellas dactilares:Consulte la explicación más elaborada aquí
fuente
@
frente en cada receta para evitar esta repetición confusa de resultados./* ... */
comentarios de bloqueCuando usa
VARIABLE = value
, si envalue
realidad es una referencia a otra variable, entonces el valor solo se determina cuandoVARIABLE
se usa. Esto se ilustra mejor con un ejemplo:Cuando lo usas
VARIABLE := value
, obtienes el valor devalue
como es ahora . Por ejemplo:Utilizando
VARIABLE ?= val
significa que solo establece el valor deVARIABLE
ifVARIABLE
no está configurado ya. Si aún no está configurado, la configuración del valor se difiere hasta queVARIABLE
se utiliza (como en el ejemplo 1).VARIABLE += value
simplemente anexavalue
aVARIABLE
. El valor real devalue
se determina como era cuando se configuró inicialmente, usando=
o:=
.fuente
En las respuestas anteriores, es importante comprender qué se entiende por "los valores se expanden en el momento de la declaración / uso". Dar un valor como
*.c
no implica ninguna expansión. Es solo cuando esta cadena es utilizada por un comando que tal vez desencadene un poco de bloqueo. Del mismo modo, un valor como$(wildcard *.c)
o$(shell ls *.c)
no implica ninguna expansión y se evalúa por completo en el momento de la definición, incluso si lo utilizamos:=
en la definición de variable.Pruebe el siguiente Makefile en el directorio donde tiene algunos archivos C:
La ejecución
make
activará una regla que crea un archivo C adicional (vacío), llamadofoo.c
pero ninguna de las 6 variables tienefoo.c
en su valor.fuente