CMakeFindExternalProject(下称CFEP)是用于CMake构建系统的依赖管理工具。
其实现借助CMake内置的ExternalProject模块。
允许CMake在配置期(而非构建期)安装第三方依赖库。
同时, 它提供了第三方依赖安装, Windows运行时库安装等工具。
使用注意:
以下函数(宏)均允许以小写形式调用
CYGWIN平台也被判定为WINDOWS平台
还为CYGWIN平台的cygwin1.dll添加支持
CMake提供如下函数:
CEFP_find_xxx
xxx可以为url
,git
,dir
分别表示从不同的地方下载第三方依赖库。
并不是所有时候都会下载构建并安装(不是安装到全局目录而是安装到)第三方依赖库,只有通过find_package
无法定位到库时才会购机第三方库。
cfep_find_url(<name>
[REQUIRED]
[QUIET]
[MODULE]
[URL _url]
[CMAKE_DIR _dir]
[PACKAGE ...]
[EXTERNAL ...]
)
name
库名,用于find_package
。(必须指定)REQUIRED
参数表示是否强制找到该库。QUITE
参数表示是否保持安静,即不输出信息。MODULE
以module模式而非config模式寻找库(只是设置参数的不同,find_package采用相同的策略)。URL
指定一个url
链接。(必须指定)CMAKE_DIR
表示当构建并安装该库后,该库的CMake文件夹和安装目录的相对位置。 若不提供该值,则使用默认值,具体见后文。PACKAGE
可跟多个参数, 将应用于find_package
。但不可为REQUIRED
以及QUIET
。EXTERNAL
可跟多个参数, 具体见后文。
该函数的执行效果与find_package
一样,本质就是调用find_package
。
可以设定cache
:<name>_BUILD
表示必须启用构建, 而不是先find_package
。
同时, 还会额外定义一下CACHE
。
<name>_CFEP_FOUND
表示CFEP是否成功构建, 安装第三方依赖库<name>_CFEP_BUILD_DIR
表示第三方库的构建位置(不代表找到该库)<name>_CFEP_INSTALL
表示第三方库的安装位置<name>_CFEP_INSTALL_TYPE
表示第三方库的安装类型,具体见后文
注意:库被安装后会再次执行find_package, 但库成功安装不代表find_package能成功。
同时<name>_CFEP_FOUND
也只表示库安装成功, <name>_FOUND
才能代表库定位成功
库并不是直接安装在CMAKE_INSTALL_PREFIX
中
EXTERNAL支持如下参数:
NOT_INFO
FORCE
BUILD_DIR _build_dir
INSTALL_DIR _install
TIMEOUT _time
CMAKE_ARGS ...
BUILD_CMAKE_ARGS ...
BUILD_CMAKE_CACHE_ARGS ...
BUILD_CMAKE_CACHE_DEFAULT_ARGS ...
CFEP的原理的构建原理是, 生成一个CMakeLists.txt
,其中调用ExternalProject
模块, 最后执行CMakeLists.txt
。
NOT_INFO
不显示消息FORCE
强制执行 (当多次执行时,CMakeLists.txt
不会重复生成, 因此配置步骤的部分内容不会重复执行, 使用该选项将强制CMakeLists.txt
重新生成)BUILD_DIR
项目构建的位置 默认是:CMAKE_BINARY_DIR/deps/<name>
,指定后变为CMAKE_BINARY_DIR/deps/<_build_dir>
INSTALL_DIR
项目的安装方式:base
或binary
:安装到CMAKE_BINARY_DIR/<name>
- 其他:安装到
_build_dir/install
TIMEOUT
下载超时(不是构建超时)CMAKE_ARGS
运行CMakeLists.txt
的CMake命令行参数BUILD_CMAKE_ARGS
传递给ExternalProject_Add
的CMAKE_ARGS
参数。已经设定生成器和CMAKE_BUILD_TYPE
,以及生成器等参数。BUILD_CMAKE_CACHE_ARGS
传递给ExternalProject_Add
的CMAKE_CACHE_ARGS
参数。已经设定生成器和CMAKE_INSTALL_PREFIX
参数。BUILD_CMAKE_CACHE_DEFAULT_ARGS
传递给ExternalProject_Add
的CMAKE_CACHE_DEFAULT_ARGS
参数。
在_build_dir
目录下还包括一些构建日志log
, 源码source
等。
CFEP安装项目后, 需要找到该项目的cmake
文件所在路径,供find_package
使用。
因此,CMAKE_DIR
参数用于指定cmake
文件相对于该库的安装路径的位置。
默认值为:
Windows
: ./cmake
其他系统: ./shared/cmake/<name>
与从url
下载项目类似, 但没有URL
参数, 添加如下参数:
GIT _git
GIT_TAG _tag
GIT
git仓库的地址。不建议使用ssh
。(必须指定)GIT_TAG
git_tag, 可以为hash信息, git标签, git分支名。(必须指定)
其余效果与url
相似。
<_build_dir>
目录下download
文件夹将为空。
与从url
下载项目类似,但没有URL
参数,添加如下参数:
SOURCE_DIR _source_dir
SOURCE_DIR
指定第三方依赖库的文件夹
其余效果与url
相似。
<_build_dir>
目录下download
文件夹将为空。
<_build_dir>
目录下将没有source
文件夹。
将第三方依赖安装到指定位置(随构建树一起安装),使用函数:
cfep_install(<name>
[NOT_QUIET]
[PREFIX _prefix]
)
name
即第三方依赖库名字, 同CFEP_find_xxx。NOT_QUIET
即输出安装信息PREFIX
即安装位置, 默认为CMAKE_INSTALL_PREFIX
注意:该函数执行前需要执行CFEP_find_xxx
函数。
若CFEP_find_xxx
未安装第三方依赖, 则此函数被的执行被忽略。
将第三方依赖安装的内容复制到指定位置(CMake配置时执行),使用函数:
cfep_copy_install(<name>
[NOT_QUIET]
[DEST _dest]
)
name
即第三方依赖库名字, 同CFEP_find_xxx。NOT_QUIET
即输出安装信息DEST
即复制的位置, 默认为CMAKE_BINARY_DIR
注意:该函数执行前需要执行CFEP_find_xxx
函数。
若CFEP_find_xxx
未安装第三方依赖, 则此函数被的执行被忽略。
以下函数尽在windows
平台生效, 其他平台执行无效果
因为windows
平台没有rpath
等机制, 因此需要将第三方导入的库的.dll
复制到指定位置
使用函数:
wi_install_import(
[RUNTIME _runtime]
[LIBRARY _library]
[TARGETS ...]
)
RUNTIME
运行时库安装的位置, 默认值为INSTALL_BINDIR
LIBRARY
导入库的安装位置,默认值为INSTALL_LIBDIR
TARGETS
安装的对象
wi_install_import
是在构建树安装时才安装导入的库。
使用wi_copy_import
可以在CMake
配置时就复制文件到指定位置。
使用wi_build_import
可以在CMake
构建时才复制文件到指定位置(本质是添加一个构建目标)。
使用方式和wi_install_import
相同。
使用如下函数,可以检索文件夹下的所有dll
并安装到指定位置:
wi_install_dll_bin(
[RUNTIME _runtime]
[DIRS ...]
)
RUNTIME
运行时库安装的位置, 默认值为INSTALL_BINDIR
DIRS
需要检查的目录路径
wi_install_dll_bin
是在构建树安装时才安装导入的库。
使用wi_copy_dll_bin
可以在CMake
配置时就复制文件到指定位置。
使用方式和wi_install_dll_bin
相同。
使用如下函数,检查一个目录是否包含.exe
,若包含则将该目录的.dll
安装到指定位置:
wi_install_dll_dir(
[RUNTIME _runtime]
[DIRS ...]
)
RUNTIME
运行时库安装的位置, 默认值为INSTALL_BINDIR
DIRS
需要检查的目录路径
wi_install_dll_dir
是在构建树安装时才安装导入的库。
使用wi_copy_dll_dir
可以在CMake
配置时就复制文件到指定位置。
使用方式和wi_install_dll_dir
相同。
设定标准的GNU
安装路径, 使用如下函数:
wi_set_install_dir
wi_set_install_dir_quiet
以上两个函数的区别在于, 后者不会显示任何信息。
注意:该函数必须在project
指令后执行。
他们将会设定cache
:
- INSTALL_LIBDIR 库文件的安装路径
- INSTALL_BINDIR 可执行文件的安装路径
- INSTALL_INCLUDEDIR 头文件的安装路径
- INSTALL_RESOURCEDIR
resource
文件的安装路径 - INSTALL_CMAKEDIR
cmake
文件的安装路径
同时还会设定构建时动态库和可执行文件的输出位置
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY
- CMAKE_LIBRARY_OUTPUT_DIRECTORY
- CMAKE_RUNTIME_OUTPUT_DIRECTORY
使用函数wi_find_cygwin1
可以获取cygwin1.dll
动态库。
将生成导入目标: CYGWIN::cygwin1
将项目中的cmake/CMakeFindExternalProject
文件夹放置在项目指定位置, 在cmake
中执行:
include(<CMakeFindExternalProject文件夹位置>/init.cmake)
CMakeFindExternalProject.cmake
文件包含的是第三方依赖管理的程序 依赖于CMakeLists.txt.in
文件WindowsInstall.cmake
是.dll
安装程序InstallDir.cmake
是安装路径设置程序以及安装程序 依赖于_void_p_test.c
文件,该程序用于检查一个void
指针的大小。
本程序是在HUAN LICENSE
下发布的。