Source

FROM scratch AS build
ARG VERSION
ARG TARGETARCH
ARG MRUSTC_VERSION
ENV BOOTSTRAP_RUST_VERSION="1.74"
ENV BOOTSTRAP_GCC_VERSION="15.2.0"
COPY --from=stagex/core-filesystem . /
COPY --from=stagex/core-busybox . /
COPY --from=stagex/core-ncurses . /
COPY --from=stagex/core-bash . /
COPY --from=stagex/core-make . /
COPY --from=stagex/core-cmake . /
COPY --from=stagex/core-python . /
COPY --from=stagex/core-py-setuptools . /
COPY --from=stagex/core-zlib . /
COPY --from=stagex/core-pkgconf . /
COPY --from=stagex/core-openssl . /
COPY --from=stagex/core-libzstd . /
COPY --from=stagex/core-perl . /
COPY --from=stagex/core-curl . /
COPY --from=stagex/core-ca-certificates . /
COPY --from=stagex/core-libffi . /
COPY --from=stagex/core-musl . /
COPY --from=stagex/core-clang-rt-devel . /
COPY --from=stagex/core-libunwind . /
COPY --from=stagex/core-libcxx . /
COPY --from=stagex/core-libcxxabi . /
COPY --from=stagex/core-binutils . /
COPY --from=stagex/core-mpfr . /
COPY --from=stagex/core-mpc . /
COPY --from=stagex/core-isl . /
COPY --from=stagex/core-gmp . /
COPY --from=stagex/core-gcc . /
COPY --from=stagex/core-hiredis . /
COPY --from=stagex/core-xxhash . /
COPY --from=stagex/core-llvm17 . /
COPY <<-'EOF' /etc/profile
	set -eux
	[[ "$TARGETARCH" == "amd64" ]] && ARCH="x86_64"
	[[ "$TARGETARCH" == "arm64" ]] && ARCH="aarch64"
	export ARCH
	export TARGET=${ARCH}-unknown-linux-musl
	export MAKEFLAGS="-j$(nproc)"
	export LLVM_ROOT="/usr/lib/llvm${LLVM_VERSION}"
	[[ "$LLVM_VERSION" == "system" ]] && LLVM_ROOT="/usr"
	export LLVM_BINDIR=${LLVM_ROOT}/bin
	export LLVM_CONFIG=${LLVM_BINDIR}/llvm-config
EOF
SHELL ["/bin/sh","-l","-c"]

ADD fetch/mrustc-${MRUSTC_VERSION}.tar.gz .
WORKDIR /mrustc-${MRUSTC_VERSION}
COPY fetch/rustc-${BOOTSTRAP_RUST_VERSION}.0-src.tar.gz .
ADD patches/add-missing-std-lib-includes.patch .
ADD patches/fix-lib-linking.patch .
ENV LLVM_VERSION="17"
RUN --network=none <<-EOF
	export RUSTC_VERSION="${BOOTSTRAP_RUST_VERSION}.0"
	export MRUSTC_TARGET_VER="${BOOTSTRAP_RUST_VERSION}"
	export RUSTC_INSTALL_BINDIR="bin"
	export LIBGIT2_SYS_USE_PKG_CONFIG="1"
	export OUTDIR_SUF=
	export CXXFLAGS_EXTRA="-L/usr/lib/gcc/${ARCH}-linux-musl/${BOOTSTRAP_GCC_VERSION}/"
	export RUSTC_TARGET="${TARGET}"
	export CC=/usr/bin/gcc
	export CXX=/usr/bin/g++
	mkdir -p /etc/clang
	echo "--gcc-install-dir=/usr/lib/gcc/${ARCH}-linux-musl/${BOOTSTRAP_GCC_VERSION}/" > /etc/clang/${ARCH}-unknown-linux-musl.cfg
	ln -sf ${LLVM_BINDIR}/ld.lld /usr/bin/ld
	patch -p1 < fix-lib-linking.patch
	patch -p1 < add-missing-std-lib-includes.patch
	make
	make RUSTCSRC
	make LIBS
	export CXX="${LLVM_BINDIR}/clang++"
	make -f minicargo.mk LLVM_CONFIG=${LLVM_CONFIG} output/cargo
	make -f minicargo.mk LLVM_CONFIG=${LLVM_CONFIG} output/rustc
	ln -sf /usr/bin/gcc /usr/bin/cc
	make -C run_rustc LLVM_CONFIG=${LLVM_CONFIG}
	mkdir /rust-${RUSTC_VERSION}
	cp -R run_rustc/output/prefix /rust-${RUSTC_VERSION}/usr
EOF

#HACK: We import llvm late because it clobbers binutils tools needed ealier in the build
# remove when binutils tools replaced by llvm are gnu- prefixed by default in package
# This frees up /usr/bin/ld to point at ld.lld by default, etc
COPY --from=stagex/core-llvm . /

WORKDIR /

