特定于 Fuchsia 的 Ninja 改进

Fuchsia 构建系统使用自定义 Ninja 二进制文件,该二进制文件提供了 改善开发者体验。本页对此进行了介绍。

设计初衷

为 Fuchsia 定制 Ninja 的动机详细说明了 RFC-0153

简而言之,Fuchsia 有许多实用功能。 开发者。

所有特定于 Fuchsia 的更改都在本地 fuchsia-rfc-0153 上执行 本地 Ninja git 镜像的分支,以及 定期重新调整,以便于以 GitHub 拉取请求的形式发送 添加到上游项目,如 RFC 的“策略”部分

功能:运行命令的状态

将您环境中的NINJA_STATUS_MAX_COMMANDS设为严格正数 整数供 Ninja 输出,在智能终端中运行时, 运行时间最长的命令以及经过的时间。 例如,对于 export NINJA_STATUS_MAX_COMMANDS=4,状态可能如下所示 例如:

[0/28477](260) STAMP host_x64/obj/tools/configc/configc_sdk_meta_generated_file.stamp
  0.4s | STAMP obj/sdk/zircon_sysroot_meta_verify.stamp
  0.4s | CXX obj/BUILD_DIR/fidling/gen/sdk/fidl/fuchsia.me...chsia.media/cpp/fuchsia.media_cpp_common.common_types.cc.o
  0.4s | CXX obj/BUILD_DIR/fidling/gen/sdk/fidl/fuchsia.me...fuchsia.media/cpp/fuchsia.media_cpp.natural_messaging.cc.o
  0.4s | CXX obj/BUILD_DIR/fidling/gen/sdk/fidl/fuchsia.me...dia/cpp/fuchsia.media_cpp_natural_types.natural_types.cc.o

以下动画图片展示了实际操作方式:

Ninja 多行状态示例

请注意:

  • 在试运行或详细调用中,此功能会自动停用 Ninja(即使用 -n--verbose 标志)。

  • 当 Ninja 不在 是交互式 / 智能终端。

  • 运行控制台命令时也会暂停此功能(可见 )。

  • 借助此功能,您可以轻松直观呈现构建中的瓶颈,即 会阻止其他命令并行运行的长效命令。

命令表默认每秒更新 10 次,这非常有用 来了解哪些长命令会阻碍构建进程可以 将 NINJA_STATUS_REFRESH_MILLIS 设置为小数以更改刷新周期 以毫秒为单位的值(并非所有小于 100 的值都会被忽略,因为 用时仅输出一个十进制小数)。

功能:可缩短启动时间的持久模式

通过将 NINJA_PERSISTENT_MODE=1 您的环境此功能使 Ninja 启动后台服务器进程 读取一次构建清单,然后将构建图保存在内存中, 后续版本。

请注意:

  • 此功能应是完全透明的,不应影响 其他忍者的行为。如果您发现了问题或不同之处,请 请发送电子邮件至 fuchsia-build-team@google.com 与我们联系!

  • 系统会自动检测输入 .ninja 文件中的任何更改。在本课中, 系统会关闭现有服务器,并启动新的服务器 。更改后不需要额外的用户互动 GN build 文件或执行 jiri update

  • 服务器进程将在空闲 5 分钟后正常关闭。 在您的环境中设置 NINJA_PERSISTENT_TIMEOUT_SECONDS=<count> 来更改此延迟时间

  • 使用 fx build -t server status 检索服务器的状态 。

  • 使用 fx build -t server stop 停止正在运行的服务器实例 。

  • 设置 NINJA_PERSISTENT_LOG_FILE=<path> 以发送与 永久模式。

  • 对于 core.x64,每个服务器进程目前大约需要 1 GiB 的 RAM build 配置。确切数字将取决于忍者的体型 这取决于您的 args.gn 配置。

  • 每个 Ninja 构建目录最多可由一个服务器进程提供。 但在使用多个 build 时,可能会有多个进程 目录。

  • 忍者工具(例如 ninja -C <dir> -t commands <target>)无法在 所以仍将使用缓慢启动。此问题将在 来加快查询速度。

已知错误 / 注意事项,将得到解决:

  • 如果在同一目录上混合使用永久性构建和非永久性构建, 导致服务器感到困惑,因为对 Ninja 的 build 和 deps 日志。此问题将会解决。

    权宜解决方法:在取消设置之前使用 -t server stop 停止服务器 NINJA_PERSISTENT_MODE

  • “快速启动”需要几秒钟的时间。目前,每次增量构建 仍然需要针对构建图中的所有文件调用 stat(), 目前需要几秒钟的时间。这一问题以后将由 使用主机的基于 inotify / kqueue 的文件系统监控功能 只要在上传完几个文件后就立即开始 。

  • 目前无法在 Windows 上运行。这是由于 Win32 技术限制 阻止将控制台句柄复制到其他进程。这主要是 上游 Ninja 团队出现的问题,因为 Fuchsia 开发 都是在 Windows 上发生的。