2019-09-25-ExternalProject_FetchContent


layout: post
title: ExternalProject_FetchContent
date: 2019-12-03 21:10:24
description: ExternalProject_FetchContent
tag: cmake


1. 使用及编译第三方库

1.1. 简介

ExternalProject 是老的第三方管理API
FetchContent 是3.11(大约发行于2018年4月份左右)开始引入的一个模块。这个模块可以看成是原来 ExternalProject 模块的一个升级。也就是说 FetchContent 可以替换ExternalProject

1.2. ExternalProject

1.2.1. 说明

外部项目管理方法之一:ExternalProject

1.2.2. 函数

1.2.2.1. ExternalProject_Add

ExternalProject_Add 创建一个外部target,Download/Update/patch,configure,build,install and test.比 FetchContent_Declare 功能强大,相当于FetchContent_Declare/FetchContent_Populate 的组合,比较复杂.可以定制外部项目

1.2.2.1.1. 目录参数

目录结构相关

PREFIX <dir> : 根目录
TMP_DIR <dir>: 临时目录
STAMP_DIR <dir> : 时间戳目录
DOWNLOAD_DIR <dir> : 解压缩文件之前要在其中存储下载文件的目录。该目录仅由URL下载方法使用,所有其他下载方法都SOURCE_DIR直接使用。
SOURCE_DIR <dir> : 将下载的内容解压缩到的源目录,或对于非URL下载方法,应检出,克隆存储库的目录等。如果未指定下载方法,则此目录必须指向外部已存在的现有目录项目已被解压或克隆/检出。
注意 如果指定了下载方法,则可以删除源目录中所有现有的内容。在启动下载之前,只有URL下载方法会检查此目录是否丢失或为空,如果不为空,则以错误停止。所有其他下载方法均以静默方式丢弃源目录中的所有先前内容。
BINARY_DIR <dir> : 指定构建目录位置。如果BUILD_IN_SOURCE启用,则忽略此选项 。
INSTALL_DIR <dir> : 安装目录
LOG_DIR <dir> : 日志目录

如果PREFIX给定了选项或EP_PREFIX设置了 目录属性,那么将在指定的前缀下构建并安装一个外部项目

TMP_DIR      = <prefix>/tmp
STAMP_DIR    = <prefix>/src/<name>-stamp
DOWNLOAD_DIR = <prefix>/src
SOURCE_DIR   = <prefix>/src/<name>
BINARY_DIR   = <prefix>/src/<name>-build
INSTALL_DIR  = <prefix>
LOG_DIR      = <STAMP_DIR>

否则,如果EP_BASE设置了目录属性,则将外部项目的组件存储在指定的基础下

TMP_DIR      = <base>/tmp/<name>
STAMP_DIR    = <base>/Stamp/<name>
DOWNLOAD_DIR = <base>/Download/<name>
SOURCE_DIR   = <base>/Source/<name>
BINARY_DIR   = <base>/Build/<name>
INSTALL_DIR  = <base>/Install/<name>
LOG_DIR      = <STAMP_DIR>
1.2.2.1.2. 下载步骤参数

如果使用该SOURCE_DIR选项指向现有的非空目录,则可以省略下载方法。否则,必须指定以下一种下载方法

DOWNLOAD_COMMAND <cmd>...

  1. URL Download
  2. Git
  3. Subversion
  4. Mercurial
  5. CVS
1.2.2.1.3. Update/Patch Step Options

: 更新

1.2.2.1.4. Configure Step Options

: 重写configure过程

1.2.2.1.5. Build Step Options

: 自定义编译步骤,比如非CMake/Makefile工程

1.2.2.1.6. Install Step Options

: 自定义安装步骤,比如非CMake/Makefile工程

1.2.2.1.7. Test Step Options

: 自定义测试步骤

1.2.2.1.8. Output Logging Options

: 日志选项

1.2.2.1.9. Terminal Access Options

: 访问终端输入

1.2.2.1.10. Target Options

: target选项

1.2.2.1.11. Miscellaneous Options

: 其他选项

1.2.2.2. ExternalProject_Get_Property

类似于FetchContent_GetProperties

1.2.2.3. ExternalProject_Add_Step

除去ExternalProject_Add中几大步骤之外,再定义自己的步骤,非Download/Update/patch,configure,build,install and test,一般很少用

1.2.2.4. ExternalProject_Add_StepTargets

为每个子步骤定义target, <name>-<step>形式,一般很少用

1.2.2.5. ExternalProject_Add_StepDependencies

为每个子步骤添加依赖项,一般很少用

1.3. FetchContent

1.3.1. FetchContent说明

此方法是ExternalProject的扩展和优化,将声明与实现分离.而ExternalProject都集成到ExternalProject_Add接口中.

1.3.1.1. FetchContent_Declare

声明一个依赖项,对标ExternalProject_Add的Directory/Download,ExternalProject_Add的Directory/Download大部分参数都可用于FetchContent_Declare(FetchContent_Declare只是声明,不支持configure, build, install and test steps)

1.3.1.2. FetchContent_Populate

执行声明,甚至于没有FetchContent_Declare的话,FetchContent_Populate也可以直接执行,只是需要包含FetchContent_Declare对应的内容.

1.3.1.3. FetchContent_GetProperties

获取属性

1.3.1.4. FetchContent_MakeAvailable

等效于FetchContent_Populate() and add_subdirectory()

模板如下

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

FetchContent_Declare(
  myCompanyIcons
  URL      https://intranet.mycompany.com/assets/iconset_1.12.tar.gz
  URL_HASH 5588a7b18261c20068beabfb4f530b87
)

FetchContent_Declare(
  myCompanyCertificates
  SVN_REPOSITORY svn+ssh://svn.mycompany.com/srv/svn/trunk/certs
  SVN_REVISION   -r12345
)
# Check if population has already been performed
FetchContent_GetProperties(<name>)
string(TOLOWER "<name>" lcName)
if(NOT ${lcName}_POPULATED)
  # Fetch the content using previously declared details
  FetchContent_Populate(<name>)

  # Set custom variables, policies, etc.
  # ...

  # Bring the populated content into the build
  add_subdirectory(${${lcName}_SOURCE_DIR} ${${lcName}_BINARY_DIR})
endif()

1.4. 参考资料

  1. ExternalProject
  2. FetchContent
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值