Makefile中的括号$()和大括号$ {}语法有什么区别?

时间:2014-08-07 14:51:05

标签: variables syntax makefile

使用语法${var}$(var)调用变量有什么不同吗?例如,变量将被扩展的方式还是什么?

6 个答案:

答案 0 :(得分:64)

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

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

(其他答案指向GNU Make文档的相关部分,请注意,您不应该在单个表达式中混合语法)

答案 1 :(得分:34)

GNU make文档状态中的Basics of Variable References section 无差异

  

要替换变量的值,请写一个美元符号后跟   括号或大括号中变量的名称: $(foo)或   ${foo}是变量foo的有效参考

答案 2 :(得分:12)

正如已经正确指出的那样,没有区别要警惕不要混合使用这两种分隔符,因为它可能会导致像 unomadh GNU make这样的神秘错误示例

来自the GNU make manual on the Function Call Syntax(强调我的):

  

[...]如果参数本身包含其他函数调用或变量引用,则最明智的做法是对所有引用使用相同类型的分隔符;写$(subst a,b,$(x)),而不是$(subst a,b,${x})。这是因为它更清晰,而且因为只匹配一种类型的分隔符来查找引用的结尾

答案 3 :(得分:11)

实际上,它似乎有很大不同:

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

输出

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

但到目前为止,当$ {...}中的变量名称包含逗号时,我才发现这种差异。我首先想到$ {...}正在扩展逗号而不是作为值的一部分,但事实证明我不能以这种方式破解它。我仍然不明白这一点......如果有人有解释,我很高兴知道!

答案 4 :(得分:7)

$ {}样式允许您测试shell中的make规则,如果您设置了相应的环境变量,因为它与bash兼容。

答案 5 :(得分:2)

如果表达式包含不平衡的括号,则会有所不同:

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

->

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

对于变量引用,这对函数或包含方括号的变量名有所不同(不好的主意)