foreach - GNU Make 失败,foreach->eval->call

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

最佳答案

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

在你的例子中,这发生在 function -- 当 make 去执行 foreach , function还没有被定义为任何东西,所以它最终会扩展为空。因此,您最终不会包含任何您想要的子 Makefile。

移动 $(foreach ... 在 define function 之后的行/endef
此外,您不需要额外的 eval函数内调用(尽管在这种情况下它们可能不会造成任何伤害,但如果 VAR2VAR4 扩展为其中包含 $ 的内容,它们可能会导致意外结果。)

关于foreach - GNU Make 失败,foreach->eval->call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986953/

相关文章:

javascript - 如何调用一个简单的javascript函数();当我单击 .swf 文件(FLASH)中的按钮时?

actionscript-3 - Function.call(someInstance,args) 用于方法。忽略第一个参数

c# - foreach 循环在 C# 中如何工作?

javascript - 需要将每个 post 元素 append 到 slider 的每个 ul li

php - 创建一个foreach循环以在php变量中缓存html表单名称

c++ - 带有命令行参数的 C++ Makefile 和 Bash 脚本

regex - 处理单个和多个单词字符串

bash - 在 Makefile 中提取操作系统名称和版本号

c++ - 将两个相似的 make 规则减少为一个通用规则

更改结构内的调用