你可能想尝试使用eval function在MODULES
配方模板
MODULES = mod1 mod2
define MODULE_RULE
dir_$(1)/target_$(1):dep_$(1)
touch [email protected]
endef
$(foreach mod,$(MODULES),$(eval $(call MODULE_RULE,$(mod))))
对于每一个项目一起,一个明确的规则,将产生下面的模式dir_MODULE/target_MODULE: dep_MODULE
。这是一种非常方便的方法来构建遵循特定模式的多条规则,但不容易通过简单的%
规则解决。
编辑:
如果模块的名单之前不知道,应该通过扫描所有dep
名称来确定,然后只需使用:
MODULES=$(patsubst dep_%,%,$(wildcard dep_*))
让所有的模块名称
另外,如果您希望将所有dir_XXX/target_XXX
目标作为另一个目标的先决条件,例如all
,您可以重建从模块名称所有dir_XXX/target_XXX
名称为这样:
DIR_NAMES = $(patsubst %,dir_%/,$(MODULES))
TARGET_NAMES = $(patsubst %,target_%,$(MODULES))
FULLPATH_TARGETS = $(join $(DIR_NAMES),$(TARGET_NAMES))
all: $(FULLPATH_TARGETS)
此外,如果dir_XXX
不存在以前,您可以创建另一个规则来制定的。完整的makefile可能如下所示:
MODULES = $(patsubst dep_%,%,$(wildcard dep_*))
DIR_NAMES = $(patsubst %,dir_%/,$(MODULES))
TARGET_NAMES = $(patsubst %,target_%,$(MODULES))
FULLPATH_TARGETS = $(join $(DIR_NAMES), $(TARGET_NAMES))
dir_%:
mkdir -p [email protected]
define MODULE_RULE
dir_$(1)/target_$(1):dep_$(1) dir_$(1)
touch [email protected]
endef
$(foreach mod,$(MODULES),$(eval $(call MODULE_RULE,$(mod))))
all: $(FULLPATH_TARGETS)
这是有用的信息,但我特别询问是否有一个解决方案不涉及硬编码模块列表。 – user234461
这可以很容易地通过扩展这个答案来完成。我以为你被困在生成规则,而不是生成模块名称。回答编辑。 –
您编辑的答案仍然需要一个模块名称列表,这只是它们被记录在文件系统中。 – user234461