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.


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


"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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.