ENV CONFIGURE_FLAGS=
COPY --chmod=0755 <<-'EOF' build
	set -eux
	TARGET_VERSION=${1}
	BUILD_VERSION=${2}
	TOOLS=${3:-cargo}
	PATCHES=${4:-}
	PREFIX=/rust-${TARGET_VERSION}/usr
	BUILD_PREFIX=/rust-${BUILD_VERSION}/usr
	export CC=${LLVM_BINDIR}/clang
	export CXX=${LLVM_BINDIR}/clang++
	export AS=${LLVM_BINDIR}/llvm-as
	export AR=${LLVM_BINDIR}/llvm-ar
	export NM=${LLVM_BINDIR}/llvm-nm
	export DWP=${LLVM_BINDIR}/llvm-dwp
	export RANLIB=${LLVM_BINDIR}/llvm-ranlib
	export READELF=${LLVM_BINDIR}/llvm-readelf
	export STRIP=${LLVM_BINDIR}/llvm-strip
	export OBJCOPY=${LLVM_BINDIR}/llvm-objcopy
	export OBJDUMP=${LLVM_BINDIR}/llvm-objdump
	export SIZE=${LLVM_BINDIR}/llvm-size
	export LIBCC="/usr/lib/clang/${LLVM_VERSION}/lib/${TARGET}/libclang_rt.builtins.a"
	export LDFLAGS="-fuse-ld=${LLVM_BINDIR}/ld.lld"
	ln -sf ${LLVM_BINDIR}/clang++ /usr/bin/c++
	ln -sf ${LLVM_BINDIR}/clang /usr/bin/cc
	ln -sf ${LLVM_BINDIR}/ld.lld /usr/bin/ld
	cd rustc-${TARGET_VERSION}-src
	[[ -z "$PATCHES" ]] || for name in ${PATCHES//,/ }; do
		patch -p1 < ../${name}.patch
	done
	./configure \
		--build="${TARGET}" \
		--host="${TARGET}" \
		--target="${TARGET}" \
		--local-rust-root="${BUILD_PREFIX}" \
		--tools="${TOOLS}" \
		--llvm-root="${LLVM_ROOT}" \
		--llvm-libunwind="system" \
		--enable-local-rust \
		--enable-clang \
		--enable-option-checking \
		--enable-locked-deps \
		--enable-vendor \
		--dist-compression-formats=gz \
		--disable-docs \
		--python="python3" \
		--prefix="${PREFIX}/usr" \
		--sysconfdir="${PREFIX}/etc" \
		--release-channel="stable" \
		--set="install.prefix=${PREFIX}" \
		--set="target.${TARGET}.crt-static=false" \
		--set="target.${TARGET}.musl-root=/usr" \
		--set="target.${TARGET}.llvm-config=${LLVM_BINDIR}/llvm-config" \
		$CONFIGURE_FLAGS
	python3 x.py dist
	python3 x.py install
	cd /
	[ "${TARGET_VERSION}" == "${VERSION}" ] || rm -rf rustc-${TARGET_VERSION}-src /rust-${BUILD_VERSION}
EOF

# HACK: Required by Rust 1.75.0
# https://github.com/rust-lang/rust/issues/117885
RUN mkdir -p $HOME/.cargo/registry/src/index.crates.io-6f17d22bba15001f/
ADD fetch/rustc-1.75.0-src.tar.gz .
RUN ./build 1.75.0 1.74.0

ADD fetch/rustc-1.76.0-src.tar.gz .
RUN ./build 1.76.0 1.75.0

ADD fetch/rustc-1.77.0-src.tar.gz .
RUN ./build 1.77.0 1.76.0

ADD fetch/rustc-1.78.0-src.tar.gz .
RUN ./build 1.78.0 1.77.0

ADD fetch/rustc-1.79.0-src.tar.gz .
RUN ./build 1.79.0 1.78.0

ADD fetch/rustc-1.80.0-src.tar.gz .
RUN ./build 1.80.0 1.79.0

ADD fetch/rustc-1.81.0-src.tar.gz .
RUN ./build 1.81.0 1.80.0

ADD fetch/rustc-1.82.0-src.tar.gz .
RUN ./build 1.82.0 1.81.0

ENV LLVM_VERSION="19"
COPY --from=stagex/core-llvm19 . /
ADD fetch/rustc-1.83.0-src.tar.gz .
RUN ./build 1.83.0 1.82.0

ADD fetch/rustc-1.84.0-src.tar.gz .
RUN ./build 1.84.0 1.83.0

ADD fetch/rustc-1.85.0-src.tar.gz .
# HACK: rust 1.85.0 literally cannot build if .git does not exist. No idea why
RUN mkdir -p rustc-1.85.0-src/.git
RUN ./build 1.85.0 1.84.0

ADD fetch/rustc-1.86.0-src.tar.gz .
RUN ./build 1.86.0 1.85.0

ENV LLVM_VERSION="system"

ADD fetch/rustc-1.87.0-src.tar.gz .
RUN ./build 1.87.0 1.86.0

ADD patches/fix-broken-lld.patch .
ADD fetch/rustc-1.88.0-src.tar.gz .
RUN ./build 1.88.0 1.87.0 "" fix-broken-lld

ADD fetch/rustc-1.89.0-src.tar.gz .
RUN ./build 1.89.0 1.88.0 "" fix-broken-lld

ADD fetch/rustc-1.90.0-src.tar.gz .
RUN ./build 1.90.0 1.89.0 "" fix-broken-lld

ADD fetch/rustc-1.91.1-src.tar.gz .
ADD patches/no-default-static.patch .
RUN ./build ${VERSION} 1.90.0 cargo,clippy,rustdoc,rustfmt,rust-demangler,src no-default-static
RUN <<-EOF
	mv /rust-${VERSION} /rootfs
	cd /rootfs/usr/lib/rustlib
	rm install.log
	sort -o manifest-cargo manifest-cargo
	sort -o manifest-rustc manifest-rustc
	sort -o manifest-rust-std-${TARGET} manifest-rust-std-${TARGET}
	rm -f ${TARGET}/lib/self-contained/libunwind.a
EOF

FROM stagex/core-filesystem AS package-rust
COPY --from=build /rootfs/ /
Copied to clipboard!