cmake命令行工具介绍
官方文档:https://cmake.org/cmake/help/latest/index.html
命令行工具
cmake | 生成编译系统 编译和链接 本地安装 help 脚本模式 命令行模式 |
ctest | 集成测试 |
cpack | 打包 |
生成构建系统
这是生成构建系统的三种方式,接下来一个一个演示。
这是目录结构。下面是演示效果。(都是在构建目录中演示的。)
-------------------------------------------------------------------------------------------------------------------
为什么cmake ..就能生成构建系统呢?
因为cmake ..,是在上层去寻找CMakeLists.txt文件。为什么cmake . 就能生成构建系统呢?
以为在cmake ..,生成构建系统之后,在构建目录下会生成一个CMakeCache.txt文件,在文件中有一个CMAKE_HOME_DIRECTORY的字段,帮助指引寻找到顶级CMakeLists.txt文件所在的位置,原理和cmake ..一样,都需要寻找CMakeLists.txt文件
编译链接
cmake --build <dir>(这里的dir就是构建目录) 等价于 make
在生成构建目录之后,就会直接生成Makefile文件,使用make就能完成编译。
为什么cmake --build <dir>就等价于make呢?
因为在构建目录的CMakeCache.txt文件中配置了语句的,使用cmake --build <dir>,实际上是使用的gmake。而这里的gmake实际上是make的一个软链接。所以二者效果等效。
实际效果如下:
测试
ctest [options]和make test等价
为什么make test和ctest等价呢?
在构建目录下生成的Makefile文件中,也做了配置,使用make test的时候,实际上调用的还是ctest命令完成的。
实际效果如下:
接下来解释效果
为什么使用ctest命令,就知道去测试test_add呢?
核心在于构建目录下生成了CTestTestfile.cmake脚本,在该脚本中对于顶级CMakeLists.txt中集成ctest的配置进行了翻译。
在顶级CMakeLists.txt集成ctest,首先添加生成二进制可执行程序,在开启测试测试功能,使用CTest中的add_test模块,添加测试case。
安装
在单元测试通过之后,我们可以使⽤cmake的安装命令把库和⼆进制发布到本机的标准路径,供⼤家⼀起开发使⽤。如果cmake的配置⽂件CMakeLists.txt⾥包含install函数,则⽣成的makefile⾥也会包含install 伪⽬标,可以使⽤make来执⾏。
cmake --install <dir>(这里的dir是构建目录)命令等价于make install
这里等价的原因,也是因为在Makefile文件中做了配置。二者实际上都是在实际执行cmake_install.cmake脚本文件。如果单独执行这个cmake脚本也是有一样的效果。
效果如下:
安装之前:main是在自己项目的构建目录下,是一个临时目录,可以任意删除
安装之后:main是在机器的公共目录下 /usr/local/bin/main,删除的话,就需要权限管理了
安装之后,还会生成一个资源清单
打包
可以使⽤cpack 把⼆进制或者动态库打包成压缩包的⽅式进⾏分发和共享。如果cmake的配置⽂件CMakeLists.txt⾥包含CPack功能,则⽣成的makefile⾥也会包含 package 伪⽬标,可以使⽤make 来执⾏。
cpack [options] 等价于 make package
二者实际上都是执行CPackConfig.cmake脚本,里面配置了生成的包的格式、名称、版本等
cpack的执行步骤:
1、设置临时安装目录
2、执行cmake_install.cmake
3、收集临时目录的文件列表
4、执行打包 &拷贝压缩包至构建目录
make install 执行cmake_install.cmake的目的地是/usr/local
cpack执行cmake_install.cmake的目的地是临时的安装目录。
所以这里会存在权限的不同。
脚本模式
cmake脚本模式,不会生成构建产物,也不会生成中间过程。
cmake -P <file>(这里的file就是以cmake为后缀的脚本文件)
比如 /usr/local/bin/cmake -P cmake_install.cmake
调用外部命令
调用外部命令,类似于shell命令行一样。可以理解为使用cmake -E执行shell命令行
cmake -E [options]
查看帮助
查看帮助文档 cmake --help
重点命令解释
cmake_minimum_required
指定项目所需的最低 CMake 版本,应放在顶级 CMakeLists.txt 的第⼀⾏。
project
给项目设置一个名称。指定项⽬名字,放在顶级CMakeLists⽂件的第⼆⾏,⼦⽬录中⼀般⽆需调⽤。
project(<PROJECT-NAME> [<language-name>...])project(<PROJECT-NAME>[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]][DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>][LANGUAGES <language-name>...])
project()执行后,CMake会自动创建一些变量,比如PROJECT_VERSION
如果没有设置语言,cmake默认设置C/C++。如果语言设置错了,就会报错 cmake error。
message函数是cmake提供的打印函数。可以打印一些变量值
运行
include
加载指定的脚本文件或者模块到当前CMakeLists.txt执行的上下文中并运行。类似于C语言中的include
文件的搜索路径
如果指定的是相对路径,则相对当前的正在执⾏的CMakeLists.txt 所在的⽬录。
如果指定的是绝对路径,那直接从对应的磁盘⽂件读取⽂件并加载执⾏。
module搜索路径顺序
首先在当前⽬录查找指定⽂件。
然后在CMAKE_MODULE_PATH 变量指定的⽬录中查找。
执行逻辑
在当前执⾏上下⽂执⾏被包含的camke代码。
这是目录结构。
在CMakeLists.txt中编辑如下。
在sub文件夹中的sub.cmake中编辑如下
运行效果
可以观察出,当要真实获取当前正在执行的cmake脚本的路径时,使用CMAKE_CURRENT_LIST_DIR变量。
install
安装(可以理解为cp) 将 ⼆进制,静态库,动态库,头⽂件,配置⽂件 部署到指定⽬录。
在构建目录下会生成cmake_install.cmake脚本,其中通过cmake内置的api file调用底层操作系统完成真正的文件操作。
总的来说install分为3个阶段,1、收集安装对应的,比如目标、文件和code等2、生成cmake_install.cmake脚本3、cmake执行cmake_install.cmake脚本,使用file()内置API进行文件操作。
参数 | 含义 |
TARGETS | 安装 使⽤add_executable和add_library 构建的⽬标⽂件。 |
FILES | 安装 ⽂件 |
DIRECTORY | 安装整个⽬录 |
EXPORT | 安装导出⽬录,⽤于发布⾃⼰的程序,供别⼈使⽤。 |
DESTINATION | 指定安装路径,路径可以是绝对路径,也可以是相对路径(相对于 CMAKE_INSTALL_PREFIX )。 |
执行
add_executable
指定cmake 从源代码⽣成⼀个可执⾏⽂件。
参数 | 含义 |
target_name | 可执⾏⽂件的名称(不包含扩展名,如 myapp),项⽬内部唯⼀ |
<sources> | 源⽂件列表(如 src/main.cpp) |
可执行文件在构建目录下的位置,与在源代码目录中的位置是对应的。