是的,如果你使用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