你可能想嘗試使用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