【问题标题】:setting variable with eval in Makefile recipe在 Makefile 配方中使用 eval 设置变量
【发布时间】: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)。有人能指出一些描述这一点的文档,或者解释发生了什么吗?

【问题讨论】:

标签: makefile eval


【解决方案1】:

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

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

第二,所有make变量赋值设置make变量,只有你export他们才会被发送到shell。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2015-02-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多