#!/usr/bin/env bash

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

# 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 $SCRIPTROOT/build.log for the full details"
        tail -50 $SCRIPTROOT/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 " -q                           make the build quieter"
    exit 1
}

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

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

    TARFILE=${1}-${2}.tar$3
    TARGETDIR=${1}-${2}
    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 extracting $TARFILE
    rm -rf $TARGETDIR
    tar xf $ARCHIVES/$TARFILE || exit 1

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

    touch $TARGETDIR/.extracted || exit 1
}

if [ "$OS" = "Linux" ]; then
    COUNT=`grep processor /proc/cpuinfo | wc -l`
    PARALLEL=-j`expr $COUNT + $COUNT`
fi
if [ "$OS" = "Darwin" ]; then
    export CPPFLAGS=-I/opt/local/include
    export LDFLAGS=-L/opt/local/lib
    export CXXFLAGS="-fbracket-depth=1024"
fi
if [ "$OS" = "FreeBSD" ]; then
    export CPPFLAGS=-I/usr/local/include
    export LDFLAGS=-L/usr/local/lib
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:q? arg
do
    case $arg in
        a ) ARCHES=$OPTARG ;;
        c ) CCACHE=1 ;;
        j ) PARALLEL="-j$OPTARG" ;;
        f ) FETCH=1 ;;
        q ) QUIET=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 $(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 GCCVER and BINVER
. toolvers

if [ "$FETCH" = "1" ]; then
    if [ ! -f binutils-$BINVER.tar.bz2 ]; then
       echo fetching binutils-$BINVER
       log wget -P $ARCHIVES -N $GNU_FTP/binutils/binutils-$BINVER.tar.bz2
    fi
    if [ ! -f gcc-$GCCVER.tar.bz2 ]; then
        echo fetching gcc-$GCCVER
        log wget -P $ARCHIVES -N $GNU_FTP/gcc/gcc-$GCCVER/gcc-$GCCVER.tar.bz2
    fi
    if [ ! -f gdb-$GDBVER.tar.xz ]; then
        echo fetching gdb-$GDBVER
        log wget -P $ARCHIVES -N $GNU_FTP/gdb/gdb-$GDBVER.tar.xz
    fi
    if [ ! -f mpfr-$MPFRVER.tar.bz2 ]; then
        echo fetching mpfr-$MPFRVER
        log wget -P $ARCHIVES -N $GNU_FTP/mpfr/mpfr-$MPFRVER.tar.bz2
    fi
    if [ ! -f mpc-$MPCVER.tar.gz ]; then
        echo fetching mpc-$MPCVER
        log wget -P $ARCHIVES -N $GNU_FTP/mpc/mpc-$MPCVER.tar.gz
    fi
    if [ ! -f gmp-$GMPVER.tar.bz2 ]; then
        echo fetching gmp-$GMPVER
        log wget -P $ARCHIVES -N $GNU_FTP/gmp/gmp-$GMPVER.tar.bz2
    fi
fi

if [ ! -f .extracted-stamp ]; then
    extract-tool binutils $BINVER .bz2 $PATCHES/binutils-patch.txt
    extract-tool gcc $GCCVER .bz2 $PATCHES/gcc-patch.txt
    extract-tool gdb $GDBVER .xz $PATCHES/gdb-patch.txt
    extract-tool gmp $GMPVER .bz2
    extract-tool mpc $MPCVER .gz
    extract-tool mpfr $MPFRVER .bz2
    touch .extracted-stamp
fi

# link the last three libs into gcc
pushd gcc-$GCCVER
ln -sf ../gmp-$GMPVER gmp
ln -sf ../mpc-$MPCVER mpc
ln -sf ../mpfr-$MPFRVER mpfr
popd

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

    INSTALLPATH=`pwd`/$TARGET-$GCCVER-$OS-$HOSTARCH
    BINBUILDPATH=build-binutils-$BINVER-$ARCH-$OS-$HOSTARCH
    GCCBUILDPATH=build-gcc-$GCCVER-$ARCH-$OS-$HOSTARCH
    GDBBUILDPATH=build-gdb-$GDBVER-$ARCH-$OS-$HOSTARCH
    export PATH=$INSTALLPATH/bin:$PATH

    # Building Binutils
    if [ ! -f $BINBUILDPATH/built.txt ]; then
        echo building binutils
        mkdir -p $BINBUILDPATH
        pushd $BINBUILDPATH
        log ../binutils-$BINVER/configure --target=$TARGET --prefix=$INSTALLPATH --disable-werror
        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-$GCCVER/configure --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
        echo building gdb
        mkdir -p $GDBBUILDPATH
        pushd $GDBBUILDPATH
        log ../gdb-$GDBVER/configure --target=$TARGET --prefix=$INSTALLPATH --disable-werror
        log make $PARALLEL
        log make install
        touch built.txt
        popd
    fi
done

echo all done
