#!/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="June 4th, 2015"
CROSSGCC_VERSION="1.29"

# default settings
TARGETDIR=$(pwd)/xgcc
TARGETARCH=i386-elf
DESTDIR=

# 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=4.9.2
GCC_AUTOCONF_VERSION=2.69
BINUTILS_VERSION=2.25
GDB_VERSION=7.9
IASL_VERSION=20150204
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

SAVETEMPS=0
BUILDCLANG=0
SKIPGDB=1
SKIPPYTHON=1

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)

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
}

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
	printf "${RED}ERROR:${red} Missing tool: Please install $1 (eg using your OS packaging system)${NC}\n" >&2
	[ -z "$3" ] && exit 1
	false
}

TAR=$(searchtool tar) || exit $?
PATCH=$(searchtool patch) || exit $?
MAKE=$(searchtool make) || exit $?
CMAKE=$(searchtool cmake "cmake") || 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" > /dev/null
searchtool wget > /dev/null
searchtool bzip2 "bzip2," > /dev/null

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

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

	test -f tarballs/$FILE && \
		( test -z "$CHECKSUM" || \
		  test "$(cat sum/$FILE.cksum 2>/dev/null | \
				sed -e 's,.*\([0-9a-f]\{40\}\).*,\1,')" = \
			"$($CHECKSUM tarballs/$FILE 2>/dev/null | \
				sed -e 's,.*\([0-9a-f]\{40\}\).*,\1,')" ) && \
			printf "(cached)" || (
		printf "(downloading)"
		rm -f tarballs/$FILE
		cd tarballs
		wget --no-check-certificate -q $archive
		cd ..
		test ! -f sum/$FILE.cksum && test -f tarballs/$FILE && \
			(test -z "$CHECKSUM" || $CHECKSUM tarballs/$FILE > sum/$FILE.cksum ) && \
			printf "(checksum created. ${RED}Note. Please upload sum/$FILE.cksum if the corresponding archive is upgraded.${NC})"
	)
	if [ ! -f tarballs/$FILE ]; then
		printf "\n${RED}Failed to download $FILE.${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
	)
}

wait_for_build() {
	# $1: directory in which log file and failure marker are stored
	cat > "$1/crossgcc-build.log"
	test -r "$1/.failed" && printf "${RED}failed${NC}. Check $1/crossgcc-build.log.\n" || \
		printf "${green}ok${NC}\n"
	test -r "$1/.failed" && exit 1
	true
}

build() {
	package=$1
	version="$(eval echo \$$package"_VERSION")"
	[[ "$PACKAGES" == *$package* ]] && \
	if [ -f ${BUILDDIRPREFIX}-$package/.success ]; then
		printf "Skipping $package as it is already built\n"
	else
		printf "Building $package $version ... "
	        (
			cd ${BUILDDIRPREFIX}-$package
			rm -f .failed
			build_${package}
			if [ ! -f .failed ]; then touch .success; fi
		) 2>&1 | wait_for_build "${BUILDDIRPREFIX}-$package" || exit 1
	fi
}

cleanup()
{
	printf "Cleaning up temporary files... "
	for package in $PACKAGES; do
		rm -rf ${BUILDDIRPREFIX}-$package $(eval echo \$$package"_DIR")
	done
	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 "    [-C|--clang]                  build CLANG toolchain"
	printf "    [-p|--platform <platform>]    target platform to build cross compiler for\n"
	printf "                                  (defaults to $TARGETARCH) *)\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 "    [-G|--gdb]                    build GNU debugger *)\n"
	printf "    [-S|--scripting]              build scripting support for GDB *)\n\n"
	printf " *) option only available when building GCC toolchain (not with CLANG)\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
}

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() {
	# Now build binutils
	CC="$CC" ../binutils-${BINUTILS_VERSION}/configure --prefix=$TARGETDIR \
		--target=${TARGETARCH} --disable-werror --disable-nls \
		$USE_GOLD 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 \
		--disable-libssp --disable-bootstrap --disable-nls \
		--disable-libquadmath --without-headers \
		$GCC_OPTIONS --enable-languages="c" $USE_GOLD \
		--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
	$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
}

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:,jobs:,destdir:,savetemps,skip-gdb,ccache,clang Vhcd:p:j:D:tGyC -- "$@")
	eval set "$args"
else
	# Detected non-GNU getopt
	args=$(getopt Vhcd:p:j:D:tGyC $*)
	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;;
		-D|--destdir)	shift; DESTDIR="$1"; shift;;
		-j|--jobs)	shift; JOBS="-j $1"; shift;;
		-C|--clang)	shift; BUILDCLANG=1;;
		-G|--gdb)	shift; SKIPGDB=0;;
		-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

if [ "$BUILDCLANG" -eq 0 ]; then
echo "Target architecture is now $TARGETARCH"
NAME="${TARGETARCH} cross"
PACKAGES="GMP MPFR MPC LIBELF BINUTILS GCC IASL"
else
NAME=clang
PACKAGES="LLVM CFE CRT CTE"
fi

BUILDDIRPREFIX=build-${TARGETARCH}
BUILDDIR=$PWD/build-clang

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

if [ $SKIPGDB -eq 1 ]; then
	printf "Will skip GDB ... ${green}ok${NC}\n"
	if [ $SKIPPYTHON -eq 0 ]; then
		printf "Python scripting needs GDB ... disabling ... ${green}ok${NC}\n"
		SKIPPYTHON=1
	fi
else
	PACKAGES="$PACKAGES GDB"
fi
if [ $SKIPPYTHON -eq 0 ]; then
	PACKAGES="$PACKAGES EXPAT PYTHON"
fi

# coreboot does not like the GOLD linker
# USE_GOLD="--enable-gold"
USE_GOLD=""
GCC_OPTIONS="--enable-lto"

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
done
printf "Unpacked and patched ... ${green}ok${NC}\n"

if [[ "$PACKAGES" == *GCC* ]]; then
CC=cc
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
fi
fi # GCC

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

for package in $PACKAGES; do
	mkdir -p ${BUILDDIRPREFIX}-$package
done

mkdir -p $DESTDIR$TARGETDIR/bin
export PATH=$DESTDIR$TARGETDIR/bin:$PATH

build GMP

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

build MPFR
build MPC
build LIBELF
build BINUTILS
build GCC
build EXPAT
build PYTHON
build GDB
build IASL
build LLVM

# 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"
