Ninja

Ninja

Ninja 构建系统是一个注重速度的构建系统。与 GNU Make 等传统构建工具相比,Ninja 可以在更短的时间内构建像 Google Chrome 和安卓操作系统这样的大规模软件项目。

Ninja 和 Incredibuild 集成使用

工作原理是什么?

Ninja 通过减少现代构建系统中的一个关键性能因素(解析用户创建的控制文件) 来实现其惊人的速度。其他编译系统过程控制文件(如 GNU Make 中的 Makefile),指导构建器处理命令和计算依赖关系。这些脚本可包括复杂且耗时的决策逻辑。虽然这种功能使得开发人员对构建过程的控制更得心应手,但在复杂项目中还是会消耗很大一部分的 CPU 时间。

开发人员使用 Gyp、GN 或 CMake 等工具来生成 Ninja 控制文件而非手工创建控制文件。这些文件无需手工编辑,因此要以最小的解析和最快的执行速度来操作。

Ninja 构建系统的历史

Ninja 是由 Google 的 Evan Martin 编写的。在2012 年,根据 Apache 许可证 2.0 发布,并于 2013 年被添加到 GitHub。Ninja 的最新稳定版本是 2020 年 11 月 28 日发布的 1.10.2 版,由两百多个贡献者积极开发。

立即试用

获取免费 License

功能及优点

Ninja 构建系统的核心是速度。事实上,它之所以如此之快,是因为其重点在于速度而不是功能。Ninja 包含了您在 GNU Make 这样的简单构建系统中所期望的标准功能,如依赖性管理、编译器指令和变量支持。Ninja 的性能改进还提供了额外的好处,如命令输出缓冲,使得构建指令与错误警告更容易配对。

Ninja 是免费的开源软件。

如何下载和安装 Ninja 构建系统

Ninja 在基于 Debian 的系统(即 Debian、Ubuntu 及其衍生产品)上可以通过 ninja-build 软件包获得。若要安装,请运行:

apt install ninja-build

如果您没有安装 Debian 或 Ubuntu,Ninja 可提供 Windows、Linux 和 macOS 的预先编译好的二进制文件(https://github.com/ninja-build/ninja/releases)。如果您使用这些预先编译的可执行文件,就无需复杂的安装过程——只需将文件直接复制到路径中的某个位置或者在运行时直接引用二进制文件。

Ninja 构建系统示例

Ninja 构建文件是由其他实用程序创建,而不是手工编辑。不过,您可以构建一个极其简单的示例文件。

cflags = -Wall

rule cc

command = gcc $cflags -c $in -o $out

build hello: cc hello.c

将此文件保存为 build.ninja,然后运行 ninja 命令。在这个示例中,hello 二进制文件是通过 GNU 的 gcc 编译 hello.c 源代码生成的。示例如此简单,您可能不需要使用 Ninja,因为 GNU Make 或类似的构建系统几乎一样快。

CMake 这样的构建系统可以输出 Ninja 控制文件。要做到这一点,需在 CMake 命令中添加 -GNinja 参数。然后,通过运行 ninja 命令来处理得到的名为 build.ninja 的输出。

Ninja 与 Make

对于小型项目,GNU Make 或类似的构建系统可能已经足够了。由于 Ninja 是为性能而建立的,因此将其用于有许多源文件的复杂软件项目是有意义的。使用另一个工具生成 build.ninja 文件的额外步骤可能会给项目增加不必要的复杂性。

虽然 Ninja 的控制文件结构与 make 相似,但 Ninja 包含的功能要少得多。故意这样设计,是为了让 Ninja 能更快地构建项目。也就是说,不建议手工构建 Ninja 构建文件,因为其他的构建系统控制文件的构建功能更具表现力。

Ninja 构建系统和 Incredibuild

尽管 Ninja 构建系统速度很快,但其调用的编译器仍然需要时间来解析、编译和链接源代码项目,将源代码项目链接到最终的二进制构建中。Incredibuild 在远程设备上复制您的构建环境,然后在一个扩展的、平行的操作中执行构建,大大减少了编译时间。

Incredibuild 允许您利用网络或云机器上的额外计算资源,有效地将每台主机转化为具有数百个内核的超级计算机。

icon

总结

尽管缺乏详细的构建控制语法可能是小型项目的一个缺点,但 Ninja 精简的功能集提供了出色的性能。如果您最关心速度,那 Ninja 构建系统是最佳的选择。由于 Ninja 的存在,像 Google Chrome 这样的大型软件享受到了快速的构建过程,而您的大项目也可以从中受益。Ninja Incredibuild 搭配使用,可以让您根据需要扩展软件编译,减少构建时间,提高开发人员工作效率,并缩短上市时间。

开始免费试用

More Build systems