当repo(googletest)有多个库时,如何处理CMake ExternalProject?

Abe*_*olf 6 github cmake googletest

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

我正在努力建立一个使用Google Test和Mock进行测试的框架CMake项目,但是当我尝试下载google test repo(https://github.com/google/googletest)时ExternalProject_Add,它会在构建时抱怨它无法找到项目的来源.好吧,那是因为谷歌已经将googletest和googlemock合并为一个项目,除了它现在是两个项目.

一些repo的文件结构:

googletest-master/
???[...no CMakeFiles.txt exists here...]
???googletest/
?  ???src/
?  ???CMakeFiles.txt
???googlemock/
   ???src/
   ???CMakeFiles.txt
Run Code Online (Sandbox Code Playgroud)

当我做以下事情......

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"
)
Run Code Online (Sandbox Code Playgroud)

...它下载了实际的回购,googletest-master/src/gtest因为我在回购时使用"googletest-master"来保持它不受我的主要源代码的影响,并且它假设我正在下载一个只有源代码的项目,而且该源代码是在根目录中.

所以我想完成两件事:

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

Tsy*_*rev 8

您需要单个下载步骤,但需要两个构建步骤.不同的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)
Run Code Online (Sandbox Code Playgroud)