cmake - ExternalProject_Add() 完成下载后如何使用 add_subdirectory()?

标签 cmake googletest external-project

我基本上问的问题与问过的问题相同 here .然而,这个问题还没有得到回答。

我想在我的项目中使用 googletest。为此,我使用 ExternalProject_Add(),它使用 git 克隆测试套件。之后,我喜欢用add_subdirectory() .

这也是 official repository 中描述的内容.这种方法的好处是,googletest 中的构建脚本自己处理构建过程。

然而,问题是,add_subdirectory()找不到源文件夹,因为它从一开始就不存在。因此,add_subdirectory()应该取决于ExternalProject_Add()的完成.

是否可以制作 add_subdirectory()受抚养人 ExternalProject_Add() ,就像 add_dependencies() 对目标一样吗?

附注。如果我评论 add_subdirectory(),我可以让它全部编译出,构建它(由于缺少 googletest 库而以错误结束),取消注释并再次构建它(成功)。

ExternalProject_Add(
    googletest
    GIT_REPOSITORY  https://github.com/google/googletest.git
    GIT_TAG         master
    CONFIGURE_COMMAND ""
    BUILD_COMMAND     ""
    INSTALL_COMMAND   ""
    TEST_COMMAND      ""
    )

ExternalProject_Get_Property(googletest source_dir binary_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include)
set(GMOCK_INCLUDE_DIR ${source_dir}/googlemock/include)


add_subdirectory(${source_dir}
                 ${binary_dir})

最佳答案

我用过 this tutorial来实现这一点。只要把你的 ExternalProject在一个单独的文件中编写代码,说“CMakeLists.txt.dependencies”,然后用 execute_process 启动另一个 cmake .我用 configure_file首先将配置信息注入(inject)外部项目并将其复制到构建树中。

configure_file(CMakeLists.txt.dependency.in dependency/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dependency" )
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dependency" )
请注意,该教程具有 ExternalProject单独的代码 CMakeLists.txt文件。 gtest也是如此官方文档。那是因为ExternalProject在构建时运行,而不是配置时。这是一个黑客使用 ExternalProject在配置时将它放在第三个项目中并在主要 CMake 配置步骤的中间执行单独的 CMake+build 运行。
在 3.11 版 CMake 中添加了一个 FetchContent 命令。我没有使用过它,但文档使它看起来像是 ExternalProject 的配置时替代品.这将在配置时获取内容,使其可用于以后 add_subdirectory命令。ExternalProjectFetchContent命令将适用于少数小的和/或模糊的依赖项。如果您的依赖项超过 2 个、大型和/或流行,我建议您查看像 Conan 这样的依赖项管理器。 .它与 CMake 很好地合作。

关于cmake - ExternalProject_Add() 完成下载后如何使用 add_subdirectory()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415493/

相关文章:

c++ - 如何在 cmake 中使用 QML_ELEMENT

cmake - 将 VTK 目录作为系统包含在 Cmake 中

c++ - Ubuntu 上的 Cmake 可执行文件在哪里

c++ - CMake ExternalProject_Add() 和 FindPackage()

cmake 项目构建错误,共享库依赖于另一个库

c++ - 如何使用 googletest 检查两个枚举类元素的相等性?

c++ - CMake 是否以不同方式处理测试源?

windows - 使用 Mingw 编译器编译 google 测试框架

c++ - CMake 链接到外部项目