#!/bin/sh
#
# Copyright (C) 2008-2010 by coresystems GmbH
# written by Patrick Georgi <patrick.georgi@coresystems.de> and
#            Stefan Reinauer <stefan.reinauer@coresystems.de>
#
# Copyright (C) 2011 by Sage Electronic Engineering
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc.
#

cd $(dirname $0)

CROSSGCC_DATE="July 17th, 2015"
CROSSGCC_VERSION="1.32"

# default settings
PACKAGE=GCC
TARGETDIR=$(pwd)/xgcc
TARGETARCH=i386-elf
LANGUAGES=c
DESTDIR=
SAVETEMPS=0
SKIPPYTHON=1

# GCC toolchain version numbers
GMP_VERSION=6.0.0
MPFR_VERSION=3.1.2
MPC_VERSION=1.0.3
LIBELF_VERSION=0.8.13
GCC_VERSION=5.2.0
GCC_AUTOCONF_VERSION=2.69
BINUTILS_VERSION=2.25
GDB_VERSION=7.9.1
IASL_VERSION=20150619
PYTHON_VERSION=3.4.3
EXPAT_VERSION=2.1.0
# CLANG version number
CLANG_VERSION=3.6.1

# GCC toolchain archive locations
GMP_ARCHIVE="http://ftpmirror.gnu.org/gmp/gmp-${GMP_VERSION}a.tar.bz2"
MPFR_ARCHIVE="http://ftpmirror.gnu.org/mpfr/mpfr-${MPFR_VERSION}.tar.bz2"
MPC_ARCHIVE="http://ftpmirror.gnu.org/mpc/mpc-${MPC_VERSION}.tar.gz"
LIBELF_ARCHIVE="http://www.mr511.de/software/libelf-${LIBELF_VERSION}.tar.gz"
GCC_ARCHIVE="http://ftpmirror.gnu.org/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.bz2"
BINUTILS_ARCHIVE="http://ftpmirror.gnu.org/binutils/binutils-${BINUTILS_VERSION}.tar.bz2"
GDB_ARCHIVE="http://ftpmirror.gnu.org/gdb/gdb-${GDB_VERSION}.tar.xz"
IASL_ARCHIVE="https://acpica.org/sites/acpica/files/acpica-unix-${IASL_VERSION}.tar.gz"
PYTHON_ARCHIVE="http://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz"
EXPAT_ARCHIVE="http://downloads.sourceforge.net/sourceforge/expat/expat-${EXPAT_VERSION}.tar.gz"
# CLANG toolchain archive locations
LLVM_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/llvm-${CLANG_VERSION}.src.tar.xz"
CFE_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/cfe-${CLANG_VERSION}.src.tar.xz"
CRT_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/compiler-rt-${CLANG_VERSION}.src.tar.xz"
CTE_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/clang-tools-extra-${CLANG_VERSION}.src.tar.xz"

# GCC toolchain directories
GMP_DIR="gmp-${GMP_VERSION}"
MPFR_DIR="mpfr-${MPFR_VERSION}"
MPC_DIR="mpc-${MPC_VERSION}"
LIBELF_DIR="libelf-${LIBELF_VERSION}"
GCC_DIR="gcc-${GCC_VERSION}"
BINUTILS_DIR="binutils-${BINUTILS_VERSION}"
GDB_DIR="gdb-${GDB_VERSION}"
IASL_DIR="acpica-unix-${IASL_VERSION}"
PYTHON_DIR="Python-${PYTHON_VERSION}"
EXPAT_DIR="expat-${EXPAT_VERSION}"
# CLANG toolchain directories
LLVM_DIR="llvm-${CLANG_VERSION}.src"
CFE_DIR="cfe-${CLANG_VERSION}.src"
CRT_DIR="compiler-rt-${CLANG_VERSION}.src"
CTE_DIR="clang-tools-extra-${CLANG_VERSION}.src"

unset MAKELEVEL MAKEFLAGS

