1、External Project定义
官方参考文档:https://cmake.org/cmake/help/latest/module/ExternalProject.html
ExternalProject_Add()函数创建一个外部工程可以驱动下载、更新/补丁、配置、构建、安装和测试流程的自定义目标;
ExternalProject_Add(<name> [<option>...])
1.1 目录选项
- SOURCE_DIR <dir>
将被解包或者非URL下载方式的下载文件的存放路径,如果没有指定下载方法。必须指向被解包或者克隆/检查的外部工程的存放路径;
- BINARY_DIR <dir>
指定构建目录位置,如果BUILD_IN_SOURCE使能的话,则该选项被忽略;
1.2 下载选项
1.3 更新/补丁选项
1.4 配置选项
配置流程运行在下载和更新流程的后面,外部工程默认被当作CMake工程,如果必要的话可以被否决;
- CONFIGURE_COMMAND <cmd>...
默认的配置命令运行基于主工程选项的CMake命令;
对于非CMake外部工程,该命令必须使用来覆盖其默认行为;
对于不需要配置流程的工程,指定一个空字符串选项作为命令来执行;
1.5 构建选项
当配置流程以CMake为构建系统的外部工程的流程,那构建流程也是,构建流程将基于Makefile的构建简化为无参数运行make指令;
如果必要的话,它也能使用自定义的命令来取代;
- BUILD_COMMAND <cmd>...
对于不需要配置流程的工程,指定一个空字符串选项作为命令来执行;
1.6 安装选项
- INSTALL_COMMAND <cmd>...
1.7 测试选项
1.8 输出日志选项
1.9 终端访问选项
1.10 目标选项
- DEPENDS <targets>...
指定该外部工程所依赖的其他目标;
1.11 其他选项
2、获取工程属性
3、明确流程管理
4、经典案例分享
ExternalProject命令可以很好的解决项目中使用第三方库,提高项目的可用性。
include(ExternalProject)
ExternalProject_Add(xxxxxx
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xxxxxx
BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xxxxxx
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/xxxxxx.sh xxxxxx
BUILD_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/xxxxxx.sh xxxxxx
INSTALL_COMMAND "")
add_custom_target(xxxxxx ALL
COMMAND echo "xxxxxx"
DEPENDS x1 x2 x3 x4
)
通过ExternalProject安装gflag-2.2.2
1、创建名为gflag-2.2.2.cmake的文件
在项目中创建名为Cmake的文件夹下创建名为gflag-2.2.2.cmake的文件
include(ExternalProject)
set(GFLAG_ROOT ${CMAKE_BINARY_DIR}/thirdparty/gflag-2.2.2)
set(GFLAG_LIB_DIR ${GFLAG_ROOT}/lib)
set(GFLAG_INCLUDE_DIR ${GFLAG_ROOT}/include)
set(GFLAG_URL https://github.com/gflags/gflags/archive/v2.2.2.zip)
set(GFLAG_CONFIGURE cd ${GFLAG_ROOT}/src/gflag-2.2.2 && cmake -D CMAKE_INSTALL_PREFIX=${GFLAG_ROOT} .)
set(GFLAG_MAKE cd ${GFLAG_ROOT}/src/gflag-2.2.2 && make)
set(GFLAG_INSTALL cd ${GFLAG_ROOT}/src/gflag-2.2.2 && make install)
ExternalProject_Add(gflag-2.2.2
URL ${GFLAG_URL}
DOWNLOAD_NAME gflag-2.2.2.zip
PREFIX ${GFLAG_ROOT}
CONFIGURE_COMMAND ${GFLAG_CONFIGURE}
BUILD_COMMAND ${GFLAG_MAKE}
INSTALL_COMMAND ${GFLAG_INSTALL}
)
2、最后是在项目根目录下的CMakeLists.txt中使用include调用这个cmake即可
include(cmake/gflag-2.2.2.cmake)
include(cmake/hwloc-1.11.cmake)
include(cmake/protobuf-2.6.1.cmake)
include(cmake/protobuf-2.6.1-compile.cmake)