ExternalProject_Add() 下载完成后如何使用 add_subdirectory()?
How do i use add_subdirectory() after ExternalProject_Add() has finished downloading?
我问的问题基本上和 一样。然而这个问题还没有得到回答。
我想在我的项目中使用 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})
您没有正确遵循该方法。 CMakeLists.txt.in
文件中的最后一个命令应该只有 ExternalProject_Add()
。
CMakeLists.txt.in
文件由外部 CMakeLists.txt
文件调用,因此子项目处理通过 execute_process()
在配置时发生。 CMakeLists.txt.in
只是一个美化的下载器。
因此,所有其他命令如 add_subdirectory()
都添加到外部 CMakeLists.txt
文件。
我用 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" )
请注意,本教程在单独的 CMakeLists.txt
文件中包含 ExternalProject
代码。 gtest
官方文档也是如此。这是因为 ExternalProject
运行s 在构建时,而不是配置时。这是一个在配置时使用 ExternalProject
的 hack,方法是将它放在第三个项目中并在您的主要 CMake 配置步骤中间执行单独的 CMake+build 运行。
在 3.11 版本中,CMake 添加了一个 FetchContent
命令。我没有使用过它,但文档使它看起来像是 ExternalProject
的配置时替代品。这将在配置时获取内容,使其可用于以后的 add_subdirectory
命令。
ExternalProject
和 FetchContent
命令可以很好地处理少量 and/or 模糊的依赖项。如果你的依赖项超过 2 个,很大,and/or 流行,我建议你看一下像 Conan 这样的依赖项管理器。它与 CMake 配合得很好。
我问的问题基本上和
我想在我的项目中使用 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})
您没有正确遵循该方法。 CMakeLists.txt.in
文件中的最后一个命令应该只有 ExternalProject_Add()
。
CMakeLists.txt.in
文件由外部 CMakeLists.txt
文件调用,因此子项目处理通过 execute_process()
在配置时发生。 CMakeLists.txt.in
只是一个美化的下载器。
因此,所有其他命令如 add_subdirectory()
都添加到外部 CMakeLists.txt
文件。
我用 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" )
请注意,本教程在单独的 CMakeLists.txt
文件中包含 ExternalProject
代码。 gtest
官方文档也是如此。这是因为 ExternalProject
运行s 在构建时,而不是配置时。这是一个在配置时使用 ExternalProject
的 hack,方法是将它放在第三个项目中并在您的主要 CMake 配置步骤中间执行单独的 CMake+build 运行。
在 3.11 版本中,CMake 添加了一个 FetchContent
命令。我没有使用过它,但文档使它看起来像是 ExternalProject
的配置时替代品。这将在配置时获取内容,使其可用于以后的 add_subdirectory
命令。
ExternalProject
和 FetchContent
命令可以很好地处理少量 and/or 模糊的依赖项。如果你的依赖项超过 2 个,很大,and/or 流行,我建议你看一下像 Conan 这样的依赖项管理器。它与 CMake 配合得很好。