2016-09-22 88 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