2016-09-22 87 views
-1

我谨代表以下形式的目标和依赖:重复的百分比字符串

dir_MODULE/target_MODULE: dep_MODULE 

然而,直观的解决方案不起作用:

dir_%/target_%: dep_% 
    @echo 1 
dir_%/target_$*: dep_% 
    @echo 2 

> make: *** No rule to make target `dir_test/target_test'. Stop. 

是否有变通方法并不取决于预先提供MODULE的可能值列表?

(这不是Can I have more than one % sign in a makefile target?重复,因为他们想生成表单dir_STR1/target_STR2的目标的所有可能(STR1,STR2)元组的;我的情况比较简单,因为约束STR1 = STR2的。)

回答

1

这是可能,原则上很简单,但由于Make缺乏正则表达能力,唯一的解决方案(我可以看到)很丑陋。

您可以捕捉目标与"match anything" rule,写为目标的新规则到一个单独的文件(special.mk),然后重新运行该规则制作:

-include special.mk 

special.mk: # not really necessary, but it soothes Make 
    @: 

ruler = dir_$(1)/target_$(1): dep_$(1) 

%: 
    @echo $(call ruler,$(subst target_,,$(notdir [email protected]))) > special.mk 
    @echo '\t'@echo now building '[email protected]' somehow from $$^ >> special.mk 
    @$(MAKE) [email protected] 
-1

你可能想尝试使用eval functionMODULES配方模板

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) 
+0

这是有用的信息,但我特别询问是否有一个解决方案不涉及硬编码模块列表。 – user234461

+0

这可以很容易地通过扩展这个答案来完成。我以为你被困在生成规则,而不是生成模块名称。回答编辑。 –

+0

您编辑的答案仍然需要一个模块名称列表,这只是它们被记录在文件系统中。 – user234461