所以我无法在形式的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等中尝试了很多变化但是没有任何作用。如果我把所有内容都放回到明确拼写出来的每一行,那么一切都很好。有什么明显的东西我做错了吗?
答案 0 :(得分:3)
如果Makefile中有宏定义或包含事物的基本语法(不在依赖项或动作中),那么在读取makefile时会立即扩展这些宏。它确实很有意义,因为make需要扩展它们以便弄清楚要读什么。但正因为如此,规则定义的顺序很重要 - 特别是,稍后在文件中定义的其他宏将不会被定义,并将扩展为空。
在您的示例中,function
会发生这种情况 - 当make执行foreach
时,function
尚未定义为任何内容,因此最终会扩展为空。因此,您最终不会包含任何所需的子Makefile。
在$(foreach
/ define function
endef
...行
此外,您不需要在函数内额外eval
次调用(尽管在这种情况下它们可能不会造成任何伤害,如果VAR2
或VAR4
它们可能会导致意外结果扩展到其中包含$
的内容。)