【问题标题】:How to handle CMake ExternalProject when repo (googletest) has multiple libraries?当 repo(googletest)有多个库时如何处理 CMake ExternalProject?
【发布时间】:2016-01-18 18:24:07
【问题描述】:

当项目的 repo 不是我要使用的库的根目录时,我如何在 CMake 中添加外部项目,但实际上包含两个目录,每个目录都是我要在项目中使用的 repos 的根目录?

我正在努力建立一个使用 Google Test 和 Mock 进行测试的框架 CMake 项目,但是当我尝试使用 ExternalProject_Add 下载 google 测试存储库 (https://github.com/google/googletest) 时,它在构建时抱怨它可以'找不到项目的来源。嗯,那是因为 Google 已经将 googletest 和 googlemock 合并到一个项目中,只不过现在是两个项目。

一些repo的文件结构:

googletest-master/
├──[...no CMakeFiles.txt exists here...]
├──googletest/
│  ├──src/
│  └──CMakeFiles.txt
└──googlemock/
   ├──src/
   └──CMakeFiles.txt

当我执行以下操作时...

ExternalProject_Add(
    gtest
    GIT_REPOSITORY https://github.com/google/googletest.git
    TIMEOUT 10
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
    PREFIX "googletest-master"
)

...它将实际的 repo 下载到 googletest-master/src/gtest,因为我在 repo 前面加上“googletest-master”以使其远离我的主要源代码,并且它假设我正在下载一个项目只有源,并且该源在根目录中。

所以我想完成两件事:

  1. 将 repo 下载到 googletest-master 目录中,就像我在那里克隆 repo 或从 GitHub 下载 zip 并解压缩它一样。
  2. 在我的 CMake 项目中构建并包含 googletest 和 googlemock

【问题讨论】:

    标签: github cmake googletest


    【解决方案1】:

    您需要 一个 下载步骤,但需要 两个 构建步骤。不同的ExternalProject_add 命令调用不能共享 步骤,但是您可以将所有这些步骤安排到不同的调用中,并且它们之间具有适当的依赖关系:

    # Single download(git clone)
    ExternalProject_Add(
        googletest-master
        DOWNLOAD_DIR "googletest-master/src" # The only dir option which is required
        GIT_REPOSITORY https://github.com/google/googletest.git
        TIMEOUT 10
        LOG_DOWNLOAD ON
        # Disable all other steps
        CONFIGURE_COMMAND ""
        BUILD_COMMAND ""
        INSTALL_COMMAND ""
    )
    
    # Build gtest from existing sources
    ExternalProject_Add(
        gtest
        DOWNLOAD_COMMAND "" # No download required
        SOURCE_DIR "googletest-master/src/googletest" # Use specific source dir
        PREFIX "googletest-master" # But use prefix for compute other dirs
        INSTALL_COMMAND ""
        LOG_CONFIGURE ON
        LOG_BUILD ON
    )
    
    # gtest should be build after being downloaded
    add_dependencies(gtest googletest-master)
    
    # Build gmock from existing sources
    ExternalProject_Add(
        gmock
        DOWNLOAD_COMMAND "" # No download required
        SOURCE_DIR "googletest-master/src/googlemock" # Use specific source dir
        PREFIX "googletest-master" # But use prefix for compute other dirs
        INSTALL_COMMAND ""
        LOG_CONFIGURE ON
        LOG_BUILD ON
    )
    
    # gmock should be build after being downloaded
    add_dependencies(gmock googletest-master)
    

    【讨论】:

    • 我最终对一些相对路径进行了一些定制,以满足我的需求/偏好——这个解决方案原始导致了一些看起来不必要的复杂目录结构(googletest-master/src/谷歌测试/src)。但这行得通,正是我所需要的。
    【解决方案2】:

    我有一个repository,我在其中使用 CMake 导入 gtest 和 gmock 库,正如您所愿,但使用旧的 SVN 源存储库而不是 GIT。

    我认为关键是只为 gmock 获取源,因为它包含 gtest 源,然后导出两个库。

    CMakeLists.txt 看起来像这样:

    cmake_minimum_required(VERSION 2.8)
    
    include(ExternalProject)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
    set(GMOCK_VERSION "1.7.0")
    set(GMOCK_DIR "${CMAKE_CURRENT_BINARY_DIR}/gmock-${GMOCK_VERSION}")
    ExternalProject_Add(project_gmock
        SVN_REPOSITORY http://googlemock.googlecode.com/svn/tags/release-${GMOCK_VERSION}
        PREFIX ${GMOCK_DIR}
        CMAKE_ARGS -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER}
        # Disable update step
        UPDATE_COMMAND ""
        # Disable install step
        INSTALL_COMMAND ""
    )
    ExternalProject_Get_Property(project_gmock source_dir)
    ExternalProject_Get_Property(project_gmock binary_dir)
    
    include_directories(${source_dir}/gtest/include)
    add_library(gtest STATIC IMPORTED)
    set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a)
    add_dependencies(gtest project_gmock)
    add_library(gtest_main STATIC IMPORTED)
    set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a)
    add_dependencies(gtest_main project_gmock)
    include_directories(${source_dir}/include)
    add_library(gmock STATIC IMPORTED)
    set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock.a)
    add_dependencies(gmock project_gmock)
    add_library(gmock_main STATIC IMPORTED)
    set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock_main.a)
    add_dependencies(gmock_main project_gmock)
    
    include_directories(${cpp_utest_SOURCE_DIR}/src)
    set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
    #add_executable(utests )
    #target_link_libraries(utests gmock_main gmock gtest pthread)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      相关资源
      最近更新 更多