diff --git a/packages/stage2-x86_64-gnu/Containerfile b/packages/stage2-x86_64-gnu/Containerfile new file mode 100644 index 0000000..f71885d --- /dev/null +++ b/packages/stage2-x86_64-gnu/Containerfile @@ -0,0 +1,217 @@ +FROM scratch AS base +ENV GCC_VERSION=13.1.0 +ENV GCC_HASH=61d684f0aa5e76ac6585ad8898a2427aade8979ed5e7f85492286c4dfc13ee86 +ENV GCC_FILE=gcc-$GCC_VERSION.tar.xz +ENV GCC_SITE=https://mirrors.kernel.org/gnu/gcc/gcc-${GCC_VERSION}/${GCC_FILE} +ENV GMP_VERSION=6.2.1 +ENV GMP_HASH=eae9326beb4158c386e39a356818031bd28f3124cf915f8c5b1dc4c7a36b4d7c +ENV GMP_FILE=gmp-${GMP_VERSION}.tar.bz2 +ENV GMP_SITE=https://gcc.gnu.org/pub/gcc/infrastructure/${GMP_FILE} +ENV MPFR_VERSION=4.1.0 +ENV MPFR_HASH=feced2d430dd5a97805fa289fed3fc8ff2b094c02d05287fd6133e7f1f0ec926 +ENV MPFR_FILE=mpfr-${MPFR_VERSION}.tar.bz2 +ENV MPFR_SITE=https://gcc.gnu.org/pub/gcc/infrastructure/${MPFR_FILE} +ENV MPC_VERSION=1.2.1 +ENV MPC_HASH=17503d2c395dfcf106b622dc142683c1199431d095367c6aacba6eec30340459 +ENV MPC_FILE=mpc-${MPC_VERSION}.tar.gz +ENV MPC_SITE=https://gcc.gnu.org/pub/gcc/infrastructure/${MPC_FILE} +ENV ISL_VERSION=0.24 +ENV ISL_HASH=fcf78dd9656c10eb8cf9fbd5f59a0b6b01386205fe1934b3b287a0a1898145c0 +ENV ISL_FILE=isl-${ISL_VERSION}.tar.bz2 +ENV ISL_SITE=https://gcc.gnu.org/pub/gcc/infrastructure/${ISL_FILE} +ENV MUSL_VERSION=1.2.4 +ENV MUSL_FILE=musl-${MUSL_VERSION}.tar.gz +ENV MUSL_SITE=http://musl.libc.org/releases/${MUSL_FILE} +ENV MUSL_HASH=7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039 +ENV GLIBC_VERSION=2.40 +ENV GLIBC_FILE=glibc-${VERSION}.tar.gz +ENV GLIBC_SITE=http://ftpmirror.gnu.org/gnu/glibc/${SRC_FILE} +ENV GLIBC_HASH=2abc038f5022949cb67e996c3cae0e7764f99b009f0b9b7fd954dfc6577b599e +ENV LINUX_VERSION=6.6 +ENV LINUX_HASH=d926a06c63dd8ac7df3f86ee1ffc2ce2a3b81a2d168484e76b5b389aba8e56d0 +ENV LINUX_FILE=linux-${LINUX_VERSION}.tar.xz +ENV LINUX_SITE=https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/${LINUX_FILE} +ENV BINUTILS_VERSION=2.35 +ENV BINUTILS_HASH=1b11659fb49e20e18db460d44485f09442c8c56d5df165de9461eb09c8302f85 +ENV BINUTILS_FILE=binutils-${BINUTILS_VERSION}.tar.xz +ENV BINUTILS_SITE=https://ftp.gnu.org/gnu/binutils/${BINUTILS_FILE} +ENV TARGET_ARCH=x86_64 +ENV HOST_ARCH=i386 +ENV BUILD=${HOST_ARCH}-unknown-linux-musl +ENV HOST=${HOST_ARCH}-unknown-linux-musl +ENV TARGET=${TARGET_ARCH}-linux-gnu +ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV USER=user +ENV HOME=/home/${USER} +ENV TZ=UTC +ENV LANG=C.UTF-8 +ENV SOURCE_DATE_EPOCH=1 +ENV KCONFIG_NOTIMESTAMP=1 +ENV SYSROOT_DIR=${HOME}/build-sysroot +ENV GCC_DIR=${HOME}/build-gcc +ENV LINUX_DIR=${HOME}/build-linux +ENV BINUTILS_DIR=${HOME}/build-binutils +ENV MUSL_DIR=${HOME}/build-musl +ENV GLIBC_DIR=${HOME}/build-glibc + +FROM base AS fetch +WORKDIR /${HOME} +ADD --checksum=sha256:${LINUX_HASH} ${LINUX_SITE} . +ADD --checksum=sha256:${MUSL_HASH} ${MUSL_SITE} . +ADD --checksum=sha256:${GLIBC_HASH} ${MUSL_SITE} . +ADD --checksum=sha256:${BINUTILS_HASH} ${BINUTILS_SITE} . +ADD --checksum=sha256:${GCC_HASH} ${GCC_SITE} . +ADD --checksum=sha256:${GMP_HASH} ${GMP_SITE} . +ADD --checksum=sha256:${MPFR_HASH} ${MPFR_SITE} . +ADD --checksum=sha256:${MPC_HASH} ${MPC_SITE} . +ADD --checksum=sha256:${ISL_HASH} ${ISL_SITE} . + +FROM fetch AS build +COPY --from=stagex/stage1 . / +RUN --network=none <<-EOF + set -eux + tar -xf ${LINUX_FILE} + tar -xzf ${MUSL_FILE} + tar -xzf ${GLIBC_FILE} + tar -xf ${BINUTILS_FILE} + tar -xf ${GCC_FILE} + cd gcc-${GCC_VERSION} + mv ../*.tar.* .; \ + ./contrib/download_prerequisites +EOF + +# Phase 1: Build cross binutils in build-binutils +WORKDIR /${BINUTILS_DIR} +RUN --network=none <<-EOF + set -eux + ../binutils-${BINUTILS_VERSION}/configure \ + --build=${BUILD} \ + --host=${HOST} \ + --target=${TARGET} \ + --with-sysroot=/${TARGET} \ + --prefix= \ + --libdir=/lib \ + --disable-nls \ + --disable-multilib \ + --disable-plugins \ + --disable-gprofng \ + --enable-64-bit-bfd \ + --enable-ld=default \ + --enable-install-libiberty \ + --enable-deterministic-archives + make all +EOF + +# Phase 2: Prepare build sysroot +WORKDIR /${SYSROOT_DIR} +RUN <<-EOF + set -eux + mkdir -p include + ln -sf . usr + ln -sf lib lib32 + ln -sf lib lib64 +EOF + +# Phase 3: Build gcc (without libgcc) in build-gcc +WORKDIR /${GCC_DIR} +RUN --network=none <<-EOF + set -eux + ../gcc-${GCC_VERSION}/configure \ + --build=${BUILD} \ + --host=${HOST} \ + --target=${TARGET} \ + --with-build-sysroot=${SYSROOT_DIR} \ + --with-sysroot=/${TARGET} \ + --prefix= \ + --libdir=/lib \ + --disable-multilib \ + --disable-bootstrap \ + --disable-assembly \ + --disable-libmudflap \ + --disable-libsanitizer \ + --disable-gnu-indirect-function \ + --disable-libmpx \ + --disable-werror \ + --enable-languages=c,c++ \ + --enable-tls \ + --enable-initfini-array \ + --enable-libstdcxx-time=rt \ + --enable-deterministic-archives \ + AR_FOR_TARGET=${BINUTILS_DIR}/binutils/ar \ + AS_FOR_TARGET=${BINUTILS_DIR}/gas/as-new \ + LD_FOR_TARGET=${BINUTILS_DIR}/ld/ld-new \ + NM_FOR_TARGET=${BINUTILS_DIR}/binutils/nm-new \ + OBJCOPY_FOR_TARGET=${BINUTILS_DIR}/binutils/objcopy \ + OBJDUMP_FOR_TARGET=${BINUTILS_DIR}/binutils/objdump \ + RANLIB_FOR_TARGET=${BINUTILS_DIR}/binutils/ranlib \ + READELF_FOR_TARGET=${BINUTILS_DIR}/binutils/readelf \ + STRIP_FOR_TARGET=${BINUTILS_DIR}/binutils/strip-new + make all-gcc +EOF + +# Phase 4: Install gnu libc headers to build-sysroot for use by libgcc +WORKDIR /${GLIBC_DIR} +RUN --network=none <<-EOF + set -eux + ../glibc-${GLIBC_VERSION}/configure \ + CC="${GCC_DIR}/gcc/xgcc -B ${GCC_DIR}/gcc" \ + LIBCC="${GCC_DIR}/${TARGET}/libgcc/libgcc.a" \ + --prefix= \ + --host=${TARGET} + ../musl-${MUSL_VERSION}/configure \ + CC="${GCC_DIR}/gcc/xgcc -B ${GCC_DIR}/gcc" \ + LIBCC="${GCC_DIR}/${TARGET}/libgcc/libgcc.a" \ + --prefix= \ + --host=${TARGET} + make DESTDIR=${SYSROOT_DIR} install-headers +EOF + +# Phase 5: Compile libgcc +WORKDIR /${GCC_DIR} +RUN --network=none make MAKE="make enable_shared=no" all-target-libgcc + +# Phase 5: Compile gnu libc and install to sysroot +WORKDIR /${GLIBC_DIR} +RUN --network=none <<-EOF + set -eux + make \ + AR=${BINUTILS_DIR}/binutils/ar \ + RANLIB=${BINUTILS_DIR}/binutils/ranlib + make DESTDIR=${SYSROOT_DIR} install +EOF + +# Phase 6: Compile remaining gcc targets +WORKDIR /${GCC_DIR} +RUN make all + +# Phase 7: Generate linux headers +WORKDIR /${HOME}/linux-${LINUX_VERSION} +RUN --network=none <<-EOF + set -eux + make ARCH=${TARGET_ARCH} headers + find usr/include -name '.*' -delete + rm usr/include/Makefile + rm usr/include/headers_check.pl + cp -rv usr/include ${LINUX_DIR} +EOF + +FROM build AS install +WORKDIR /${HOME} +COPY --from=stagex/stage1 . /rootfs/ +RUN <<-EOF + set -eux + rm /rootfs/lib + env -C build-glibc make DESTDIR=/rootfs/${TARGET} install + env -C build-gcc make DESTDIR=/rootfs/ install + env -C build-binutils make DESTDIR=/rootfs/ install + cp -Rv ${LINUX_DIR}/* /rootfs/${TARGET}/include + # NOTE: ld and libc are separate when using glibc + #ln -s /usr/lib/ld-musl-${HOST_ARCH}.so.1 /rootfs/lib/ld-musl-${HOST_ARCH}.so.1 + #ln -s /${TARGET}/lib/ld-musl-${TARGET_ARCH}.so.1 /rootfs/lib/ld-musl-${TARGET_ARCH}.so.1 +EOF + +FROM base AS package +COPY --from=install /rootfs/ / +USER 1000:1000 +ENTRYPOINT ["/bin/bash"] +ENV PS1="stage2 $ "