【问题标题】:How to clone and integrate external (from git) cmake project into local one如何克隆外部(来自 git)cmake 项目并将其集成到本地项目中
【发布时间】:2016-10-26 16:06:26
【问题描述】:

我在尝试使用 Google Test 时遇到了问题。

有很多关于如何使用ExternalProject_Add将gtest添加到项目中的手册,但是其中大多数描述了一种基于使用gtest下载zip存档并构建它的方法。

我们知道 gtest 是 github 托管和基于 cmake 的项目。所以我想找到原生的cmake方式。

如果这是一个只有标题的项目,我会写这样的:

cmake_minimum_required(VERSION 2.8.8)
include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(
    gtest
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/ext
    GIT_REPOSITORY https://github.com/google/googletest.git
    TIMEOUT 10
    UPDATE_COMMAND ${GIT_EXECUTABLE} pull
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
)

ExternalProject_Get_Property(gtest source_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include CACHE INTERNAL "Path to include folder for GTest")
set(GTEST_ROOT_DIR ${source_dir}/googletest CACHE INTERNAL "Path to source folder for GTest")
include_directories(${INCLUDE_DIRECTORIES} ${GTEST_INCLUDE_DIR} ${GTEST_ROOT_DIR})
message(${GTEST_INCLUDE_DIR})

并从我的 cmake 项目中添加此脚本,例如:

 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/")
 include(AddGTest)
....
 add_dependencies(${PROJECT_NAME} gtest)

但这需要一个构建步骤。

这应该如何实现?

  1. 通过将BUILD_COMMAND 添加到ExternaProject_Add 并与生成的库链接?
  2. 或者通过将 gtest 的 cmakelists 包含到我的项目中,如下所示:

add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)

这是不正确的方法,因为在项目加载的那一刻,该文件夹不存在。

  1. 还有其他方法吗?

什么是正确/首选的方式?

【问题讨论】:

    标签: c++ git cmake googletest


    【解决方案1】:

    我会采用第一种方法。您不需要指定构建命令,因为默认使用 cmake。这可能看起来像:

    cmake_minimum_required(VERSION 3.0)
    project(GTestProject)
    
    include(ExternalProject)
    
    set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external)
    
    ExternalProject_Add(googletest
        GIT_REPOSITORY https://github.com/google/googletest
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
    )
    
    include_directories(${EXTERNAL_INSTALL_LOCATION}/include)
    link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
    
    add_executable(FirstTest main.cpp)
    add_dependencies(FirstTest googletest)
    target_link_libraries(FirstTest gtest gtest_main pthread)
    

    我不知道这是否是正确/首选的方式,如果有的话。如果您想实现第二种方法,则必须先使用 execute_process 下载代码。

    【讨论】:

    • 谢谢,这是我想听到的——“cmake 默认会这样做”,在手册中没有找到这个,并寻找构建命令
    • This article 记录了 gtest 手册现在also recommends 的方式。 CMake 3.11 添加了FetchContent module,它进一步扩展了该方法并使用 gtest 作为其示例之一。
    • @CraigScott 你的回答总是最有启发性的。这值得自己回答,而不仅仅是评论。顺便说一句,我真的很喜欢你的书!
    猜你喜欢
    • 2014-12-10
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2015-08-04
    • 2021-06-29
    相关资源
    最近更新 更多