use*_*438 4 foreach gnu makefile eval call
因此,我在尝试在以下形式的 makefile 中压缩一堆重复行时遇到了麻烦:
dir := XXX
include dir/Makefile
VAR_1 += $(VAR2) # where VAR2 and VAR4 are defined in the included makefile
VAR_3 += $(VAR4)
Run Code Online (Sandbox Code Playgroud)
像这样的表格:
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
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误,因为 makefile 似乎无法确定如何构建文件。我是 makefile 的新手,我在函数、foreach 等方面尝试了许多变体,但没有任何效果。如果我将所有内容都放回明确说明的每一行,那么一切都会很好。有什么明显的我做错了吗?
当您在 Makefile 中有用于定义或包含事物的基本语法的宏(不在依赖项或操作中)时,这些宏会在读取 makefile 时立即展开。这真的很有意义,因为 make 需要扩展它们以找出要阅读的内容。但正因为如此,规则定义的顺序很重要——特别是,文件中稍后定义的其他宏还没有定义,并将扩展为空。
在您的示例中,这种情况发生在function-- 当 make 执行foreach,function尚未定义为任何内容时,因此它最终扩展为无。因此,您最终不会包含任何您想要的子 Makefile。
$(foreach在define function/之后移动... 行endef
此外,您不需要eval在函数内进行额外的调用(尽管在这种情况下它们可能不会造成任何伤害,但如果VAR2或VAR4扩展到其中包含 a$的内容,它们可能会导致意外结果。)
| 归档时间: |
|
| 查看次数: |
2901 次 |
| 最近记录: |