目标和动力
在任何构建系统中定义构建操作时,请务必正确 并完整指明该操作的输入和输出。 增量构建(在对源代码进行小幅更改后的部分重新构建)依赖于 此信息在构建图中存在且正确, 识别和执行重建。如果这些信息不正确或不完整, 重新构建可能会产生错误的结果, 干净 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 会运行操作跟踪,因此您可以用它来 问题排查信息。
如果已经有针对相应问题的错误报告,则该错误应包含 错误信息。如果不存在错误,请提交一个,然后 并记录您收集的信息。
解决问题
有一些常见原因会导致封闭问题。您可以看到 本指南。 如果您遇到本指南未涵盖的问题,请考虑 改进指南。
如果您能够移除 hermetic_deps = false
并且仍然成功构建
或者跟踪的 tryjob 通过,那么您的更改就可以
审核。
完成任务
按所有者查找审核者并合并您的更改。
示例
- 472565:[build] 在 generate_fidl_json.py 中生成 depfile
- 472657:[build] 修复了 hotsort_target_internal 的封闭性
- 473980:[build] 修复了 fidl-c-header 的封闭性
- 472658:[build] 让 go_library 封闭构建
- 472637:[build] 修复了平面缓冲区的封闭性
赞助商
如有疑问或需要更新状态,欢迎与我们联系: