2017-02-16 57 views
0

我有一個二進制文件,需要使用不同的編譯器標誌多次編譯。因此,我有,指出像一個Makefile:Makefile來自同一源文件的多個目標,具有不同的標誌

OBJECTS_A := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.a.o)) 
OBJECTS_B := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.b.o)) 
OBJECTS_C := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.c.o)) 

我還定義了一個規則來更改標誌每個OBJECTS_x:

$(OBJECTS_B): DEFINES+=-D_B 
$(OBJECTS_C): DEFINES+=-D_C 

而這正是問題的發生:如果我陳述分別爲:

$(OBJFOLDER)/%.a.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

$(OBJFOLDER)/%.b.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

$(OBJFOLDER)/%.c.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

所有的作品。不過,如果我合併所有的規則爲一體,只有第一個評價:

$(OBJFOLDER)/%.a.o $(OBJFOLDER)/%.b.o $(OBJFOLDER)/%.c.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

我得到一個預演是隻有$(OBJFOLDER)/%AO對象被建立,但在關聯規則。每個二進制文件都需要其對象(因此b和c二進制文件無法生成)。

任何想法? 謝謝!

+0

具備多目標模式的模式規則意味着完全按照你所經歷的:它期望配方的一次調用打造_ALL_目標。它在程序創建多個輸出文件時使用。請參閱https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html(最後一段) – MadScientist

回答

3

可以使用secondary expansion實現這一目標:

.SECONDEXPANSION: 
$(OBJFOLDER)/%.o: $$(basename $$*).cpp 
     $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected] 

請注意,這是不是這樣做的很地道的方式,更常見的define/call/eval組合可用於生成規則,在你第一次解決方案:

VARIANTS=a b c 

DEFINES_FOR_a= 
DEFINES_FOR_b=-D_B 
DEFINES_FOR_c=-D_C 

define make_target = 
$$(OBJFOLDER)/%.$(1).o: %.cpp 
     $$(COMPILER) $$(CFLAGS) $$(INCFOLDER) $$(DEFINES_FOR_$(1)) -c $$< -o [email protected] 

endef 

$(eval $(foreach variant,$(VARIANTS),$(call make_target,$(variant)))) 
+0

爲什麼特定於目標的變量分配不再工作? – MadScientist

+0

我的不好,它工作得很好,我編輯了答案 –

0

另一種方法是爲源文件創建符號鏈接並編譯具有不同標誌的符號鏈接。這樣,同一個通用模式規則(OBJFOLDER)/%.o: %.cpp可以建立你的所有目標:

OBJECTS_A := $(SOURCES:%.cpp=$(OBJFOLDER)/%.a.o) 
OBJECTS_B := $(SOURCES:%.cpp=$(OBJFOLDER)/%.b.o) 
OBJECTS_B := $(SOURCES:%.cpp=$(OBJFOLDER)/%.c.o) 
$(OBJECTS_B): DEFINES+=-D_B 
$(OBJECTS_C): DEFINES+=-D_C 

%.a.cpp : %.cpp 
    ln -s $< [email protected] 

%.b.cpp : %.cpp 
    ln -s $< [email protected] 

%.c.cpp : %.cpp 
    ln -s $< [email protected] 

$(OBJFOLDER)/%.o: %.cpp 
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c -o [email protected] $< 
相關問題