¿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.


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.


"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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.