web-dev-qa-db-fra.com

Quelle est la différence entre la parenthèse $ () et la syntaxe $ {} entre crochets dans Makefile?

Existe-t-il des différences dans l'appel de variables avec la syntaxe ${var} Et $(var)? Par exemple, dans la façon dont la variable sera développée ou quoi que ce soit?

83
Édouard Lopez

Il n'y a pas de différence - ils signifient exactement la même chose (dans GNU Make et dans POSIX make).

Je pense que $(round brackets) semble plus ordonné, mais c'est juste une préférence personnelle.

(D'autres réponses pointent vers les sections pertinentes de la documentation GNU Make, et notez que vous ne devez pas mélanger les syntaxes dans une seule expression))

67
Norman Gray

La section Bases des références de variables de l'état de la documentation GNU make aucune différence :

Pour remplacer la valeur d'une variable, écrivez un signe dollar suivi du nom de la variable entre parenthèses ou accolades: soit $(foo) ou ${foo} Est une référence valide à la variable foo.

34
Édouard Lopez

Comme déjà correctement souligné, il n'y a pas de différence mais attention à ne pas mélanger les deux types de délimiteurs car cela peut conduire à des erreurs cryptiques comme unomadh GNU faites un exemple.

De le GNU make manual on the Function Call Syntax (accent sur le mien):

[…] Si les arguments eux-mêmes contiennent d'autres appels de fonction ou références de variable, il est plus judicieux d'utiliser le même type de délimiteurs pour toutes les références; écrire $(subst a,b,$(x)), pas $(subst a,b,${x}). En effet, il est plus clair et car un seul type de délimiteur est mis en correspondance pour trouver la fin de la référence .

12
Alexandre Perrin

En fait, cela semble assez différent:

, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)

les sorties

a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.

Mais jusqu'à présent, je n'ai trouvé cette différence que lorsque le nom de variable dans $ {...} contient lui-même une virgule. J'ai d'abord pensé que $ {...} augmentait la virgule non pas en tant que partie de la valeur, mais il s'avère que je ne suis pas en mesure de le pirater de cette façon. Je ne comprends toujours pas ça ... Si quelqu'un avait une explication, je serais heureux de le savoir!

11
unomadh

Le style $ {} vous permet de tester les règles de création dans le shell, si vous avez défini les variables d'environnement correspondantes, car cela est compatible avec bash.

9
Warren MacEvoy

Cela fait une différence si l'expression contient des crochets non équilibrés:

${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))

->

:-(
*** insufficient number of arguments (1) to function 'subst'.  Stop.

Pour les références de variables, cela fait une différence pour les fonctions ou pour les noms de variables qui contiennent des crochets (mauvaise idée)

2
Erik Carstensen