为什么这个变量不是用eval扩展的?

时间:2016-02-14 18:43:19

标签: makefile gnu-make

我对以下makefile有疑问。我使用GNU Make v4.1。

define code
    foo:=hello
    bar:=${foo}
endef

$(eval ${code})
default:
    #${foo}
    #${bar}

${foo}回应hello,但${bar}没有回应。为什么会这样? 我希望${bar}也能回显hello,因为我认为这相当于以下makefile:

foo:=hello
bar:=${foo}
default:
    #${foo}
    #${bar}

2 个答案:

答案 0 :(得分:1)

我是原创海报。我发现了另一个功能'价值'哪个返回值没有扩展。

define code
    foo:=hello
    bar:=${foo}
endef

$(eval $(value code))
default:
    #${foo}
    #${bar}

这也有效。

答案 1 :(得分:0)

添加$(info ${code})以查看正在进行的操作。

当构建${foo}的定义时,

code被扩展,因此code包含

    foo:=hello
    bar:=${foo}

如果您希望在运行${foo}时展开$(eval ${code}),这是eval有用的原因,那么您需要使code的值包含1美元登录。

define code
    foo:=hello
    bar:=$${foo}
endef

在这种情况下,通过使bar成为后期扩展定义,您可以获得相同的结果:

bar=${foo}
foo:=hello
default:
    #${foo}
    #${bar}

eval在更复杂的情况下很有用,尤其是当动态构建字符串eval时。