diff --git a/buildtoolchain/buildit.sh b/buildtoolchain/buildit.sh index 0bf292f..2ae7037 100755 --- a/buildtoolchain/buildit.sh +++ b/buildtoolchain/buildit.sh @@ -3,6 +3,7 @@ # Copyright (C) 2007 Segher Boessenkool # Copyright (C) 2009 Hector Martin "marcan" # Copyright (C) 2009 Andre Heider "dhewg" +# Copyright (C) 2022 Shiz # Released under the terms of the GNU GPL, version 2 SCRIPTDIR=`dirname $PWD/$0` @@ -27,7 +28,6 @@ GCC_DIR="gcc-$GCC_VER" GCC_TARBALL="gcc-core-$GCC_VER.tar.bz2" GCC_URI="http://ftp.gnu.org/gnu/gcc/gcc-$GCC_VER/$GCC_TARBALL" -BUILDTYPE=$1 ARM_TARGET=armeb-eabi POWERPC_TARGET=powerpc-elf @@ -46,63 +46,82 @@ case `uname -s` in MAKE=make esac -export PATH=$WIIDEV/bin:$PATH - die() { echo $@ exit 1 } -cleansrc() { - [ -e $WIIDEV/$BINUTILS_DIR ] && rm -rf $WIIDEV/$BINUTILS_DIR - [ -e $WIIDEV/$GCC_DIR ] && rm -rf $WIIDEV/$GCC_DIR -} - -cleanbuild() { - [ -e $WIIDEV/build_binutils ] && rm -rf $WIIDEV/build_binutils - [ -e $WIIDEV/build_gcc ] && rm -rf $WIIDEV/build_gcc -} - download() { DL=1 - if [ -f "$WIIDEV/$2" ]; then - echo "Testing $2..." - tar tf "$WIIDEV/$2" >/dev/null 2>&1 && DL=0 + if [ -f "$1" ]; then + echo "Testing $1..." + tar tf "$1" >/dev/null 2>&1 && DL=0 fi if [ $DL -eq 1 ]; then echo "Downloading $2..." - wget "$1" -c -O "$WIIDEV/$2" || die "Could not download $2" + wget "$2" -c -O "$1" || die "Could not download $2" fi } extract() { - echo "Extracting $1..." - tar xf "$WIIDEV/$1" -C "$2" || die "Error unpacking $1" + echo "Extracting $2..." + tar xf "$2" -C "$1" || die "Could not unpack $2" } -makedirs() { - mkdir -p $WIIDEV/build_binutils || die "Error making binutils build directory $WIIDEV/build_binutils" - mkdir -p $WIIDEV/build_gcc || die "Error making gcc build directory $WIIDEV/build_gcc" + +cleansrc() { + [ -e "$1/src/$BINUTILS_DIR" ] && rm -rf "$1/src/$BINUTILS_DIR" + [ -e "$1/src/$GCC_DIR" ] && rm -rf "$1/src/$GCC_DIR" +} + +cleanbuild() { + [ -e "$(printf "%s\n" "$1/var/build/$BINUTILS_DIR"-* | head -n 1)" ] && rm -rf "$1/var/build/$BINUTILS_DIR"-* + [ -e "$(printf "%s\n" "$1/var/build/$GCC_DIR"-* | head -n 1)" ] && rm -rf "$1/var/build/$GCC_DIR"-* +} + +prepsrc() { + mkdir -p "$1/var/cache" || die "Could not create cache directory $1/var/cache" + + download "$1/var/cache/$BINUTILS_TARBALL" "$BINUTILS_URI" + download "$1/var/cache/$GMP_TARBALL" "$GMP_URI" + download "$1/var/cache/$MPFR_TARBALL" "$MPFR_URI" + download "$1/var/cache/$GCC_TARBALL" "$GCC_URI" + + cleansrc "$1" + + mkdir -p "$1/src" || die "Could not create source directory $1/src" + + extract "$1/src" "$1/var/cache/$BINUTILS_TARBALL" + extract "$1/src" "$1/var/cache/$GCC_TARBALL" + extract "$1/src/$GCC_DIR" "$1/var/cache/$GMP_TARBALL" + mv "$1/src/$GCC_DIR/$GMP_DIR" "$1/src/$GCC_DIR/gmp" || die "Error renaming $GMP_DIR -> gmp" + extract "$1/src/$GCC_DIR" "$1/var/cache/$MPFR_TARBALL" + mv "$1/src/$GCC_DIR/$MPFR_DIR" "$1/src/$GCC_DIR/mpfr" || die "Error renaming $MPFR_DIR -> mpfr" + + # http://sourceware.org/bugzilla/show_bug.cgi?id=12964 + patch -d $WIIDEV/$BINUTILS_DIR -u -p1 -i $SCRIPTDIR/binutils-2.21.1.patch || die "Error applying binutils patch" } buildbinutils() { - TARGET=$1 ( - cd $WIIDEV/build_binutils && \ - $WIIDEV/$BINUTILS_DIR/configure --target=$TARGET \ + export PATH="$1/bin:$PATH" + mkdir -p "$1/var/build/$BINUTILS_DIR-$2" + cd "$1/var/build/$BINUTILS_DIR-$2" && \ + "$1/src/$BINUTILS_DIR/configure" --target="$2" \ --prefix=$WIIDEV --disable-nls --disable-werror \ --disable-multilib && \ nice $MAKE $MAKEOPTS && \ $MAKE install - ) || die "Error building binutils for target $TARGET" + ) || die "Error building binutils for target $2" } buildgcc() { - TARGET=$1 ( - cd $WIIDEV/build_gcc && \ - $WIIDEV/$GCC_DIR/configure --target=$TARGET --enable-targets=all \ + export PATH="$1/bin:$PATH" + mkdir -p "$1/var/build/$GCC_DIR-$2" + cd "$1/var/build/$GCC_DIR-$2" && \ + "$1/src/$GCC_DIR/configure" --target="$2" --enable-targets=all \ --prefix=$WIIDEV --disable-multilib \ --enable-languages=c --without-headers \ --disable-nls --disable-threads --disable-shared \ @@ -112,35 +131,44 @@ buildgcc() { CFLAGS='-fgnu89-inline -g -O2' && \ nice $MAKE $MAKEOPTS && \ $MAKE install - ) || die "Error building gcc for target $TARGET" + ) || die "Error building gcc for target $2" } -buildarm() { - cleanbuild - makedirs - echo "******* Building ARM binutils" - buildbinutils $ARM_TARGET - echo "******* Building ARM GCC" - buildgcc $ARM_TARGET - echo "******* ARM toolchain built and installed" -} -buildpowerpc() { - cleanbuild - makedirs - echo "******* Building PowerPC binutils" - buildbinutils $POWERPC_TARGET - echo "******* Building PowerPC GCC" - buildgcc $POWERPC_TARGET - echo "******* PowerPC toolchain built and installed" +build() { + cleanbuild "$1" + echo "******* Building $2 binutils" + [ -f "$1/bin/$2-ld" ] || buildbinutils "$1" "$2" + echo "******* Building $2 GCC" + [ -f "$1/bin/$2-gcc" ] || buildgcc "$1" "$2" + echo "******* $2 toolchain built and installed" } if [ -z "$WIIDEV" ]; then die "Please set WIIDEV in your environment." fi +BUILDTYPE="$1" case $BUILDTYPE in - arm|powerpc|both|clean) ;; + arm) + prepsrc "$WIIDEV" + build "$WIIDEV" $ARM_TARGET + ;; + powerpc) + prepsrc "$WIIDEV" + build "$WIIDEV" $POWERPC_TARGET + ;; + both) + prepsrc "$WIIDEV" + build "$WIIDEV" $ARM_TARGET + build "$WIIDEV" $POWERPC_TARGET + cleanbuild "$WIIDEV" + cleansrc "$WIIDEV" + ;; + clean) + cleanbuild "$WIIDEV" + cleansrc "$WIIDEV" + ;; "") die "Please specify build type (arm/powerpc/both/clean)" ;; @@ -148,34 +176,3 @@ case $BUILDTYPE in die "Unknown build type $BUILDTYPE" ;; esac - -if [ "$BUILDTYPE" = "clean" ]; then - cleanbuild - cleansrc - exit 0 -fi - -download "$BINUTILS_URI" "$BINUTILS_TARBALL" -download "$GMP_URI" "$GMP_TARBALL" -download "$MPFR_URI" "$MPFR_TARBALL" -download "$GCC_URI" "$GCC_TARBALL" - -cleansrc - -extract "$BINUTILS_TARBALL" "$WIIDEV" -extract "$GCC_TARBALL" "$WIIDEV" -extract "$GMP_TARBALL" "$WIIDEV/$GCC_DIR" -extract "$MPFR_TARBALL" "$WIIDEV/$GCC_DIR" - -# http://sourceware.org/bugzilla/show_bug.cgi?id=12964 -patch -d $WIIDEV/$BINUTILS_DIR -u -p1 -i $SCRIPTDIR/binutils-2.21.1.patch || die "Error applying binutils patch" - -# in-tree gmp and mpfr -mv "$WIIDEV/$GCC_DIR/$GMP_DIR" "$WIIDEV/$GCC_DIR/gmp" || die "Error renaming $GMP_DIR -> gmp" -mv "$WIIDEV/$GCC_DIR/$MPFR_DIR" "$WIIDEV/$GCC_DIR/mpfr" || die "Error renaming $MPFR_DIR -> mpfr" - -case $BUILDTYPE in - arm) buildarm ;; - powerpc) buildpowerpc ;; - both) buildarm ; buildpowerpc; cleanbuild; cleansrc ;; -esac