#!/usr/bin/env bash set -euo pipefail umask 022 . version.bash . flags.bash . utilities.bash toolchain_m4() { } toolchain_ncurses() { fetch $NCURSES_URL cd "$SOURCES" && tar xf ncurses-$NCURSES_VERSION.tar.gz && cd ncurses-$NCURSES_VERSION mkdir -p build pushd build ../configure \ --prefix="$CROSS" \ AWK=gawk \ --silent \ --quiet make -C include make -C progs tic install progs/tic "$CROSS/bin" popd ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(./config.guess) \ --mandir=/usr/share/man \ --with-manpage-format=normal \ --with-shared \ --without-normal \ --with-cxx-shared \ --without-debug \ --without-ada \ --disable-stripping \ AWK=gawk \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install ln -s libncursesw.so "$SYSROOT"/usr/lib/libncurses.so sed -e 's/^#if.*XOPEN.*$/#if 1/' -i "$SYSROOT"/usr/include/curses.h cd "$SOURCES" && rm -rf ncurses-$NCURSES_VERSION } toolchain_bash() { fetch $BASH_URL cd "$SOURCES" && tar xf bash-$BASH_VERSION.tar.gz && cd bash-$BASH_VERSION ./configure \ --prefix=/usr \ --build=$(sh support/config.guess) \ --host=$TARGET \ --without-bash-malloc \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install ln -s bash "$SYSROOT"/bin/sh cd "$SOURCES" && rm -rf bash-$BASH_VERSION } toolchain_coreutils() { fetch $COREUTILS_URL cd "$SOURCES" && tar xf coreutils-$COREUTILS_VERSION.tar.xz && cd coreutils-$COREUTILS_VERSION sed -r '/_GL_EXTERN_C/s/w?memchr|bsearch/(&)/' -i $(find -name \*.in.h) ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --enable-install-program=hostname \ --enable-no-install-program=kill,uptime \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install mv "$SYSROOT"/usr/bin/chroot "$SYSROOT"/usr/sbin cd "$SOURCES" && rm -rf coreutils-$COREUTILS_VERSION } toolchain_diffutils() { fetch $DIFFUTILS_URL cd "$SOURCES" && tar xf diffutils-$DIFFUTILS_VERSION.tar.xz && cd diffutils-$DIFFUTILS_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ gl_cv_func_strcasecmp_works=y \ --build=$(./build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf diffutils-$DIFFUTILS_VERSION } toolchain_file() { fetch $FILE_URL cd "$SOURCES" && tar xf file-$FILE_VERSION.tar.gz && cd file-$FILE_VERSION mkdir -p build pushd build ../configure \ --disable-bzlib \ --disable-libseccomp \ --disable-xzlib \ --disable-zlib \ --silent \ --quiet make popd ./configure \ --prefix=/usr \ --host="$TARGET" \ --build=$(./config.guess) \ --silent \ --quiet make FILE_COMPILE="$(pwd)/build/src/file" && make DESTDIR="$SYSROOT" install rm "$SYSROOT"/usr/lib/libmagic.la cd "$SOURCES" && rm -rf file-$FILE_VERSION } toolchain_findutils() { fetch $FINDUTILS_URL cd "$SOURCES" && tar xf findutils-$FINDUTILS_VERSION.tar.xz && cd findutils-$FINDUTILS_VERSION ./configure \ --prefix=/usr \ --localstatedir=/var/lib/locate \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf findutils-$FINDUTILS_VERSION } toolchain_gawk() { fetch $GAWK_URL cd "$SOURCES" && tar xf gawk-$GAWK_VERSION.tar.xz && cd gawk-$GAWK_VERSION sed -i 's/extras//' Makefile.in ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf gawk-$GAWK_VERSION } toolchain_grep() { fetch $GREP_URL cd "$SOURCES" && tar xf grep-$GREP_VERSION.tar.xz && cd grep-$GREP_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf grep-$GREP_VERSION } toolchain_gzip() { fetch $GZIP_URL cd "$SOURCES" && tar xf gzip-$GZIP_VERSION.tar.xz && cd gzip-$GZIP_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf gzip-$GZIP_VERSION } toolchain_make() { fetch $MAKE_URL cd "$SOURCES" && tar xf make-$MAKE_VERSION.tar.gz && cd make-$MAKE_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf make-$MAKE_VERSION } toolchain_patch() { fetch $PATCH_URL cd "$SOURCES" && tar xf patch-$PATCH_VERSION.tar.xz && cd patch-$PATCH_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf patch-$PATCH_VERSION } toolchain_sed() { fetch $SED_URL cd "$SOURCES" && tar xf sed-$SED_VERSION.tar.xz && cd sed-$SED_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf sed-$SED_VERSION } toolchain_tar() { fetch $TAR_URL cd "$SOURCES" && tar xf tar-$TAR_VERSION.tar.xz && cd tar-$TAR_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf tar-$TAR_VERSION } toolchain_xz() { fetch $XZ_URL cd "$SOURCES" && tar xf xz-$XZ_VERSION.tar.xz && cd xz-$XZ_VERSION ./configure \ --prefix=/usr \ --host=$TARGET \ --build=$(build-aux/config.guess) \ --disable-static \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install rm "$SYSROOT"/usr/lib/liblzma.la cd "$SOURCES" && rm -rf xz-$XZ_VERSION } toolchain_binutils() { cd "$SOURCES" && tar xf binutils-$BINUTILS_VERSION.tar.xz && cd binutils-$BINUTILS_VERSION sed '6031s/$add_dir//' -i ltmain.sh mkdir -p build && cd build ../configure \ --prefix=/usr \ --build=$(../config.guess) \ --host=$TARGET \ --disable-nls \ --enable-shared \ --enable-gprofng=no \ --disable-werror \ --enable-64-bit-bfd \ --enable-new-dtags \ --enable-default-hash-style=gnu \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install rm "$SYSROOT"/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la} cd "$SOURCES" && rm -rf binutils-$BINUTILS_VERSION } toolchain_gcc() { cd "$SOURCES" && tar xf gcc-$GCC_VERSION.tar.xz && cd gcc-$GCC_VERSION tar xf ../gmp-$GMP_VERSION.tar.xz && mv gmp-$GMP_VERSION gmp tar xf ../isl-$ISL_VERSION.tar.xz && mv isl-$ISL_VERSION isl tar xf ../mpc-$MPC_VERSION.tar.gz && mv mpc-$MPC_VERSION mpc tar xf ../mpfr-$MPFR_VERSION.tar.xz && mv mpfr-$MPFR_VERSION mpfr sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 sed '/thread_header =/s/@.*@/gthr-posix.h/' -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in mkdir -p build && cd build ../configure \ --build=$(../config.guess) \ --host=$TARGET \ --target=$TARGET \ --prefix=/usr \ --with-build-sysroot="$SYSROOT" \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-multilib \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libsanitizer \ --disable-libssp \ --disable-libvtv \ --enable-languages=c,c++ \ LDFLAGS_FOR_TARGET=-L"$PWD/$TARGET/libgcc" \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install ln -s gcc "$SYSROOT"/usr/bin/cc cd "$SOURCES" && rm -rf gcc-$GCC_VERSION } prechroot_gettext() { fetch $GETTEXT_URL sudo chroot "$SYSROOT" /usr/bin/env -i \ MAKEFLAGS="$MAKEFLAGS" \ PATH=/usr/bin:/usr/sbin \ SOURCES=/sources \ GETTEXT_VERSION=$GETTEXT_VERSION \ /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf gettext-$GETTEXT_VERSION.tar.xz && cd gettext-$GETTEXT_VERSION ./configure \ --disable-shared \ --silent \ --quiet make cp gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin cd "$SOURCES" && rm -rf gettext-$GETTEXT_VERSION EOF } prechroot_bison() { fetch $BISON_URL sudo chroot "$SYSROOT" /usr/bin/env -i \ MAKEFLAGS="$MAKEFLAGS" \ PATH=/usr/bin:/usr/sbin \ SOURCES=/sources \ BISON_VERSION=$BISON_VERSION \ /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf bison-$BISON_VERSION.tar.xz && cd bison-$BISON_VERSION ./configure \ --prefix=/usr \ --silent \ --quiet make && make install cd "$SOURCES" && rm -rf bison-$BISON_VERSION EOF } prechroot_perl() { fetch $PERL_URL sudo chroot "$SYSROOT" /usr/bin/env -i \ MAKEFLAGS="$MAKEFLAGS" \ PATH=/usr/bin:/usr/sbin \ SOURCES=/sources \ PERL_VERSION=$PERL_VERSION \ /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf perl-$PERL_VERSION.tar.gz && cd perl-$PERL_VERSION sh Configure -des \ -D prefix=/usr \ -D vendorprefix=/usr \ -D useshrplib \ -D privlib=/usr/lib/perl5/$PERL_VERSION/core_perl \ -D archlib=/usr/lib/perl5/$PERL_VERSION/core_perl \ -D sitelib=/usr/lib/perl5/$PERL_VERSION/site_perl \ -D sitearch=/usr/lib/perl5/$PERL_VERSION/site_perl \ -D vendorlib=/usr/lib/perl5/$PERL_VERSION/vendor_perl \ -D vendorarch=/usr/lib/perl5/$PERL_VERSION/vendor_perl make && make install cd "$SOURCES" && rm -rf perl-$PERL_VERSION EOF } prechroot_python() { fetch $PYTHON_URL sudo chroot "$SYSROOT" /usr/bin/env -i \ MAKEFLAGS="$MAKEFLAGS" \ PATH=/usr/bin:/usr/sbin \ SOURCES=/sources \ PYTHON_VERSION=$PYTHON_VERSION \ /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf Python-$PYTHON_VERSION.tar.xz && cd Python-$PYTHON_VERSION ./configure \ --prefix=/usr \ --enable-shared \ --without-static-libpython \ --disable-test-modules \ --without-ensurepip \ --silent \ --quiet make && make install rm -rf /usr/lib/python$PYTHON_VERSION/test cd "$SOURCES" && rm -rf Python-$PYTHON_VERSION EOF } prechroot_util_linux() { fetch $UTIL_LINUX_URL sudo chroot "$SYSROOT" /usr/bin/env -i \ MAKEFLAGS="$MAKEFLAGS" \ PATH=/usr/bin:/usr/sbin \ SOURCES=/sources \ UTIL_LINUX_VERSION=$UTIL_LINUX_VERSION \ /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf util-linux-$UTIL_LINUX_VERSION.tar.xz && cd util-linux-$UTIL_LINUX_VERSION mkdir -p /var/lib/hwclock ./configure --libdir=/usr/lib \ --runstatedir=/run \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --disable-liblastlog2 \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --silent \ --quiet make && make install cd "$SOURCES" && rm -rf util-linux-$UTIL_LINUX_VERSION EOF } prechroot_cleanup() { sudo chroot "$SYSROOT" /usr/bin/env -i \ /usr/bin/bash <<- "EOF" rm -rf /usr/share/{info,man,doc}/* find /usr/{lib,libexec} -name \*.la -delete rm -rf /cross EOF } chroot_tmpfs_setup() { sudo chroot "$SYSROOT" /usr/bin/env -i /usr/bin/bash <<- "EOF" ln -s run /var/run ln -sfv run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp ln -s proc/self/mounts /etc/mtab cat > /etc/hosts <<- "END_OF_FILE" 127.0.0.1 localhost axe ::1 localhost END_OF_FILE cat > /etc/passwd <<- "END_OF_FILE" root:x:0:0:root:/root:/usr/bin/bash uuidd:x:6:6::/dev/null:/usr/bin/nologin messagebus:x:7:7::/run/dbus:/usr/bin/nologin nobody:x:65534:65534::/dev/null:/usr/bin/nologin END_OF_FILE cat > /etc/group <<- "END_OF_FILE" root:x:0: tty:x:1: audio:x:2: video:x:3: input:x:4: wheel:x:5: uuidd:x:6: messagebus:x:7: users:x:999: nogroup:x:65534: END_OF_FILE EOF } chroot_iana_etc() { fetch $IANA_ETC_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources IANA_ETC_VERSION=$IANA_ETC_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf iana-etc-$IANA_ETC_VERSION.tar.gz && cd iana-etc-$IANA_ETC_VERSION cp services protocols /etc cd "$SOURCES" && rm -rf iana-etc-$IANA_ETC_VERSION EOF } chroot_glibc() { fetch $TZDATA_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources GLIBC_VERSION=$GLIBC_VERSION LINUX_VERSION=$LINUX_VERSION TZDATA_VERSION=$TZDATA_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf glibc-$GLIBC_VERSION.tar.xz && cd glibc-$GLIBC_VERSION patch -Np1 -i ../glibc-fhs-1.patch mkdir -p build && cd build echo "rootsbindir=/usr/sbin" > configparms ../configure \ --prefix=/usr \ --disable-werror \ --disable-nscd \ libc_cv_slibdir=/usr/lib \ --enable-stack-protector=strong \ --enable-kernel= \ --disable-nls \ --enable-kernel=$LINUX_VERSION \ --silent \ --quiet make && make install touch /etc/ld.so.conf sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd cat > /etc/nsswitch.conf <<- "END_OF_FILE" passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files END_OF_FILE tar xf $SOURCES/tzdata$TZDATA_VERSION.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -p $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica asia australasia backward; do zic -L /dev/null -d $ZONEINFO ${tz} zic -L /dev/null -d $ZONEINFO/posix ${tz} zic -L leapseconds -d $ZONEINFO/right ${tz} done cp zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p Africa/Johannesburg unset ZONEINFO tz ln -sf /usr/share/zoneinfo/Africa/Johannesburg /etc/localtime cat > /etc/ld.so.conf <<- "END_OF_FILE" /usr/local/lib /opt/lib include /etc/ld.so.conf.d/*.conf END_OF_FILE mkdir -p /etc/ld.so.conf.d cd "$SOURCES" && rm -rf glibc-$GLIBC_VERSION EOF } chroot_zlib() { fetch $ZLIB_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources ZLIB_VERSION=$ZLIB_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf zlib-$ZLIB_VERSION.tar.gz && cd zlib-$ZLIB_VERSION ./configure \ --prefix=/usr make && make install rm -f /usr/lib/libz.a cd "$SOURCES" && rm -rf zlib-$ZLIB_VERSION EOF } chroot_bzip2() { fetch $BZIP2_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources BZIP2_VERSION=$BZIP2_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf bzip2-$BZIP2_VERSION.tar.gz && cd bzip2-$BZIP2_VERSION sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile make -f Makefile-libbz2_so make clean make && make PREFIX=/usr install cp -a libbz2.so.* /usr/lib ln -sf libbz2.so.1.0.8 /usr/lib/libbz2.so ln -sf libbz2.so.1.0.8 /usr/lib/libbz2.so.1 cp bzip2-shared /usr/bin/bzip2 for i in /usr/bin/{bzcat,bunzip2}; do ln -sf bzip2 $i done rm -f /usr/lib/libbz2.a cd "$SOURCES" && rm -rf bzip2-$BZIP2_VERSION EOF } chroot_xz() { sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources XZ_VERSION=$XZ_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf xz-$XZ_VERSION.tar.xz && cd xz-$XZ_VERSION ./configure \ --prefix=/usr \ --disable-static make && make install cd "$SOURCES" && rm -rf xz-$XZ_VERSION EOF } chroot_zstd() { fetch $ZSTD_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources ZSTD_VERSION=$ZSTD_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf zstd-$ZSTD_VERSION.tar.gz && cd zstd-$ZSTD_VERSION make prefix=/usr make prefix=/usr install rm /usr/lib/libzstd.a cd "$SOURCES" && rm -rf zstd-$ZSTD_VERSION EOF } chroot_file() { fetch $FILE_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources FILE_VERSION=$FILE_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf file-$FILE_VERSION.tar.gz && cd file-$FILE_VERSION ./configure \ --prefix=/usr make && make install cd "$SOURCES" && rm -rf file-$FILE_VERSION EOF } chroot_readline() { fetch $READLINE_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources READLINE_VERSION=$READLINE_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf readline-$READLINE_VERSION.tar.gz && cd readline-$READLINE_VERSION sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install sed -i 's/-Wl,-rpath,[^ ]*//' support/shobj-conf sed -e '270a\ else\ chars_avail = 1;' \ -e '288i\ result = -1;' \ -i.orig input.c ./configure \ --prefix=/usr \ --disable-static \ --with-curses make SHLIB_LIBS="-lncursesw" && make install cd "$SOURCES" && rm -rf readline-$READLINE_VERSION EOF } chroot_pcre2() { fetch $PCRE2_URL sudo chroot "$SYSROOT" /usr/bin/env -i MAKEFLAGS="$MAKEFLAGS" PATH=/usr/bin:/usr/sbin SOURCES=/sources PCRE2_VERSION=$PCRE2_VERSION /usr/bin/bash <<- "EOF" set -euo pipefail cd "$SOURCES" && tar xf pcre2-$PCRE2_VERSION.tar.gz && cd pcre2-$PCRE2_VERSION ./configure \ --prefix=/usr \ --enable-unicode \ --enable-jit \ --enable-pcre2-16 \ --enable-pcre2-32 \ --enable-pcre2grep-libz \ --enable-pcre2grep-libbz2 \ --enable-pcre2test-libreadline \ --disable-static make && make install cd "$SOURCES" && rm -rf pcre2-$PCRE2_VERSION EOF } #create_sysroot #bootstrap_binutils #bootstap_gcc #bootstap_linux #bootstap_glibc #bootstap_libstdcpp #toolchain_m4 #toolchain_ncurses #toolchain_bash #toolchain_coreutils #toolchain_diffutils #toolchain_file #toolchain_findutils #toolchain_gawk #toolchain_grep #toolchain_gzip #toolchain_make #toolchain_patch #toolchain_sed #toolchain_tar #toolchain_xz #toolchain_binutils #toolchain_gcc #change_owner #do_mount #prechroot_gettext #prechroot_bison #prechroot_perl #prechroot_python #prechroot_util_linux #prechroot_cleanup #do_unmount #chroot_iana_etc #chroot_glibc #chroot_zlib #chroot_bzip2 #chroot_xz #chroot_zstd #chroot_file #chroot_readline #chroot_pcre2