UPDATE_DISCONNECTED设置为ON时如何触发ExternalProject的更新

时间:2016-10-25 14:12:56

标签: cmake

我在项目根目录的 external 目录中有以下CMakeLists.txt文件。它应该为我提取 Catch (仅限标题单元测试库)。

include(ExternalProject)

ExternalProject_Add(
   Catch
   # I want to have it downloaded only once, 
   # therefore CMAKE_CURRENT_SOURCE_DIR which is projectRoot/external
   PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/Catch
   GIT_REPOSITORY https://github.com/philsquared/Catch.git
   # disables auto update on every build
   UPDATE_DISCONNECTED 1
   # disable following, since it is not needed
   CONFIGURE_COMMAND ""
   BUILD_COMMAND ""
   INSTALL_DIR ""
   INSTALL_COMMAND ""
)

除了一件事,它对我有用。

我已将UPDATE_DISCONNECTED设置为1,因为我不想在每个构建中检查更新(检查更新需要一些时间)。

但我仍然希望有机会从CMake本身更新外部项目。例如。通过make Catch_updatemake external_update_all或其他任何方式。

除了在外部项目目录中编写自定义目标调用git pull之外,还有更好的方法吗?如果是,那怎么样?谢谢!

2 个答案:

答案 0 :(得分:0)

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

#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)

答案 1 :(得分:0)

ExternalProject模块具有一个目标选项STEP_TARGETS,您可以在其中添加“更新”。在调用ExternalProject_Add时,只需添加一行STEP_TARGETS update。这将自动创建一个目标(在您的情况下为Catch-update),该目标将调用一个非常复杂的CMake脚本(在您的情况下,可能为projectRoot / external / Catch / tmp / Catch-gitupdate.cmake)。 ExternalProject模块本身创建此gitupdate脚本。该脚本的功能远不止简单的提取。它将根据需要存储本地更改,然后将其弹出。我大约一个星期前才使用它,对此感到非常满意。

CMake documentation中获得UPDATE_DISCONNECTED选项(我添加了粗体):

  

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

但是,当您使用STEP_TARGETS选项调用ExternalProject_Add时,会自动为您调用ExternalProject_Add_StepTargets

最后一件事情:您不需要像在第一个答案中那样打find_package(Git REQUIRED)。通过在对GIT_REPOSITORY的调用中设置ExternalProject_Add,模块本身将尝试查找git(如果找不到,将发出FATAL_ERROR消息)。