stage3
Source
FROM --platform=linux/386 stagex/bootstrap-stage2 AS base
ARG TARGETARCH
WORKDIR /rootfs/
SHELL ["/bin/sh","-l","-c"]
ENV SOURCE_DATE_EPOCH=1
COPY <<-'EOF' /etc/profile
set -eux
[[ "$TARGETARCH" == "amd64" ]] \
&& ARCH="x86_64"
[[ "$TARGETARCH" == "arm64" ]] \
&& ARCH="aarch64"
export ARCH
export MAKEFLAGS="-j$(nproc)"
export BUILD=i386-unknown-linux-musl
export TARGET=${ARCH}-linux-musl
EOF
WORKDIR /rootfs
RUN --network=none <<-EOF
install -d -m0750 root
install -d -m0755 etc
install -d -m0755 usr
install -d -m0755 usr/bin
install -d -m0755 usr/lib
install -d -m0755 usr/include
install -d -m1777 tmp
install -d -m1777 var/tmp
install -d -m1777 var/spool/mail
install -o 1000 -g 1000 -d -m0755 home/user
ln -sT usr/lib lib64
ln -sT lib usr/lib64
ln -sT usr/lib lib
ln -sT usr/bin bin
ln -sT usr/sbin sbin
ln -sT ../run var/run
ln -sT ../run/lock var/lock
install -m0755 /etc/profile /rootfs/etc/profile
find /rootfs/ -type f -exec install -Dm 755 "{}" "/{}" \;
EOF
FROM base AS make
ARG TARGETARCH
ARG MAKE_VERSION
ADD fetch/make-${MAKE_VERSION}.tar.gz /
WORKDIR /make-${MAKE_VERSION}
RUN --network=none <<-EOF
./configure \
--build=${BUILD} \
--host=${TARGET} \
--prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--disable-nls
make
make DESTDIR=/rootfs install
rm -rf /make-*
EOF
FROM base AS busybox
ARG TARGETARCH
ARG BUSYBOX_VERSION
ADD fetch/busybox-${BUSYBOX_VERSION}.tar.bz2 /
WORKDIR /busybox-${BUSYBOX_VERSION}
RUN --network=none <<-EOF
make CROSS_COMPILE=${TARGET}- defconfig
echo "CONFIG_STATIC=y" >> .config
make CROSS_COMPILE=${TARGET}-
mkdir -p /rootfs/usr/bin
cp busybox /rootfs/usr/bin
cp busybox /usr/bin
cd /rootfs
/usr/bin/busybox --install -s usr/bin
rm -rf /busybox-*
EOF
FROM base AS linux-headers
ARG TARGETARCH
ARG LINUX_VERSION
ADD fetch/linux-${LINUX_VERSION}.tar.xz /
WORKDIR /linux-${LINUX_VERSION}
RUN --network=none <<-EOF
LINUX_ARCH="$ARCH"
[[ "$TARGETARCH" == "arm64" ]] \
&& LINUX_ARCH="$TARGETARCH"
make ARCH="$LINUX_ARCH" headers
find usr/include -name '.*' -delete
rm usr/include/Makefile
rm usr/include/headers_check.pl
cp -Rv usr/include/* /rootfs/usr/include/
rm -rf /linux-*
EOF
FROM base AS go
ARG TARGETARCH
ARG GO_VERSION
ADD fetch/go${GO_VERSION}.src.tar.gz /
WORKDIR /go
RUN --network=none <<-EOF
export GOROOT_BOOTSTRAP=/usr/lib/go
export GOHOSTARCH=386
export GOARCH=${TARGETARCH}
env -C src bash -- make.bash
rm -rf src/testdata
mv bin/linux_${TARGETARCH}/* bin
rm -rf bin/linux_${TARGETARCH}
mkdir -p /rootfs/usr/lib/go /rootfs/usr/bin
cp -a bin lib pkg src /rootfs/usr/lib/go
ln -s /usr/lib/go/bin/go /rootfs/usr/bin/go
ln -s /usr/lib/go/bin/gofmt /rootfs/usr/bin/gofmt
rm -rf /go
EOF
FROM base AS binutils
ARG TARGETARCH
ARG BINUTILS_VERSION
ADD fetch/binutils-${BINUTILS_VERSION}.tar.xz /
WORKDIR /binutils-${BINUTILS_VERSION}
RUN --network=none <<-EOF
./configure \
--build=${BUILD} \
--host=${TARGET} \
--prefix=/usr \
--bindir=/usr/bin \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/etc \
--disable-nls \
--disable-multilib \
--disable-plugins \
--disable-gprofng \
--enable-64-bit-bfd \
--enable-ld=default \
--enable-install-libiberty \
--enable-deterministic-archives
make
make DESTDIR=/rootfs install
rm -rf /binutils-*
EOF
FROM base AS gcc
ARG TARGETARCH
ARG GCC_VERSION
ARG GMP_VERSION
ARG MPFR_VERSION
ARG MPC_VERSION
ARG ISL_VERSION
ADD fetch/gcc-${GCC_VERSION}.tar.xz /
ADD fetch/gmp-${GMP_VERSION}.tar.bz2 /
ADD fetch/mpfr-${MPFR_VERSION}.tar.bz2 /
ADD fetch/mpc-${MPC_VERSION}.tar.gz /
ADD fetch/isl-${ISL_VERSION}.tar.bz2 /
WORKDIR /gcc-${GCC_VERSION}
RUN --network=none <<-EOF
mv ../gmp-${GMP_VERSION} gmp
mv ../mpfr-${MPFR_VERSION} mpfr
mv ../mpc-${MPC_VERSION} mpc
mv ../isl-${ISL_VERSION} isl
./configure \
--build=${BUILD} \
--host=${TARGET} \
--target=${TARGET} \
--prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--libdir=/usr/lib \
--disable-cet \
--disable-fixed-point \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-libsanitizer \
--disable-nls \
--disable-werror \
--enable-__cxa_atexit \
--enable-default-pie \
--enable-default-ssp \
--enable-languages=c,c++ \
--enable-link-serialization=2 \
--enable-linker-build-id
make
make DESTDIR=/rootfs install
rm -rf /gcc-*
EOF
FROM base AS xz
ARG TARGETARCH
ARG XZ_VERSION
ADD fetch/xz-${XZ_VERSION}.tar.gz /
WORKDIR /xz-${XZ_VERSION}
RUN --network=none <<-EOF
autoreconf -fi
./configure \
--prefix=/usr \
--host=${TARGET}
make DESTDIR=/rootfs install
rm -rf /xz-*
EOF
FROM base AS libucontext
ARG TARGETARCH
ARG LIBUCONTEXT_VERSION
ADD fetch/libucontext-${LIBUCONTEXT_VERSION}.tar.gz /
WORKDIR /libucontext-libucontext-${LIBUCONTEXT_VERSION}
RUN --network=none <<-EOF
export CC=${ARCH}-linux-musl-gcc
sed 's/\((wildcard .*)\)/(sort $\1)/g' -i Makefile
make -j1 ARCH=${ARCH} DESTDIR=/rootfs install
rm -rf /libucontext-*
EOF
FROM base AS musl
ARG TARGETARCH
ARG MUSL_VERSION
ADD fetch/musl-${MUSL_VERSION}.tar.gz /
WORKDIR /musl-${MUSL_VERSION}
RUN --network=none <<-EOF
./configure \
--prefix=/usr \
--host=${TARGET}
make DESTDIR=/rootfs install
ln -sf /usr/lib/ld-musl-${ARCH}.so.1 /rootfs/usr/bin/ldd
mv -f /rootfs/usr/lib/libc.so /rootfs/usr/lib/ld-musl-${ARCH}.so.1
ln -sf ld-musl-${ARCH}.so.1 /rootfs/usr/lib/libc.musl-${ARCH}.so.1
ln -sf /usr/lib/ld-musl-${ARCH}.so.1 /rootfs/usr/lib/libc.so
rm -rf /musl-*
EOF
FROM base AS python
ARG TARGETARCH
ARG PYTHON_VERSION
ADD fetch/python-${PYTHON_VERSION}.tar.xz /
WORKDIR /Python-${PYTHON_VERSION}
COPY <<-EOF config.site
ac_cv_file__dev_ptmx=no
ac_cv_file__dev_ptc=no
EOF
ENV CONFIG_SITE=config.site
RUN --network=none <<-EOF
./configure \
--prefix=/usr \
--build=${BUILD} \
--host=${TARGET} \
--target=${TARGET} \
--with-build-python \
--with-computed-gotos \
--without-ensurepip \
--disable-ipv6 \
make
make DESTDIR=/rootfs install
ln -s /usr/bin/python3 /rootfs/usr/bin/python
rm -rf /python-*
EOF
FROM scratch AS cmake
COPY --from=base /rootfs/ /
COPY --from=musl /rootfs/ /
COPY --from=busybox /rootfs/ /
COPY --from=python /rootfs/ /
COPY --from=make /rootfs/ /
COPY --from=gcc /rootfs/ /
COPY --from=binutils /rootfs/ /
COPY --from=linux-headers /rootfs/ /
ARG TARGETARCH
ARG CMAKE_VERSION
ADD fetch/cmake-${CMAKE_VERSION}.tar.gz /
WORKDIR /cmake-${CMAKE_VERSION}/build
SHELL ["/bin/sh","-l","-c"]
RUN --network=none <<-EOF
export CFLAGS="-fPIC"
export CXXFLAGS="$CFLAGS"
export CC=/usr/bin/gcc
../configure \
--prefix=/usr \
-- \
-DCMAKE_USE_OPENSSL=OFF
make
make DESTDIR=/rootfs install
rm -rf /cmake-*
EOF
FROM scratch AS libzstd
COPY --from=base /rootfs/ /
COPY --from=musl /rootfs/ /
COPY --from=busybox /rootfs/ /
COPY --from=python /rootfs/ /
COPY --from=make /rootfs/ /
COPY --from=gcc /rootfs/ /
COPY --from=binutils /rootfs/ /
COPY --from=cmake /rootfs/ /
ARG TARGETARCH
ARG LIBZSTD_VERSION
ADD fetch/libzstd-${LIBZSTD_VERSION}.tar.gz /
WORKDIR /zstd-${LIBZSTD_VERSION}
SHELL ["/bin/sh","-l","-c"]
RUN --network=none <<-EOF
cmake \
-B build-cmake \
-S build/cmake \
-DCMAKE_INSTALL_PREFIX=/usr/ \
-Dbacktrace=disabled \
-Db_lto=false \
-Db_staticpic=true \
-Db_pie=true \
-Dpython.bytecompile=0 \
-Dwerror=false \
-Db_ndebug=true \
-Dbin_tests=false \
-Dbin_contrib=false \
-Dbin_programs=true \
-Dbacktrace=disabled \
-Dmulti_thread=enabled \
-Dlz4=disabled \
-Dlzma=disabled \
-Dzlib=disabled
cmake --build build-cmake -v --parallel $(nproc)
mkdir -p /rootfs/usr/lib
ln -s lib /rootfs/usr/lib64
DESTDIR=/rootfs cmake --install build-cmake
rm -rf /rootfs/usr/lib64
rm -rf /libzstd-*
EOF
FROM scratch AS zlib
COPY --from=base /rootfs/ /
COPY --from=musl /rootfs/ /
COPY --from=busybox /rootfs/ /
COPY --from=make /rootfs/ /
COPY --from=gcc /rootfs/ /
COPY --from=binutils /rootfs/ /
COPY --from=cmake /rootfs/ /
COPY --from=libzstd /rootfs/ /
ARG TARGETARCH
ARG ZLIB_VERSION
ADD fetch/zlib-${ZLIB_VERSION}.tar.gz /
WORKDIR /zlib-${ZLIB_VERSION}
SHELL ["/bin/sh","-l","-c"]
RUN --network=none <<-EOF
export CFLAGS="-fPIC"
./configure \
--prefix=/usr \
--libdir=/usr/lib \
--shared
make -j "$(nproc)"
DESTDIR=/rootfs make install
rm -rf /zlib-*
EOF
FROM scratch AS libffi
COPY --from=base /rootfs/ /
COPY --from=musl /rootfs/ /
COPY --from=busybox /rootfs/ /
COPY --from=make /rootfs/ /
COPY --from=gcc /rootfs/ /
COPY --from=binutils /rootfs/ /
COPY --from=cmake /rootfs/ /
COPY --from=libzstd /rootfs/ /
ARG TARGETARCH
ARG LIBFFI_VERSION
ADD fetch/libffi-${LIBFFI_VERSION}.tar.gz /
WORKDIR /libffi-${LIBFFI_VERSION}
SHELL ["/bin/sh","-l","-c"]
RUN --network=none <<-EOF
set -ex
./configure \
--prefix=/usr \
--enable-pax_emutrap \
--enable-portable-binary \
--disable-exec-static-tramp \
--without-gcc-arch
make -j "$(nproc)"
DESTDIR=/rootfs make install
rm -rf /rootfs/usr/lib64
rm -rf /libffi-*
EOF
FROM base AS libunwind
ARG TARGETARCH
ARG LIBUNWIND_VERSION
COPY --from=musl /rootfs/ /
COPY --from=busybox /rootfs/ /
COPY --from=make /rootfs/ /
COPY --from=gcc /rootfs/ /
COPY --from=binutils /rootfs/ /
COPY --from=cmake /rootfs/ /
COPY --from=libzstd /rootfs/ /
COPY --from=xz /rootfs/ /
COPY --from=zlib /rootfs/ /
COPY --from=libucontext /rootfs/ /
ADD fetch/libunwind-${LIBUNWIND_VERSION}.tar.gz /
WORKDIR /libunwind-${LIBUNWIND_VERSION}
RUN <<-EOF
set -eux
export CFLAGS="-llzma -lucontext"
export CXXFLAGS="$CFLAGS"
export CPPFLAGS="$CFLAGS"
autoreconf -i
./configure \
--prefix=/usr \
--host=${TARGET} \
--enable-cxx-exceptions \
--disable-tests
make
make DESTDIR=/rootfs install
rm -rf /libunwind-*
EOF
FROM scratch AS install
ARG TARGETARCH
SHELL ["/bin/sh","-l","-c"]
COPY --from=base /rootfs/ /
COPY --from=busybox /rootfs/ /
COPY --from=make /rootfs/ /
COPY --from=musl /rootfs/ /
COPY --from=gcc /rootfs/ /
COPY --from=binutils /rootfs/ /
COPY --from=python /rootfs/ /
COPY --from=go /rootfs/ /
COPY --from=cmake /rootfs/ /
COPY --from=linux-headers /rootfs/ /
COPY --from=libffi /rootfs/ /
COPY --from=libzstd /rootfs/ /
COPY --from=libunwind /rootfs/ /
COPY --from=libucontext /rootfs/ /
COPY --from=zlib /rootfs/ /
COPY --from=xz /rootfs/ /
#Non deterministic edge case and we don't need it
RUN rm -rf /usr/share/info/dir
FROM scratch AS package
COPY --from=install . /
Copied to clipboard!