分布式 sccache (sccache-dist)

sccache 是一个类似于 ccache 的工具,由 Mozilla 和许多贡献者使用 Rust 编写。

sccache-dist,其分布式变体,通过在多台机器之间分发和缓存 Rust 编译来提升此功能。如果您在同一网络上有多台机器编译 Firefox,请考虑使用 sccache-dist。

下面详细介绍了将您的机器设置为 sccache-dist 服务器的步骤。

除了改进的安全特性之外,分布式 sccache 还提供了 Rust 编译的分发和缓存,因此它应该比我们使用 icecc 所看到的有所改进。构建服务器在 Linux 上运行,并且目前支持从 Linux、macOS 和 Windows 分发构建。

将构建作为 sccache-dist 客户端分发的步骤

首先按照 https://github.com/mozilla/sccache/blob/master/docs/DistributedQuickstart.md#configure-a-client 中的说明配置您的 sccache 分布式客户端。注意如果您从 Linux 分发,则工具链将自动打包并提供给构建服务器。如果您从 Windows 或 macOS 分发,请先使用 ./mach bootstrap 提供的交叉工具链,而不是尝试使用 icecc-create-env。建议使用 sccache 0.2.12 或更高版本,并且您的配置中的 auth 部分必须读取

[dist.auth]
type = "mozilla"
  • 如果您是从 macOS 客户端编译,这里还有一些其他注意事项:https://github.com/mozilla/sccache/blob/master/docs/DistributedQuickstart.md#considerations-when-distributing-from-macos

    运行 ./mach bootstrap 将预构建的工具链下载到 ~/.mozbuild/clang-dist-toolchain.tar.xz~/.mozbuild/rustc-dist-toolchain.tar.xz。这是一个示例路径,应将其添加到您的客户端配置中以指定在 macOS 上构建的工具链,位于 ~/Library/Application Support/Mozilla.sccache/config

    [[dist.toolchains]]
    type = "path_override"
    compiler_executable = "/path/to/home/.rustup/toolchains/stable-x86_64-apple-darwin/bin/rustc"
    archive = "/path/to/home/.mozbuild/rustc-dist-toolchain.tar.xz"
    archive_compiler_executable = "/builds/worker/toolchains/rustc/bin/rustc"
    
    [[dist.toolchains]]
    type = "path_override"
    compiler_executable = "/path/to/home/.mozbuild/clang/bin/clang"
    archive = "/path/to/home/.mozbuild/clang-dist-toolchain.tar.xz"
    archive_compiler_executable = "/builds/worker/toolchains/clang/bin/clang"
    
    [[dist.toolchains]]
    type = "path_override"
    compiler_executable = "/path/to/home/.mozbuild/clang/bin/clang++"
    archive = "/path/to/home/.mozbuild/clang-dist-toolchain.tar.xz"
    archive_compiler_executable = "/builds/worker/toolchains/clang/bin/clang"
    

    请注意,rustc-dist-toolchain.tar.xz 中找到的 rustc 版本必须与本地使用的 rustc 版本匹配。分布式存档将包含自动化构建使用的 rustc 版本,该版本在 Rust 发布后的几天内可能落后于稳定版本,这由 此文件 中的任务定义指定。例如,要指定 1.37.0 而不是当前稳定版本,请运行 rustup toolchain add 1.37.0 并指向 /path/to/home/.rustup/toolchains/1.37.0-x86_64-apple-darwin/bin/rustc 在您的客户端配置中。

    构建系统目前需要使用 HOST_CFLAGSHOST_CXXFLAGS 传递显式目标,例如:

    export HOST_CFLAGS="--target=x86_64-apple-darwin16.0.0"
    export HOST_CXXFLAGS="--target=x86_64-apple-darwin16.0.0"
    
  • 从 Windows 客户端编译受支持,但测试不如其他平台多。以下 mozconfig 示例可用作指南

    ac_add_options CCACHE="C:/Users/<USER>/.mozbuild/sccache/sccache.exe"
    
    export CC="C:/Users/<USER>/.mozbuild/clang/bin/clang-cl.exe --driver-mode=cl"
    export CXX="C:/Users/<USER>/.mozbuild/clang/bin/clang-cl.exe --driver-mode=cl"
    export HOST_CC="C:/Users/<USER>/.mozbuild/clang/bin/clang-cl.exe --driver-mode=cl"
    export HOST_CXX="C:/Users/<USER>/.mozbuild/clang/bin/clang-cl.exe --driver-mode=cl"
    

    客户端配置应位于 ~/AppData/Roaming/Mozilla/sccache/config/config,并且与 macOS 上一样,自定义工具链应使用 ./mach bootstrap 获取并在客户端配置中指定,例如

    [[dist.toolchains]]
    type = "path_override"
    compiler_executable = "C:/Users/<USER>/.mozbuild/clang/bin/clang-cl.exe"
    archive = "C:/Users/<USER>/.mozbuild/clang-dist-toolchain.tar.xz"
    archive_compiler_executable = "/builds/worker/toolchains/clang/bin/clang"
    
    [[dist.toolchains]]
    type = "path_override"
    compiler_executable = "C:/Users/<USER>/.rustup/toolchains/stable-x86_64-pc-windows-msvc/bin/rustc.exe"
    archive = "C:/Users/<USER>/.mozbuild/rustc-dist-toolchain.tar.xz"
    archive_compiler_executable = "/builds/worker/toolchains/rustc/bin/rustc"
    
  • 将以下内容添加到您的 mozconfig 中

    ac_add_options CCACHE=/path/to/home/.mozbuild/sccache/sccache
    

    如果您是从 macOS 客户端编译,则可能需要一些其他配置

    # Set the target flag to Darwin
    export CFLAGS="--target=x86_64-apple-darwin16.0.0"
    export CXXFLAGS="--target=x86_64-apple-darwin16.0.0"
    export HOST_CFLAGS="--target=x86_64-apple-darwin16.0.0"
    export HOST_CXXFLAGS="--target=x86_64-apple-darwin16.0.0"
    
    # Specify the macOS SDK to use
    ac_add_options --with-macos-sdk=/path/to/MacOSX-SDKs/MacOSX13.3.sdk
    

    您可以通过从 developer.apple.com 下载旧版本的 XCode 并从中解压缩 SDK 来获取正确的 macOS SDK。

  • 在尝试运行客户端时,应查阅 sccache -s 的输出以确认编译是否正在分发。为了在编译未分发的情况下从本地守护程序接收有用的日志,请在构建之前,在与构建分开的终端窗口中运行 SCCACHE_NO_DAEMON=1 SCCACHE_START_SERVER=1 SCCACHE_LOG=sccache=trace path/to/sccache注意如果您的 sccache 版本不包含 拉取请求 822,请使用 RUST_LOG 而不是 SCCACHE_LOG。(来自 mach bootstrapsccache 二进制文件确实包含此 PR。)

  • 运行 ./mach build -j<value>,其中 <value> 的值应适当大。sccache --dist-status 应该提供可用于您的核心数(或如果未连接则显示消息)。将来,这将与构建系统集成,以自动选择合适的值。

