如何避免执行make clean时自动运行qmake?
我之前也碰到过这个头疼的问题,根源在于qmake生成的Makefile默认把.pro文件设为自身的依赖项——只要.pro有修改,不管你执行make还是make clean,都会先触发qmake重新生成Makefile。这里有两个解决方向,看你需求选:
方案1:只跳过clean场景下的特定代码
如果你只是不想让make clean时执行.pro里的某些代码(比如你那个测试用的warning),可以通过检查MAKEFLAGS环境变量来判断当前是否是clean场景,然后条件执行代码。
修改你的.pro文件成这样:
TARGET = qmake-runs-on-make-clean TEMPLATE = app # 只有非clean场景才执行这段警告 !contains(MAKEFLAGS, clean) { warning(qmake runs even if it's make clean) }
这样当make clean触发qmake时,因为MAKEFLAGS里带着clean关键字,这段代码就会被跳过,不会弹出警告了。
方案2:彻底阻止make clean触发qmake
如果你想完全避免make clean时跑qmake,就得修改生成的Makefile,让clean目标不再依赖于Makefile本身(这样.pro修改后,make clean不会先去更新Makefile)。
可以在.pro里加一段脚本,让qmake生成Makefile后自动修改它:
TARGET = qmake-runs-on-make-clean TEMPLATE = app warning(qmake runs even if it's make clean) # Unix/Linux/macOS 环境下的处理 unix { # 移除clean目标对Makefile的依赖 QMAKE_POST_LINK += @sed -i '/^clean:/s/Makefile//' $$MAKEFILE; } # Windows 环境(需要sed工具,比如Git Bash里的sed) win32 { QMAKE_POST_LINK += @sed -i '/^clean:/s/Makefile//' $$MAKEFILE; }
这个方法用sed把Makefile里的clean: Makefile改成clean:,这样clean目标就不会因为Makefile过期而触发qmake了。
⚠️ 注意:这个方案有点hacky,依赖qmake生成的Makefile格式,如果Qt版本更新导致Makefile结构变了,可能得调整sed命令。另外Windows下要确保系统有sed(比如装Git并把它的bin目录加到PATH里)。还有,用了这个方案后,你修改.pro文件后**必须手动跑qmake**更新Makefile,因为make和make clean都不会自动触发qmake了,这是个需要权衡的点。
内容的提问来源于stack exchange,提问作者Verkh

