#!/usr/bin/env bash set -euo pipefail umask 022 . version.bash . flags.bash . utilities.bash bootstrap_binutils() { fetch $BINUTILS_URL cd "$SOURCES" && tar xf binutils-$BINUTILS_VERSION.tar.xz && cd binutils-$BINUTILS_VERSION mkdir -p build && cd build ../configure \ --prefix="$CROSS" \ --with-sysroot="$SYSROOT" \ --target=$TARGET \ --disable-nls \ --enable-gprofng=no \ --disable-werror \ --enable-new-dtags \ --enable-default-hash-style=gnu \ --silent \ --quiet make && make install cd "$SOURCES" rm -rf binutils-$BINUTILS_VERSION } bootstap_gcc() { fetch $GCC_URL fetch $GMP_URL fetch $ISL_URL fetch $MPC_URL fetch $MPFR_URL 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 mkdir -p build && cd build ../configure \ --target=$TARGET \ --prefix="$CROSS" \ --with-glibc-version=$GLIBC_VERSION \ --with-sysroot="$SYSROOT" \ --with-newlib \ --without-headers \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++ \ --silent \ --quiet make && make install cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > "`dirname $($TARGET-gcc -print-libgcc-file-name)`/include/limits.h" cd "$SOURCES" && rm -rf gcc-$GCC_VERSION } bootstap_linux() { fetch $LINUX_URL cd "$SOURCES" && tar xf linux-$LINUX_VERSION.tar.xz && cd linux-$LINUX_VERSION make mrproper make headers find usr/include -type f ! -name '*.h' -delete cp -r usr/include "$SYSROOT"/usr cd "$SOURCES" && rm -rf linux-$LINUX_VERSION } bootstap_glibc() { fetch $GLIBC_URL fetch $GLIBC_PATCH_URL cd "$SOURCES" && tar xf glibc-$GLIBC_VERSION.tar.xz && cd glibc-$GLIBC_VERSION ln -sf ld-linux-x86-64.so.2 "$SYSROOT"/lib/ld-lsb-x86-64.so.3 patch -sNp1 -i "$SOURCES"/glibc-fhs-1.patch mkdir -p build && cd build echo "rootsbindir=/usr/sbin" > configparms ../configure \ --prefix=/usr \ --host=$TARGET \ --build=$(../scripts/config.guess) \ --disable-nscd \ --disable-nls \ libc_cv_slibdir=/usr/lib \ --enable-kernel=$LINUX_VERSION \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install sed '/RTLDLIST=/s@/usr@@g' -i "$SYSROOT"/usr/bin/ldd cd "$SOURCES" && rm -rf glibc-$GLIBC_VERSION } bootstap_libstdcpp() { cd "$SOURCES" && tar xf gcc-$GCC_VERSION.tar.xz && cd gcc-$GCC_VERSION mkdir -p build && cd build ../libstdc++-v3/configure \ --host=$TARGET \ --build=$(../config.guess) \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/cross/$TARGET/include/c++/$GCC_VERSION \ --silent \ --quiet make && make DESTDIR="$SYSROOT" install rm -rf "$SYSROOT"/usr/lib/lib{stdc++{,exp,fs},supc++}.la cd "$SOURCES" && rm -rf gcc-$GCC_VERSION } toolchain_m4() { fetch $M4_URL cd "$SOURCES" && tar xf m4-$M4_VERSION.tar.xz && cd m4-$M4_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) make && make DESTDIR="$SYSROOT" install cd "$SOURCES" && rm -rf m4-$M4_VERSION } 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 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 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 make && make DESTDIR="$SYSROOT" install ln -sv 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 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) 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 make popd ./configure \ --prefix=/usr \ --host="$TARGET" \ --build=$(./config.guess) 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) 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) 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) 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 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) 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) 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) 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) 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 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 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" make && make DESTDIR="$SYSROOT" install ln -s gcc "$SYSROOT"/usr/bin/cc cd "$SOURCES" && rm -rf gcc-$GCC_VERSION } #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