在makefile中构建多个目标

时间:2013-02-12 18:03:21

标签: makefile

知道为什么这样的东西在makefile中不起作用吗?

all : $(GOAL_DB) $(GOAL)

%.d: %.cpp      
    $(CC) $(CPPFLAGS_DB) $<  > $@
%.o : %.cpp
    $(CC) $(FLAGS_DB) $< -o $@

$(GOAL_DB) : $(OFILES)
        $(CC) $(LFLAGS_DB) -o $@ $^ $(LIBS_DB)
    strip $(GOAL_DB)
    rm -f *.o *.d

%.d: %.cpp     
    $(CC) $(CPPFLAGS) $<  > $@
%.o : %.cpp
    $(CC) $(FLAGS) $< -o $@
$(GOAL) : $(OFILES)
        $(CC) $(LFLAGS) -o $@ $^ $(LIBS)
    strip $(GOAL)
    rm -f *.o *.d

我只是尝试使用make all,GNU make来构建两个不同的目标。

第一个目标构建正常,但它没有为另一个目标创建新的目标文件。

1 个答案:

答案 0 :(得分:3)

makefile与按顺序执行的标准程序不同。您似乎已经假设在新目标出现之前出现的新规则将适用于该目标。不是这种情况。在开始应用规则之前,makefile会针对变量,目标,依赖关系等进行全面评估。

Make会将那些$(OFILES)与那些%。d:target中的一个匹配,可能是它找到的第一个目标模式。

你没有为另一个目标获取新对象的原因是为了使你看起来像是在构建同一组文件两次,因此跳过第二个构建因为它已经完成了。

解决方案是使用'目标特定变量':

all : $(GOAL_DB) $(GOAL)

$(GOAL): BUILD_FLAGS=$(FLAGS)
$(GOAL): BUILD_CPPFLAGS=$(CPPFLAGS)
$(GOAL): BUILD_OUTDIR=./outdir
$(GOAL): $(OFILES)

$(GOAL_DB): BUILD_FLAGS=$(FLAGS_DB)
$(GOAL_DB): BUILD_CPPFLAGS=$(CPPFLAGS_DB)
$(GOAL_DB): BUILD_OUTDIR=./outdir_db
$(GOAL_DB): $(OFILES)

%.d: %.cpp      
    mkdir -p $(BUILD_OUTDIR)
    $(CC) $(BUILD_CPPFLAGS) $<  > $(BUILD_OUTDIR)/$@

%.o : %.cpp
    mkdir -p $(BUILD_OUTDIR)
    $(CC) $(BUILD_FLAGS) $< -o $(BUILD_OUTDIR)/$@