stage3

Details
Source
FROM --platform=linux/386 stagex/bootstrap-stage2 AS build
ARG GCC_SOURCE
ARG GCC_VERSION
ARG LINUX_SOURCE
ARG LINUX_VERSION
ARG MUSL_SOURCE
ARG MUSL_VERSION
ARG BUSYBOX_SOURCE
ARG BUSYBOX_VERSION
ARG BINUTILS_SOURCE
ARG BINUTILS_VERSION
ARG MAKE_SOURCE
ARG MAKE_VERSION
ARG GO_SOURCE
ENV BUILD=i386-unknown-linux-musl
ENV PATH=/usr/sbin:/usr/bin:/sbin:/bin
ENV TZ=UTC
ENV LANG=C.UTF-8
ENV SOURCE_DATE_EPOCH=1
ENV KCONFIG_NOTIMESTAMP=1
COPY --from=fetch . .

RUN --network=none <<-EOF
	set -eux
	tar -xf ${LINUX_SOURCE}
	tar -kxf ${BINUTILS_SOURCE}
	tar -kxf ${GCC_SOURCE}
	tar -kxjf ${BUSYBOX_SOURCE}
	tar -kxzf ${MUSL_SOURCE}
	tar -kxzf ${MAKE_SOURCE}
	tar -kxzf ${GO_SOURCE}
EOF

ARG TARGETARCH
RUN --network=none <<-EOF
	echo "export TARGET_ARCH=`echo ${TARGETARCH} | sed 's/amd64/x86_64/' | sed 's/arm64/aarch64/'`" >> /.env
	. /.env
	echo "export TARGET=$TARGET_ARCH-linux-musl" >> /.env
EOF

WORKDIR /build-musl
RUN --network=none <<-EOF
	set -eux
	. /.env
	../musl-${MUSL_VERSION}/configure \
		--prefix=/usr \
		--build=${BUILD} \
		--host=${TARGET}
	make -j$(nproc)
EOF
WORKDIR /build-binutils
RUN --network=none <<-EOF
	set -eux
	. /.env
	../binutils-${BINUTILS_VERSION}/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 -j$(nproc)
EOF
WORKDIR /build-make
RUN --network=none <<-EOF
	set -eux
	. /.env
	../make-${MAKE_VERSION}/configure \
		--build=${BUILD} \
		--host=${TARGET} \
		--prefix=/usr \
		--mandir=/usr/share/man \
		--infodir=/usr/share/info \
		--disable-nls
	make -j$(nproc)
EOF
WORKDIR /build-gcc
RUN --network=none <<-EOF
	set -eux
	. /.env
	cp ../*.tar.* /gcc-${GCC_VERSION}
	env -C /gcc-${GCC_VERSION} ./contrib/download_prerequisites
	/gcc-${GCC_VERSION}/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 -j$(nproc)
EOF
WORKDIR /build-busybox
RUN --network=none <<-EOF
    set -eux
	. /.env
    setConfs='
        CONFIG_LAST_SUPPORTED_WCHAR=0
        CONFIG_STATIC=y
    '
    unsetConfs='
        CONFIG_FEATURE_SYNC_FANCY
        CONFIG_FEATURE_HAVE_RPC
        CONFIG_FEATURE_INETD_RPC
        CONFIG_FEATURE_UTMP
        CONFIG_FEATURE_WTMP
    '
    make \
        -f ../busybox-${BUSYBOX_VERSION}/Makefile \
        KBUILD_SRC=../busybox-${BUSYBOX_VERSION} \
        CROSS_COMPILE=${TARGET}- \
        defconfig
    for conf in $unsetConfs; do
        sed -i \
            -e "s!^$conf=.*\$!# $conf is not set!" \
            .config
    done
    for confV in $setConfs; do
        conf="${confV%=*}"
        sed -i \
            -e "s!^$conf=.*\$!$confV!" \
            -e "s!^# $conf is not set\$!$confV!" \
            .config
        if ! grep -q "^$confV\$" .config; then
            echo "$confV" >> .config
        fi
    done
    make oldconfig CROSS_COMPILE=${TARGET}-
    for conf in $unsetConfs; do
        ! grep -q "^$conf=" .config
    done
    for confV in $setConfs; do
        grep -q "^$confV\$" .config
    done
    make -j$(nproc) CROSS_COMPILE=${TARGET}-
EOF
WORKDIR /linux-${LINUX_VERSION}
RUN --network=none <<-EOF
	set -eux
	make ARCH="$(echo ${TARGETARCH} | sed 's/amd64/x86_64/')" headers
	find usr/include -name '.*' -delete
	rm usr/include/Makefile
	rm usr/include/headers_check.pl
	cp -rv usr/include /build-linux
EOF
WORKDIR ${HOME}/go
RUN --network=none <<-EOF
	set -eux
	cd src
	GOROOT_BOOTSTRAP=/usr/lib/go \
	GOHOSTARCH=386 GOARCH=${TARGETARCH} \
	bash -- make.bash
EOF
RUN --network=none <<-EOF
	set -eux
	rm -rf src/testdata
	mkdir -p /rootfs/usr/lib/go
	cp bin/linux_${TARGETARCH}/* bin
	rm -rf bin/linux_${TARGETARCH}
	cp -a bin lib pkg src /rootfs/usr/lib/go
	mkdir -p /rootfs/usr/bin
	ln -s /usr/lib/go/bin/go /rootfs/usr/bin/go
	ln -s /usr/lib/go/bin/gofmt /rootfs/usr/bin/gofmt
EOF
RUN --network=none <<-EOF
	set -eux
	. /.env
	env -C /build-busybox make \
		CROSS_COMPILE=${TARGET}- \
		CONFIG_PREFIX=/rootfs \
		install
	env -C /build-musl make DESTDIR=/rootfs install
	env -C /build-binutils make DESTDIR=/rootfs install
	env -C /build-make make DESTDIR=/rootfs install
	env -C /build-gcc make DESTDIR=/rootfs install
	cp -Rv /build-linux/* /rootfs/usr/include/
	cd /rootfs/
	ln -sT /lib lib64
	mkdir -p etc tmp var/tmp
EOF

FROM scratch AS package
COPY --from=build /rootfs/ /