Makefile 为什么不是';这个变量不是用eval展开的吗?
我对下面的makefile有一个问题。我使用GNU Make v4.1Makefile 为什么不是';这个变量不是用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
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…)