2013-04-28 100 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