Makefile中括号$()和花括号$ {}的区别是什么?

语法${var}$(var)调用variables有什么区别吗? 例如,variables的方式将被扩展或任何东西?

没有区别 – 它们的意思完全相同(在GNU Make和POSIX make中)。

我认为$(round brackets)看起来更加整齐,但这只是个人偏好。

来自GNU make文档状态的variables引用基础部分 没有区别

要replace一个variables的值,写一个美元符号,后面加上括号或大括号中的variables名称: $(foo)${foo}variablesfoo 的有效引用

事实上,这似乎是相当不同的:

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

输出

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

但到目前为止,我只发现这种差异,当$ {…}的variables名称包含自己的逗号。 我首先想到$ {…}扩展逗号不是价值的一部分,但事实certificate我不能这样破解它。 我还是不明白这个…如果有人有解释,我会很高兴知道!

正如已经正确指出的那样,没有什么区别, 但是不要混淆这两种分隔符,因为它会导致像unomadh GNU例子那样的神秘错误。

从函数调用语法的GNU make手册 (强调我的):

[…]如果参数本身包含其他函数调用或variables引用,则对所有引用使用相同types的分隔符是最明智的; 写$(subst a,b,$(x)) ,而不是$(subst a,b,${x}) 。 这是因为它更清晰,并且因为只有一种types的分隔符被匹配以find引用的结尾