封闭操作

目标和动力

在任何构建系统中定义构建操作时,请务必正确 并完整指明该操作的输入和输出。 增量构建(在对源代码进行小幅更改后的部分重新构建)依赖于 此信息在构建图中存在且正确, 识别和执行重建。如果这些信息不正确或不完整, 重新构建可能会产生错误的结果, 干净 build。

只从其声明的输入中读取数据且只向其写入数据的 声明的输出对于构建系统而言是封闭的。 现在,我们还没有完全封闭的 build,不过有数十种操作 以及读取/写入不在其声明的输入/输出中的文件的工具。 这使我们从不完全依赖于生产环境中的增量重建, 迫使我们进行完全整洁的构建,这样速度约为原来的 10 倍。

此外,这些非封闭行为通常表现为缺乏连贯性, 构建系统的行为模式, 来排查问题

本项目旨在调查并修复所有非封闭 构建操作

技术背景

熟悉 GN 和 BUILD.gn 文件非常重要,尤其是 以下目标类型:

在许多情况下,您还需要了解 Depfile 的工作原理:

您可在本指南中找到更多重要信息:

如何提供帮助

选择任务

选择任何标记为非封闭的构建目标。它们如下所示:

action("foo") {
  ...
  # TODO(https://fxbug.dev/xxxxx): delete the line below and fix this
  hermetic_deps = false
}

执行任务

重现问题

若想了解某项操作为何是非封闭的,您需要使用 操作跟踪工具。此工具会在跟踪 其文件系统访问,然后将这些访问与声明的 这些操作的输入 / 输出 / 目录。

要在本地重现问题,请先移除 hermetic_deps = false,然后 按如下方式设置 build:

fx set what --args=build_should_trace_actions=true

使用上述设置运行 build 应该会产生以下错误: 实用的问题排查信息

默认情况下,CQ 会运行操作跟踪,因此您可以用它来 问题排查信息。

如果已经有针对相应问题的错误报告,则该错误应包含 错误信息。如果不存在错误,请提交一个,然后 并记录您收集的信息。

示例:https://fxbug.dev/42147316

解决问题

有一些常见原因会导致封闭问题。您可以看到 本指南。 如果您遇到本指南未涵盖的问题,请考虑 改进指南。

如果您能够移除 hermetic_deps = false 并且仍然成功构建 或者跟踪的 tryjob 通过,那么您的更改就可以 审核。

完成任务

按所有者查找审核者并合并您的更改。

示例

赞助商

如有疑问或需要更新状态,欢迎与我们联系: