CMake基础(10)使用ninja构建

简介: CMake基础(10)使用ninja构建

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安装的。

相关文章
|
2月前
|
Windows
CMake基础(5)安装项目
CMake基础(5)安装项目
46 3
|
2月前
|
程序员 API 数据库
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
92 1
|
2月前
|
IDE Java Linux
【CMake】CMake构建C++代码(一)
【CMake】CMake构建C++代码(一)
|
2月前
|
编译器 Linux C语言
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
168 0
|
24天前
Cmake构建Qt项目链接glog库
Cmake构建Qt项目链接glog库
|
2月前
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
104 0
|
2月前
|
算法 编译器 C语言
【CMake install 命令】精通CMake安装:灵活、高效的构建和部署
【CMake install 命令】精通CMake安装:灵活、高效的构建和部署
471 0
|
2月前
|
Linux 开发工具 C语言
【Linux系统编程】项目自动化构建工具make/Makefile--1
【Linux系统编程】项目自动化构建工具make/Makefile--1
|
2月前
|
C++
项目自动化构建工具——make/Makefile
项目自动化构建工具——make/Makefile
47 0
|
7月前
|
并行计算 编译器 Linux