【问题标题】:GNU Make fail with foreach->eval->callGNU Make 因 foreach->eval->call 而失败
【发布时间】:2011-12-20 16:17:48
【问题描述】:

所以我在尝试将一堆重复的行压缩到以下形式的 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 等方面尝试了许多变体,但没有任何效果。如果我将所有内容都放回明确说明的每一行,那么一切都会很好。有什么明显的我做错了吗?

【问题讨论】:

    标签: foreach makefile call eval gnu


    【解决方案1】:

    当您在 Makefile 中有用于定义或包含事物的基本语法的宏(不在依赖项或操作中)时,这些宏会在读取 makefile 时立即展开。这真的很有意义,因为 make 需要扩展它们以找出要阅读的内容。但正因为如此,规则定义的顺序很重要——特别是,文件中稍后定义的其他宏将不会被定义,并将扩展为空。

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

    $(foreach...行移到define function/endef之后

    此外,您不需要在函数内进行额外的 eval 调用(尽管在这种情况下它们可能不会伤害任何东西,但如果 VAR2VAR4 扩展为带有 @ 的东西,它们可能会导致意外结果987654330@在里面。)

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多