Quelle est la différence entre: = et = dans Makefile?

Réponses:

76

Ceci est décrit dans la documentation GNU Make, dans la section intitulée 6.2 Les deux saveurs des variables .

En bref, les variables définies avec :=sont développées une fois, mais les variables définies avec =sont développées chaque fois qu'elles sont utilisées.

Greg Hewgill
la source
4
Alors serait-il correct de dire que: = est plus efficace? Ou l'efficacité n'est-elle pas vraiment un facteur avec Makefiles?
Ungeheuer
3
@Ungeheuer Ce n'est pas un problème car l'appel de processus (le maketravail principal de la tâche) a une surcharge beaucoup plus importante qu'une telle résolution de variable interne.
Kirill Bulygin
63

Affectation simple :=

Une expression d'affectation simple est évaluée une seule fois, à la toute première occurrence. Par exemple, si CC :=${GCC} ${FLAGS}lors de la première rencontre est évalué à gcc -Walors chaque fois ${CC}qu'il se produit, il sera remplacé par gcc -W.

Affectation récursive =

Une expression d'affectation récursive est évaluée chaque fois que la variable est rencontrée dans le code. Par exemple, une instruction comme CC = ${GCC} {FLAGS}ne sera évaluée que lorsqu'une action comme ${CC} file.csera exécutée. Cependant, si la variable GCCest réaffectée, c'est-à-dire que GCC=c++le ${CC}sera converti c++ -Waprès la réaffectation.

Affectation conditionnelle ?=

L'affectation conditionnelle affecte une valeur à une variable uniquement si elle n'a pas de valeur

Ajout +=

Supposons CC = gccqu'alors l'opérateur d'ajout est utilisé comme CC += -w
alors a CCmaintenant la valeurgcc -W

Pour plus d'informations, consultez ces tutoriels

Amjad
la source
"Une expression d'affectation simple n'est évaluée qu'une seule fois, à la toute première occurrence": pour être clair, l'expansion / évaluation est effectuée lorsque la variable est définie, pas la première fois qu'elle est utilisée.
Michael Burr le