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

时间:2012-05-03 09:22:10

标签: makefile

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

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

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

1 个答案:

答案 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"