如何让CMake将Shell脚本及补丁文件设为外部项目依赖?
解决CMake ExternalProject_Add补丁脚本及补丁文件变更不触发重建的问题
方案1:使用CMake 3.20+的PATCH_DEPENDS选项(推荐)
如果你的CMake版本在3.20或以上,可以直接利用ExternalProject_Add提供的PATCH_DEPENDS参数,显式指定补丁步骤依赖的文件(包括patch_script.sh和所有补丁文件)。CMake会自动追踪这些文件的变化,一旦文件修改,就会重新执行补丁步骤并触发外部项目重建。
示例配置:
# 定义补丁脚本和所有补丁文件的路径 set(MY_PATCH_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/patch_script.sh") set(MY_PATCH_FILES "${CMAKE_CURRENT_SOURCE_DIR}/patch1.patch" "${CMAKE_CURRENT_SOURCE_DIR}/patch2.patch" # 添加其他补丁文件路径 ) ExternalProject_Add( my_external_project # 其他必要配置:比如URL、SOURCE_DIR、BINARY_DIR等 PATCH_COMMAND bash ${MY_PATCH_SCRIPT} # 指定补丁步骤依赖的文件 PATCH_DEPENDS ${MY_PATCH_SCRIPT} ${MY_PATCH_FILES} )
方案2:自定义目标与命令(兼容旧版本CMake)
如果你的CMake版本低于3.20,可以通过自定义目标和命令手动管理依赖关系,确保脚本或补丁文件变更时触发补丁步骤:
- 定义补丁脚本和补丁文件的路径:
set(MY_PATCH_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/patch_script.sh") set(MY_PATCH_FILES "${CMAKE_CURRENT_SOURCE_DIR}/patch1.patch" "${CMAKE_CURRENT_SOURCE_DIR}/patch2.patch" )
- 创建自定义命令,执行补丁脚本并生成标记文件(追踪补丁完成状态),同时声明依赖脚本和补丁文件:
# 标记文件路径,放在外部项目的源码目录下 set(PATCH_MARKER "${CMAKE_CURRENT_BINARY_DIR}/my_external_project-src/.patched") add_custom_command( OUTPUT ${PATCH_MARKER} # 执行补丁脚本 COMMAND bash ${MY_PATCH_SCRIPT} # 生成标记文件,用于追踪补丁是否已执行 COMMAND ${CMAKE_COMMAND} -E touch ${PATCH_MARKER} # 声明依赖:脚本或补丁文件变化时,重新执行该命令 DEPENDS ${MY_PATCH_SCRIPT} ${MY_PATCH_FILES} # 指定执行补丁的工作目录(外部项目的源码目录) WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/my_external_project-src" )
- 创建自定义目标,依赖上述标记文件:
add_custom_target(apply_my_patches ALL DEPENDS ${PATCH_MARKER})
- 配置外部项目,禁用默认PATCH_COMMAND,并依赖自定义补丁目标:
ExternalProject_Add( my_external_project # 其他必要配置 PATCH_COMMAND "" # 禁用默认补丁命令 # 让外部项目依赖自定义补丁目标,确保补丁完成后再构建 DEPENDS apply_my_patches )
这样,当patch_script.sh或任何补丁文件被修改时,apply_my_patches目标会重新执行补丁脚本,进而触发外部项目的重建流程。
内容的提问来源于stack exchange,提问作者Hesky Fisher
相关产品推荐
相关产品推荐

