Skip to content

Commit d250169

Browse files
committed
Auto merge of #38359 - alexcrichton:sccache, r=brson
rustbuild: Add sccache support This commit adds support for sccache, a ccache-like compiler which works on MSVC and stores results into an S3 bucket. This also switches over all Travis and AppVeyor automation to using sccache to ensure a shared and unified cache over time which can be shared across builders. The support for sccache manifests as a new `--enable-sccache` option which instructs us to configure LLVM differently to use a 'sccache' binary instead of a 'ccache' binary. All docker images for Travis builds are updated to download Mozilla's tooltool builds of sccache onto various containers and systems. Additionally a new `rust-lang-ci-sccache` bucket is configured to hold all of our ccache goodies. --- Note that this does not currently change Windows [due to previously written up issues](#38119 (comment)). Despite that, however, I was curious to get timings for the builds on Travis to see what ranges we're working with. As a result, this is a WIP PR I'm using to gauge build times and such.
2 parents c6d8ab0 + 96a5fc7 commit d250169

File tree

21 files changed

+152
-35
lines changed

21 files changed

+152
-35
lines changed

.travis.yml

+13-6
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,34 @@ matrix:
3030
RUST_CONFIGURE_ARGS=--target=x86_64-apple-darwin
3131
SRC=.
3232
os: osx
33-
install: brew install ccache
33+
install: &osx_install_sccache >
34+
curl -L https://api.pub.build.mozilla.org/tooltool/sha512/d0025b286468cc5ada83b23d3fafbc936b9f190eaa7d4a981715b18e8e3bf720a7bcee7bfe758cfdeb8268857f6098fd52dcdd8818232692a30ce91039936596 |
35+
tar xJf - -C /usr/local/bin --strip-components=1
3436
- env: >
3537
RUST_CHECK_TARGET=check
3638
RUST_CONFIGURE_ARGS=--target=i686-apple-darwin
3739
SRC=.
3840
os: osx
39-
install: brew install ccache
41+
install: *osx_install_sccache
4042
- env: >
4143
RUST_CHECK_TARGET=check
4244
RUST_CONFIGURE_ARGS=--target=x86_64-apple-darwin --disable-rustbuild
4345
SRC=.
4446
os: osx
45-
install: brew install ccache
47+
install: *osx_install_sccache
4648
- env: >
4749
RUST_CHECK_TARGET=
4850
RUST_CONFIGURE_ARGS=--target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios
4951
SRC=.
5052
os: osx
51-
install: brew install ccache
53+
install: *osx_install_sccache
54+
55+
env:
56+
global:
57+
- SCCACHE_BUCKET=rust-lang-ci-sccache
58+
- AWS_ACCESS_KEY_ID=AKIAIMX7VLAS3PZAVLUQ
59+
# AWS_SECRET_ACCESS_KEY=...
60+
- secure: "Pixhh0hXDqGCdOyLtGFjli3J2AtDWIpyb2btIrLe956nCBDRutRoMm6rv5DI9sFZN07Mms7VzNNvhc9wCW1y63JAm414d2Co7Ob8kWMZlz9l9t7ACHuktUiis8yr+S4Quq1Vqd6pqi7pf2J++UxC8R/uLeqVrubzr6+X7AbmEFE="
5261

5362
script:
5463
- >
@@ -77,5 +86,3 @@ notifications:
7786
cache:
7887
directories:
7988
- $HOME/docker
80-
- $HOME/.ccache
81-
- $HOME/.cargo

appveyor.yml

