我正在查看另一个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)。有人能指出一些描述这个的文档,或解释一下发生了什么吗?
答案 0 :(得分:2)
我不确定为什么你会指望你提到的任何事情都是真的。也许你不知道这是在使用shell eval
吗?这不是它正在做的事情,而是使用GNU make eval
函数,即discussed here。
与任何其他变量或函数一样,配方中出现的eval
不会扩展,直到(并且除非)调用配方,因为目标已过期。有关何时扩展变量和函数的详细信息,请参阅How make Reads a Makefile。
其次,所有的变量赋值都设置为变量,只有当你export
它们被发送到shell时才会被赋予变量。