2016-07-06 49 views
0

我在看另一个stack overflow question,以及他们使用,看起来是无证行为的makefile ......如果我有下面的Makefile:设置与EVAL变量的Makefile配方

X=X 

all: 
    @echo [email protected]: $(X) 
    $(eval X=Y) 
    @echo [email protected] part2: $(X) 

all2: 
    @echo [email protected]: $(X) 

然后我跑:

~> make all2 
all2: X 
~> make all all2 
running all 
all: X 
all part2: Y 
all2: Y 

我本来期望的$(eval X=Y)在Makefile来扩大解析时间,并设置变量XY该行的RECIP的e(即没做什么)。相反,似乎在all配方运行时进行评估,并且似乎设置了make变量。我已经浏览了make man页面和在线手册,但是我找不到任何描述这种行为的东西(我正在使用GNU Make 4.0)。有人可以给我一些文档描述,或解释发生了什么?

+1

您可能在这里找到更多的信息:http://stackoverflow.com/questions/38224102/make-define-multiple-variables-in-the-same-eval-call。 基本上,正如在GNU make文档中所说的那样,它是在调用时评估的Makefile语法部分,因此它仍然是一个Makefile变量,实际上,它在目标“all”中进行评估。这里是'eval'文档:https://www.gnu.org/software/make/manual/html_node/Eval-Function.html – Tim

回答

2

我不确定为什么你会期望你提到的任何一件事情都是真实的。也许你认为这是使用shell eval,不知何故?这不是它在做什么,它使用GNU make eval函数,它是discussed here

与其他变量或函数一样,出现在配方中的eval直到(和除非)调用配方,因为目标已过期。请参阅How make Reads a Makefile了解变量和函数何时展开的完整细节。

其次,所有使变量赋值设置变量,只有当你将它们发送到shell。