red='\033[0;31m'
RED='\033[1;31m'
green='\033[0;32m'
GREEN='\033[1;32m'
blue='\033[0;34m'
BLUE='\033[1;34m'
cyan='\033[0;36m'
CYAN='\033[1;36m'
NC='\033[0m' # No Color

UNAME=$(uname | grep -iq cygwin && echo Cygwin || uname)

normalize_dirs()
{
	mkdir -p $DESTDIR$TARGETDIR/lib
	test -d $DESTDIR$TARGETDIR/lib32 && mv $DESTDIR$TARGETDIR/lib32/* $DESTDIR$TARGETDIR/lib
	test -d $DESTDIR$TARGETDIR/lib64 && mv $DESTDIR$TARGETDIR/lib64/* $DESTDIR$TARGETDIR/lib
	rmdir -p $DESTDIR$TARGETDIR/lib32 $DESTDIR$TARGETDIR/lib64

	perl -pi -e "s,/lib32,/lib," $DESTDIR$TARGETDIR/lib/*.la
	perl -pi -e "s,/lib64,/lib," $DESTDIR$TARGETDIR/lib/*.la
}

please_install()
{
	test -r /etc/os-release && . /etc/os-release
	case "$ID_LIKE" in
	debian) solution="sudo apt-get install $1" ;;
	suse) solution="sudo zypper install $1" ;;
	*) solution="using your OS packaging system" ;;
	esac

	printf "${RED}ERROR:${red} Missing tool: Please install \'$1\' utility. (eg $solution)${NC}\n" >&2
}

searchtool()
{
	# $1 short name
	# $2 search string
	# $3 soft fail if set
	# result: file name of that tool on stdout
	#         or no output if nothing suitable was found
	search=GNU
	if [ -n "$2" ]; then
		search="$2"
	fi
	for i in "$1" "g$1" "gnu$1"; do
		if [ -x "$(which $i 2>/dev/null)" ]; then
			if [ "$(cat /dev/null | $i --version 2>&1 | grep -c "$search")" \
			    -gt 0 ]; then
				echo $i
				return
			fi
		fi
	done
	# A workaround for OSX 10.9 and some BSDs, whose nongnu
	# patch and tar also work.
	if [ $UNAME = "Darwin" -o $UNAME = "FreeBSD" -o $UNAME = "NetBSD" -o $UNAME = "OpenBSD" ]; then
		if [ "$1" = "patch" -o "$1" = "tar" ]; then
			if [ -x "$(which $1 2>/dev/null)" ]; then
				echo $1
				return
			fi
		fi
	fi
	if [ "$(echo $1 | cut -b -3)" = "sha" ]; then
		if [ $UNAME = "FreeBSD" ]; then
			if [ -x "$(which sha1 2>/dev/null)" ]; then
				echo sha1
				return
			fi
		fi
		if [ $UNAME = "NetBSD" ]; then
			if [ -x "$(which cksum 2>/dev/null)" ]; then
				echo cksum -a $(echo $1 | sed -e 's,sum,,')
				return
			fi
		fi
		if [ $UNAME = "Darwin" ]; then
			if [ -x "$(which openssl 2>/dev/null)" ]; then
				echo openssl $(echo $1 | sed -e 's,sum,,')
				return
			fi
		fi
	fi
	please_install $1
	[ -z "$3" ] && exit 1
	false
}

check_sum() {
	test -z "$CHECKSUM" || \
	test "$(cat sum/$1.cksum 2>/dev/null | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@')" = \
	"$($CHECKSUM tarballs/$1 2>/dev/null | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@')"
}

compute_sum() {
	test ! -f sum/$1.cksum && test -f tarballs/$1 && \
	(test -z "$CHECKSUM" || $CHECKSUM tarballs/$1 > sum/$1.cksum ) && \
	printf "(checksum created. ${RED}Note. Please upload sum/$1.cksum if the corresponding archive is upgraded.)${NC}"
}

download() {
	package=$1
	archive="$(eval echo \$$package"_ARCHIVE")"

	FILE=$(basename $archive)
	printf " * $FILE "

	if test -f tarballs/$FILE && check_sum $FILE ; then
		printf "(cached)"
	else
		printf "(downloading from $archive)"
		rm -f tarballs/$FILE
		cd tarballs
		wget --no-check-certificate -q $archive
		wgetret=$?
		cd ..
		compute_sum $FILE
	fi

	if [ ! -f tarballs/$FILE ]; then
		printf "\n${RED}Failed to download $FILE. Wget returns $wgetret. See 'man wget'.${NC}\n"
		exit 1
	fi
	printf "\n"
}

unpack_and_patch() {
	package=$1
	archive="$(eval echo \$$package"_ARCHIVE")"
	dir="$(eval echo \$$package"_DIR")"
	test -d ${dir} && test -f ${dir}/.unpack_success || (
		printf " * $(basename $archive)\n"
		FLAGS=zxf
		suffix=$(echo $archive | sed 's,.*\.,,')
		test "$suffix" = "gz" && FLAGS=zxf
		test "$suffix" = "bz2" && FLAGS=jxf
		test "$suffix" = "xz" && FLAGS="--xz -xf"
		test "$suffix" = "lzma" && FLAGS="--lzma -xf"
		$TAR $FLAGS tarballs/$(basename $archive)
		for patch in patches/${dir}_*.patch; do
			test -r $patch || continue
			printf "   o $(basename $patch)\n"
			$PATCH -s -N -p0 < $(echo $patch) || {
				printf "\n${RED}Failed $patch.${NC}\n"
				exit 1
			}
		done
		touch ${dir}/.unpack_success
	)
}

fn_exists()
{
	type $1 >/dev/null 2>&1
}

is_package_enabled()
{
	echo "$PACKAGES" |grep -q "\<$1\>"
}

build() {
	package=$1

	fn_exists build_$package || return

	version="$(eval echo \$$package"_VERSION")"
	BUILDDIR=build-${TARGETARCH}-$package

	mkdir -p ${BUILDDIR}

	is_package_enabled "$package" && \
	if [ -f ${BUILDDIR}/.success ]; then
		printf "Skipping $package as it is already built\n"
	else
		printf "Building $package $version ... "
		DIR=$PWD
		cd ${BUILDDIR}
		rm -f .failed
		build_${package} > build.log 2>&1
		cd $DIR/${BUILDDIR}
		if [ ! -f .failed ]; then touch .success; fi
		cd ..

		if [ -r "${BUILDDIR}/.failed" ]; then
			printf "${RED}failed${NC}. Check ${BUILDDIR}/build.log.\n"
			exit 1
		fi
		printf "${green}ok${NC}\n"
	fi
}

cleanup()
{
	printf "Cleaning up temporary files... "
	for package in $PACKAGES; do
		rm -rf build-${TARGETARCH}-$package $(eval echo \$$package"_DIR")
	done
	rm -f getopt
	printf "${green}ok${NC}\n"
}

myhelp()
{
	printf "Usage: $0 [-V] [-c] [-p <platform>] [-d <target directory>] [-D <dest dir>] [-C] [-G] [-S]\n"
	printf "       $0 [-V|--version]\n"
	printf "       $0 [-h|--help]\n\n"

	printf "Options:\n"
	printf "    [-V|--version]                print version number and exit\n"
	printf "    [-h|--help]                   print this help and exit\n"
	printf "    [-c|--clean]                  remove temporary files before build\n"
	printf "    [-t|--savetemps]              don't remove temporary files after build\n"
	printf "    [-y|--ccache]                 Use ccache when building cross compiler\n"
	printf "    [-j|--jobs <num>]             run <num> jobs in parallel in make\n"
	printf "    [-d|--directory <target dir>] target directory to install cross compiler to\n"
	printf "                                  (defaults to $TARGETDIR)\n\n"
	printf "    [-D|--destdir <dest dir>]     destination directory to install cross compiler to\n"
	printf "                                  (for RPM builds, default unset)\n"
	printf "    [-P|--package <package>]      Build a specific package: GCC, CLANG, IASL, GDB\n"
	printf "                                  (defaults to $PACKAGE)\n"
	printf "GCC specific options:\n"
	printf "    [-p|--platform <platform>]    target platform to build cross compiler for\n"
	printf "                                  (defaults to $TARGETARCH)\n"
	printf "    [-l|--languages <languages>]  comma separated list of target languages\n"
	printf "                                  (defaults to $LANGUAGES)\n"
	printf "GDB specific options:\n"
	printf "    [-p|--platform <platform>]    target platform to build cross compiler for\n"
	printf "                                  (defaults to $TARGETARCH)\n"
	printf "    [-S|--scripting]              build scripting support for GDB\n\n"
	printf "Platforms for GCC & GDB:\n"
	printf "    x86_64 i386-elf i386-mingw32 mipsel-elf riscv-elf arm aarch64\n\n"
}

myversion()
{
	# version tag is always printed, so just print the license here

	cat << EOF
Copyright (C) 2008-2010 by coresystems GmbH
Copyright (C) 2011 by Sage Electronic Engineering

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

EOF
}

build_GMP() {
	CC="$CC" CFLAGS="-Os" ../${GMP_DIR}/configure --disable-shared --enable-fat --prefix=$TARGETDIR $OPTIONS \
		|| touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed

	normalize_dirs

	# Now set CFLAGS to match GMP CFLAGS but strip out -pedantic
	# as GCC 4.6.x fails if it's there.
	export HOSTCFLAGS=$(grep __GMP_CFLAGS $DESTDIR$TARGETDIR/include/gmp.h |cut -d\" -f2 |\
	    sed s,-pedantic,,)
}

build_MPFR() {
	test $UNAME = "Darwin" && CFLAGS="$CFLAGS -force_cpusubtype_ALL"
	CC="$CC" ../${MPFR_DIR}/configure --disable-shared --prefix=$TARGETDIR \
		--infodir=$TARGETDIR/info \
		--with-gmp=$DESTDIR$TARGETDIR CFLAGS="$HOSTCFLAGS" || \
		touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed

	normalize_dirs

	# work around build problem of libgmp.la
	if [ "$DESTDIR" != "" ]; then
	    perl -pi -e "s,$DESTDIR,," $DESTDIR$TARGETDIR/libgmp.la
	fi
}

build_MPC() {
	CC="$CC" ../${MPC_DIR}/configure --disable-shared --prefix=$TARGETDIR \
		--infodir=$TARGETDIR/info --with-mpfr=$DESTDIR$TARGETDIR \
		--with-gmp=$DESTDIR$TARGETDIR CFLAGS="$HOSTCFLAGS" || \
		touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed

	normalize_dirs
}

build_LIBELF() {
	CC="$CC" CFLAGS="$HOSTCFLAGS" libelf_cv_elf_h_works=no \
	../${LIBELF_DIR}/configure --disable-shared --prefix=$TARGETDIR \
		--infodir=$TARGETDIR/info CFLAGS="$HOSTCFLAGS" || touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install prefix=$DESTDIR$TARGETDIR || touch .failed

	normalize_dirs
}

build_BINUTILS() {
	if [ $TARGETARCH == "x86_64-elf" ]; then
		ADDITIONALTARGET=",i386-elf"
	fi
	CC="$CC" ../binutils-${BINUTILS_VERSION}/configure --prefix=$TARGETDIR \
		--target=${TARGETARCH} --enable-targets=${TARGETARCH}${ADDITIONALTARGET} \
		--disable-werror --disable-nls --enable-lto --enable-gold \
		--enable-plugins --enable-multilibs CFLAGS="$HOSTCFLAGS" || touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed
}


build_GCC() {
	# GCC does not honor HOSTCFLAGS at all. CFLAGS are used for
	# both target and host object files.
	# There's a work-around called CFLAGS_FOR_BUILD and CFLAGS_FOR_TARGET
	# but it does not seem to work properly. At least the host library
	# libiberty is not compiled with CFLAGS_FOR_BUILD.
	CC="$CC" CFLAGS_FOR_TARGET="-O2" CFLAGS="$HOSTCFLAGS" \
		CFLAGS_FOR_BUILD="$HOSTCFLAGS" ../gcc-${GCC_VERSION}/configure \
		--prefix=$TARGETDIR --libexecdir=$TARGETDIR/lib \
		--target=${TARGETARCH} --disable-werror --disable-shared \
		--enable-lto --enable-plugins --enable-gold --enable-ld=default \
		--disable-libssp --disable-bootstrap --disable-nls \
		--disable-libquadmath --without-headers \
		${GCC_OPTIONS} --enable-languages="${LANGUAGES}" \
		--with-gmp=$DESTDIR$TARGETDIR --with-mpfr=$DESTDIR$TARGETDIR \
		--with-mpc=$DESTDIR$TARGETDIR --with-libelf=$DESTDIR$TARGETDIR \
		--with-pkgversion="coreboot toolchain v$CROSSGCC_VERSION $CROSSGCC_DATE" \
		|| touch .failed
	$MAKE $JOBS CFLAGS_FOR_BUILD="$HOSTCFLAGS" all-gcc || touch .failed

	if [ "$(echo ${LANGUAGES} | grep -c '\<ada\>')" -gt 0 ]; then
		$MAKE $JOBS CFLAGS_FOR_BUILD="$HOSTCFLAGS" -Cgcc/ cross-gnattools || touch .failed
	fi

	$MAKE install-gcc DESTDIR=$DESTDIR || touch .failed

	if [ "$(echo $TARGETARCH | grep -c -- -mingw32)" -eq 0 ]; then
		$MAKE $JOBS CFLAGS_FOR_BUILD="$HOSTCFLAGS" all-target-libgcc || touch .failed
		$MAKE install-target-libgcc DESTDIR=$DESTDIR || touch .failed
	fi
}

build_EXPAT() {
	CC="$CC" CFLAGS="$HOSTCFLAGS" ../${EXPAT_DIR}/configure --disable-shared \
		--prefix=$TARGETDIR --target=${TARGETARCH} || touch .failed
	$MAKE || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed

	normalize_dirs
}

build_PYTHON() {
	CC="$CC" CFLAGS="$HOSTCFLAGS" ../${PYTHON_DIR}/configure --prefix=$TARGETDIR \
		--target=${TARGETARCH} || touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed

	normalize_dirs
}

build_GDB() {
	export PYTHONHOME=$DESTDIR$TARGETDIR
	if [ $(uname) != "FreeBSD" -a $(uname) != "NetBSD" ]; then
		LIBDL="-ldl"
	fi
	LDFLAGS="-Wl,-rpath,\$\$ORIGIN/../lib/ -L$DESTDIR$TARGETDIR/lib \
		 -lpthread $LIBDL -lutil" \
	CC="$CC" CFLAGS="$HOSTCFLAGS -I$DESTDIR$TARGETDIR/include" \
	../${GDB_DIR}/configure --prefix=$TARGETDIR \
		--target=${TARGETARCH} --disable-werror --disable-nls
	$MAKE $JOBS || touch .failed
	$MAKE install DESTDIR=$DESTDIR || touch .failed
}

build_IASL() {
	RDIR=$PWD
	cd ../$IASL_DIR/generate/unix
	CFLAGS="$HOSTCFLAGS"
	HOST="_LINUX"
	test $UNAME = "Darwin" && HOST="_APPLE"
	test $UNAME = "FreeBSD" && HOST="_FreeBSD"
	test $UNAME = "Cygwin" && HOST="_CYGWIN"
	HOST="$HOST" OPT_CFLAGS="-O -D_FORTIFY_SOURCE=2" CFLAGS="$CFLAGS" $MAKE CC="$CC" iasl || touch $RDIR/.failed
	rm -f $DESTDIR$TARGETDIR/bin/iasl || touch $RDIR/.failed
	cp bin/iasl $DESTDIR$TARGETDIR/bin || touch $RDIR/.failed
}

build_LLVM() {
	cd ..
	ln -sf $PWD/$CFE_DIR  $LLVM_DIR/tools/clang
	ln -sf $PWD/$CTE_DIR  $LLVM_DIR/tools/clang/tools/extra
	ln -sf $PWD/$CRT_DIR  $LLVM_DIR/projects/compiler-rt
	cd -

	$CMAKE -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$DESTDIR$TARGETDIR \
		-DCMAKE_BUILD_TYPE=Release ../$LLVM_DIR || touch .failed
	$MAKE $JOBS || touch .failed
	$MAKE install || touch .failed

	cp -a ../$CFE_DIR/tools/scan-build/* $DESTDIR$TARGETDIR/bin
	cp -a ../$CFE_DIR/tools/scan-view/* $DESTDIR$TARGETDIR/bin

	# create symlinks to work around broken --print-librt-file-name
	# when used with -target.
	cd $DESTDIR$TARGETDIR/lib/clang/${CLANG_VERSION}/lib
	for i in */libclang_rt.builtins*.a; do
		ln -s $i .
	done
}

