我正在尝试解析一些 Makefile 文件以读取它们的一些配置,并且遇到了各种各样的表达式,例如:
AAA := Some, text
BBB_NAME := @AAA@ (c)
CCC = value
DDD = Some other $(CCC) xxx
我想知道所有这些是否有效以及它们之间是否有任何区别(以便我可以正确解析它们)。
我正在尝试解析一些 Makefile 文件以读取它们的一些配置,并且遇到了各种各样的表达式,例如:
AAA := Some, text
BBB_NAME := @AAA@ (c)
CCC = value
DDD = Some other $(CCC) xxx
我想知道所有这些是否有效以及它们之间是否有任何区别(以便我可以正确解析它们)。
它们都是有效的,您可以通过将它们放入 Makefile 并运行它来判断。如果您想知道他们实际采用的值,您可以尝试
$(info $(AAA))
(请注意,唯一真正的问题是(c)
in BBB_NAME
,如果将其传递给其他函数,可能会导致问题。)
=
一个棘手的部分是和:=
(和其他赋值运算符)之间的区别。完整的细节在手册中,但基本上:=
一次评估右侧,而=
推迟到左侧在某处评估。考虑
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"