这应该足以分发您的构建并替换您对 icecc 的使用。请记住,可能会有几个障碍,并且在进一步调查之前,请确保您的 sccache 版本是最新的。请参阅下面的常见问题部分,如果任何问题阻止您通过电子邮件 (dev-builds)、#sccache 的 slack 或 irc 上的 #build 寻求帮助。

设置服务器的步骤

构建服务器必须运行 Linux 并使用 bubblewrap 0.3.0+ 来沙盒编译进程。这需要内核 4.6 或更高版本,例如 Ubuntu 18+、RHEL 8 或类似版本。

  • 运行 ./mach bootstrap./mach artifact toolchain --from-build linux64-sccache 以获取最新版本的 sccache-dist。请使用以这种方式获取的 sccache-dist 二进制文件以确保与静态链接的依赖项兼容。

  • https://github.com/mozilla/sccache/blob/master/docs/DistributedQuickstart.md#configure-a-build-server 中的说明应包含配置和运行服务器所需的所有其他内容。

    注意端口 10500 将按照惯例由构建器使用。请在构建器配置的 public_addr 部分中使用端口 10500。

    设置服务器时,额外的日志记录可能会有所帮助。要启用日志记录,请使用 sudo env SCCACHE_LOG=sccache=trace ~/.mozbuild/sccache/sccache-dist server --config ~/.config/sccache/server.conf(或类似命令)运行您的服务器。注意 sudo 必须出现在设置环境变量之前才能正常工作。注意如果您的 sccache 版本不包含 拉取请求 822,请使用 RUST_LOG 而不是 SCCACHE_LOG。(来自 mach bootstrapsccache 二进制文件确实包含此 PR。)

常见问题/注意事项

  • 我的构建仍然很慢:scache-dist 只能对无法并行化构建的部分做一些事情。要开始调试缓慢的构建,请确保 sccache -s 输出中的“成功的分布式编译”行占主导地位。对于完整的构建,应观察到至少 2-3 倍的改进。

  • 我的构建输出由于警告泛滥而难以理解:当 clang 在单独的调用中接收预处理代码时,它会以不同的方式处理某些警告(预处理在本地使用 sccache-dist 进行)。将 rewrite_includes_only = true 添加到客户端配置的 dist 部分将改善这种情况;但是,设置此选项会导致构建失败,因为 glibc 的常用版本存在问题。一旦修复程序更广泛地可用,此选项将默认为 true。此修复程序的详细信息可以在 此补丁 中找到。

  • 我的构建失败,并显示有关依赖 crate 之间 rustc 版本不兼容的消息:如果您使用的是自定义工具链,请检查 rustc-dist-toolchain.tar.xz 中的 rustc 版本是否与您本地运行的版本相同。