【发布时间】:2016-07-06 20:06:19
【问题描述】:
我正在查看另一个 stack overflow question,他们正在使用,看起来像是未记录的 makefile 行为...如果我有以下 Makefile:
X=X
all:
@echo $@: $(X)
$(eval X=Y)
@echo $@ part2: $(X)
all2:
@echo $@: $(X)
然后我运行:
~> make all2
all2: X
~> make all all2
running all
all: X
all part2: Y
all2: Y
我本来希望 $(eval X=Y) 在 Makefile 解析时扩展,并将 shell 变量 X 设置为该配方行的 Y(即什么都不做)。相反,它似乎在运行 all 配方时进行了评估,此外,它似乎设置了 make 变量。我浏览了 make 手册页和在线手册,但找不到任何描述这种行为的东西(我使用的是 GNU Make 4.0)。有人能指出一些描述这一点的文档,或者解释发生了什么吗?
【问题讨论】:
-
您可以在这里找到更多信息:stackoverflow.com/questions/38224102/…。基本上,正如 GNU make 文档中所说,它是在调用时评估的 Makefile 语法部分,因此它仍然是 Makefile 变量,并且确实在目标
all中评估。这是eval文档:gnu.org/software/make/manual/html_node/Eval-Function.html