我想在 makefile 中执行规则之外的某些初始化操作(涉及读取子文件和内部存在的信息)。
也就是说,我有几个目录,在其中创建了“module.mk”文件(每个目录一个),这些文件包含在这些目录中的 Makefile 中。它们描述了很多东西,包括某些产品的名称。现在,这些产品存储在每个 module.mk 文件中的同一变量中(例如:“ProductS:=foo bar”)
我想要做的是,在父目录的 Makefile 中,依次包含这些文件中的每一个,然后能够对该文件中的 PRODUCTS 变量进行某种处理。例如,将它们(使用适当的路径)添加到文件列表中,我可以在规则中使用它来构建其他内容。
所以,例如:
目录 A:module.mk,包含行 PRODUCTS:=foo bar
目录 B:module.mk,包含行 PRODUCTS:=baz
然后,在父目录的 Makefile 中,有类似的内容 目录:=A B $(foreach DIR,$(DIRECTORIES),include $(DIR)/module.mk;FILES+=$(产品))
我想要更多的处理(通过添加适当的路径和其他东西来修改给定的 makefile 中的产品,但“基本”问题是能够从单个 $(foreach) 调用创建单独的行。 现在,当我尝试类似的事情时,我收到一个 make 错误,它告诉我 “Makefile:515: *** 缺少分隔符。停止。”
是否有解决方案可以按照我设想的方式进行操作,或者我是否必须采取困难的方式,并在规则内进行操作,必须自己解析文件(使用 grep 和其他命令行工具)?
为此,您必须使用
eval
。请参阅 GNU make 手册的以下部分:
而且您可能会发现这一系列博客文章很有趣(从最下面的一篇开始,这是最先写的):
在您的情况下,您需要使用
define
创建变量,然后在 eval
循环中使用 foreach
。比如:
define INCLUDE_ONE
PRODUCTS :=
include $(dir)/module.mk
FILES += $(PRODUCTS)
endef
$(foreach dir,$(DIRECTORIES),$(eval $(value INCLUDE_ONE)))
或者,如果您有多个“论点”,您可以使用
call
。