makefile并行清理+编译问题

时间:2014-03-25 20:06:46

标签: makefile

我有一个包含3个构建规则的简单makefile:

  1. 清洁(清洁.o)
  2. debug(使用debgging的东西编译我的代码)
  3. 发布(用优化的东西编译我的代码)
  4. 有时我想在调试模式和发布之间切换,所以我会发出这个

    make clean debug -j8
    

    make clean release -j8
    

    这有一个缺点,因为当它正在做干净的东西时,-j8允许make 一些命令,因为.o仍然存在然后那些.o被清除规则删除了编译器抱怨,因为它找不到那些.o

    我可以做类似

    的事情
    make clean; make debug -j8
    

    但由于我在另一个目录中使用了一个奇怪的makefile,命令变为

    make -C ../src -f nMakefile clean ; make -C ../src -f nMakefile -j8 release
    

    那更烦人。我想知道是否有一个 hiddedn-guru-mode-rule 允许我在一行中完成

    希望它足够清楚......

2 个答案:

答案 0 :(得分:1)

如上所述,通常的做法是为目标文件设置不同的子目录。当您并行运行时,我认为您需要强制执行串行执行,以便在发布之前完成清理。一种方法可以是:

clean_release: clean
    +@$(MAKE) -s --no-print-directory release

或者如果您愿意

clean_release:
    +@$(MAKE) -s --no-print-directory clean && $(MAKE) -s --no-print-directory release

答案 1 :(得分:1)

我需要解决同样的问题,我提出的解决方案是解析MAKECMDGOALS clean,然后发出一个shell命令来进行实际的清理工作;比清洁构建作为目标更重要。这样,任何MAKECMDGOALS包括" clean"将作为构建的一部分清理构建,首先是顺序,而不是clean作为其自己的目标异步运行。

-include $(deps)
bin/%.o : %.cpp
    @mkdir -p $@D
    g++ $(flags) $(includes) -MMD -c $< -o $@

.PHONY : clean
clean:
    @echo rm -rf bin/

ifneq ($(filter clean,$(MAKECMDGOALS)),)
    $(shell rm -rf bin/)
endif