Ninja(忍者)一词让人联想到潜行和速度。在开发“另一个构建系统”时——正如 Ninja 的创造者 Evan Martin 在其手册中提到的那样——速度是最重要的。将构建系统命名为 Ninja 非常恰当,我将在这篇博文中向您展示它的功能,并强调它的独特之处。让我们开始吧。
Ninja 是什么,为什么是另一个构建系统?
让我们从为什么发明 Ninja 开始讨论。在将 Chromium 从 Windows 移植到其他操作系统期间,构建性能成为了一大障碍。点击此处了解全部详情。使用 Makefiles 被认为是次优选择,有一个新的构建系统在概念上非常类似于 Make,但它侧重于速度。它将 Chrome 的构建启动时间缩短到不到一秒,并且很快就实现开源了。它通过以下方式实现了这一壮举:
- 在设计原则上,侧重速度而非便捷
- 拥有最少的策略或内置规则集(由 ninja 输入文件处理)
- 构建始终并行运行,默认基于系统拥有的 CPU 数量
每个构建系统最终都会通过解析构建文件来创建依赖关系图。(在下一节中,我列出了一张 Ninja 本身的图像)。构建过程遍历此图,以获得最终输出。对于 Ninja,这是一个两阶段的遍历,其中:
- 在第一阶段中,将图形从最终输出向上遍历到输入文件,以查看是否有任何修改,并为构建创建一个计划
- 在第二阶段中,按照计划将图形从输入文件向下遍历并并行执行
此外,以下低级设计决策有助于 Ninja 提速:
- Re2c 用于解析构建文件,效率很高
- Ninja 将构建文件中的路径规范化。它不是将文件路径视为字符串,而是将路径转换为 Node 对象,从而消除用于路径相等性检查的成本昂贵的字符串比较。若要比较两条路径是否相等,Ninja 只需要进行非常快速的指针比较
- Ninja 以二进制序列化格式保存构建的配置(例如使用的编译标志)。要确定输出是否因构建配置更改而过期,只需要进行二进制哈希比较即可。
所有这些低级优化使 Ninja 快速高效。
获取 Ninja
在 Windows 上,从源代码构建 Ninja 很容易。其构建步骤如下所示:
- git clone https://github.com/ninja-build/ninja.git
- cd ninja && python configure.py –bootstrap
安装最新版本的 Python,并打开 Visual Studio x64 本机工具命令提示符。发出上述两个命令,其中第一个命令将从其 GitHub 仓库下载 Ninja 源代码,第二个命令将神奇地构建 Ninja。
Ninja 是使用 Ninja 和一种称为引导的技术构建的。引导步骤首先构建一个名为 ninja.bootstrap.exe 的可执行文件和一个 build.ninja 文件。此引导可执行文件进一步用于构建 ninja.exe。构建速度非常快,因为 Ninja 本身的依赖项非常小。我使用命令生成了以下 Ninja 依赖关系图:
- ninja -t graph ninja.exe > graph_ninja.dot
- dot -Tpng graph_ninja.dot > graph_ninja.png
使用 Ninja
要使用 Ninja 进行软件构建,我们需要创建默认名为 build.ninja 的输入构建文件。下面我们以构建 Ninja 所创建的 build.ninja 部分为例:
# This file is used to build ninja itself.# It is generated by configure.py.n