5

我基本上问的问题和这里问的问题一样。然而,这个问题没有得到回答。

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

这也是官方存储库中描述的内容。这种方法的好处是,googletest 中的构建脚本自己处理构建过程。

但是,问题是add_subdirectory()找不到源文件夹,因为它从一开始就不存在。因此,add_subdirectory()应依赖于完成ExternalProject_Add()

是否可以像 add_dependencies() 那样对目标进行add_subdirectory()依赖?ExternalProject_Add()

PS。如果我注释掉它,我可以让它全部编译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})
4

2 回答 2

3

我使用本教程来实现这一点。只需将您的ExternalProject代码放在一个单独的文件中,例如“CMakeLists.txt.dependencies”,然后使用execute_process. 我configure_file首先使用将配置信息注入外部项目并将其复制到构建树中。

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在构建时运行,而不是在配置时运行。这是一个在配置时使用的 hack,ExternalProject通过将其放入第三个项目并在主要 CMake 配置步骤的中间执行单独的 CMake+build 运行。

随着版本 3.11 CMake 添加了一个FetchContent命令。我没有使用过它,但是文档使它看起来像是在配置时替换ExternalProject. 这将在配置时获取内容,使其可用于以后的add_subdirectory命令。

ExternalProjectandFetchContent命令适用于少量小的和/或模糊的依赖项。如果您的依赖项超过 2 个、大型和/或流行,我建议您查看像Conan这样的依赖项管理器。它与 CMake 的合作非常好。

于 2018-08-14T16:04:07.053 回答
-1

您没有正确遵循该方法。应该只ExternalProject_Add()作为文件中的最终命令CMakeLists.txt.in

CMakeLists.txt.in文件由外部CMakeLists.txt文件调用,以便子项目处理在配置时通过execute_process(). CMakeLists.txt.in只是一个美化的下载器。

因此,所有其他命令add_subdirectory()都被添加到外部CMakeLists.txt文件中。

于 2017-07-31T12:13:48.507 回答