+12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
environment:
2+
SCCACHE_BUCKET: rust-lang-ci-sccache
3+
AWS_ACCESS_KEY_ID: AKIAIMX7VLAS3PZAVLUQ
4+
AWS_SECRET_ACCESS_KEY:
5+
secure: 1UkmbiDd15tWtYbMm5O2Uqm0b0Ur8v1MoSlydxl4ojcroPeerRMlUges0l57py8c
6+
SCCACHE_DIGEST: f808afabb4a4eb1d7112bcb3fa6be03b61e93412890c88e177c667eb37f46353d7ec294e559b16f9f4b5e894f2185fe7670a0df15fd064889ecbd80f0c34166c
27
matrix:
38
# 32/64 bit MSVC
49
- MSYS_BITS: 64
@@ -84,6 +89,13 @@ install:
8489
# Otherwise pull in the MinGW installed on appveyor
8590
- if NOT defined MINGW_URL set PATH=C:\msys64\mingw%MSYS_BITS%\bin;C:\msys64\usr\bin;%PATH%
8691

92+
# Download and install sccache
93+
- appveyor DownloadFile https://api.pub.build.mozilla.org/tooltool/sha512/%SCCACHE_DIGEST%
94+
- mv %SCCACHE_DIGEST% sccache.tar.bz2
95+
- 7z x -y sccache.tar.bz2 > nul
96+
- 7z x -y sccache.tar > nul
97+
- set PATH=%PATH%;%CD%\sccache2
98+
8799
test_script:
88100
- git submodule update --init
89101
- set SRC=.

configure

+17-4
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ opt llvm-assertions 0 "build LLVM with assertions"
621621
opt debug-assertions 0 "build with debugging assertions"
622622
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
623623
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
624+
opt sccache 0 "invoke gcc/clang via sccache to reuse object files between builds"
624625
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
625626
opt local-rebuild 0 "assume local-rust matches the current version, for rebuilds; implies local-rust, and is implied if local-rust already matches the current version"
626627
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
@@ -1677,11 +1678,23 @@ do
16771678
LLVM_CC_64_ARG1="gcc"
16781679
;;
16791680
("gcc")
1680-
LLVM_CXX_32="g++"
1681-
LLVM_CC_32="gcc"
1681+
if [ -z "$CFG_ENABLE_SCCACHE" ]; then
1682+
LLVM_CXX_32="g++"
1683+
LLVM_CC_32="gcc"
16821684

1683-
LLVM_CXX_64="g++"
1684-
LLVM_CC_64="gcc"
1685+
LLVM_CXX_64="g++"
1686+
LLVM_CC_64="gcc"
1687+
else
1688+
LLVM_CXX_32="sccache"
1689+
LLVM_CC_32="sccache"
1690+
LLVM_CXX_32_ARG1="g++"
1691+
LLVM_CC_32_ARG1="gcc"
1692+
1693+
LLVM_CXX_64="sccache"
1694+
LLVM_CC_64="sccache"
1695+
LLVM_CXX_64_ARG1="g++"
1696+
LLVM_CC_64_ARG1="gcc"
1697+
fi
16851698
;;
16861699

16871700
(*)

src/bootstrap/config.rs

