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) 2009 Hector Martin "marcan" <hector@marcansoft.com>
# 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
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