来自同一源文件的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_B): DEFINES+=-D_B
$(OBJECTS_C): DEFINES+=-D_C

这就是问题发生的地方:如果我单独陈述目标,则为:

$(OBJFOLDER)/%.a.o: %.cpp
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@
$(OBJFOLDER)/%.b.o: %.cpp
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@
$(OBJFOLDER)/%.c.o: %.cpp
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@

都有效。但是,如果我将所有规则合并为一个规则,则仅评估第一个规则:

$(OBJFOLDER)/%.a.o $(OBJFOLDER)/%.b.o $(OBJFOLDER)/%.c.o: %.cpp
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@

我在干式运行中获得的是构建$(objfolder)/%。P>

有什么想法吗?谢谢!

您可以使用次要扩展来实现此目标:

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

请注意,这不是一种非常惯用的方法,可以使用更常见的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 $$@
endef
$(eval $(foreach variant,$(VARIANTS),$(call make_target,$(variant))))

另一种方法是为您的源文件创建符号链接,并编译具有不同标志的符号。这样,相同的一个通用模式规则(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 $< $@
%.b.cpp : %.cpp
    ln -s $< $@
%.c.cpp : %.cpp
    ln -s $< $@
$(OBJFOLDER)/%.o: %.cpp
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c -o $@ $< 

相关内容

  • 没有找到相关文章

最新更新