+29-4
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use util::push_exe_path;
3838
/// `src/bootstrap/config.toml.example`.
3939
#[derive(Default)]
4040
pub struct Config {
41-
pub ccache: bool,
41+
pub ccache: Option<String>,
4242
pub ninja: bool,
4343
pub verbose: bool,
4444
pub submodules: bool,
@@ -138,7 +138,7 @@ struct Build {
138138
/// TOML representation of how the LLVM build is configured.
139139
#[derive(RustcDecodable, Default)]
140140
struct Llvm {
141-
ccache: Option<bool>,
141+
ccache: Option<StringOrBool>,
142142
ninja: Option<bool>,
143143
assertions: Option<bool>,
144144
optimize: Option<bool>,
@@ -147,6 +147,18 @@ struct Llvm {
147147
static_libstdcpp: Option<bool>,
148148
}
149149

150+
#[derive(RustcDecodable)]
151+
enum StringOrBool {
152+
String(String),
153+
Bool(bool),
154+
}
155+
156+
impl Default for StringOrBool {
157+
fn default() -> StringOrBool {
158+
StringOrBool::Bool(false)
159+
}
160+
}
161+
150162
/// TOML representation of how the Rust build is configured.
151163
#[derive(RustcDecodable, Default)]
152164
struct Rust {
@@ -247,7 +259,15 @@ impl Config {
247259
set(&mut config.vendor, build.vendor);
248260

249261
if let Some(ref llvm) = toml.llvm {
250-
set(&mut config.ccache, llvm.ccache);
262+
match llvm.ccache {
263+
Some(StringOrBool::String(ref s)) => {
264+
config.ccache = Some(s.to_string())
265+
}
266+
Some(StringOrBool::Bool(true)) => {
267+
config.ccache = Some("ccache".to_string());
268+
}
269+
Some(StringOrBool::Bool(false)) | None => {}
270+
}
251271
set(&mut config.ninja, llvm.ninja);
252272
set(&mut config.llvm_assertions, llvm.assertions);
253273
set(&mut config.llvm_optimize, llvm.optimize);
@@ -338,7 +358,6 @@ impl Config {
338358
}
339359

340360
check! {
341-
("CCACHE", self.ccache),
342361
("MANAGE_SUBMODULES", self.submodules),
343362
("COMPILER_DOCS", self.compiler_docs),
344363
("DOCS", self.docs),
@@ -475,6 +494,12 @@ impl Config {
475494
let path = parse_configure_path(value);
476495
self.python = Some(path);
477496
}
497+
"CFG_ENABLE_CCACHE" if value == "1" => {
498+
self.ccache = Some("ccache".to_string());
499+
}
500+
"CFG_ENABLE_SCCACHE" if value == "1" => {
501+
self.ccache = Some("sccache".to_string());
502+
}
478503
_ => {}
479504
}
480505
}

src/bootstrap/config.toml.example

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
# Indicates whether ccache is used when building LLVM
2727
#ccache = false
28+
# or alternatively ...
29+
#ccache = "/path/to/ccache"
2830

2931
# If an external LLVM root is specified, we automatically check the version by
3032
# default to make sure it's within the range that we're expecting, but setting

src/bootstrap/native.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ pub fn llvm(build: &Build, target: &str) {
109109

110110
// MSVC handles compiler business itself
111111
if !target.contains("msvc") {
112-
if build.config.ccache {
113-
cfg.define("CMAKE_C_COMPILER", "ccache")
112+
if let Some(ref ccache) = build.config.ccache {
113+
cfg.define("CMAKE_C_COMPILER", ccache)
114114
.define("CMAKE_C_COMPILER_ARG1", build.cc(target))
115-
.define("CMAKE_CXX_COMPILER", "ccache")
115+
.define("CMAKE_CXX_COMPILER", ccache)
116116
.define("CMAKE_CXX_COMPILER_ARG1", build.cxx(target));
117117
} else {
118118
cfg.define("CMAKE_C_COMPILER", build.cc(target))

src/bootstrap/sanity.rs

+4
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,8 @@ $ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake
223223
if build.lldb_version.is_some() {
224224
build.lldb_python_dir = run(Command::new("lldb").arg("-P")).ok();
225225
}
226+
227+
if let Some(ref s) = build.config.ccache {
228+
need_cmd(s.as_ref());
229+
}
226230
}

src/ci/docker/arm-android/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ RUN dpkg --add-architecture i386 && \
1616
expect \
1717
openjdk-9-jre \
1818
sudo \
19-
libstdc++6:i386
19+
libstdc++6:i386 \
20+
xz-utils
2021

2122
WORKDIR /android/
2223
ENV PATH=$PATH:/android/ndk-arm-9/bin:/android/sdk/tools:/android/sdk/platform-tools
@@ -33,6 +34,10 @@ COPY start-emulator.sh /android/
3334

3435
ENTRYPOINT ["/usr/bin/dumb-init", "--", "/android/start-emulator.sh"]
3536

37+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
38+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
39+
tar xJf - -C /usr/local/bin --strip-components=1
40+
3641
ENV TARGETS=arm-linux-androideabi
3742
ENV TARGETS=$TARGETS,i686-linux-android
3843
ENV TARGETS=$TARGETS,aarch64-linux-android

src/ci/docker/cross/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
2121
gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \
2222
gcc-powerpc64-linux-gnu libc6-dev-ppc64-cross \
2323
gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross \
24-
gcc-s390x-linux-gnu libc6-dev-s390x-cross
24+
gcc-s390x-linux-gnu libc6-dev-s390x-cross \
25+
xz-utils
26+
27+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
28+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
29+
tar xJf - -C /usr/local/bin --strip-components=1
2530

2631
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
2732
dpkg -i dumb-init_*.deb && \

src/ci/docker/i686-gnu-nopt/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
sudo \
14-
gdb
14+
gdb \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

src/ci/docker/i686-gnu/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
sudo \
14-
gdb
14+
gdb \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

src/ci/docker/run.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ docker \
2525
-t rust-ci \
2626
"`dirname "$script"`/$image"
2727

28-
mkdir -p $HOME/.ccache
2928
mkdir -p $HOME/.cargo
3029
mkdir -p $root_dir/obj
3130

@@ -35,8 +34,9 @@ exec docker \
3534
--volume "$root_dir/obj:/checkout/obj" \
3635
--workdir /checkout/obj \
3736
--env SRC=/checkout \
38-
--env CCACHE_DIR=/ccache \
39-
--volume "$HOME/.ccache:/ccache" \
37+
--env SCCACHE_BUCKET=$SCCACHE_BUCKET \
38+
--env AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
39+
--env AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
4040
--env CARGO_HOME=/cargo \
4141
--env LOCAL_USER_ID=`id -u` \
4242
--volume "$HOME/.cargo:/cargo" \

src/ci/docker/x86_64-freebsd/Dockerfile

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-ini
2323
rm dumb-init_*.deb
2424
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
2525

26+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
27+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
28+
tar xJf - -C /usr/local/bin --strip-components=1
29+
2630
ENV \
2731
AR_x86_64_unknown_freebsd=x86_64-unknown-freebsd10-ar \
2832
CC_x86_64_unknown_freebsd=x86_64-unknown-freebsd10-gcc

src/ci/docker/x86_64-gnu-cargotest/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
libssl-dev \
14-
sudo
14+
sudo \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

src/ci/docker/x86_64-gnu-debug/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
sudo \
14-
gdb
14+
gdb \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

src/ci/docker/x86_64-gnu-llvm-3.7/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1414
gdb \
1515
llvm-3.7-tools \
1616
libedit-dev \
17-
zlib1g-dev
17+
zlib1g-dev \
18+
xz-utils
19+
20+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
21+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
22+
tar xJf - -C /usr/local/bin --strip-components=1
1823

1924
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
2025
dpkg -i dumb-init_*.deb && \

src/ci/docker/x86_64-gnu-make/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
sudo \
14-
gdb
14+
gdb \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

src/ci/docker/x86_64-gnu-nopt/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
sudo \
14-
gdb
14+
gdb \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

src/ci/docker/x86_64-gnu/Dockerfile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1111
cmake \
1212
ccache \
1313
sudo \
14-
gdb
14+
gdb \
15+
xz-utils
16+
17+
ENV SCCACHE_DIGEST=7237e38e029342fa27b7ac25412cb9d52554008b12389727320bd533fd7f05b6a96d55485f305caf95e5c8f5f97c3313e10012ccad3e752aba2518f3522ba783
18+
RUN curl -L https://api.pub.build.mozilla.org/tooltool/sha512/$SCCACHE_DIGEST | \
19+
tar xJf - -C /usr/local/bin --strip-components=1
1520

1621
RUN curl -OL https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
1722
dpkg -i dumb-init_*.deb && \

0 commit comments

Comments
 (0)