GNU使用foreach-> eval->调用失败

时间:2011-11-02 20:32:32

标签: foreach makefile call eval gnu

所以我无法在形式的makefile中压缩一堆重复的行:

dir := XXX  
include dir/Makefile  
VAR_1 += $(VAR2)    # where VAR2 and VAR4 are defined in the included makefile    
VAR_3 += $(VAR4)    

表格如下:

dir:= XXX1 XXX2 XXX3 ...
$(foreach elements,$(dir),$(eval $(call function,$(elements))))

define function  
$(eval include $(1)/Makefile)  
$(eval VAR_1+=$$(VAR2))  
$(eval VAR_3+=$$(VAR4))  
endef

但是我收到的错误似乎是makefile无法确定如何构建文件。我是makefile的新手,我在函数,foreach等中尝试了很多变化但是没有任何作用。如果我把所有内容都放回到明确拼写出来的每一行,那么一切都很好。有什么明显的东西我做错了吗?

1 个答案:

答案 0 :(得分:3)

如果Makefile中有宏定义或包含事物的基本语法(不在依赖项或动作中),那么在读取makefile时会立即扩展这些宏。它确实很有意义,因为make需要扩展它们以便弄清楚要读什么。但正因为如此,规则定义的顺序很重要 - 特别是,稍后在文件中定义的其他宏将不会被定义,并将扩展为空。

在您的示例中,function会发生这种情况 - 当make执行foreach时,function尚未定义为任何内容,因此最终会扩展为空。因此,您最终不会包含任何所需的子Makefile。

$(foreach / define function

之后移动endef ...行

此外,您不需要在函数内额外eval次调用(尽管在这种情况下它们可能不会造成任何伤害,如果VAR2VAR4它们可能会导致意外结果扩展到其中包含$的内容。)