摘要
- ninja 相关学习笔记
ninja构建工具 详解
Ninja 构建工具详解
Ninja 是一个专注于速度和效率的构建系统,用于从源代码生成目标文件(如可执行文件或库)。它由 Google 开发,主要为了取代 Make,用于解决构建大型项目时的性能瓶颈问题。
Ninja 的特点
极快的构建速度
- Ninja 专为高效处理增量构建而设计。它通过最小化构建所需的计算和磁盘 I/O,大大提高了构建速度。
- 与 Make 不同,Ninja 不直接计算依赖,而是依赖于生成的构建文件(
.ninja
文件)快速执行。
简单的功能集
- Ninja 的设计目标是专注于构建,不包括复杂的功能(如自动依赖解析、配置系统等)。
- 它常常与其他工具(如 CMake、GN)一起使用,由这些工具生成
.ninja
文件。
并行构建
- Ninja 默认支持并行化,可以根据可用的 CPU 核心数自动分配构建任务。
轻量级和便携性
- Ninja 是一个小型、开源的工具,跨平台支持 Linux、macOS 和 Windows。
Ninja 的工作原理
Ninja 的核心概念是通过 .ninja
文件描述构建规则和依赖关系。以下是 Ninja 的工作流程:
生成
.ninja
文件- Ninja 不负责生成
.ninja
文件。通常需要借助工具(如 CMake、GN 等)生成这些文件。 - 例子:
使用 CMake 生成 Ninja 文件:1
cmake -G Ninja .
- Ninja 不负责生成
执行构建
- Ninja 解析
.ninja
文件并执行构建命令。 - 运行 Ninja 构建:
1
ninja
- Ninja 解析
增量构建
- Ninja 通过检查依赖关系和时间戳,仅构建受影响的文件,提高了构建效率。
Ninja 文件结构
一个典型的 .ninja
文件包含以下几部分:
变量定义
使用变量减少冗余:1
cflags = -Wall -O2
规则定义
描述如何生成目标文件:1
2
3rule compile
command = gcc $cflags -c $in -o $out
description = Compiling $in构建目标
定义文件的依赖关系和构建规则:1
2build main.o: compile main.c
build app: link main.o util.o
Ninja vs Make
特性 | Ninja | Make |
---|---|---|
速度 | 更快,专注于增量构建 | 比 Ninja 慢 |
文件格式 | .ninja 文件,简单高效 |
Makefile ,灵活但复杂 |
依赖管理 | 外部工具生成依赖 | 支持内置依赖解析 |
并行构建 | 默认支持 | 需指定 -j 参数 |
生态系统 | 与 CMake/GN 等工具配合使用 | 独立使用,功能更全面 |
使用场景
大型项目
Ninja 在 Google 的 Chrome 浏览器项目中广泛使用,处理数百万行代码的增量构建。与 CMake 配合
- CMake 是一个流行的跨平台构建系统,可以生成
.ninja
文件。 - 示例:
1
2cmake -G Ninja .
ninja
- CMake 是一个流行的跨平台构建系统,可以生成
与 GN 配合
- GN(Generate Ninja)是一种更轻量的构建配置工具,专为 Ninja 设计。常用于 Chrome 项目。
安装与使用
安装 Ninja
- 在 Linux 上:
1
sudo apt install ninja-build
- 在 macOS 上:
1
brew install ninja
- 在 Windows 上:
使用包管理工具(如choco
或scoop
)安装。
- 在 Linux 上:
基本命令
- 构建项目:
1
ninja
- 指定目标:
1
ninja target_name
- 查看构建图:
1
ninja -t targets
- 查看构建时间:
1
ninja -t compdb
- 构建项目:
总结
Ninja 是一个专注于速度的高效构建工具,尤其适合需要频繁增量构建的大型项目。虽然功能集较少,但其简洁性和与其他工具的良好兼容性使其成为现代构建流程的重要组成部分。如果你需要高效的构建体验,Ninja 是一个值得尝试的工具。