#!/usr/bin/env bash

OS=`uname`
HOSTARCH=`uname -m`
PARALLEL=
FETCH=0
QUIET=0
STRIP=0
GNU_MIRROR=https://mirrors.kernel.org/gnu
# Get absolute path, will spawn a subshell then exit so our pwd is retained
SCRIPTROOT=$(cd "$(dirname $0)" && pwd)
PATCHES=$SCRIPTROOT/patches/

# Cause errors in pipes to return failure when necessary
set -o pipefail

function err() {
    echo "doit: error during build"
    if [ "$QUIET" = "1" ]; then
        echo "doit: dumping last 50 lines of build log..."
        echo "doit: see $OUTDIR/build.log for the full details"
        tail -50 $OUTDIR/build.log
    fi
    exit 1
}

trap err ERR

function help()
{
    echo "Options"
    echo " -a <arch list>               architectures to build"
    echo "    example: -a 'arm' or -a 'arm i386 x86_64' for multiple"
    echo " -c                           use compilation cache (ccache must be installed)"
    echo " -f                           fetch source releases from upstream"
    echo " -h|-?                        display this help message"
    echo " -j<#>                        use <#> parallel workers to build"
    echo " -o <dir>                     output directory"
    echo " -q                           make the build quieter"
    echo " -s                           strip the binaries"
    exit 1
}

function log()
{
    if [ "$QUIET" = "1" ]; then
        "$@" >> $OUTDIR/build.log 2>&1
    else
        "$@" 2>&1 | tee -a $OUTDIR/build.log
    fi
}

function extract-tool()
{
    #echo "extract-tool " $1 $2 $3 $4

    TARFILE=${1}-${2}.tar$3
    TARGETDIR=${1}-${2}
    HASH="$4"
    PATCH="$5"
    if [ -f ${TARGETDIR}/.extracted ]; then
        log echo "$TARFILE already extracted into $TARGETDIR, skipping"
        return 0
    fi
    if [ ! -f $ARCHIVES/$TARFILE ]; then
        log echo "error, missing $TARFILE"
        exit 1
    fi

    echo "checking $TARFILE integrity"
    if [ "$(shasum -a 256 -b "$ARCHIVES/$TARFILE" | cut -f1 -d' ')" != "$HASH" ]; then
      log echo "$TARFILE failed integrity check"
      exit 1
    fi

    echo extracting $TARFILE
    pushd $OUTDIR
    rm -rf $TARGETDIR
    tar xf $ARCHIVES/$TARFILE || exit 1

    if [ -n "$PATCH" ]; then
        log echo patching $1
        log patch -d $TARGETDIR -p1 < "$PATCH" || exit 1
    fi

    touch $TARGETDIR/.extracted || exit 1
    popd
}

if [ "$OS" = "Linux" ]; then
    COUNT=`grep processor /proc/cpuinfo | wc -l`
    PARALLEL=-j`expr $COUNT + $COUNT`
fi
if [ "$OS" = "Darwin" ]; then
    # needed to work around problem with clang compiler and some generated code in gcc
    export CXXFLAGS="-fbracket-depth=1024 -g -O2"
fi
MAKE=make
if [ "$OS" = "FreeBSD" ]; then
    MAKE=gmake
fi
if [ "$HOSTARCH" = "amd64" ]; then
    HOSTARCH=x86_64
fi

if [ $# == "0" ]; then
    help
fi

while getopts a:cfhj:o:qs? arg
do
    case $arg in
        a ) ARCHES=$OPTARG ;;
        c ) CCACHE=1 ;;
        j ) PARALLEL="-j$OPTARG" ;;
        f ) FETCH=1 ;;
        o ) OUTDIR=$OPTARG ;;
        q ) QUIET=1 ;;
        s ) STRIP=1 ;;
        h ) help ;;
        ? ) help ;;
        * ) echo "unrecognized option '$arg'" ; exit 1 ;;
    esac
done


if [ -z "$ARCHES" ]; then
    echo need to specify architectures to build
    echo ie -a "arm sh"
    exit 1
fi

if [ -z "$OUTDIR" ]; then
    OUTDIR=`pwd`
fi
ARCHIVES=$OUTDIR/archives

if [ -z $(which makeinfo) ]; then
    echo makeinfo not found. On debian/ubuntu this is provided by the texinfo package.
    exit 1
fi

export CC="cc"
export CXX="c++"

if [ "$CCACHE" = "1" ]; then
export CC="ccache $CC"
export CXX="ccache $CXX"
fi

log date
log echo "ARCHES='$ARCHES' PARALLEL='$PARALLEL' FETCH='$FETCH' CCACHE='$CCACHE'"
# load GCC_VER and BINUTILS_VER
. toolvers

