Ensemble paresseux
VARIABLE = value
Réglage normal d'une variable, mais toutes les autres variables mentionnées avec le value
champ sont récursivement développées avec leur valeur au point où la variable est utilisée, pas celle qu'elle avait lorsqu'elle a été déclarée
Ensemble immédiat
VARIABLE := value
Définition d'une variable avec simple expansion des valeurs à l'intérieur - les valeurs à l'intérieur sont développées au moment de la déclaration.
Paresseux si absent
VARIABLE ?= value
Définition d'une variable uniquement si elle n'a pas de valeur. value
est toujours évalué lors de l' VARIABLE
accès. C'est équivalent à
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Voir la documentation pour plus de détails.
Ajouter
VARIABLE += value
Ajout de la valeur fournie à la valeur existante (ou définition de cette valeur si la variable n'existait pas)
L'utilisation
=
entraîne l'attribution d'une valeur à la variable. Si la variable avait déjà une valeur, elle est remplacée. Cette valeur sera développée lors de son utilisation. Par exemple:L'utilisation
:=
est similaire à l'utilisation=
. Cependant, au lieu de développer la valeur lors de son utilisation, elle est développée lors de l'affectation. Par exemple:L'utilisation
?=
affecte à la variable une valeur si la variable n'a pas été précédemment affectée. Si la variable a été précédemment affectée d'une valeur vide (VAR=
), elle est toujours considérée comme définie, je pense . Sinon, fonctionne exactement comme=
.Utiliser,
+=
c'est comme utiliser=
, mais au lieu de remplacer la valeur, la valeur est ajoutée à la valeur actuelle, avec un espace entre les deux. Si la variable a été précédemment définie avec:=
, elle est développée je pense . La valeur résultante est élargie lorsqu'elle est utilisée, je pense . Par exemple:Si quelque chose du genre
HELLO_WORLD = $(HELLO_WORLD) world!
était utilisé, une récursivité en résulterait, ce qui mettrait très probablement fin à l'exécution de votre Makefile. Si ellesA := $(A) $(B)
étaient utilisées, le résultat ne serait pas exactement le même que celui utilisé+=
carB
est développé avec:=
alors+=
qu'il ne provoquerait pasB
de développement.la source
VARIABLE = literal
etVARIABLE := literal
est toujours équivalente. Ai-je bien compris?Je vous suggère de faire quelques expériences en utilisant "make". Voici une démo simple, montrant la différence entre
=
et:=
.make test
impressions:Vérifiez l'explication plus élaborée ici
la source
@
devant chaque recette pour éviter cette répétition confuse des résultats./* ... */
commentaires de blocLorsque vous utilisez
VARIABLE = value
, sivalue
est en fait une référence à une autre variable, la valeur n'est déterminée que lorsqu'elleVARIABLE
est utilisée. Ceci est mieux illustré par un exemple:Lorsque vous utilisez
VARIABLE := value
, vous obtenez la valeur devalue
ce qu'elle est maintenant . Par exemple:L'utilisation
VARIABLE ?= val
signifie que vous définissez uniquement la valeur deVARIABLE
siVARIABLE
n'est pas déjà définie. S'il n'est pas déjà défini, le réglage de la valeur est différé jusqu'à ce qu'ilVARIABLE
soit utilisé (comme dans l'exemple 1).VARIABLE += value
ajoute justevalue
àVARIABLE
. La valeur réelle devalue
est déterminée telle qu'elle était lorsqu'elle a été initialement définie, à l'aide de=
ou:=
.la source
Dans les réponses ci-dessus, il est important de comprendre ce que l'on entend par "les valeurs sont développées au moment de la déclaration / de l'utilisation". Donner une valeur comme
*.c
n'implique aucune expansion. Ce n'est que lorsque cette chaîne est utilisée par une commande qu'elle déclenchera peut-être un globbing. De même, une valeur comme$(wildcard *.c)
ou$(shell ls *.c)
n'implique aucune expansion et est complètement évaluée au moment de la définition même si nous avons utilisé:=
dans la définition de variable.Essayez le Makefile suivant dans le répertoire où vous avez des fichiers C:
L'exécution
make
déclenchera une règle qui crée un fichier C supplémentaire (vide), appeléfoo.c
mais aucune des 6 variables n'afoo.c
de valeur.la source