2016-02-14 16 views
1

我有一个关于下面的makefile的问题。我使用GNU Make v4.1。为什么eval没有扩大这个变量?

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} 

回答

0

添加$(info ${code}),看看发生了什么事情。

${foo}code的定义是建立在扩大,所以code包含

foo:=hello 
    bar:=${foo} 

如果你想${foo}当你运行$(eval ${code}),这是什么使将扩大eval有用,那么你需要做的code的值包含美元符号。

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

eval是在更复杂的情况下非常有用,特别是当被eval'ed串建:

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

在这种情况下,你可以通过使bar后期扩张definiton达到同样的效果动态。

+0

非常感谢。我非常了解,也非常感谢您纠正我在英语中的语法错误。我将自己申请。 –

1

我是最初的海报。我发现了另一个函数'value',它返回的值没有扩展。

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

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

这也适用。

+0

'$(value ...)'在使用'$(eval ...)时保持语法理解真的很有帮助' – bobbogo

相关问题