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

时间:2017-07-31 12:05:03

标签: 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()对目标一样?

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})

2 个答案:

答案 0 :(得分:1)

我用this tutorial完成了这一任务。只需将您的ExternalProject代码放在一个单独的文件中,说“ CMakeLists.txt.dependencies”,然后使用execute_process启动另一个cmake。我首先使用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" )

答案 1 :(得分:-1)

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

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

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