@@ -108,14 +108,82 @@ RUN userdel -r ubuntu
108108
109109ENTRYPOINT  ["autouseradd" , "--user" , "materialize" ]
110110
111- #  Stage 2: Build a full CI Builder image that can be used for any CI job.
111+ #  Stage 2. Build a cross-compiling toolchain that targets the oldest version of
112+ #  Linux that we support.
113+ # 
114+ #  TODO(parkmycar): This shouldn't be necessary anymore with Bazel.
115+ FROM  ubuntu:noble-20250619 as crosstool
116+ 
117+ ARG  ARCH_GCC
118+ ARG  ARCH_GO
119+ 
120+ WORKDIR  /scratch
121+ 
122+ #  The environment variables are necessary to convince `tzdata`'s install scripts
123+ #  not to hang.
124+ #  See: https://serverfault.com/questions/949991/how-to-install-tzdata-on-a-ubuntu-docker-image
125+ RUN  apt-get update --fix-missing && TZ=UTC DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
126+     autoconf \
127+     automake \
128+     bison \
129+     bzip2 \
130+     ca-certificates \
131+     curl \
132+     file \
133+     flex \
134+     gawk \
135+     g++ \
136+     gcc \
137+     gnupg2 \
138+     help2man \
139+     libc-dev \
140+     libncurses-dev \
141+     libstdc++6 \
142+     libstdc++-13-dev \
143+     libtool-bin \
144+     llvm \
145+     make \
146+     patch \
147+     texinfo \
148+     unzip \
149+     xz-utils
150+ 
151+ COPY  crosstool.asc ./
152+ 
153+ #  Faster uncompression
154+ ARG  XZ_OPT=-T0
155+ 
156+ RUN  gpg --import crosstool.asc \
157+     && rm crosstool.asc \
158+     && echo "trusted-key 09f6dd5f1f30ef2e"  >> ~/.gnupg/gpg.conf \
159+     && mkdir crosstool \
160+     && curl -fsSL https://github.com/crosstool-ng/crosstool-ng/releases/download/crosstool-ng-1.26.0/crosstool-ng-1.26.0.tar.xz > crosstool.tar.xz \
161+     && curl -fsSL https://github.com/crosstool-ng/crosstool-ng/releases/download/crosstool-ng-1.26.0/crosstool-ng-1.26.0.tar.xz.sig > crosstool.sig \
162+     && gpg --verify crosstool.sig crosstool.tar.xz \
163+     && tar -xf crosstool.tar.xz -C crosstool --strip-components=1 \
164+     && rm crosstool.sig crosstool.tar.xz \
165+     && (cd crosstool && ./configure && make install) \
166+     && rm -rf crosstool
167+ 
168+ COPY  crosstool-$ARCH_GCC.defconfig ./
169+ 
170+ RUN  DEFCONFIG=crosstool-$ARCH_GCC.defconfig ct-ng defconfig \
171+     && rm crosstool-$ARCH_GCC.defconfig \
172+     && ct-ng build
173+ 
174+ #  Stage 3: Build a full CI Builder image that imports the cross-compiling
175+ #  toolchain and can be used for any CI job.
112176FROM  ci-builder-min as ci-builder-full
113177
114178ARG  ARCH_GCC
115179ARG  ARCH_GO
116180
117181WORKDIR  /workdir
118182
183+ #  Import the cross toolchain.
184+ 
185+ COPY  --from=crosstool /opt/x-tools /opt/x-tools
186+ 
119187#  Install dependencies needed by any CI job. Not all of these are available in
120188#  the Ubuntu repositories.
121189RUN  apt-get update --fix-missing && TZ=UTC DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
@@ -238,6 +306,11 @@ RUN mkdir rust \
238306    && cargo install --root /usr/local --version "=0.3.6"  --locked cargo-binutils \
239307    && cargo install --root /usr/local --version "=0.13.1"  --locked wasm-pack
240308
309+ #  Link the system lld into the cross-compiling sysroot.
310+ 
311+ RUN  ln -s /usr/bin/lld /opt/x-tools/$ARCH_GCC-unknown-linux-gnu/bin/$ARCH_GCC-unknown-linux-gnu-ld.lld \
312+     && ln -s /usr/bin/lld /opt/x-tools/$ARCH_GCC-unknown-linux-gnu/bin/$ARCH_GCC-unknown-linux-gnu-lld
313+ 
241314#  Shims for sanitizers
242315COPY  sanshim/$ARCH_GCC /sanshim
243316
@@ -347,11 +420,27 @@ RUN curl -fsSL https://amazon-inspector-sbomgen.s3.amazonaws.com/1.8.1/linux/$AR
347420#  trustworthy on the first connection.
348421COPY  ssh_known_hosts /etc/ssh/ssh_known_hosts
349422
423+ #  Set the necessary environment variables to point Cargo and C/C++ build systems
424+ #  at our cross-compiling toolchain.
425+ 
426+ ENV  AR=$ARCH_GCC-unknown-linux-gnu-ar
427+ ENV  LD=$ARCH_GCC-unknown-linux-gnu-lld
428+ ENV  RANLIB=$ARCH_GCC-unknown-linux-gnu-ranlib
429+ ENV  CPP=$ARCH_GCC-unknown-linux-gnu-cpp
430+ ENV  CC=$ARCH_GCC-unknown-linux-gnu-cc
431+ ENV  CXX=$ARCH_GCC-unknown-linux-gnu-c++
432+ ENV  CXXSTDLIB=static=stdc++
350433ENV  LDFLAGS="-fuse-ld=lld -static-libstdc++" 
351- ENV  RUSTFLAGS="-Clink-arg=-Wl,--compress-debug-sections=zlib -Clink-arg=-Wl,-O3 -Clink-arg=-fuse-ld=lld -Csymbol-mangling-version=v0 -Ctarget-cpu=$RUST_CPU_TARGET -Ctarget-feature=$RUST_TARGET_FEATURES --cfg=tokio_unstable" 
352- ENV  PATH=/opt/google-cloud-sdk/bin:$PATH
434+ ENV  RUSTFLAGS="-Clink-arg=-Wl,--compress-debug-sections=zlib -Clink-arg=-Wl,-O3 -Clink-arg=-fuse-ld=lld -L/opt/x-tools/$ARCH_GCC-unknown-linux-gnu/$ARCH_GCC-unknown-linux-gnu/sysroot/lib/ -Csymbol-mangling-version=v0 --cfg=tokio_unstable" 
435+ ENV  TARGET_AR=$AR
436+ ENV  TARGET_CC=$CC
437+ ENV  TARGET_CXX=$CXX
438+ ENV  TARGET_CXXSTDLIB=static=stdc++
439+ ENV  TARGET_RANLIB=$RANLIB
440+ ENV  PATH=/opt/google-cloud-sdk/bin:/opt/x-tools/$ARCH_GCC-unknown-linux-gnu/bin:$PATH
441+ ENV  CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-unknown-linux-gnu-cc
442+ ENV  CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-unknown-linux-gnu-cc
353443ENV  CARGO_TARGET_DIR=/mnt/build
354- ENV  CARGO_INCREMENTAL=1
355444ENV  HELM_PLUGINS=/usr/local/share/helm/plugins
356445
357446#  Set up for a persistent volume to hold Cargo metadata, so that crate metadata
0 commit comments