因此,我在尝试在以下形式的 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
函数内调用(尽管在这种情况下它们可能不会造成任何伤害,但如果 VAR2
或 VAR4
扩展为其中包含 $
的内容,它们可能会导致意外结果。)
关于foreach - GNU Make 失败,foreach->eval->call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986953/