2012-05-03 41 views
5

在手动:如何在makefile中使用eval函数?

eval函数很特别:它允许您定义新的 makefile的结构是不恒定的;这是 评估其他变量和函数的结果。扩展函数eval 的参数,然后将该扩展的结果解析为 makefile语法。

认识到eval参数被扩展两次是很重要的; 首先通过eval函数,然后当它们被解析为makefile语法时,扩展的结果是 。这意味着当 使用eval时,您可能需要为“$”字符提供额外级别的转义级别。

“扩展两次”使我困惑。

例如,我创建了一个makefile:

define func 
    tmp = $(OBJPATH)/$(strip $1) 
    objs += $$(tmp) 
    $$(tmp) : $2 
     gcc $$^ -o [email protected] 
endef 

all : foo 

$(eval $(call func, foo, 1.c))  

如何eval函数进行扩展?

+0

“eval函数将如何扩展?”你试过了吗? – Beta

回答

15

了解它最简单的方法是用信息来取代EVAL:

$(info $(call func, foo, 1.c)) 

这将作为显示输出的第一次扩张的结果,所以你可以看到什么使实际上将被解析。你没有提供的OBJPATH变量中的值,但如果是obj例如那么在你的情况下,第一膨胀的结果(的通话功能):

tmp = obj/foo 
objs += $(tmp) 
$(tmp) : 1.c 
    gcc $^ -o [email protected] 

然后假装解析器将评估这个,并且在此过程中它将再次展开,因此扩展了$(tmp)之类的内容。