printf "${blue}Welcome to the ${red}coreboot${blue} cross toolchain builder v$CROSSGCC_VERSION ($CROSSGCC_DATE)${NC}\n\n"

# Look if we have getopt. If not, build it.
export PATH=$PATH:.
getopt - > /dev/null 2>/dev/null || gcc -o getopt getopt.c

# parse parameters.. try to find out whether we're running GNU getopt
getoptbrand="$(getopt -V | sed -e '1!d' -e 's,^\(......\).*,\1,')"
if [ "${getoptbrand}" = "getopt" ]; then
	# Detected GNU getopt that supports long options.
	args=$(getopt -l version,help,clean,directory:,platform:,languages:,package:,jobs:,destdir:,savetemps,scripting,ccache Vhcd:p:l:P:j:D:tSy -- "$@")
	eval set "$args"
else
	# Detected non-GNU getopt
	args=$(getopt Vhcd:p:l:P:j:D:tSy $*)
	set -- $args
fi

if [ $? != 0 ]; then
	myhelp
	exit 1
fi

while true ; do
        case "$1" in
		-V|--version)	shift; myversion; exit 0;;
		-h|--help)	shift; myhelp; exit 0;;
		-c|--clean)	shift; clean=1;;
		-t|--savetemps)	shift; SAVETEMPS=1;;
		-d|--directory)	shift; TARGETDIR="$1"; shift;;
		-p|--platform)	shift; TARGETARCH="$1"; shift;;
		-l|--languages)	shift; LANGUAGES="$1"; shift;;
		-D|--destdir)	shift; DESTDIR="$1"; shift;;
		-j|--jobs)	shift; JOBS="-j $1"; shift;;
		-P|--package)   shift; PACKAGE="$1"; shift;;
		-S|--scripting) shift; SKIPPYTHON=0;;
		-y|--ccache)	shift; USECCACHE=1;;
		--)		shift; break;;
		-*)		printf "Invalid option\n\n"; myhelp; exit 1;;
		*)		break;;
	esac
