是否有CMake变量可检测构建必要性或无变更?解决POST_BUILD不触发问题
解决CMake无代码变更时POST_BUILD命令不触发的方案
方案1:用带ALWAYS参数的自定义目标替代POST_BUILD
将后置命令迁移到独立的自定义目标中,通过ALWAYS TRUE强制该目标每次构建都执行,同时让它依赖主项目以保证执行顺序。
# 定义主项目 add_executable(MyProject main.cpp) # 创建强制执行的后置命令目标 add_custom_target( MyProject_PostBuild COMMAND echo "执行后置任务:复制资源文件" COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/assets/* ${CMAKE_CURRENT_BINARY_DIR}/assets/ DEPENDS MyProject # 确保主项目构建完成后再执行 ALWAYS TRUE # 强制每次构建都运行此目标 VERBATIM ) # 设置默认构建目标为后置任务,直接cmake --build .就会触发 add_dependencies(MyProject MyProject_PostBuild)
构建时运行默认目标即可,不管主项目代码是否变更,后置命令都会执行。
方案2:让POST_BUILD依赖“动态更新的触发文件”
通过创建一个每次构建都会被修改的临时文件,让POST_BUILD命令依赖该文件,从而强制触发执行。
add_executable(MyProject main.cpp) # 定义触发文件路径 set(POST_BUILD_TRIGGER ${CMAKE_CURRENT_BINARY_DIR}/.post_build_trigger) # 自定义命令:每次构建都更新触发文件 add_custom_command( OUTPUT ${POST_BUILD_TRIGGER} COMMAND ${CMAKE_COMMAND} -E touch ${POST_BUILD_TRIGGER} COMMENT "更新后置命令触发标记" ) # 创建目标管理触发文件的生成 add_custom_target( Update_PostBuild_Trigger DEPENDS ${POST_BUILD_TRIGGER} ) add_dependencies(MyProject Update_PostBuild_Trigger) # 原POST_BUILD命令添加对触发文件的依赖 add_custom_command( TARGET MyProject POST_BUILD COMMAND echo "执行后置命令:生成版本信息" COMMAND ${CMAKE_COMMAND} -D SRC=${PROJECT_SOURCE_DIR}/version.txt -D DST=${CMAKE_CURRENT_BINARY_DIR}/version.txt -P ${PROJECT_SOURCE_DIR}/update_version.cmake DEPENDS ${POST_BUILD_TRIGGER} VERBATIM )
核心逻辑是每次构建都会更新触发文件,CMake检测到文件变化后,会自动触发依赖它的POST_BUILD命令。
方案3:全局构建钩子(适用于所有目标)
如果需要给所有项目添加统一的后置逻辑,可以使用CMAKE_POST_BUILD全局变量,它会在每个目标构建完成后执行,不受目标是否更新的影响。
# 全局后置命令,所有目标构建后都会执行 set(CMAKE_POST_BUILD "${CMAKE_POST_BUILD};echo '全局后置任务完成'")
注意:此方式会作用于所有构建目标,适合全局统一操作,不适合单个项目的定制化需求。
内容的提问来源于stack exchange,提问作者Basti
相关产品推荐
相关产品推荐

