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!