0x01 介绍
CMake 是一个跨平台的构建系统,可以用来管理 C/C++ 等项目的构建过程。它通过一个名为 CMakeLists.txt 的文件来描述项目的构建方式,然后通过 CMake 命令来生成各种平台的构建脚本,如 Makefile 或 Visual Studio 项目文件。
Ninja 是一个轻量级的构建系统,它使用类似于 Makefile 的文本文件描述构建过程,并通过 ninja 命令来执行构建。Ninja 与 Make 的区别在于,Ninja 会更快地执行构建,因为它使用了一些优化技术来减少构建过程中的 IO 操作。
如果要使用 Ninja 来构建 CMake 项目,可以在生成构建脚本时使用 -G Ninja 选项,如下所示:
cmake -G Ninja path/to/project
这样 CMake 就会生成一个名为 build.ninja 的 Ninja 构建脚本,然后你就可以使用 ninja 命令来执行构建了,如下所示:
ninja
你也可以使用 ninja install 命令来安装构建后的二进制文件。
需要注意的是,在使用 CMake 生成 Ninja 构建脚本时,你需要安装 Ninja 的可执行文件,并且在 CMake 命令中指定它的路径。如果没有指定,CMake 就会使用系统中的默认的 Ninja 可执行文件,如果系统中没有安装 Ninja,则需要先安装它。
在使用 Ninja 构建 CMake 项目时,还可以使用一些额外的选项来控制构建过程。例如,可以使用 -j 选项来指定并行构建时使用的 CPU 核心数,使用 -v 选项来输出详细的构建信息。
例如,下面是使用 4 个 CPU 核心来并行构建项目,并输出详细的构建信息的命令:
ninja -j 4 -v
此外,CMake 还支持很多其他的构建系统,如 Unix Makefiles、Visual Studio 等,可以根据自己的需要选择使用。
总的来说,使用 Ninja 来构建 CMake 项目是一个不错的选择,因为它可以提高构建效率,并且易于使用。
在使用 CMake 生成 Ninja 构建脚本时,还可以使用一些其他的选项来控制构建过程。
例如,可以使用 -DCMAKE_BUILD_TYPE 选项来指定构建类型,常见的构建类型有 Debug、Release 等。这个选项可以用来控制是否启用调试信息、优化等级等。
例如,下面是使用 CMake 生成 Release 版本的 Ninja 构建脚本的命令:
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release path/to/project
此外,CMake 还支持设置各种各样的变量,来控制构建过程。例如,可以使用 -DVARNAME=VALUE 选项来设置变量 VARNAME 的值为 VALUE。
例如,下面是使用 CMake 生成 Ninja 构建脚本,并设置一个名为 ENABLE_FOO 的布尔型变量的命令:
cmake -G Ninja -DENABLE_FOO=ON path/to/project
这些变量可以在 CMakeLists.txt 文件中使用,来控制构建过程。例如,你可以使用 if(ENABLE_FOO) 语句来判断 ENABLE_FOO 变量是否为真,然后决定是否编译某些源文件。
总的来说,使用 CMake 生成 Ninja 构建脚本,并使用一些选项来控制构建过程,是一种非常灵活的方式,可以让你轻松地管理 C/C++ 项目的构建过程。
此外,CMake 还提供了很多实用的功能,可以帮助你更好地管理项目的构建过程。
例如,CMake 支持自动检测系统中的库文件和头文件,可以帮助你避免手动指定库文件路径的麻烦。
CMake 还支持自动生成项目的文档,可以使用 Doxygen 或者 Sphinx 等工具生成 HTML、PDF 等格式的文档。
CMake 还支持自动化测试,可以使用 CTest 命令来运行项目中的单元测试、功能测试等。
总的来说,CMake 是一个非常强大的构建系统,可以帮助你更好地管理 C/C++ 项目的构建过程,提高项目的质量和效率。
0x2 示例
如前所述,CMake 是一个元(meta)构建系统,可用于为许多其他构建工具创建构建文件。这个例子展示了如何让 CMake 使用 ninja 构建工具。
本教程中的文件如下:
$ tree . ├── CMakeLists.txt ├── main.cpp
- [CMakeLists.txt] - 包含要运行的 CMake 命令
# Set the minimum version of CMake that can be used # To find the cmake version run # $ cmake --version cmake_minimum_required(VERSION 3.5) # Set the project name project (hello_cmake) # Add an executable add_executable(hello_cmake main.cpp)
- [main.cpp] - 一个简单的 “Hello World”CPP 文件
#include <iostream> int main(int argc, char *argv[]) { std::cout << "Hello CMake!" << std::endl; return 0; }
下面是构建此示例的示例输出。
ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_10/build$ cmake .. -G Ninja && ninja -j24 -v -- Configuring done -- Generating done -- Build files have been written to: /mnt/d/Project/Cmake_examples/cmake_basics_10/build [1/2] /usr/bin/c++ -MD -MT CMakeFiles/hello_cmake.dir/main.cpp.o -MF CMakeFiles/hello_cmake.dir/main.cpp.o.d -o CMakeFiles/hello_cmake.dir/main.cpp.o -c ../main.cpp [2/2] : && /usr/bin/c++ -rdynamic CMakeFiles/hello_cmake.dir/main.cpp.o -o hello_cmake && : ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_10/build$ ./hello_cmake Hello CMake! ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_10/build$
1.生成器
CMake 生成器负责为底层构建系统编写输入文件 (例如 Makefile)。运行cmake --help将显示可用的生成器。对于 cmake version 3.16.3,我的系统支持的生成器包括:
Generators The following generators are available on this platform (* marks default): * Unix Makefiles = Generates standard UNIX makefiles. Green Hills MULTI = Generates Green Hills MULTI files (experimental, work-in-progress). Ninja = Generates build.ninja files. Watcom WMake = Generates Watcom WMake makefiles. CodeBlocks - Ninja = Generates CodeBlocks project files. CodeBlocks - Unix Makefiles = Generates CodeBlocks project files. CodeLite - Ninja = Generates CodeLite project files. CodeLite - Unix Makefiles = Generates CodeLite project files. Sublime Text 2 - Ninja = Generates Sublime Text 2 project files. Sublime Text 2 - Unix Makefiles = Generates Sublime Text 2 project files. Kate - Ninja = Generates Kate project files. Kate - Unix Makefiles = Generates Kate project files. Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files. ln28@DESKTOP-FS9U3GT:/mnt/d/AndroidSourceCode/rk3588_12/frameworks/base/core$
正如本文所述,CMake 包括不同类型的生成器,如命令行生成器、IDE 生成器和其他生成器。
在本例中,ninja 是通过命令sudo apt-get install ninja-build安装的。