2013-04-28 99 views
0

是否可以在先决条件中使用makefile变量?我下面的例子是有点落后,但应表现出我想要实现: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 [email protected] 

编辑: 我使用GNU使3.80所以很遗憾SECONDEXPANSION不可!

回答

3

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

只是我正在寻找的指针。感谢您提供答案。 – Chris 2013-04-29 07:59:49

+0

虽然这个答案很好,但它在我的旧版本的GNU Make 3.80中不起作用。似乎从3.81开始可用:http://www.cmcrossroads.com/article/whats-new-gnu-make-381不幸的是,我的make程序是供应商工具链的一部分,而不是我可以更新:( – Chris 2013-04-29 08:52:12

+0

然后一个简单的'subsystem1.elf:$ {objects_subsystem1}'本身就足够了,如果你需要一堆这些,然后用'$(eval ...)'把它放在一个循环中。 – bobbogo 2013-04-29 10:15:04