我有一个包含3个构建规则的简单makefile:
有时我想在调试模式和发布之间切换,所以我会发出这个
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 允许我在一行中完成
希望它足够清楚......
答案 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