done

case "$TARGETARCH" in
	x86_64-elf)	;;
	x86_64*)	TARGETARCH=x86_64-elf;;
	i386-elf)	;;
	i386-mingw32)	;;
	mipsel-elf)	;;
	riscv-elf)	;;
	i386*)		TARGETARCH=i386-elf;;
	arm*)		TARGETARCH=armv7-a-eabi;;
	aarch64*)	TARGETARCH=aarch64-elf;;
	*)		printf "${red}WARNING: Unsupported architecture $TARGETARCH.${NC}\n\n"; ;;
esac

# Figure out which packages to build

case "$PACKAGE" in
	GCC|gcc)
		echo "Target architecture is now $TARGETARCH"
		NAME="${TARGETARCH} cross GCC"
		PACKAGES="GMP MPFR MPC LIBELF BINUTILS GCC"
		;;
	GDB|gdb)
		NAME="${TARGETARCH} cross GDB"
		PACKAGES="GDB"
		if [ $SKIPPYTHON -eq 0 ]; then
			PACKAGES="EXPAT PYTHON $PACKAGES"
		fi
		;;
	CLANG|clang)
		NAME=clang
		PACKAGES="LLVM CFE CRT CTE"
		CMAKE=$(searchtool cmake "cmake") || exit $?
		;;
	IASL|iasl)
		NAME="IASL ACPI compiler"
		PACKAGES=IASL
		;;
	*)
		printf "${red}ERROR: Unsupported package $PACKAGE. (Supported packages are GCC, GDB, CLANG, IASL)${NC}\n\n";
		exit 1
		;;
