合肥网站优化 新浪博客常宁seo外包
文章目录
- Ninja 构建系统
- Ninja 是什么?
- Ninja 的定位
- Ninja 的构建流程(配合 CMake)
- 1. 准备 CMake 项目
- 2. 执行构建
- 3. 清理构建
- 4. 依赖分析(增量构建)
- Ninja 构建文件简析(不建议手写,但值得了解)
- Ninja 与 Make 的对比
- 适合 Ninja 的使用场景
- 如何切换项目为 Ninja 构建?
- 安装 Ninja
- 总结
Ninja 构建系统
Ninja 是什么?
Ninja 是一个专注于 极致构建速度 的构建工具,由 Google 的 Evan Martin 开发,最初用于加速大型项目(如 Chromium)的构建。
与 GNU Make 不同,它不是“构建语言”或“元构建系统”,而是一个 非常简洁、纯粹的构建执行工具,用于执行已经生成好的构建规则。
Ninja 的定位
特点 | 说明 |
---|---|
构建工具 | 只负责构建执行,不负责生成构建规则(如依赖关系) |
快速执行规则 | 设计目标是极致速度:少 IO、快速增量构建 |
不适合手写构建文件 | 需要由 CMake、Meson、GN 等工具生成 .ninja 文件 |
Ninja 的构建流程(配合 CMake)
1. 准备 CMake 项目
mkdir build
cd build
cmake -G Ninja ..
这会生成 Ninja 构建规则文件:
build.ninja
rules.ninja
CMakeFiles/
2. 执行构建
ninja # 默认构建所有目标
ninja MyApp # 构建单个目标
3. 清理构建
ninja -t clean
4. 依赖分析(增量构建)
Ninja 会自动追踪文件修改时间,仅构建变更项,增量构建非常快。
Ninja 构建文件简析(不建议手写,但值得了解)
一个典型的 build.ninja
结构可能如下:
rule CXXcommand = g++ -c $in -o $outbuild main.o: CXX main.cpp
build app: link main.o
rule
定义构建动作;build
指定依赖关系和目标;- Ninja 使用 简洁无逻辑的语法(无条件判断、无变量展开逻辑)保证速度和一致性。
Ninja 与 Make 的对比
对比项 | Ninja | Make |
---|---|---|
构建速度 | 极快(适合大型项目) | 相对较慢 |
并发能力 | 默认高并发(多核支持) | 但性能略逊 |
构建文件可维护性 | 不建议手写(太底层) | 可自定义规则 |
可读性 | 不适合人写 | Makefile 人工可维护 |
与 CMake 配合 | 优选 | 支持但生成慢 |
支持平台 | 跨平台(Windows/Linux/macOS) | 同样跨平台 |
适合 Ninja 的使用场景
场景类型 | 是否适合 | 原因 |
---|---|---|
单文件小项目 | ❌ | Ninja 没有优势 |
中型项目 | ✅ | 构建速度快,配合 CMake 使用 |
大型 C++ 工程 | ✅✅ | 最快增量构建体验,支持并发 |
CI/CD 自动构建 | ✅ | 速度快、输出可控 |
Android/Chromium | ✅ | Google 官方推荐 Ninja 构建 |
如何切换项目为 Ninja 构建?
mkdir build-ninja
cd build-ninja
cmake -G Ninja ..
ninja
也可以写入 CMakePresets.json
:
{"version": 3,"configurePresets": [{"name": "ninja-release","generator": "Ninja","description": "Release build using Ninja","binaryDir": "build/ninja","cacheVariables": {"CMAKE_BUILD_TYPE": "Release"}}]
}
安装 Ninja
平台 | 安装方式 |
---|---|
Ubuntu | sudo apt install ninja-build |
macOS | brew install ninja |
Windows | Chocolatey: choco install ninja 或下载 zip 解压 |
总结
Ninja 是一个轻量级、高性能、执行级别的构建工具,适合通过 CMake 等元构建系统生成构建规则并执行构建,特别适用于大型项目、高并发构建场景。