buildtoolchain: use less global variables, refactor build process a bit

This commit is contained in:
Shiz 2024-01-03 13:41:40 +01:00
parent a32b8f6520
commit 7aa26c15b5

View File

@ -3,6 +3,7 @@
# Copyright (C) 2007 Segher Boessenkool <segher@kernel.crashing.org> # Copyright (C) 2007 Segher Boessenkool <segher@kernel.crashing.org>
# Copyright (C) 2009 Hector Martin "marcan" <hector@marcansoft.com> # Copyright (C) 2009 Hector Martin "marcan" <hector@marcansoft.com>
# Copyright (C) 2009 Andre Heider "dhewg" <dhewg@wiibrew.org> # Copyright (C) 2009 Andre Heider "dhewg" <dhewg@wiibrew.org>
# Copyright (C) 2022 Shiz <hi@shiz.me>
# Released under the terms of the GNU GPL, version 2 # Released under the terms of the GNU GPL, version 2
SCRIPTDIR=`dirname $PWD/$0` SCRIPTDIR=`dirname $PWD/$0`
@ -27,7 +28,6 @@ GCC_DIR="gcc-$GCC_VER"
GCC_TARBALL="gcc-core-$GCC_VER.tar.bz2" GCC_TARBALL="gcc-core-$GCC_VER.tar.bz2"
GCC_URI="http://ftp.gnu.org/gnu/gcc/gcc-$GCC_VER/$GCC_TARBALL" GCC_URI="http://ftp.gnu.org/gnu/gcc/gcc-$GCC_VER/$GCC_TARBALL"
BUILDTYPE=$1
ARM_TARGET=armeb-eabi ARM_TARGET=armeb-eabi
POWERPC_TARGET=powerpc-elf POWERPC_TARGET=powerpc-elf
@ -46,63 +46,82 @@ case `uname -s` in
MAKE=make MAKE=make
esac esac
export PATH=$WIIDEV/bin:$PATH
die() { die() {
echo $@ echo $@
exit 1 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() { download() {
DL=1 DL=1
if [ -f "$WIIDEV/$2" ]; then if [ -f "$1" ]; then
echo "Testing $2..." echo "Testing $1..."
tar tf "$WIIDEV/$2" >/dev/null 2>&1 && DL=0 tar tf "$1" >/dev/null 2>&1 && DL=0
fi fi
if [ $DL -eq 1 ]; then if [ $DL -eq 1 ]; then
echo "Downloading $2..." 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 fi
} }
extract() { extract() {
echo "Extracting $1..." echo "Extracting $2..."
tar xf "$WIIDEV/$1" -C "$2" || die "Error unpacking $1" 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" cleansrc() {
mkdir -p $WIIDEV/build_gcc || die "Error making gcc build directory $WIIDEV/build_gcc" [ -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() { buildbinutils() {
TARGET=$1
( (
cd $WIIDEV/build_binutils && \ export PATH="$1/bin:$PATH"
$WIIDEV/$BINUTILS_DIR/configure --target=$TARGET \ 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 \ --prefix=$WIIDEV --disable-nls --disable-werror \
--disable-multilib && \ --disable-multilib && \
nice $MAKE $MAKEOPTS && \ nice $MAKE $MAKEOPTS && \
$MAKE install $MAKE install
) || die "Error building binutils for target $TARGET" ) || die "Error building binutils for target $2"
} }
buildgcc() { buildgcc() {
TARGET=$1
( (
cd $WIIDEV/build_gcc && \ export PATH="$1/bin:$PATH"
$WIIDEV/$GCC_DIR/configure --target=$TARGET --enable-targets=all \ 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 \ --prefix=$WIIDEV --disable-multilib \
--enable-languages=c --without-headers \ --enable-languages=c --without-headers \
--disable-nls --disable-threads --disable-shared \ --disable-nls --disable-threads --disable-shared \
@ -112,35 +131,44 @@ buildgcc() {
CFLAGS='-fgnu89-inline -g -O2' && \ CFLAGS='-fgnu89-inline -g -O2' && \
nice $MAKE $MAKEOPTS && \ nice $MAKE $MAKEOPTS && \
$MAKE install $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() { build() {
cleanbuild cleanbuild "$1"
makedirs echo "******* Building $2 binutils"
echo "******* Building PowerPC binutils" [ -f "$1/bin/$2-ld" ] || buildbinutils "$1" "$2"
buildbinutils $POWERPC_TARGET echo "******* Building $2 GCC"
echo "******* Building PowerPC GCC" [ -f "$1/bin/$2-gcc" ] || buildgcc "$1" "$2"
buildgcc $POWERPC_TARGET echo "******* $2 toolchain built and installed"
echo "******* PowerPC toolchain built and installed"
} }
if [ -z "$WIIDEV" ]; then if [ -z "$WIIDEV" ]; then
die "Please set WIIDEV in your environment." die "Please set WIIDEV in your environment."
fi fi
BUILDTYPE="$1"
case $BUILDTYPE in 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)" die "Please specify build type (arm/powerpc/both/clean)"
;; ;;
@ -148,34 +176,3 @@ case $BUILDTYPE in
die "Unknown build type $BUILDTYPE" die "Unknown build type $BUILDTYPE"
;; ;;
esac 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