2017-02-16 86 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] $< 
相关问题