如何在规则之外循环生成文件

问题描述 投票:0回答:1

我想在 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 和其他命令行工具)?

gnu-make
1个回答
0
投票

为此,您必须使用

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

© www.soinside.com 2019 - 2024. All rights reserved.