如何配置CMake使add_custom_command每次执行make命令时都触发运行
问题根因
你当前使用的POST_BUILD类型自定义命令绑定在mainbin目标上,仅当mainbin本身需要重新构建(例如main.cxx有修改导致目标重新生成)时,才会触发后续的脚本执行逻辑。你修改script.sh后没有改动main.cxx,mainbin不需要重新构建,因此脚本不会运行。
解决方案
根据你的需求,有两种常用配置方式:
方案1:脚本修改自动触发执行
如果需要script.sh内容改动后自动运行脚本,只需将脚本添加为mainbin的依赖即可:
cmake_minimum_required(VERSION 3.21.1) project(testdir) # 用内置变量声明脚本路径,避免写死绝对路径 set(SCRIPT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/script.sh) add_executable(mainbin main.cxx) # 将脚本添加为mainbin的依赖 add_dependencies(mainbin ${SCRIPT_PATH}) set_source_files_properties(${SCRIPT_PATH} PROPERTIES GENERATED TRUE) add_custom_command(TARGET mainbin POST_BUILD COMMAND /bin/sh ${SCRIPT_PATH} # 指定脚本执行的工作目录,按需修改为源码目录或构建目录 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )
方案2:每次执行make都强制运行脚本
如果要求无论是否有文件改动,只要执行make就运行脚本,可以新增一个总是构建的自定义目标:
cmake_minimum_required(VERSION 3.21.1) project(testdir) set(SCRIPT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/script.sh) add_executable(mainbin main.cxx) # 声明总是运行的自定义目标 add_custom_target(run_script ALWAYS COMMAND /bin/sh ${SCRIPT_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) # 让mainbin依赖该目标,每次构建前都会先执行脚本 add_dependencies(mainbin run_script)
补充说明
- 建议使用CMake内置路径变量代替硬编码的绝对路径,避免项目移动或环境变更后路径失效。
- 可根据你的实际需求调整
WORKING_DIRECTORY参数,指定脚本执行的工作目录。
内容的提问来源于stack exchange,提问作者SuperNoob
相关产品推荐
相关产品推荐

