如何在主项目配置期间配置ExternalProject?

Paw*_*ica 10 cmake external-project

CMake的ExternalProject允许定义如何下载,配置,构建和安装外部项目.所有步骤都将在构建时执行.

我想在主项目配置期间执行外部项目的配置步骤.完成外部项目配置后,可以使用导入目标的描述,以便可以使用find_package()函数加载外部项目.

是否可以在配置时构建一些目标?

Tsy*_*rev 8

ExternalProject只是一系列执行步骤.所以你可以使用它的两个实例:

  1. ExternalProject_Add()调用在主项目的配置阶段构建.例如,如该问题所述:

other_project/CMakeLists.txt:

project(other_project)
include(ExternalProject)

ExternalProject_Add(<project_name> <options...>
    BUILD_COMMAND "" # Disable build step.
    INSTALL_COMMAND "" # Disable install step too.
)
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt:

# The first external project will be built at *configure stage*
execute_process(
    COMMAND ${CMAKE_COMMAND} --build . ${CMAKE_SOURCE_DIR}/other_project
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/other_project
)
Run Code Online (Sandbox Code Playgroud)
  1. ExternalProject_Add()调用在main的项目构建阶段构建.

CMakeLists.txt:

# The second external project will be built at *build stage*
ExternalProject_Add(<project_name> <options...>
    CONFIGURE_COMMAND "" # Disable configure step. But other steps will be generated.
)
Run Code Online (Sandbox Code Playgroud)

通过对两个调用使用相同的<options>,ExternalProject_Add()我们实现了两个创建的外部项目的"preemtion":第二个项目的构建和跟随步骤将使用第一个项目的配置步骤的结果.

  • 请注意,如果execute_process尚不存在,将不会创建其WORKING_DIRECTORY,因此在执行进程之前,您可能需要调用file(MAKE_DIRECTORY $ {CMAKE_BINARY_DIR} / other_project)。不确定较旧版本的CMake是否适用... (2认同)

Paw*_*ica 5

猎人C ++包管理器做什么,我提出的要求。Hunter基于CMake ExternalProject,但附带了一组预定义的项目。此外,它还在配置期间建立依赖关系并且可以通过进行访问find_package(... CONFIG)。好东西!


Jus*_*tin 5

如果您不想在配置时构建项目,而只想下载它,请使用FetchContentFetchContent_Declare使用许多与 相同的参数ExternalProject_Add,只是它不允许构建项目。

文档有一个关于如何使用它的很好的例子:

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
  FetchContent_Populate(googletest)
  add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
endif()
Run Code Online (Sandbox Code Playgroud)

这需要 CMake 3.11 或更高版本。对于以前的版本,您可以从 CMake 存储库以及FetchContent 目录下载FetchContent.cmake模块,确保您遵守 BSD 3-Clause 许可。

† 在配置时构建有一些严重的缺点。例如,除非您非常小心地设置,否则您的库的用户无法控制构建过程。包管理器是更好的解决方案