cmake:在使用主cmakelists之前从git检索库

时间:2016-01-25 20:51:09

标签: c++ git cmake

我通过附加的cmakelists.txt从github获取Catch库,该库包含在主要文件中:

cmake_minimum_required(VERSION 3.2)
project(MyProject)

add_subdirectory(ext/catch)
include_directories(${CATCH_INCLUDE_DIR} ${CXXOPTS_INCLUDE_DIR} src)
...

Catch的CmakeLists.txt是:

cmake_minimum_required(VERSION 2.8.8)
project(catch_builder CXX)
include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(
    catch
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}
    GIT_REPOSITORY https://github.com/philsquared/Catch.git
    TIMEOUT 10
    UPDATE_COMMAND ${GIT_EXECUTABLE} pull
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
)

# Expose required variable (CATCH_INCLUDE_DIR) to parent scope
ExternalProject_Get_Property(catch source_dir)
set(CATCH_INCLUDE_DIR ${source_dir}/include CACHE INTERNAL "Path to include folder for Catch")
message(${CATCH_INCLUDE_DIR})

但是,主要项目的构建比Catch从Git中检索的更早开始。 如何解决这个问题?我的cmake脚本有什么问题?

2 个答案:

答案 0 :(得分:2)

我认为我有同样的问题,我做的是:

  • 将AddCatch.cmake(catch的cmakelist)放入CMAKE_MODULE_PATH中 e.g.: set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
  • 删除行:project(catch_builder CXX)
  • add_subdirectory(ext/catch)替换为include(AddCatch)

它应该可以正常工作;)

答案 1 :(得分:2)

在您的情况下,ExternalProject_Add执行的下载发生在_build_time,而不是在CMake运行时,因此在调用add_subdirectory时,下载将不会发生。只需一点点工作,您就可以使用CMake的ExternalProject_Add命令在CMake / configure时从github下载Catch,而不是在构建时。这意味着当您致电add_subdirectory时它将出现。有一篇文章here展示了如何做到这一点(它使用GoogleTest作为示例,它链接到一个完全通用的实现,你应该能够直接用于你的情况)。一般方法是它创建一个小脚本,通过CMake的脚本模式调用,以强制立即发生ExternalProject_Add调用。