我正在寻找以下行为:
# make debug (project is rebuilt. this works fine.)
# make debug (project is not rebuilt because no changes have been made.)
# make release (this is a different target than the currently-built one. I want 'make clean' to run before the release target is built)
# make release (project is not rebuilt because no changes have been made.)
谢谢。
答案 0 :(得分:2)
有趣的问题。我能做到这一点的唯一方法是从外部记录最近的目标(例如将其回显到文件),然后检查它是否与当前目标相同或不同。如果它们是相同的,只需运行常规构建过程;如果它们不同,请先运行make clean
。
我首先尝试了这个,以说明这个过程(未经测试)。
debug release: ifneq ($(MAKECMDGOALS),$(shell cat last_target.txt)) $(MAKE) clean endif @echo $@ > last_target.txt [regular build commands]
这假设两个目标具有相同的配方(对于某些变量具有不同的设置)。如果它们具有不同的配方,则显然必须在两个配方中插入条件部分和echo命令。
答案 1 :(得分:0)
您可能已经或应该拥有DEBUG和RELEASE的单独目录。它们应该是分开的,因为所有中介和可执行文件都是不同的。然后在每个目录中都有单独的make目标/上下文,使用'global'来选择正确的make文件并从那里继续,这将是微不足道的。
答案 2 :(得分:0)
详细说明我的评论,我认为最好的设置是为不同的构建选项集提供不同的输出目录。在您的情况下,debug
有一个输出目录,release
有一个输出目录。我们的想法是在构建期间生成的所有文件(目标文件,库,可执行文件等)都放在特定于目标的目录中。
这会将make release
与make debug
完全分离,并会消除部分构建混淆的可能性。
答案 3 :(得分:0)
据推测,debug
和release
目标会构建相同的文件,但标记不同。有一篇名为Rebuilding when CPPFLAGS changes的Mr. Make文章描述了如何让gmake做你需要的。
或者你可以切换到ElectricMake,一个与gmake兼容的make实现,对标准gmake进行了许多改进,包括分类帐功能,它允许考虑命令行参数/编译器最新检查中的标记,因此您将获得您正在描述的行为,即启用该功能:
emake --emake-ledger=command debug ;# builds everything with debug flags
emake --emake-ledger=command debug ;# does nothing
emake --emake-ledger=command release ;# rebuilds everything with release flags
emake --emake-ledger=command release ;# does nothing
(免责声明:我是ElectricMake的架构师)