我正在尝试解析一些Makefile文件来阅读一些配置它们,我遇到了各种各样的表达式,如:
AAA := Some, text
BBB_NAME := @AAA@ (c)
CCC = value
DDD = Some other $(CCC) xxx
我想知道所有这些是否有效以及它们之间有什么区别(所以我可以正确地解析它们)。
答案 0 :(得分:2)
它们都是有效的,您可以将它们放入Makefile并运行它。如果您想知道他们实际采用的是什么值,您可以尝试
$(info $(AAA))
(请注意,唯一真正的问题是(c)
中的BBB_NAME
,如果将其传递给其他函数,则会导致问题。)
一个棘手的部分是=
和:=
(和其他赋值运算符)之间的区别。完整的详细信息位于the manual,但基本上:=
一次评估右侧,而=
保持不变,直到在某处评估左侧。考虑
CCC = value
DDD := Some other $(CCC) xxx
EEE = Some other $(CCC) xxx
DDD
的值现为Some other value xxx
,而EEE的值为Some other $(CCC) xxx
。如果你在某个地方使用它们:
$(info $(DDD))
$(info $(EEE))
将$(DDD)
和$(EEE)
扩展为相同的内容,您会看到
Some other value xxx
Some other value xxx
但存在差异:
CCC = value
DDD := Some other $(CCC) xxx
EEE = Some other $(CCC) xxx
DDD := $(DDD) and yyy # This is perfectly legal.
EEE := $(EEE) and yyy # Infinite recursion. Make will not allow this.
CCC = dimension
$(info $(DDD)) # Produces "Some other value xxx and yyy"
$(info $(EEE)) # Produces "Some other dimension xxx"