Makefile 为什么不是';这个变量不是用eval展开的吗?

Makefile 为什么不是';这个变量不是用eval展开的吗?,makefile,gnu-make,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,因为我认为这相当于以下生成文件: foo:=hello bar:=${foo} default: #${fo

我对下面的makefile有一个问题。我使用GNU Make v4.1

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

$(eval ${code})
default:
    #${foo}
    #${bar}
${foo}
回显
hello
,但
${bar}
不回显任何内容。为什么会这样? 我希望
${bar}
也能回显
hello
,因为我认为这相当于以下生成文件:

foo:=hello
bar:=${foo}
default:
    #${foo}
    #${bar}
添加
$(info${code})
以查看发生了什么

${foo}
是在构建
code
的定义时展开的,因此
code
包含

    foo:=hello
    bar:=${foo}
如果希望在运行
$(eval${code})
时展开
${foo}
,这正是
eval
有用的地方,那么需要使
code
的值包含一个美元符号

define code
    foo:=hello
    bar:=$${foo}
endef
在这种情况下,您可以通过将
bar
作为后期扩展定义来实现相同的结果:

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

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

我是原始海报。我发现了另一个函数“value”,它返回值而不进行扩展

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

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

这也很有效。

非常感谢。我完全理解,也非常感谢你纠正我的英语语法错误。我会尽我所能。
$(value…
在使用
$(eval…)