[TOC]
  • 获取软件包(FetchContent) (CMake 3.11+)

获取软件包(FetchContent) (CMake 3.11+)

有时你想要在配置的时候下载数据或者是包,而不是在编译的时候下载。这种方法已经被第三方包重复“发明”了好几次。最终,这种方法在 CMake 3.11 中以 FetchContent 模块的形式出现。

FetchContent 模块有出色的文档,我在此不会赘述。我会阐述这样几个步骤:

  • 使用 FetchContent_Declare(MyName) 来从 URL、Git 仓库等地方获取数据或者是软件包。
  • 使用 FetchContentGetProperties(MyName) 来获取 MyName* 等变量的值,这里的 MyName 是上一步获取的软件包的名字。
  • 检查 MyName_POPULATED 是否已经导出,否则使用 FetchContent_Populate(MyName) 来导出变量(如果这是一个软件包,则使用 add_subdirectory(“${MyName_SOURCE_DIR}” “${MyName_BINARY_DIR}”) )

比如,下载 Catch2 :

FetchContent_Declare(  catch  GIT_REPOSITORY https://github.com/catchorg/Catch2.git  GIT_TAG        v2.13.6)# CMake 3.14+FetchContent_MakeAvailable(catch)

如果你不能使用 CMake 3.14+ ,可以使用适用于低版本的方式来加载:

# CMake 3.11+FetchContent_GetProperties(catch)if(NOT catch_POPULATED)  FetchContent_Populate(catch)  add_subdirectory(${catch_SOURCE_DIR} ${catch_BINARY_DIR})endif()

当然,你可以将这些语句封装到一个宏内:

if(${CMAKE_VERSION} VERSION_LESS 3.14)    macro(FetchContent_MakeAvailable NAME)        FetchContent_GetProperties(${NAME})        if(NOT ${NAME}_POPULATED)            FetchContent_Populate(${NAME})            add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR})        endif()    endmacro()endif()

这样,你就可以在 CMake 3.11+ 里使用 CMake 3.14+ 的语法了。

可以在这里查看例子。