CMake 是一个构建系统生成器,可以使用单个 CMakeLists.txt 为不同平台上的不同工具集配置项目。您可以在 CMakeLists.txt 中描述构建系统必须执行的操作,以配置并编译代码;基于这些指令,CMake 将为所选的构建系统(Unix Makefile、Ninja、Visual Studio 等)生成相应的指令,后面的章节中我们还会重新讨论生成器。本篇将展示为项目切换生成器是多么容易。
提示:本示例在 CMake 3.5 或更高版本中有效,并已在 GNU/Linux、macOS 和 Windows 上测试通过。
准备工作
CMake 针对不同平台支持一系列本地构建工具,既支持命令行工具(如 Unix Makefile 和 Ninja),也支持集成开发环境(IDE)工具。使用以下命令,可以在当前平台上找到生成器名单,以及已安装的 CMake 版本:
$ cmake --help
这个命令的输出会列出 CMake 命令行界面上所有的选项,您会在其中找到可用生成器的列表。例如,安装了 CMake 3.11.2 的 GNU/Linux 机器上,生成器部分的输出(节选)如下:
Generators
The following generators are available on this platform (* marks default):
* Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
...
具体实施
我们将重用上一篇示例中的 hello-world.cpp 和 CMakeLists.txt。唯一的区别在于调用 CMake 的方式:现在必须显式地使用命令行选项 -G 来切换生成器。
首先,使用以下步骤配置项目:
$ mkdir -p build
$ cd build
$ cmake .. -G Ninja
第二步,构建项目:
$ cmake --build .
工作原理
与前面的配置相比,每一步的输出没什么变化。但每个生成器都有自己的文件集,所以编译步骤的输出和构建目录的内容是不同的:
build.ninja和rules.ninja:包含 Ninja 所有的构建语句和构建规则。CMakeCache.txt:CMake 会在该文件中进行缓存,与生成器无关。CMakeFiles:包含由 CMake 在配置期间生成的临时文件。cmake_install.cmake:处理安装规则的 CMake 脚本,在安装时使用。
此外,cmake --build . 会将 ninja 命令封装在一个跨平台的接口中。
后面的章节中,我们还会讨论可选生成器和交叉编译。