Sccache是一个类似于ccache的工具。它用作编译器包装器,并在可能的情况下避免编译。Sccache具有在远程存储环境中使用缓存的能力,包括各种云存储选项,或者可选地在本地存储中。
项目描述
sccache - 共享编译缓存
sccache是一个类似于ccache的编译器缓存工具。它用作编译器包装器,并在可能的情况下避免编译,缓存结果存储在本地磁盘或几个云存储后端之一。
sccache支持缓存C/C++代码、Rust的编译,以及使用nvcc和clang的NVIDIA CUDA。
sccache还提供了icecream风格的分布式编译(自动打包本地工具链)以支持所有支持的编译器(包括Rust)。分布式编译系统包括icecream缺少的几个安全功能,如身份验证、传输层加密以及在构建服务器上沙箱编译器执行。有关更多信息,请参阅分布式快速入门指南。
Sccache也作为GitHub Actions提供,以方便使用GitHub Actions缓存进行部署。
目录
安装
适用于Windows、Linux(针对musl编译的便携式二进制文件)和macOS的预构建x86-64二进制文件可在发布页面上找到。一些软件包管理器也包含了sccache软件包,您可以使用cargo从源代码安装最新版本,或者直接从源代码检出构建。
macOS
在macOS上,您可以通过Homebrew安装sccache。
brew install sccache
或通过MacPorts安装。
sudo port install sccache
Windows
在Windows上,您可以通过scoop安装sccache。
scoop install sccache
通过cargo
如果您已安装了Rust工具链,可以使用cargo安装sccache。**注意,这将从源代码编译sccache,这需要相当多的资源。出于CI目的,您应该使用预构建的二进制软件包。**
cargo install sccache --locked
用法
运行sccache就像运行ccache一样:在编译命令前加上它,如下所示
sccache gcc -o foo.o -c foo.c
如果您想使用sccache缓存Rust构建,可以在cargo配置文件中定义build.rustc-wrapper
。例如,您可以在$HOME/.cargo/config.toml
中全局设置它,通过添加以下内容:
[build]
rustc-wrapper = "/path/to/sccache"
注意,您需要使用1.40或更高版本的cargo才能使用此功能。
或者,您可以使用环境变量RUSTC_WRAPPER
export RUSTC_WRAPPER=/path/to/sccache
cargo build
sccache支持gcc、clang、MSVC、rustc、NVCC、NVC++和Wind River的diab编译器。gcc和msvc都支持响应文件,有关其实现的更多信息,请参阅此处。
如果您没有指定其他方式,sccache将使用本地磁盘缓存。
sccache使用客户端-服务器模型工作,其中服务器在客户端所在的同一台机器上本地运行。客户端-服务器模型允许服务器通过在内存中保持一些状态来提高效率。如果还没有运行,sccache命令将生成一个服务器进程,或者您可以通过运行sccache --start-server
来启动后台服务器进程而不执行任何编译。
您可以通过运行sccache --stop-server
来终止服务器。默认情况下,在10分钟后无活动时,它也将终止。
运行sccache --show-stats
将打印缓存统计摘要。
有关使用sccache
与Jenkins的一些说明,请参阅此处。
要使用sccache与cmake,请向cmake 3.4或更高版本提供以下命令行参数
-DCMAKE_C_COMPILER_LAUNCHER=sccache
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache
使用sccache与MSVC和cmake的过程取决于您使用的cmake版本。**对于3.24和更早版本的cmake**,要为使用MSVC进行调试生成PDB文件,您可以使用/Z7
选项。或者,如果/Fd
为每个生成的对象文件指定不同的PDB文件名,则/Zi
选项与/Fd
选项可以一起使用。请注意,CMake默认设置/Zi
,因此如果您使用CMake,您可以通过在CMakeLists.txt中添加以下代码使用/Z7
:
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
endif()
默认情况下,如果sccache无法成功与其相关服务器通信,则会终止您的构建。为了使sccache在不停机的情况下优雅地切换到本地编译器,请设置环境变量SCCACHE_IGNORE_SERVER_IO_ERROR=1
。
**对于3.25及更高版本的cmake**,要使用MSVC编译,您必须使用新的CMAKE_MSVC_DEBUG_INFORMATION_FORMAT
选项,用于配置-Z7
标志。此外,您必须将cmake策略编号0141设置为NEW设置
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
cmake_policy(SET CMP0141 NEW)
以下是一个自动在PATH
中查找sccache
的示例配置
find_program(SCCACHE sccache REQUIRED)
set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE})
set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE})
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
cmake_policy(SET CMP0141 NEW)
或者,如果通过命令行配置cmake使用MSVC,假设sccache位于默认搜索路径中
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded -DCMAKE_POLICY_CMP0141=NEW [...]
并且您可以在命令行中不带任何附加标志地构建代码,这对于IDE很有用。
构建要求
sccache 是一个 Rust 程序。构建它需要 cargo
(因此需要 rustc
)。sccache 当前需要 Rust 1.70.0。我们建议您通过 Rustup 安装 Rust。
构建
如果您出于非开发目的构建 sccache,请确保使用 cargo build --release
来获取优化后的二进制文件
cargo build --release [--no-default-features --features=s3|redis|gcs|memcached|azure]
默认情况下,sccache
会启用对所有存储后端的支持,但可以通过重置功能列表并启用所有其他后端来禁用个别后端。有关如何使用 Cargo 选择功能的详细信息,请参阅 Cargo 文档。
功能 vendored-openssl
可以在启用 openssl 功能的情况下将其静态链接到 openssl。
构建便携式二进制文件
当使用 dist-server
功能构建时,sccache
将依赖于 OpenSSL,如果您想分发便携式二进制文件,这可能会很烦人。可以使用 openssl/vendored
功能将 OpenSSL 静态链接。
Linux
使用 cargo
构建,并使用 ldd
检查生成的二进制文件是否不再依赖于 OpenSSL。
macOS
使用 cargo
构建,并使用 otool -L
检查生成的二进制文件是否不再依赖于 OpenSSL。
Windows
在 Windows 上,二进制文件可能还依赖于一些在旧版 Windows 版本上不可用的 MSVC CRT DLL。
可以使用以下内容的 .cargo/config.toml
文件来使用 CRT 静态链接。
[target.x86_64-pc-windows-msvc]
rustflags = ["-Ctarget-feature=+crt-static"]
使用 cargo
构建,并使用 dumpbin /dependents
检查生成的二进制文件是否不再依赖于 MSVC CRT DLL。
当使用 OpenSSL 静态链接时,您需要在 $PATH
中提供 Perl。
调用之间分离缓存
在应避免不同编译调用之间相互重用缓存结果的场景中,可以将 SCCACHE_C_CUSTOM_CACHE_BUSTER
设置为唯一的值,该值将混合到哈希中。已存在的 MACOSX_DEPLOYMENT_TARGET
和 IPHONEOS_DEPLOYMENT_TARGET
变量已显示这种重用抑制行为。目前没有用于编译 Rust 的此类变量。
覆盖缓存
如果缓存中包含损坏的构建工件,可能需要覆盖缓存中的内容。可以通过设置 SCCACHE_RECACHE
环境变量来实现。
调试
您可以将 SCCACHE_ERROR_LOG
环境变量设置为一个路径,并将 SCCACHE_LOG
设置为让服务器进程将日志重定向到那里(包括未处理的恐慌的输出,因为服务器内部设置了 RUST_BACKTRACE=1
)。
SCCACHE_ERROR_LOG=/tmp/sccache_log.txt SCCACHE_LOG=debug sccache
您还可以为您的构建系统设置这些环境变量,例如
SCCACHE_ERROR_LOG=/tmp/sccache_log.txt SCCACHE_LOG=debug cmake --build /path/to/cmake/build/directory
或者,如果您是在本地编译,可以通过运行 SCCACHE_START_SERVER=1 SCCACHE_NO_DAEMON=1 sccache
手动在前台模式下运行服务器,并通过设置 SCCACHE_LOG
环境变量(例如)将日志发送到 stderr。此方法不适用于 CI 服务,因为您需要同时在另一个 shell 中编译。
SCCACHE_LOG=debug SCCACHE_START_SERVER=1 SCCACHE_NO_DAEMON=1 sccache
与GNU make
作业服务器交互
sccache 提供了对 GNU make jobserver 的支持。当服务器从一个提供 jobserver 的进程启动时,sccache 将使用该 jobserver 并将其提供给其启动的任何进程。如果您从 GNU make 脚本运行 sccache,则需要使用前缀 +
来获取此行为。如果 sccache 服务器在没有 jobserver 的情况下启动,它将创建自己的 jobserver,其槽位数量等于可用的 CPU 核心数。
这在使用 sccache 进行 Rust 编译时最有用,因为 rustc 支持使用 jobserver 进行并行代码生成,这样可以确保 rustc 不会因代码生成任务而使系统过载。Cargo 为 rustc 实现了自己的 jobserver(请参阅 cargo 文档中有关 NUM_JOBS
的信息),因此通过 RUSTC_WRAPPER
在 cargo 中使用 sccache 进行 Rust 编译应自动完成正确的事情。
已知问题
通用
- 文件的绝对路径必须匹配才能命中缓存。这意味着即使您使用共享缓存,每个人也必须使用相同的绝对路径(即不在
$HOME
中)才能相互受益。在Rust中,这包括存储在默认位置$HOME/.cargo/registry/cache
的第三方crate的源代码。
Rust
- 无法缓存调用系统链接器的crate。这包括
bin
、dylib
、cdylib
和proc-macro
crate。您可能可以通过将它们转换为带有瘦bin
包装器的lib
crate 来提高大型bin
crate的编译时间。 - 增量编译的crate无法缓存。默认情况下,在调试配置文件中,Cargo将为工作空间成员和路径依赖项使用增量编译。您可以通过以下链接禁用增量编译:禁用增量编译
符号链接
- 到sccache的符号链接将不起作用。请使用硬链接:
ln sccache /usr/local/bin/cc
存储选项
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。
源分发
构建分发
sccache-0.7.7-py3-none-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 388279aff666c1a2ff3cf5dc70c93c0504b3eba9ca20a952cc50223bd29b598c |
|
MD5 | 8f1d228e18d961af4bd964b04d4c9928 |
|
BLAKE2b-256 | 797fa8937c74536d3228905f5ad03740f9d3d6f0b1023e22840ce2203aef4153 |
sccache-0.7.7-py3-none-win32.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6b43d270316d9682d5966e5020c1bdbc98b2d4e85e7638d859ead2977f095d01 |
|
MD5 | f7704dde65557ca70d11c20a0c171581 |
|
BLAKE2b-256 | 79d2c353ff509c3c37566c4315464f1c8e8f16ba332a15212fc71380e7e3c919 |
sccache-0.7.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4620a1cede7d5958e89104a8cb5c69b738acd3845c8830075e557a711727eee1 |
|
MD5 | 7f5eec3480d42e2cbb4b726363e02e7f |
|
BLAKE2b-256 | 30656652ca3d87e3163c98a27216f028496574f4767fd87bf7cf256220950f33 |
sccache-0.7.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3af8e826895edb76609c7bc39847346bd7b77798f08b34e37d70cf0f58e3ec53 |
|
MD5 | 017c640e700486afc88dd0feed71522b |
|
BLAKE2b-256 | 492fa3bdf3badee4d34840108d626544cabc15f977835bcc78c143bf35244533 |
sccache-0.7.7-py3-none-macosx_11_0_arm64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e6bf74e6cb9d83b40269a4bdcd04a50e93738c3aba732ecfd773634328d22176 |
|
MD5 | e2883b73f9e6fec022b15a921b4c5ca3 |
|
BLAKE2b-256 | 1b6c16b68867b0cdd2b1363ce8e9215b3cc4a80ef5dcc720a5dd33f9a488417a |
sccache-0.7.7-py3-none-macosx_10_12_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ca2987e91f6b7e4c271860a8b3e9dab8e800105619d98fedad31d8a44da4ee02 |
|
MD5 | b37610093713f4af588faba567870955 |
|
BLAKE2b-256 | 05e14e5f41ae3b8b8549685cdb77f96d53f95ab96bf31fbad9f35331676def72 |