如何在配置主要项目时构建 cmake ExternalProject?
How to build cmake ExternalProject while configurating main one?
当安装目标混乱时,引用 ExternalProjects 可能会很痛苦。因此,在为给定项目生成主项目文件之前,可能需要构建和安装一次 ExternalProjects。 CMake 是否可行以及如何实现?
您可以在 execute_process
中使用 cmake
调用来配置和构建 CMake 项目,其中包含 ExternalProject:
other_project/CMakeLists.txt:
project(other_project)
include(ExternalProject)
ExternalProject_Add(<project_name> <options...>)
CMakeLists.txt:
# Configure external project
execute_process(
COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}/other_project
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/other_project
)
# Build external project
execute_process(
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/other_project
)
这样的方式other_project会在目录${CMAKE_BINARY_DIR}/other_project
中配置构建。如果你不在 ExternalProject_Add
调用中禁用安装,那么它将在构建 other_project.
时执行
通常,您希望 ExternalProject 的一些选项,如 SOURCE_DIR
、BINARY_DIR
、INSTALL_DIR
,可以从主项目中的变量推导出来。您有两种方法可以实现:
为 other_project 和 configure_file
创建 CMakeLists.txt,称为来自主项目(在 execute_process
命令之前)。
将主项目的变量作为 -D
参数传递给 ${CMAKE_COMMAND}
。
分隔 execute_process
顺序调用 COMMANDS
很重要。否则,如果将单个 execute_process
与多个 COMMANDS
一起使用,这些命令将只是“管道”(同时执行,但第一个命令的输出被视为第二个命令的输入)。
当安装目标混乱时,引用 ExternalProjects 可能会很痛苦。因此,在为给定项目生成主项目文件之前,可能需要构建和安装一次 ExternalProjects。 CMake 是否可行以及如何实现?
您可以在 execute_process
中使用 cmake
调用来配置和构建 CMake 项目,其中包含 ExternalProject:
other_project/CMakeLists.txt:
project(other_project)
include(ExternalProject)
ExternalProject_Add(<project_name> <options...>)
CMakeLists.txt:
# Configure external project
execute_process(
COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}/other_project
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/other_project
)
# Build external project
execute_process(
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/other_project
)
这样的方式other_project会在目录${CMAKE_BINARY_DIR}/other_project
中配置构建。如果你不在 ExternalProject_Add
调用中禁用安装,那么它将在构建 other_project.
通常,您希望 ExternalProject 的一些选项,如 SOURCE_DIR
、BINARY_DIR
、INSTALL_DIR
,可以从主项目中的变量推导出来。您有两种方法可以实现:
为 other_project 和
configure_file
创建 CMakeLists.txt,称为来自主项目(在execute_process
命令之前)。将主项目的变量作为
-D
参数传递给${CMAKE_COMMAND}
。
分隔 execute_process
顺序调用 COMMANDS
很重要。否则,如果将单个 execute_process
与多个 COMMANDS
一起使用,这些命令将只是“管道”(同时执行,但第一个命令的输出被视为第二个命令的输入)。