Skip to content

Commit 17146a2

Browse files
committed
Auto merge of rust-lang#117771 - tmandry:fuchsia-gha, r=<try>
Build Fuchsia in CI This is very much in a draft state but I wanted to put it up now to get early feedback. It would also be nice if we could test it on actual CI builders. Fittingly, it is failing right now due to discovering an ICE in clippy, probably more fallout from recent type system changes. Other recent regressions this would have caught include - rust-lang#117455 and rust-lang#117493 - rust-lang#117602 This ends up not sharing very much at all with cargotest. Fuchsia has its own tool to manage checkouts and its own build system. What it requires is a fully "install"ed toolchain with a host and fuchsia target. We share logic from the dist-various-2 builder to build the fuchsia target. Right now this runs clippy and skips linking a bunch of targets, since most issues we catch are in the frontend. In theory we could probably get the build CPU time down quite a bit with this approach, but right now some linked targets are creeping into the dependencies anyway and we don't have a good way of preventing that yet. The approach is basically to get a checkout at a pinned commit and then run a [script](https://fuchsia-review.git.corp.google.com/c/fuchsia/+/943833/6/scripts/rust/build_fuchsia_from_rust_ci.sh) at a predetermined location. I would like to update that pin every few weeks. For now we cherry-pick some build changes but that's temporary. Partial checkouts are used to minimize clone time, but we don't filter out prebuilt packages. r? `@Mark-Simulacrum` Based on discussion in [this Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/242791-t-infra/topic/Putting.20Fuchsia.20in.20crater).
2 parents 0f44eb3 + 234ade5 commit 17146a2

File tree

8 files changed

+222
-10
lines changed

8 files changed

+222
-10
lines changed

.github/workflows/ci.yml

+6
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ jobs:
288288
- name: x86_64-gnu-aux
289289
os: ubuntu-20.04-4core-16gb
290290
env: {}
291+
- name: x86_64-gnu-experimental
292+
os: ubuntu-20.04-16core-64gb
293+
env: {}
291294
- name: x86_64-gnu-debug
292295
os: ubuntu-20.04-8core-32gb
293296
env: {}
@@ -583,6 +586,9 @@ jobs:
583586
env:
584587
CODEGEN_BACKENDS: "llvm,cranelift"
585588
os: ubuntu-20.04-16core-64gb
589+
- name: x86_64-gnu-experimental
590+
os: ubuntu-20.04-16core-64gb
591+
env: {}
586592
timeout-minutes: 600
587593
runs-on: "${{ matrix.os }}"
588594
steps:

src/bootstrap/mk/Makefile.in

+9
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ check-aux:
5252
src/tools/cargo \
5353
src/tools/cargotest \
5454
$(BOOTSTRAP_ARGS)
55+
check-fuchsia:
56+
mkdir -p $(RUST_INSTALL_DIR)/etc
57+
$(Q)$(BOOTSTRAP) install --stage 1 \
58+
compiler/rustc \
59+
library/std
60+
$(Q)$(BOOTSTRAP) test --stage 2 \
61+
src/tools/cargotest \
62+
--test-args=fuchsia \
63+
$(BOOTSTRAP_ARGS)
5564
dist:
5665
$(Q)$(BOOTSTRAP) dist $(BOOTSTRAP_ARGS)
5766
distcheck:

