You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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,可以通过自定义目标和命令手动管理依赖关系,确保脚本或补丁文件变更时触发补丁步骤:

  1. 定义补丁脚本和补丁文件的路径:
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"
)
  1. 创建自定义命令,执行补丁脚本并生成标记文件(追踪补丁完成状态),同时声明依赖脚本和补丁文件:
# 标记文件路径,放在外部项目的源码目录下
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"
)
  1. 创建自定义目标,依赖上述标记文件:
add_custom_target(apply_my_patches ALL DEPENDS ${PATCH_MARKER})
  1. 配置外部项目,禁用默认PATCH_COMMAND,并依赖自定义补丁目标:
ExternalProject_Add(
    my_external_project
    # 其他必要配置
    PATCH_COMMAND ""  # 禁用默认补丁命令
    # 让外部项目依赖自定义补丁目标,确保补丁完成后再构建
    DEPENDS apply_my_patches
)

这样,当patch_script.sh或任何补丁文件被修改时,apply_my_patches目标会重新执行补丁脚本,进而触发外部项目的重建流程。

内容的提问来源于stack exchange,提问作者Hesky Fisher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:50:29