在Makefile recipe

时间:2016-07-06 20:06:19

标签: makefile eval

我正在查看另一个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)。有人能指出一些描述这个的文档,或解释一下发生了什么吗?

1 个答案:

答案 0 :(得分:2)

我不确定为什么你会指望你提到的任何事情都是真的。也许你不知道这是在使用shell eval吗?这不是它正在做的事情,而是使用GNU make eval函数,即discussed here

与任何其他变量或函数一样,配方中出现的eval不会扩展,直到(并且除非)调用配方,因为目标已过期。有关何时扩展变量和函数的详细信息,请参阅How make Reads a Makefile

其次,所有的变量赋值都设置为变量,只有当你export它们被发送到shell时才会被赋予变量。