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/ /