esac

# Find all the required tools:

TAR=$(searchtool tar) || exit $?
PATCH=$(searchtool patch) || exit $?
MAKE=$(searchtool make) || exit $?
SHA1SUM=$(searchtool sha1sum)
SHA512SUM=$(searchtool sha512sum)
CHECKSUM=$SHA1SUM

searchtool m4 > /dev/null
searchtool bison > /dev/null
searchtool flex flex > /dev/null
searchtool g++ "Free Software Foundation" nofail > /dev/null || \
searchtool clang "clang version" nofail > /dev/null || \
searchtool clang "LLVM"  > /dev/null
searchtool wget > /dev/null
searchtool bzip2 "bzip2," > /dev/null

# This initial cleanup is useful when updating the toolchain script.

if [ "$clean" = "1" ]; then
	cleanup
fi

# Set up host compiler and flags needed for various OSes

CC=cc
if is_package_enabled "GCC"; then
if [ $UNAME = "Darwin" ]; then
	#GCC_OPTIONS="$GCC_OPTIONS --enable-threads=posix"

	# generally the OS X compiler can create x64 binaries.
	# Per default it generated i386 binaries in 10.5 and x64
	# binaries in 10.6 (even if the kernel is 32bit)
	# For some weird reason, 10.5 autodetects an ABI=64 though
	# so we're setting the ABI explicitly here.
	if [ $(sysctl -n hw.optional.x86_64 2>/dev/null) -eq 1 ] 2>/dev/null; then
		OPTIONS="ABI=64"
	else
		OPTIONS="ABI=32"
	fi

	# In Xcode 4.5.2 the default compiler is clang.
	# However, this compiler fails to compile gcc 4.7.x. As a
	# workaround it's possible to compile gcc with llvm-gcc.
	if $CC -v 2>&1 | grep -q LLVM; then
		CC=llvm-gcc
	fi
