是的,如果你使用gnumake的:
.SECONDEXPANSION:
%.elf : $$(objects_%)
$(LD) $< -o [email protected]
編輯:
由於@bobbogo指出的,是不需要.SECONDEXPANSION
的解決方案。首先,我們拼出來的規則:
objects_subsystem1 := $(patsubst %.c,%.o,$(wildcard ../src/ss1/*.c))
objects_subsystem2 := $(patsubst %.c,%.o,$(wildcard ../src/ss2/*.c))
objects_subsystem3 := $(patsubst %.c,%.o,$(wildcard ../src/ss3/*.c))
all : subsystem1.elf subsystem2.elf subsystem3.elf
subsystem1.elf : $(objects_subsystem1)
$(LD) $< -o [email protected]
subsystem2.elf : $(objects_subsystem2)
$(LD) $< -o [email protected]
subsystem3.elf : $(objects_subsystem3)
$(LD) $< -o [email protected]
然後我們重新安排的事情一點點:
objects_subsystem1 := $(patsubst %.c,%.o,$(wildcard ../src/ss1/*.c))
all : subsystem1.elf
subsystem1.elf : $(objects_subsystem1)
objects_subsystem2 := $(patsubst %.c,%.o,$(wildcard ../src/ss2/*.c))
all : subsystem2.elf
subsystem2.elf : $(objects_subsystem2)
objects_subsystem3 := $(patsubst %.c,%.o,$(wildcard ../src/ss3/*.c))
all : subsystem3.elf
subsystem3.elf : $(objects_subsystem3)
%.elf :
$(LD) $< -o [email protected]
然後我們使用eval
功能:
define RULE_TEMPLATE
objects_subsystem$(1) := $(patsubst %.c,%.o,$(wildcard ../src/ss$(1)/*.c))
all : subsystem$(1).elf
subsystem$(1).elf : $$(objects_subsystem$(1))
endef
$(eval $(call RULE_TEMPLATE,1))
$(eval $(call RULE_TEMPLATE,2))
$(eval $(call RULE_TEMPLATE,3))
%.elf :
$(LD) $< -o [email protected]
然後用一個循環完成了(如果它是值得的):
define RULE_TEMPLATE
objects_subsystem$(1) := $(patsubst %.c,%.o,$(wildcard ../src/ss$(1)/*.c))
all : subsystem$(1).elf
subsystem$(1).elf : $$(objects_subsystem$(1))
endef
SUBSYSTEMS := 1 2 3 # this can be made automatic...
$(foreach sys,$(SUBSYSTEMS),$(eval $(call RULE_TEMPLATE,$(sys))))
%.elf :
$(LD) $< -o [email protected]
只是我正在尋找的指針。感謝您提供答案。 – Chris 2013-04-29 07:59:49
雖然這個答案很好,但它在我的舊版本的GNU Make 3.80中不起作用。似乎從3.81開始可用:http://www.cmcrossroads.com/article/whats-new-gnu-make-381不幸的是,我的make程序是供應商工具鏈的一部分,而不是我可以更新:( – Chris 2013-04-29 08:52:12
然後一個簡單的'subsystem1.elf:$ {objects_subsystem1}'本身就足夠了,如果你需要一堆這些,然後用'$(eval ...)'把它放在一個循環中。 – bobbogo 2013-04-29 10:15:04