是的,如果您使用的是 GNUMake:
.SECONDEXPANSION:
%.elf : $$(objects_%)
$(LD) $< -o $@
编辑:
正如@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 $@
subsystem2.elf : $(objects_subsystem2)
$(LD) $< -o $@
subsystem3.elf : $(objects_subsystem3)
$(LD) $< -o $@
然后我们重新整理一下:
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 $@
然后我们使用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 $@
然后完成一个循环(如果值得的话):
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 $@