Ninja 是一个轻量级、高性能的构建系统,专注于极速增量编译,广泛用于 Chromium、Android(Soong)、CMake(生成后端)等项目中。它的核心设计理念是简单和速度,通过最小化构建逻辑和并行化任务来实现高效编译。
一、Ninja基础介绍
1、Make与ninja对比
在传统的 C/C++ 项目中,通常采用 make 系统使用 Makefile 来进行整个项目的编译构建,Makefile 指定的编译依赖规则会使编译流程简单,但是 make 的依赖大而且复杂,在大型项目编译时,使用的模块越来越多,Makefile 组织的项目编译时间越来越长,这个对于编译效率来说是一个极大的浪费。
Ninja 是由 Google 员工 Evan Martin 开发的小型构建系统。Ninja 注重速度,它在两个主要方面与其他构建系统有所不同:Ninja 被设计为使其输入文件由更高级别的构建系统生成,并且其被设计为尽可能快地运行构建。
本质上,Ninja 旨在替换 Make,这在执行增量(或无操作)构建时很慢。这可能会大大降低开发人员在大型项目上的工作速度,例如 Google Chrome 将 40,000 个输入文件编译为单个可执行文件。实际上,谷歌浏览器是忍者的主要用户和动机。它也用于构建 Android,并且被大多数从事 LLVM 的开发人员所使用。
与 Make 相比,Ninja 缺少诸如字符串操作之类的功能,因为 Ninja 生成文件不是要手工编写的。相反,应使用