1

我正在尝试解析一些 Makefile 文件以读取它们的一些配置,并且遇到了各种各样的表达式,例如:

AAA := Some, text
BBB_NAME := @AAA@ (c)
CCC = value
DDD = Some other $(CCC) xxx

我想知道所有这些是否有效以及它们之间是否有任何区别(以便我可以正确解析它们)。

4

1 回答 1

2

它们都是有效的,您可以通过将它们放入 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"
于 2012-05-03T12:18:02.570 回答