Quelle est la différence entre la GNU Makefile affectations de variables =, ?=, := et +=?
Quelqu'un peut-il donner une explication claire de la façon dont l'attribution de la variable fonctionne vraiment dans les Makefiles.
Quelle est la différence entre :
VARIABLE = value
VARIABLE ?= value
VARIABLE := value
VARIABLE += value
J'ai lu le section dans GNU Make manuel de l', mais encore, elle ne fait pas de sens pour moi.
Vous devez vous connecter pour publier un commentaire.
Paresseux
Réglage Normal de la variable valeurs sont étendue de manière récursive lorsque la variable est utilisé, pas quand elle est déclarée
Immédiate
Réglage d'une variable avec une simple extension de la valeur à l'intérieur - des valeurs sont développées au moment de la déclaration.
Ensemble, Si L'Absence
Réglage d'une variable seulement si il n'a pas une valeur
Ajouter
Ajoutant la valeur fournie à la valeur actuelle (ou la définition de cette valeur, si la variable n'existe pas)
=
est référencé et:=
est en fait une copie par valeur?=
va muter de la variable de référence, si une mutation se produire. à l'aide de:=
volonté est le clone de la référence, de sorte que si une mutation se produire, il l'habitude d'affecter la variable de référence riptutorial.com/makefile/example/21468/...À l'aide de
=
fait que la variable est affectée une valeur. Si la variable a une valeur, il est remplacé. Cette valeur sera étendu lorsqu'il est utilisé. Par exemple:À l'aide de
:=
est similaire à l'utilisation=
. Cependant, au lieu de la valeur en cours d'expansion lorsqu'il est utilisé, il est élargi au cours de la mission. Par exemple:À l'aide de
?=
assigne à la variable une valeur iff la variable n'a pas été précédemment attribué. Si la variable a été précédemment attribué une valeur vide (VAR=
), il est toujours considéré comme l'ensemble je pense que. Sinon, fonctionne exactement comme=
.À l'aide de
+=
est comme l'utilisation de=
, mais au lieu de remplacer la valeur, la valeur est annexé à la présente, avec un espace entre les deux. Si la variable a été définie précédemment avec:=
, il est étendu je pense que. La valeur résultante est élargi lorsqu'il est utilisé je pense que. Par exemple:Si quelque chose comme
HELLO_WORLD = $(HELLO_WORLD) world!
ont été utilisés, la récursivité en résulteraient, qui seraient le plus susceptibles de mettre fin à l'exécution de votre Makefile. SiA := $(A) $(B)
ont été utilisés, le résultat ne serait pas exactement le même qu'à l'aide de+=
parce queB
est élargi avec:=
alors que+=
de ne pas provoquer deB
être élargi.VARIABLE = literal
etVARIABLE := literal
sont toujours équivalentes. Ai-je droit?Je vous suggère de faire quelques expériences à l'aide de "faire". Ici est une simple démo, montrant la différence entre
=
et:=
.make test
imprime:Vérifiez plus d'explication élaborée ici
@
en face de chaque recette pour éviter cette confusion répétition de résultats.Lorsque vous utilisez
VARIABLE = value
, sivalue
est en fait une référence à une autre variable, la valeur est déterminée que lorsqueVARIABLE
est utilisé. Ce fait est illustré par un exemple:Lorsque vous utilisez
VARIABLE := value
, vous obtenez la valeur devalue
comme il est maintenant. Par exemple:À l'aide de
VARIABLE ?= val
signifie que vous ne définissez la valeur deVARIABLE
siVARIABLE
n'est pas déjà défini. Si c'est pas déjà, le réglage de la valeur est reportée jusqu'à ce queVARIABLE
est utilisé (comme dans l'exemple 1).VARIABLE += value
juste ajoutevalue
àVARIABLE
. La valeur réelle devalue
est déterminé comme il l'était quand il a été initialement fixé, à l'aide=
ou:=
.Dans les réponses ci-dessus, il est important de comprendre ce que l'on entend par "valeurs sont développés lors de la déclaration/temps d'utilisation". Donner une valeur comme
*.c
n'implique pas l'expansion. C'est seulement lorsque cette chaîne est utilisée par une commande qu'il va peut-être déclencher certains d'expansion. De même, une valeur comme$(wildcard *.c)
ou$(shell ls *.c)
ne pas entraîner une expansion et est complètement évalués à la définition du temps, même si nous avons utilisé:=
dans la définition de la variable.Essayer le Makefile suivant dans le répertoire où vous avez quelques C fichiers:
De course
make
va déclencher une règle qui crée un supplémentaire (vide) C fichier, appeléfoo.c
mais aucun des 6 variables afoo.c
de sa valeur.