makefile先决条件中的变量

makefile先决条件中的变量,makefile,prerequisites,Makefile,Prerequisites,是否可以在先决条件中使用makefile变量?我下面的例子有点落后,但应该说明我试图实现的目标: objects_subsystem1 := $(patsubst %.c,%.o,$(wildcard ../src/ss1/*.c)) objects_subsystem2 := $(patsubst %.c,%.o,$(wildcard ../src/ss2/*.c)) all : subsystem1.elf subsystem2.elf %.elf : $(objects_%)

是否可以在先决条件中使用makefile变量?我下面的例子有点落后,但应该说明我试图实现的目标:

objects_subsystem1 := $(patsubst %.c,%.o,$(wildcard ../src/ss1/*.c))
objects_subsystem2 := $(patsubst %.c,%.o,$(wildcard ../src/ss2/*.c))

all : subsystem1.elf subsystem2.elf

%.elf : $(objects_%)
    $(LD) $< -o $@
objects\u子系统1:=$(patsubst%.c、%.o、$(通配符../src/ss1/*.c))
对象\子系统2:=$(patsubst%.c、%.o、$(通配符../src/ss2/*.c))
全部:子系统1.elf子系统2.elf
%.elf:$(对象%)
$(LD)$<-o$@
编辑:
我正在使用GNU Make 3.80,所以很遗憾,SECONDEXPANSION不可用

是,如果您正在使用GNUMake:

.SECONDEXPANSION:
%.elf : $$(objects_%)
    $(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 $@
然后以循环结束(如果值得的话):

定义规则\u模板
对象\u子系统$(1):=$(patsubst%.c、%.o、$(通配符../src/ss$(1)/*.c))
所有:子系统$(1).elf
子系统$(1).elf:$(对象\子系统$(1))
恩德夫
子系统:=1 2 3#这可以自动进行。。。
$(foreach sys,$(subsystem),$(eval$(调用规则模板,$(sys)))
%.elf:
$(LD)$<-o$@

正是我要找的指针。感谢您提供答案。虽然这个答案很好,但在我的旧版本GNU Make 3.80中不起作用。似乎从3.81开始就可以使用:不幸的是,我的make程序是供应商工具链的一部分,我无法更新:(然后一行上的一个简单的
subsystem1.elf:${objects\u subsystem1}
就足够了。如果你需要一堆这样的程序,那么用
$(eval…)
。请详细说明bobbogo。每个“一行程序”是否也需要LD命令?是的,我确实有越来越多这样的程序,因此希望尽可能地自动化。这是一个非常棒的测试版。感谢您提供如此详细的答复:)
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 $@
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 $@