Cmake 当update_DISCONNECTED设置为ON时,如何触发ExternalProject的更新

Cmake 当update_DISCONNECTED设置为ON时,如何触发ExternalProject的更新,cmake,Cmake,我在项目根目录的外部目录中有以下CMakeLists.txt文件。它应该为我提供fetchcatch(仅头部单元测试库) 这对我来说很好,除了一件事 我已将UPDATE_DISCONNECTED设置为1,因为我不想在每次生成中检查更新(检查更新需要一些时间) 但我仍然希望有机会从CMake自身更新外部项目。例如,通过执行makecatch\u update或makeexternal\u update\u all或其他操作 有没有比在外部项目目录中编写自定义目标调用git pull更好的方法呢?如

我在项目根目录的外部目录中有以下CMakeLists.txt文件。它应该为我提供fetchcatch(仅头部单元测试库)

这对我来说很好,除了一件事

我已将UPDATE_DISCONNECTED设置为1,因为我不想在每次生成中检查更新(检查更新需要一些时间)

但我仍然希望有机会从CMake自身更新外部项目。例如,通过执行
makecatch\u update
makeexternal\u update\u all
或其他操作


有没有比在外部项目目录中编写自定义目标调用
git pull
更好的方法呢?如果是的话,怎么办?谢谢

好的,所以在额外搜索之后,这似乎是唯一的方法。添加带有更新的自定义目标。它并不漂亮,但它正在发挥作用

#we need git executable
find_package(Git REQUIRED)

# update Catch target
add_custom_target(external-Catch-update
    COMMENT "Updated Catch"
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Catch/src/Catch
    COMMAND ${GIT_EXECUTABLE} pull
    DEPENDS Catch)

ExternalProject模块有一个目标选项,
STEP_TARGETS
,您可以在其中添加,例如,“update”。在调用
ExternalProject\u Add
时,只需添加一行,
STEP\u TARGETS update
。这将自动创建一个目标(在您的例子中是Catch update),它调用一个非常复杂的CMake脚本(在您的例子中可能是projectRoot/external/Catch/tmp/Catch gitupdate.CMake)。ExternalProject模块本身创建此gitupdate脚本。剧本不仅仅是简单的拉动;例如,它将根据需要隐藏本地更改,并将其弹出。我一周前刚用过这个,非常满意

从更新_断开连接选项(由我添加的黑体字)中:

启用此选项后,将跳过更新步骤。但是,它不会阻止下载步骤更新步骤仍然可以添加为步骤目标(请参阅ExternalProject_Add_StepTargets())并手动调用。如果您希望允许开发人员在断开与网络的连接时构建项目(尽管下载步骤可能仍然需要网络),此功能非常有用

但是,当您使用步骤目标选项调用
ExternalProject\u Add
时,会自动为您调用
ExternalProject\u Add\u StepTargets


最后一件事:您不需要像在第一个答案中那样调用
find_-package(Git-REQUIRED)
。通过在调用
ExternalProject\u Add
时设置
GIT\u REPOSITORY
,模块本身将尝试查找GIT(如果找不到,将发出致命错误消息)。

当您删除下载到的文件夹时,它应该下载最新版本。不确定是否
makeclean
确实删除了此项。是的,但是新的
git clone
git pull
更耗时。在这种情况下,Catch repo很小,所以克隆只需几秒钟,但仍然。。。一定有更好的办法。:)至少我希望有。。。在最坏的情况下,我将在外部项目目录中使用带有
git pull
的自定义目标。如何构建目标?通过步骤创建的目标_TARGETS@quetzalfir正如我在回答中指出的那样,目标将被称为“捕获更新”。如果您使用make作为构建工具,“makecatchupdate”;如果你使用忍者,“忍者捕捉更新”。
#we need git executable
find_package(Git REQUIRED)

# update Catch target
add_custom_target(external-Catch-update
    COMMENT "Updated Catch"
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Catch/src/Catch
    COMMAND ${GIT_EXECUTABLE} pull
    DEPENDS Catch)