Firefox 开发者成功为 WebIDL 代码生成引入了一种全新的缓存机制,在 Linux 环境下将构建时间缩短了 17%。此次更新利用了 Buildcache 特有的 Lua 插件系统,能够拦截原本会被 ccache 和 sccache 等传统编译器缓存忽略的基于 Python 的构建操作。
通过使用新的 Lua 封装器(wrapper),构建流程现在可以识别并缓存 `mozbuild.action.webidl` 命令的输出。该步骤负责从数百个 WebIDL 源文件生成数千个 C++ 文件。尽管该步骤具有确定性,但在之前的每次“彻底清理构建”(clobber build)中,它都必须从头开始运行。
优化构建周期
根据该项目的技术文档,此次修复涉及对 `dom/bindings/Makefile.in` 文件的一个微小改动。更新后,当 Buildcache 处于激活状态时,`py_action` 宏可以将命令封装器传递给 Python 构建操作。这使得 Buildcache 能够拦截 WebIDL 进程,并对其输入和输出应用哈希逻辑。
开发者的测试结果显示,在“热构建”(warm builds)过程中性能提升显著。在标准的 Linux 环境下,一次全新构建(clean build)耗时 5 分 35 秒;而使用带有全新 WebIDL 插件的 Buildcache 后,该时间缩短至仅 1 分 12 秒。
在工具对比方面,Buildcache 在热构建场景下的表现优于 ccache 和 sccache。虽然 ccache 能将构建时间缩短至 3 分 21 秒,但 Buildcache 插件的实现进一步为该过程节省了 15 秒。
该功能的开发者指出,虽然 WebIDL 的改进本身谈不上革命性,但它证明了该机制的可行性。该插件利用 Buildcache 的 `direct_mode` 功能直接对输入文件进行哈希处理,从而无需经过 C 预处理器。
这一实现为其他具有确定性的构建步骤提供了概念验证(proof of concept)。开发者计划探索将这种基于 Lua 的方法应用于 Firefox 构建流水线中其他由 Python 驱动的代码生成操作,以进一步加速“编辑-编译-测试”的循环周期。