我在项目根目录的 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_update
或make external_update_all
或其他任何方式。
除了在外部项目目录中编写自定义目标调用git pull
之外,还有更好的方法吗?如果是,那怎么样?谢谢!
答案 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消息)。