¿Cuál es la diferencia entre: = y = en Makefile?

Respuestas:

80

Esto se describe en la documentación de GNU Make, en la sección titulada 6.2 Los dos tipos de variables .

En resumen, las variables definidas con :=se expanden una vez, pero las variables definidas con =se expanden siempre que se utilizan.

Greg Hewgill
fuente
4
Entonces, ¿sería correcto decir que: = es más eficiente? ¿O la eficiencia no es realmente un factor con Makefiles?
Ungeheuer
3
@Ungeheuer Eso no es un problema porque la llamada al proceso (el maketrabajo principal de the ) tiene una sobrecarga mucho mayor que la resolución de la variable interna.
Kirill Bulygin
68

Asignación simple :=

Una expresión de asignación simple se evalúa solo una vez, en la primera aparición. Por ejemplo, si CC :=${GCC} ${FLAGS}durante el primer encuentro se evalúa a, gcc -Wentonces cada vez que ${CC}ocurra será reemplazado por gcc -W.

Asignación recursiva =

Una expresión de asignación recursiva se evalúa cada vez que se encuentra la variable en el código. Por ejemplo, una instrucción como CC = ${GCC} {FLAGS}se evaluará solo cuando ${CC} file.cse ejecute una acción como . Sin embargo, si la variable GCCes decir, se reasigna GCC=c++a continuación, el ${CC}se convertirá en c++ -Wdespués de la reasignación.

Asignación condicional ?=

La asignación condicional asigna un valor a una variable solo si no tiene un valor

Anexando +=

Suponga que CC = gccentonces el operador adjunto se usa como CC += -w
entonces CCahora tiene el valorgcc -W

Para obtener más información, consulte estos tutoriales.

Amjad
fuente
"Una expresión de asignación simple se evalúa solo una vez, en la primera aparición": para ser claros, la expansión / evaluación se realiza cuando se define la variable, no la primera vez que se usa.
Michael Burr