分布式 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_CFLAGS
和HOST_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 bootstrap
的sccache
二进制文件确实包含此 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 bootstrap
的sccache
二进制文件确实包含此 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 版本是否与您本地运行的版本相同。