如何列出CMake/Make构建目标的直接或独立依赖文件?
解决CMake构建中追踪所有依赖(含CMake脚本及配置文件)的问题
看起来你已经摸熟CMake构建Qt/C++项目的基本流程了,现在想让CMake把CMakeLists.txt、配置模板、自定义生成脚本这类非源码文件也纳入依赖追踪,修改它们时自动触发CMake重配置+重新构建对吧?下面给你梳理下CMake的默认行为,以及需要手动补充的配置:
一、CMake默认会自动追踪的依赖文件
不用额外配置,修改这些文件后运行make,CMake会自动重新执行配置步骤并更新构建:
- 所有被CMake处理过的
CMakeLists.txt(顶层+子目录) - 通过
include()引入的.cmake脚本文件 - 使用
configure_file()时指定的输入文件(比如用来生成头文件的模板) - Qt相关的
.ui、.qrc、含Q_OBJECT的.h文件:CMake的Qt模块已经帮你关联了uic/rcc/moc的依赖,修改这些文件会自动触发工具重新生成代码,进而触发编译
二、需要手动添加依赖的场景
如果你的项目用到了CMake默认没覆盖的自定义文件,比如用脚本生成源码的模板、file(READ)读取的配置文件,就得手动告诉CMake追踪它们:
1. 让CMake追踪自定义配置文件(触发重配置)
如果某个文件会影响CMake的配置逻辑(比如你用它来设置编译选项、定义变量),但没通过include()或configure_file()引入,可以把它加入目录的配置依赖:
# 把你的自定义配置文件加入CMake的配置依赖列表 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS /path/to/your/custom.config)
修改这个文件后,下次运行make时CMake会自动重新执行配置逻辑,更新Makefile后再继续构建。
2. 给自定义生成命令添加依赖
如果用add_custom_command生成源码(比如用Python脚本生成cpp文件),一定要把所有相关的输入文件、脚本本身都加到DEPENDS里:
add_custom_command( OUTPUT generated.cpp COMMAND python3 ${PROJECT_SOURCE_DIR}/scripts/my_generator.py ${PROJECT_SOURCE_DIR}/templates/input.tpl > generated.cpp DEPENDS ${PROJECT_SOURCE_DIR}/scripts/my_generator.py # 生成脚本本身 ${PROJECT_SOURCE_DIR}/templates/input.tpl # 生成用的模板文件 COMMENT "Generating generated.cpp from template" )
这样修改my_generator.py或input.tpl时,CMake会先重新生成generated.cpp,再触发对应的编译步骤。
三、验证依赖是否生效的小技巧
可以用make -n命令模拟构建,看看修改目标文件后,Makefile会执行哪些步骤:
touch /path/to/your/CMakeLists.txt make -n MyProgram
如果输出里包含Running CMake to update build files这类内容,说明CMake已经正确追踪到了这个文件的变化。
内容的提问来源于stack exchange,提问作者spraff
相关产品推荐
相关产品推荐