if [ "$FETCH" = "1" ]; then
    if [ ! -f $ARCHIVES/binutils-$BINUTILS_VER.tar.bz2 ]; then
       echo fetching binutils-$BINUTILS_VER
       log wget -P $ARCHIVES -N $GNU_MIRROR/binutils/binutils-$BINUTILS_VER.tar.bz2
    fi
    if [ ! -f $ARCHIVES/gcc-$GCC_VER.tar.bz2 ]; then
        echo fetching gcc-$GCC_VER
        log wget -P $ARCHIVES -N $GNU_MIRROR/gcc/gcc-$GCC_VER/gcc-$GCC_VER.tar.bz2
    fi
    if [ ! -f $ARCHIVES/gdb-$GDB_VER.tar.xz ]; then
        echo fetching gdb-$GDB_VER
        log wget -P $ARCHIVES -N $GNU_MIRROR/gdb/gdb-$GDB_VER.tar.xz
    fi
    if [ ! -f $ARCHIVES/mpfr-$MPFR_VER.tar.bz2 ]; then
        echo fetching mpfr-$MPFR_VER
        log wget -P $ARCHIVES -N $GNU_MIRROR/mpfr/mpfr-$MPFR_VER.tar.bz2
    fi
    if [ ! -f $ARCHIVES/mpc-$MPC_VER.tar.gz ]; then
        echo fetching mpc-$MPC_VER
        log wget -P $ARCHIVES -N $GNU_MIRROR/mpc/mpc-$MPC_VER.tar.gz
    fi
    if [ ! -f $ARCHIVES/gmp-$GMP_VER.tar.bz2 ]; then
        echo fetching gmp-$GMP_VER
        log wget -P $ARCHIVES -N $GNU_MIRROR/gmp/gmp-$GMP_VER.tar.bz2
    fi
fi

if [ ! -f $OUTDIR/.extracted-stamp ]; then
    extract-tool binutils $BINUTILS_VER .bz2 $BINUTILS_HASH $PATCHES/binutils-patch.txt
    extract-tool gcc $GCC_VER .bz2 $GCC_HASH $PATCHES/gcc-patch.txt
    extract-tool gdb $GDB_VER .xz $GDB_HASH $PATCHES/gdb-patch.txt
    extract-tool gmp $GMP_VER .bz2 $GMP_HASH
    extract-tool mpc $MPC_VER .gz $MPC_HASH
    extract-tool mpfr $MPFR_VER .bz2 $MPFR_HASH
    touch $OUTDIR/.extracted-stamp
fi

# link the last three libs into gcc
pushd $OUTDIR/gcc-$GCC_VER
ln -sf ../gmp-$GMP_VER gmp
ln -sf ../mpc-$MPC_VER mpc
ln -sf ../mpfr-$MPFR_VER mpfr
popd

COMMON_CONFIG=--with-included-gettext

for ARCH in $ARCHES; do
    echo building for arch \"$ARCH\"
    if [ "$ARCH" == "arm" ]; then
        TARGET=arm-eabi
    else
        TARGET=$ARCH-elf
    fi

    INSTALLPATH=$OUTDIR/$TARGET-$GCC_VER-$OS-$HOSTARCH
    BINBUILDPATH=$OUTDIR/build-binutils-$BINUTILS_VER-$ARCH-$OS-$HOSTARCH
    GCCBUILDPATH=$OUTDIR/build-gcc-$GCC_VER-$ARCH-$OS-$HOSTARCH
    GDBBUILDPATH=$OUTDIR/build-gdb-$GDB_VER-$ARCH-$OS-$HOSTARCH
    export PATH=$INSTALLPATH/bin:$PATH

    # Building Binutils
    if [ ! -f $BINBUILDPATH/built.txt ]; then
        case "$ARCH" in
            x86_64) EXTRA_TARGETS="--enable-targets=x86_64-pep" ;;
            *) EXTRA_TARGETS="" ;;
        esac

        echo building binutils
        mkdir -p $BINBUILDPATH
        pushd $BINBUILDPATH
        log ../binutils-$BINUTILS_VER/configure $COMMON_CONFIG --target=$TARGET --prefix=$INSTALLPATH --disable-werror --enable-initfini-array --enable-gold $EXTRA_TARGETS
        log $MAKE $PARALLEL
        log $MAKE install
        touch built.txt
        popd
    fi

    # Building GCC
    if [ ! -f $GCCBUILDPATH/built.txt ]; then
        echo building gcc
        ARCH_OPTIONS=
        if [ $ARCH == "arm" ]; then
            ARCH_OPTIONS="--with-cpu=arm926ej-s --with-fpu=vfp"
        fi

        mkdir -p $GCCBUILDPATH
        pushd $GCCBUILDPATH
        log ../gcc-$GCC_VER/configure $COMMON_CONFIG --target=$TARGET --prefix=$INSTALLPATH --enable-languages=c,c++ $ARCH_OPTIONS --disable-werror
        log $MAKE all-gcc $PARALLEL
        log $MAKE all-target-libgcc $PARALLEL
        log $MAKE install-gcc
        log $MAKE install-target-libgcc
        touch built.txt
        popd
    fi

    if [ ! -f $GDBBUILDPATH/built.txt ]; then
        case "$TARGET" in
            aarch64-elf) EXTRA_TARGETS="--enable-targets=arm-eabi" ;;
            *) EXTRA_TARGETS="" ;;
        esac

        echo building gdb
        mkdir -p $GDBBUILDPATH
        pushd $GDBBUILDPATH
        log ../gdb-$GDB_VER/configure $COMMON_CONFIG --target=$TARGET --prefix=$INSTALLPATH --disable-werror $EXTRA_TARGETS
        log make $PARALLEL
        log make install
        touch built.txt
        popd
    fi

    # Optionally strip the binaries
    if [ "${STRIP}" = "1" ]; then
      find "${INSTALLPATH}/bin" -type f -exec strip {} \;
      for filename in $(find "${INSTALLPATH}/libexec" -type f); do
        (file "${filename}" | grep -q ELF) && strip "${filename}"
      done
    fi
done

echo all done