src/bootstrap/src/core/build_steps/compile.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1711,7 +1711,7 @@ impl Step for Assemble {
17111711
let dst_exe = exe("rust-lld", target_compiler.host);
17121712
builder.copy(&lld_install.join("bin").join(&src_exe), &libdir_bin.join(&dst_exe));
17131713
let self_contained_lld_dir = libdir_bin.join("gcc-ld");
1714-
t!(fs::create_dir(&self_contained_lld_dir));
1714+
t!(fs::create_dir_all(&self_contained_lld_dir));
17151715
let lld_wrapper_exe = builder.ensure(crate::core::build_steps::tool::LldWrapper {
17161716
compiler: build_compiler,
17171717
target: target_compiler.host,

src/ci/docker/host-x86_64/dist-various-2/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ RUN env \
8080

8181
WORKDIR /tmp
8282
COPY host-x86_64/dist-various-2/shared.sh /tmp/
83-
COPY host-x86_64/dist-various-2/build-fuchsia-toolchain.sh /tmp/
83+
COPY scripts/build-fuchsia-toolchain.sh /tmp/
8484
RUN /tmp/build-fuchsia-toolchain.sh
8585
COPY host-x86_64/dist-various-2/build-solaris-toolchain.sh /tmp/
8686
RUN /tmp/build-solaris-toolchain.sh x86_64 amd64 solaris-i386 pc
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
FROM ubuntu:22.04
2+
3+
ARG DEBIAN_FRONTEND=noninteractive
4+
RUN apt-get update && apt-get install -y --no-install-recommends \
5+
build-essential \
6+
gawk \
7+
g++ \
8+
make \
9+
ninja-build \
10+
file \
11+
curl \
12+
ca-certificates \
13+
python3 \
14+
git \
15+
cmake \
16+
libssl-dev \
17+
sudo \
18+
time \
19+
xz-utils \
20+
pkg-config \
21+
unzip \
22+
&& rm -rf /var/lib/apt/lists/*
23+
24+
# Copied from dist-various-2 Dockerfile.
25+
# TODO move to canonical triple and deduplicate this list
26+
ENV \
27+
AR_x86_64_unknown_fuchsia=x86_64-unknown-fuchsia-ar \
28+
CC_x86_64_unknown_fuchsia=x86_64-unknown-fuchsia-clang \
29+
CFLAGS_x86_64_unknown_fuchsia="--target=x86_64-unknown-fuchsia --sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot -I/usr/local/core-linux-amd64-fuchsia-sdk/pkg/fdio/include" \
30+
CXX_x86_64_unknown_fuchsia=x86_64-unknown-fuchsia-clang++ \
31+
CXXFLAGS_x86_64_unknown_fuchsia="--target=x86_64-unknown-fuchsia --sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot -I/usr/local/core-linux-amd64-fuchsia-sdk/pkg/fdio/include" \
32+
LDFLAGS_x86_64_unknown_fuchsia="--target=x86_64-unknown-fuchsia --sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot -L/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/lib" \
33+
AR_x86_64_fuchsia=x86_64-unknown-fuchsia-ar \
34+
CC_x86_64_fuchsia=x86_64-unknown-fuchsia-clang \
35+
CFLAGS_x86_64_fuchsia="--target=x86_64-unknown-fuchsia --sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot -I/usr/local/core-linux-amd64-fuchsia-sdk/pkg/fdio/include" \
36+
CXX_x86_64_fuchsia=x86_64-unknown-fuchsia-clang++ \
37+
CXXFLAGS_x86_64_fuchsia="--target=x86_64-unknown-fuchsia --sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot -I/usr/local/core-linux-amd64-fuchsia-sdk/pkg/fdio/include" \
38+
LDFLAGS_x86_64_fuchsia="--target=x86_64-unknown-fuchsia --sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot -L/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/lib"
39+
40+
WORKDIR /tmp
41+
COPY scripts/build-fuchsia-toolchain.sh /tmp/
42+
RUN /tmp/build-fuchsia-toolchain.sh
43+
44+
# TODO move to canonical triple
45+
ENV CARGO_TARGET_X86_64_FUCHSIA_AR /usr/local/bin/llvm-ar
46+
ENV CARGO_TARGET_X86_64_FUCHSIA_RUSTFLAGS \
47+
-C link-arg=--sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot \
48+
-Lnative=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/sysroot/lib \
49+
-Lnative=/usr/local/core-linux-amd64-fuchsia-sdk/arch/x64/lib
50+
ENV CARGO_TARGET_AARCH64_FUCHSIA_AR /usr/local/bin/llvm-ar
51+
ENV CARGO_TARGET_AARCH64_FUCHSIA_RUSTFLAGS \
52+
-C link-arg=--sysroot=/usr/local/core-linux-amd64-fuchsia-sdk/arch/arm64/sysroot \
53+
-Lnative=/usr/local/core-linux-amd64-fuchsia-sdk/arch/arm64/sysroot/lib \
54+
-Lnative=/usr/local/core-linux-amd64-fuchsia-sdk/arch/arm64/lib
55+
56+
ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS -Clink-arg=-static-libstdc++
57+
58+
ENV TARGETS=x86_64-fuchsia
59+
ENV TARGETS=$TARGETS,x86_64-unknown-linux-gnu
60+
61+
COPY scripts/sccache.sh /scripts/
62+
RUN sh /scripts/sccache.sh
63+
64+
ENV RUST_INSTALL_DIR /checkout/obj/install
65+
RUN mkdir -p $RUST_INSTALL_DIR/etc
66+
67+
ENV RUST_CONFIGURE_ARGS --prefix=$RUST_INSTALL_DIR --sysconfdir=etc --enable-lld --llvm-libunwind=in-tree --enable-extended --disable-docs
68+
ENV SCRIPT \
69+
python3 ../x.py install --target $TARGETS compiler/rustc library/std clippy && \
70+
python3 ../x.py test src/tools/cargotest
71+

src/ci/docker/host-x86_64/dist-various-2/build-fuchsia-toolchain.sh renamed to src/ci/docker/scripts/build-fuchsia-toolchain.sh

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,33 @@
11
#!/usr/bin/env bash
22

3+
# TODO: copied from shared.sh
4+
hide_output() {
5+
{ set +x; } 2>/dev/null
6+
on_err="
7+
echo ERROR: An error was encountered with the build.
8+
cat /tmp/build.log
9+
exit 1
10+
"
11+
trap "$on_err" ERR
12+
bash -c "while true; do sleep 30; echo \$(date) - building ...; done" &
13+
PING_LOOP_PID=$!
14+
"$@" &> /tmp/build.log
15+
trap - ERR
16+
kill $PING_LOOP_PID
17+
set -x
18+
}
19+
320
set -ex
4-
source shared.sh
21+
#source shared.sh
522

623
FUCHSIA_SDK_URL=https://chrome-infra-packages.appspot.com/dl/fuchsia/sdk/core/linux-amd64
7-
FUCHSIA_SDK_ID=4xjxrGUrDbQ6_zJwj6cDN1IbWsWV5aCQXC_zO_Hu0XkC
8-
FUCHSIA_SDK_SHA256=e318f1ac652b0db43aff32708fa70337521b5ac595e5a0905c2ff33bf1eed179
24+
FUCHSIA_SDK_ID=MrhQwtmP8CpZre-i_PNOREcThbUcrX3bA-45d6WQr-cC
25+
FUCHSIA_SDK_SHA256=32b850c2d98ff02a59adefa2fcf34e44471385b51cad7ddb03ee3977a590afe7
926
FUCHSIA_SDK_USR_DIR=/usr/local/core-linux-amd64-fuchsia-sdk
1027
CLANG_DOWNLOAD_URL=\
1128
https://chrome-infra-packages.appspot.com/dl/fuchsia/third_party/clang/linux-amd64
12-
CLANG_DOWNLOAD_ID=vU0vNjSihOV4Q6taQYCpy03JXGiCyVwxen3rFMNMIgsC
13-
CLANG_DOWNLOAD_SHA256=bd4d2f3634a284e57843ab5a4180a9cb4dc95c6882c95c317a7deb14c34c220b
29+
CLANG_DOWNLOAD_ID=Tpc85d1ZwSlZ6UKl2d96GRUBGNA5JKholOKe24sRDr0C
30+
CLANG_DOWNLOAD_SHA256=4e973ce5dd59c12959e942a5d9df7a19150118d03924a86894e29edb8b110ebd
1431

1532
install_clang() {
1633
mkdir -p clang_download

src/ci/github-actions/ci.yml

+6
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,9 @@ jobs:
470470
- name: x86_64-gnu-aux
471471
<<: *job-linux-4c
472472

473+
- name: x86_64-gnu-experimental
474+
<<: *job-linux-16c
475+
473476
- name: x86_64-gnu-debug
474477
<<: *job-linux-8c
475478

@@ -734,6 +737,9 @@ jobs:
734737
env:
735738
CODEGEN_BACKENDS: llvm,cranelift
736739
<<: *job-linux-16c
740+
- name: x86_64-gnu-experimental
741+
<<: *job-linux-16c
742+
737743

738744
master:
739745
name: master

src/tools/cargotest/main.rs

+106-3
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,16 @@ fn main() {
106106
let out_dir = Path::new(&args[2]);
107107
let cargo = &Path::new(cargo);
108108

109-
for test in TEST_REPOS.iter().rev() {
110-
if args[3..].is_empty() || args[3..].iter().any(|s| s.contains(test.name)) {
111-
test_repo(cargo, out_dir, test);
109+
if false {
110+
for test in TEST_REPOS.iter().rev() {
111+
if args[3..].is_empty() || args[3..].iter().any(|s| s.contains(test.name)) {
112+
test_repo(cargo, out_dir, test);
113+
}
114+
}
115+
} else {
116+
// For now, let Fuchsia tests fail.
117+
if std::panic::catch_unwind(|| test_fuchsia(out_dir)).is_err() {
118+
eprintln!("Fuchsia tests failed; continuing.");
112119
}
113120
}
114121
}
@@ -216,3 +223,99 @@ fn run_cargo_test(
216223

217224
status.success()
218225
}
226+
227+
fn test_fuchsia(out_dir: &Path) {
228+
const INTEGRATION_SHA: &str = "06ae16d18bd8e4db9a3fc062f678a170025d9f1a";
229+
const PICK_REFS: &[&str] = &["refs/changes/58/938058/3", "refs/changes/33/943833/6"];
230+
231+
// This script will:
232+
// - create a directory named "fuchsia" if it does not exist
233+
// - download "jiri" to "fuchsia/.jiri_root/bin"
234+
const BOOTSTRAP: &'static str = r#"
235+
curl -s "https://fuchsia.googlesource.com/jiri/+/HEAD/scripts/bootstrap_jiri?format=TEXT" | base64 --decode | bash -s fuchsia
236+
"#;
237+
let status = Command::new("sh").arg("-c").arg(BOOTSTRAP).current_dir(out_dir).status().unwrap();
238+
assert!(status.success(), "bootstrap_jiri failed");
239+
240+
let checkout_dir = &out_dir.join("fuchsia");
241+
let jiri = || {
242+
let mut cmd = Command::new(".jiri_root/bin/jiri");
243+
cmd.current_dir(checkout_dir);
244+
cmd
245+
};
246+
247+
let status = jiri()
248+
.arg("init")
249+
.arg("-partial=true")
250+
.arg("-analytics-opt=false")
251+
.arg(checkout_dir)
252+
.status()
253+
.unwrap();
254+
assert!(status.success(), "jiri init failed");
255+
256+
let status = jiri()
257+
.args([
258+
"import",
259+
"-name=integration",
260+
&format!("-revision={INTEGRATION_SHA}"),
261+
"-overwrite=true",
262+
"flower",
263+
"https://fuchsia.googlesource.com/integration",
264+
])
265+
.status()
266+
.unwrap();
267+
assert!(status.success(), "jiri import failed");
268+
269+
if checkout_dir.join(".git").is_dir() {
270+
// Wipe out any local changes if we're reusing a checkout.
271+
let status = Command::new("git")
272+
.arg("checkout")
273+
.arg("--force")
274+
.arg("JIRI_HEAD")
275+
.current_dir(checkout_dir)
276+
.status()
277+
.unwrap();
278+
assert!(status.success(), "checkout JIRI_HEAD failed");
279+
}
280+
281+
let status = jiri()
282+
.arg("update")
283+
.arg("-autoupdate=false")
284+
// .arg("-v")
285+
.status()
286+
.unwrap();
287+
assert!(status.success(), "jiri update failed");
288+
289+
let integration = Command::new("git")
290+
.current_dir(checkout_dir.join("integration"))
291+
.arg("rev-parse")
292+
.arg("HEAD")
293+
.output()
294+
.unwrap()
295+
.stdout;
296+
let integration = String::from_utf8_lossy(&integration);
297+
println!("integration commit = {integration}");
298+
299+
for git_ref in PICK_REFS {
300+
let status = Command::new("git")
301+
.current_dir(checkout_dir)
302+
.args(["fetch", "https://fuchsia.googlesource.com/fuchsia", git_ref])
303+
.status()
304+
.unwrap();
305+
assert!(status.success(), "fetching ref '{git_ref}' failed");
306+
307+
let status = Command::new("git")
308+
.current_dir(checkout_dir)
309+
.args(["cherry-pick", "--no-commit", "FETCH_HEAD"])
310+
.status()
311+
.unwrap();
312+
assert!(status.success(), "picking ref '{git_ref}' failed");
313+
}
314+
315+
let status = Command::new("bash")
316+
.current_dir(checkout_dir)
317+
.arg("scripts/rust/build_fuchsia_from_rust_ci.sh")
318+
.status()
319+
.unwrap();
320+
assert!(status.success(), "fuchsia build failed");
321+
}

0 commit comments

Comments
 (0)