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


Answers:


95

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

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

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


11
我使用$()make来避免在make和shell变量之间引起混淆(超过已经存在的混淆)。GNU提供有关变量引用的文档
Etan Reisner 2014年

感谢用户@Eloy建议扩展此答案,尽管我拒绝了他们的纲要,只是简单地指出其他答案中的宝贵额外要点。
诺曼·格雷

1
一些工具可能不尊重它们的相同性。IntelliJ IDEA deploy: ${DEPS}对我来说是语法错误,但是显示deploy: $(DEPS)为正确,即使在中调用时两种拼写具有相同的效果make
amacleod


13

正如已经正确指出的那样,没有区别,但是请注意不要混合使用两种定界符,因为它可能导致诸如unomadh GNU make example之类的神秘错误。

GNU make函数调用语法手册(重点为我):

[…]如果参数本身包含其他函数调用或变量引用,则对所有引用使用相同类型的分隔符是最明智的;写$(subst a,b,$(x)),不行$(subst a,b,${x})。这是因为它更清晰,并且因为仅匹配一种定界符才能找到reference的末尾


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.

但是到目前为止,我仅在$ {...}中的变量名称本身包含逗号时才发现这种差异。我最初以为$ {...}并不是将逗号扩展为值的一部分,但是事实证明我无法以这种方式破解它。我仍然不明白这一点...如果有人提出解释,我很高兴知道!


基于Edouard的回答,该回答指出GNU make文档指出没有区别,我想这可能只是一个错误。
基思M

7
正如亚历山大·佩林(Alexandre Perrin)的答案所指出的,两种语法不应混在同一行中。
lenz

11

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


3

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

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

->

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.