Paw*_*ica 10 cmake external-project
CMake的ExternalProject允许定义如何下载,配置,构建和安装外部项目.所有步骤都将在构建时执行.
我想在主项目配置期间执行外部项目的配置步骤.完成外部项目配置后,可以使用导入目标的描述,以便可以使用find_package()函数加载外部项目.
是否可以在配置时构建一些目标?
ExternalProject只是一系列执行步骤.所以你可以使用它的两个实例:
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)
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":第二个项目的构建和跟随步骤将使用第一个项目的配置步骤的结果.
在猎人C ++包管理器做什么,我提出的要求。Hunter基于CMake ExternalProject,但附带了一组预定义的项目。此外,它还在配置期间建立依赖关系,并且可以通过进行访问find_package(... CONFIG)。好东西!
如果您不想在配置时构建项目†,而只想下载它,请使用FetchContent。FetchContent_Declare使用许多与 相同的参数ExternalProject_Add,只是它不允许构建项目。
该文档有一个关于如何使用它的很好的例子:
Run Code Online (Sandbox Code Playgroud)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()
这需要 CMake 3.11 或更高版本。对于以前的版本,您可以从 CMake 存储库以及FetchContent 目录下载FetchContent.cmake模块,确保您遵守 BSD 3-Clause 许可。
† 在配置时构建有一些严重的缺点。例如,除非您非常小心地设置,否则您的库的用户无法控制构建过程。包管理器是更好的解决方案
| 归档时间: |
|
| 查看次数: |
5778 次 |
| 最近记录: |