Quelle est la différence entre la syntaxe $ () et le crochet $ {} entre parenthèses dans Makefile?

Existe-t-il des différences dans l’invocation de variables avec la syntaxe ${var} et $(var) ? Par exemple, dans la manière dont la variable sera étendue ou quelque chose?

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) air plus net, mais ce n’est que la préférence personnelle.

(D’autres réponses pointent vers les sections pertinentes de la documentation de GNU Make, et notez qu’il ne faut pas mélanger les syntaxes dans une seule expression)

La section Bases de références variables de la documentation GNU make état d’ 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) soit ${foo} est une référence valide à la variable foo.

En fait, il semble être assez différent:

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

les sorties

 ab-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 la variable dans $ {…} contient une virgule. J’ai d’abord pensé que $ {…} étoffait la virgule non pas en tant que valeur, mais il s’avère que je ne peux pas la pirater de cette façon. Je ne comprends toujours pas ça … Si quelqu’un avait une explication, je serais heureux de le savoir!

Comme nous l’avons déjà souligné, il n’y a pas de différence, mais soyez prudent de ne pas mélanger les deux types de délimiteurs, car cela peut conduire à des erreurs cryptiques comme unomadh GNU make example.

À partir du manuel GNU make sur la syntaxe d’appel de fonction (mise en évidence du mien):

[…] Si les arguments eux-mêmes contiennent d’autres appels de fonctions ou références de variables, il est préférable d’utiliser le même type de délimiteurs pour toutes les références; écrivez $(subst a,b,$(x)) , pas $(subst a,b,${x}) . Cela est dû au fait qu’il est plus clair et qu’un seul type de délimiteur est associé pour trouver la fin de la référence .

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.