在Makefile文件中可以使用哪些可用的变量赋值和展开方法?

在Makefile文件中可以使用哪些可用的变量赋值和展开方法?,makefile,Makefile,我试图解析一些Makefile文件以读取一些配置文件,我遇到了一系列表达式,如: AAA := Some, text BBB_NAME := @AAA@ (c) CCC = value DDD = Some other $(CCC) xxx 我想知道是否所有这些都有效,如果它们之间有任何区别(这样我就可以正确地解析它们)。它们都有效,您可以通过将它们放入Makefile并运行它来判断。如果你想知道它们的实际值,你可以试试 $(info $(AAA)) (请注意,唯一真正的问题是BBB_NAM

我试图解析一些Makefile文件以读取一些配置文件,我遇到了一系列表达式,如:

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

我想知道是否所有这些都有效,如果它们之间有任何区别(这样我就可以正确地解析它们)。

它们都有效,您可以通过将它们放入Makefile并运行它来判断。如果你想知道它们的实际值,你可以试试

$(info $(AAA))
(请注意,唯一真正的问题是
BBB_NAME
中的
(c)
,如果将其传递到其他函数中,可能会导致问题。)

一个棘手的部分是
=
:=
(以及其他赋值运算符)之间的区别。完整的细节在中,但基本上,
:=
会立即计算右侧,而
=
会一直等到左侧的某个地方进行计算。考虑

CCC = value
DDD := Some other $(CCC) xxx
EEE = Some other $(CCC) xxx
DDD
的值现在是
一些其他值xxx
,而EEE的值是
一些其他$(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"

使用$(value…)函数更准确,如
$(info$(value AAA))
。这将显示
AAA
变量的内容,而不首先尝试展开它。使用类似于
$(AAA)
的引用将在显示之前展开该值。