elif [ $UNAME = "Linux" -o $UNAME = "Cygwin" ]; then
	# gmp is overeager with detecting 64bit CPUs even if they run
	# a 32bit kernel and userland.
	if [ "$(uname -m 2>/dev/null)" = "i686" ]; then
		OPTIONS="ABI=32"
	fi
fi
fi # GCC

if [ "$USECCACHE" = 1 ]; then
	CC="ccache $CC"
fi

# Prepare target directory for building GCC
# (dependencies must be in the PATH)
mkdir -p $DESTDIR$TARGETDIR/bin
export PATH=$DESTDIR$TARGETDIR/bin:$PATH

# Download, unpack, patch and build all packages

printf "Downloading tar balls ... \n"
mkdir -p tarballs
for P in $PACKAGES; do
	download $P
done
printf "Downloaded tar balls ... ${green}ok${NC}\n"

printf "Unpacking and patching ... \n"
for P in $PACKAGES; do
	unpack_and_patch $P || exit 1
done
printf "Unpacked and patched ... ${green}ok${NC}\n"

printf "Building packages ... \n"
for package in $PACKAGES; do
	build $package
done
printf "Packages built ... ${green}ok${NC}\n"

# Adding git information of current tree to target directory
# for reproducibility
PROGNAME=$(basename "$0")
rm -f "$DESTDIR$TARGETDIR/$PROGNAME".commit.*
cp "$PROGNAME" $DESTDIR$TARGETDIR/"$PROGNAME.commit.$(git describe)"

if [ $SAVETEMPS -eq 0 ]; then
	cleanup
else
	printf "Leaving temporary files around... ${green}ok${NC}\n"
fi

printf "\n${green}You can now run your $NAME toolchain from $TARGETDIR.${NC}\n"
