#!/bin/bash
#
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# This script is used to rebuild the Linux 32-bit cross-toolchain
# that allows you to generate 32-bit binaries that target Ubuntu 8.04
# (a.k.a. Hardy Heron) instead of the host system (which usually is 10.04,
# a.k.a. Lucid Lynx)
#
# Use --help for complete usage information.
#
# WARNING: At this time, the generated toolchain binaries will *not* run
#          with GLibc 2.11, only the machine code it generates.
#

PROGNAME="`basename \"$0\"`"
PATCHES_DIR="$( cd "$( dirname "$0" )" && pwd )/toolchain-patches"

###########################################################################
###########################################################################
#####
#####  C O N F I G U R A T I O N
#####
###########################################################################
###########################################################################

panic ()
{
    echo "ERROR: $@"
    exit 1
}

fail_panic ()
{
    if [ $? != 0 ] ; then
        echo "ERROR: $@"
        exit 1
    fi
}


# We only support running this script on Linux
OS=$(uname -s)
if [ "$OS" != Linux ]; then
    panic "This script can only run on Linux machines!"
fi

UBUNTU_ARCHS="i386 amd64"

# Used to set the host bitness of the generted toolchain binaries
# First call with the build machine's bitness, and later with 32
# if --32-bits option is used.
# $1: 32 or 64
set_host_bits ()
{
    HOST_BITS=$1
    GMP_ABI=$1
    case $1 in
        32)
            HOST_ARCH=i686
            GCC_TARGET=i686-linux
            GMP_TARGET=i386-linux
            ;;
        64)
            HOST_ARCH=x86_64
            GCC_TARGET=x86_64-linux
            GMP_TARGET=x86_64-linux
            ;;
        *)
            panic "Invalid host bitness (32 or 64 expected): $1"
    esac
}

# Determine build machine bitness
BUILD_ARCH=$(uname -m)
case "$BUILD_ARCH" in
    x86_64|amd64)
        BUILD_BITS=64
        BUILD_ARCH=x86_64
        BUILD_GCC_TARGET=x86_64-linux
        set_host_bits 64
        ;;
    i?86)
        BUILD_BITS=32
        BUILD_ARCH=i686
        BUILD_GCC_TARGET=i686-linux
        set_host_bits 32
        ;;
    *)
        panic "Unknown build CPU architecture: $BUILD_ARCH"
esac

# Versions of various toolchain components, do not touch unless you know
# what you're doing!

BINUTILS_VERSION=2.23
GMP_VERSION=5.0.5
MPFR_VERSION=3.1.1
MPC_VERSION=1.0.1
GCC_VERSION=4.6
CLOOG_VERSION=0.18.0
ISL_VERSION=0.11.1

GLIBC_VERSION=2.11

GIT_CMD=git
GIT_DATE=
GIT_BRANCH=master
GIT_REFERENCE=
GIT_BASE=
GIT_BASE_DEFAULT=https://android.googlesource.com/toolchain

# Location where we're going to install the toolchain during the build
# This will depend on the phase of the build.
install_dir () { echo "$WORK_DIR/$PHASE/$TOOLCHAIN_NAME"; }

# Given an input string that looks like <major>.<minor>.<patch>
# Return <major>.<minor> only.
major_minor_only () {
   local MAJOR=$(echo -n "$1" | cut -f1 -d.)
   local MINOR=$(echo -n "$1" | cut -f2 -d.)
   echo "$MAJOR.$MINOR"
}

# Location where we're going to install the final binaries
# If empty, TOOLCHAIN_ARCHIVE will be generated
PREFIX_DIR=

# Location of the final sysroot. This must be a sub-directory of INSTALL_DIR
# to ensure that the toolchain binaries are properly relocatable (i.e. can
# be used when moved to another directory).
sysroot_dir () { echo "$(install_dir)/sysroot"; }

# Try to parallelize the build for faster performance.
JOBS=$(cat /proc/cpuinfo | grep -c processor)

# The base URL of the Ubuntu mirror we're going to use.
UBUNTU_MIRROR=http://mirrors.us.kernel.org

# Ubuntu release name we want packages from. Can be a name or a number
# (i.e. "lucid" or "10.04")
UBUNTU_RELEASE=lucid


# The list of packages we need to download from the Ubuntu servers and
# extract into the original sysroot
#
# Call add_ubuntu_package <package-name> to add a package to the list,
# which will be processed later.
#
UBUNTU_PACKAGES=

add_ubuntu_package ()
{
    UBUNTU_PACKAGES="$UBUNTU_PACKAGES $@"
}

# The package files containing kernel headers for Hardy and the C
# library headers and binaries
add_ubuntu_package \
    linux-libc-dev \
    libc6 \
    libc6-dev \
    libcap2 \
    libcap-dev \
    libattr1 \
    libattr1-dev \
    libacl1 \
    libacl1-dev \

# The X11 headers and binaries (for the emulator)
add_ubuntu_package \
    libx11-6 \
    libx11-dev \
    libxau6 \
    libxcb1-dev \
    libxdmcp6 \
    libxext-dev \
    x11proto-core-dev \
    x11proto-xext-dev \
    x11proto-input-dev \
    x11proto-kb-dev

# The OpenGL-related headers and libraries (for GLES emulation)
add_ubuntu_package \
    mesa-common-dev \
    libgl1-mesa-dev \
    libgl1-mesa-glx \
    libxxf86vm1 \
    libxext6 \
    libxdamage1 \
    libxfixes3 \
    libdrm2

# Audio libraries (required by the emulator)
add_ubuntu_package \
    libasound2 \
    libasound2-dev \
    libesd0-dev \
    libaudiofile-dev \
    libpulse0 \
    libpulse-dev

# ZLib and others.
add_ubuntu_package \
    zlib1g \
    zlib1g-dev \
    libncurses5 \
    libncurses5-dev



###########################################################################
###########################################################################
#####
#####  E N D   O F   C O N F I G U R A T I O N
#####
###########################################################################
###########################################################################

# Parse all options
OPTION_HELP=no
VERBOSE=0
FORCE=no
ONLY_SYSROOT=no
ONLY_TOOLCHAIN_DIR=
BOOTSTRAP=
PARAMETERS=
FORCE_32=
LIST_TASKS=

for opt do
  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
  case $opt in
  --help|-h|-\?) OPTION_HELP=yes
  ;;
  --verbose) VERBOSE=$(( $VERBOSE + 1 ))
  ;;
  --force) FORCE="yes"
  ;;
  --32-bits) FORCE_32=true
  ;;
  --ubuntu-mirror=*) UBUNTU_MIRROR=$optarg
  ;;
  --ubuntu-release=*) UBUNTU_RELEASE=$optarg
  ;;
  --prefix=*) PREFIX_DIR=$optarg
  ;;
  --work-dir=*) WORK_DIR=$optarg
  ;;
  --gcc-version=*) GCC_VERSION=$optarg
  ;;
  --binutils-version=*) BINUTILS_VERSION=$optarg
  ;;
  --gmp-version=*) GMP_VERSION=$optarg
  ;;
  --mpfr-version=*) MPFR_VERSION=$optarg
  ;;
  --mpc-version=*) MPC_VERSION=$optarg
  ;;
  --isl-version=*) ISL_VERSION=$optarg
  ;;
  --cloog-version=*) CLOOG_VERSION=$oparg
  ;;
  --git=*) GIT_CMD=$optarg
  ;;
  --git-date=*) GIT_DATE=$optarg
  ;;
  --git-branch=*) GIT_BRANCH=$optarg
  ;;
  --git-base=*) GIT_BASE=$optarg
  ;;
  --git-reference=*) GIT_REFERENCE=$optarg
  ;;
  --out-dir=*) OPTION_OUT_DIR=$optarg
  ;;
  --cc=*) OPTION_CC=$optarg
  ;;
  --jobs=*) JOBS=$optarg
  ;;
  -j*) JOBS=${opt#-j}
  ;;
  --only-sysroot) ONLY_SYSROOT=yes
  ;;
  --bootstrap) BOOTSTRAP=yes
  ;;
  --list-tasks) LIST_TASKS=yes
  ;;
  -*)
    echo "unknown option '$opt', use --help"
    exit 1
    ;;
  *)
    if [ -z "$PARAMETERS" ]; then
        PARAMETERS=$opt
    else
        PARAMETERS="$PARAMETERS $opt"
    fi
  esac
done

if [ "$OPTION_HELP" = "yes" ]; then
    cat << EOF

Usage: $PROGNAME [options] [<path-to-toolchain-sources>]

This script is used to rebuild a custom Linux host toolchain that targets
GLibc $GLIBC_VERSION or higher. The machine code generated by this toolchain
will run properly on Ubuntu $UBUNTU_RELEASE or higher.

If you're running on a 32-bit system, it will generate a 32-bit toolchain.
If you're running on a 64-bit system, it will generate a 64-bit toolchain
unless you use the --32-bits option.

You can provide the path to a local copy of the toolchain sources repository
as a first parameter. If you don't, the sources will be downloaded and
extracted automatically into your work directory.

Note that this script will download various binary packages from Ubuntu
servers in order to prepare a compatible "sysroot".

By default, it generates a package archive ($TOOLCHAIN_ARCHIVE) but you can,
as an alternative, ask for direct installation with --prefix=<path>

Use the bootstrap option to re-generate the toolchain with itself. This is
useful if you want to ensure that the generated compiler binaries will work
properly on Ubuntu 8.04 or higher. By default, they will only run on systems
that match your build system's C library ABI, or higher.

Options: [defaults in brackets after descriptions]
EOF
    echo "Standard options:"
    echo "  --help                        Print this message"
    echo "  --force                       Force-rebuild everything"
    echo "  --prefix=PATH                 Installation path [$PREFIX_DIR]"
    echo "  --ubuntu-mirror=URL           Ubuntu mirror URL [$UBUNTU_MIRROR]"
    echo "  --ubuntu-release=NAME         Ubuntu release name [$UBUNTU_RELEASE]"
    echo "  --work-dir=PATH               Temporary work directory [/tmp/gcc.<random>]"
    echo "  --only-sysroot                Only download and build sysroot packages"
    echo "  --verbose                     Verbose output. Can be used twice."
    echo "  --binutils-version=VERSION    Binutils version number [$BINUTILS_VERSION]"
    echo "  --gcc-version=VERSION         GCC version number [$GCC_VERSION]"
    echo "  --gmp-version=VERSION         GMP version number [$GMP_VERSION]"
    echo "  --mpfr-version=VERSION        MPFR version numner [$MPFR_VERSION]"
    echo "  --mpc-version=VERSION         MPC version number [$MPC_VERSION]"
    echo "  --isl-version=VERSION         ISL version number [$ISL_VERSION]"
    echo "  --cloog-version=VERSION       Cloog version number [$CLOOG_VERSION]"
    echo "  --jobs=COUNT                  Run COUNT build jobs in parallel [$JOBS]"
    echo "  -j<COUNT>                     Same as --jobs=COUNT."
    echo "  --git=<cmd>                   Use this version of the git tool [$GIT_CMD]"
    echo "  --git-date=<date>             Specify specific git date when download sources [none]"
    echo "  --git-branch=<name>           Specify which branch to use when downloading the sources [$GIT_BRANCH]"
    echo "  --git-reference=<path>        Use a git reference repository"
    echo "  --git-base=<url>              Use this git repository base [$GIT_BASE]"
    echo "  --bootstrap                   Bootstrap toolchain (i.e. compile it with itself)"
    echo "  --32-bits                     Generate 32-bit toolchain on 64-bit build system."
    echo ""
    exit 1
fi

if [ "$FORCE_32" ]; then
    if [ "$BUILD_BITS" = 64 ]; then
        set_host_bits 32
    else
       echo "Warning: --32-bits option ignored on 32-bit build machine."
    fi
fi

# Determine root working directory for our script
if [ -z "$WORK_DIR" ]; then
    WORK_DIR=$(mktemp -d /tmp/$USER-gcc-$HOST_BITS-XXXXXX)
    WORK_DIR_CLEANUP=true
else
    mkdir -p "$WORK_DIR"
    fail_panic "Could not create directory: $WORK_DIR"
    WORK_DIR_CLEANUP=false
fi

if [ -z "$PARAMETERS" ] ; then
    if [ -n "$GIT_REFERENCE" ] ; then
        if [ ! -d "$GIT_REFERENCE" -o ! -d "$GIT_REFERENCE/build" ]; then
            echo "ERROR: Invalid reference repository directory path: $GIT_REFERENCE"
            exit 1
        fi
        if [ -n "$GIT_BASE" ]; then
            echo "Using git clone reference: $GIT_REFERENCE"
        else
            # If we have a reference without a base, use it as a download base instead.
            GIT_BASE=$GIT_REFERENCE
            GIT_REFERENCE=
            echo "Using git clone base: $GIT_BASE"
        fi
    elif [ -z "$GIT_BASE" ]; then
        GIT_BASE=$GIT_BASE_DEFAULT
        echo "Auto-config: --git-base=$GIT_BASE"
    fi

    # Location where we will download the toolchain sources
    TOOLCHAIN_SRC_DIR=$WORK_DIR/toolchain-src
else
    set_parameters () {
        TOOLCHAIN_SRC_DIR="$1"
        if [ ! -d "$TOOLCHAIN_SRC_DIR" ]; then
            echo "ERROR: Not a directory: $1"
            exit 1
        fi
        if [ ! -d "$TOOLCHAIN_SRC_DIR/build" ]; then
            echo "ERROR: Missing directory: $1/build"
            exit 1
        fi
    }

    set_parameters $PARAMETERS
fi

# Location of original sysroot. This is where we're going to extract all
# binary Ubuntu packages.
ORG_SYSROOT_DIR=$WORK_DIR/sysroot

# Name of the final generated toolchain
TOOLCHAIN_NAME=$GCC_TARGET-glibc$GLIBC_VERSION-$(major_minor_only $GCC_VERSION)

# Name of the final toolchain binary tarball that this script will create
TOOLCHAIN_ARCHIVE=/tmp/$TOOLCHAIN_NAME.tar.bz2

# A file that will contain details about all the sources used to generate
# the final toolchain. This includes both SHA-1 for toolchain git repositories
# and SHA-1 hashes for downloaded Ubuntu packages.
SOURCES_LIST=$WORK_DIR/SOURCES

# Determine Make flags
MAKE_FLAGS="-j$JOBS"

# Create the work directory
mkdir -p "$WORK_DIR"
mkdir -p "$TOOLCHAIN_SRC_DIR"

# Location where we download packages from the Ubuntu servers
DOWNLOAD_DIR=$WORK_DIR/download

# Empty the SOURCES file
rm -f "$SOURCES_LIST" && touch "$SOURCES_LIST"


if [ "$VERBOSE" -ge 1 ] ; then
    run () {
        echo "## COMMAND: $@"
        $@
    }
    log () {
        echo "$@"
    }
    if [ "$VERBOSE" -ge 2 ] ; then
        log2 () {
            echo "$@"
        }
    else
        log2 () {
            return
        }
    fi
else
    run () {
        "$@" >>$TMPLOG 2>&1
    }
    log () {
        return
    }
    log2 () {
        return
    }
fi

# Sanitize a path list, we want to remove empty sub-dirs and
# leading/trailing columns.
sanitize_path_list ()
{
  local RESULT
  RESULT=$(printf "%s\n" "$*" | tr ':' '\n' | awk '$1 != "" && $1 != "." { print $0; }' | tr '\n' ':')
  printf "%s" ${RESULT%:}
}

PATH=$(sanitize_path_list $PATH)
LD_LIBRARY_PATH=$(sanitize_path_list $LD_LIBRARY_PATH)

BUILD_DIR=$WORK_DIR/build
mkdir -p $BUILD_DIR

TMPLOG=$BUILD_DIR/build.log
rm -rf $TMPLOG && touch $TMPLOG

build_dir_for () { echo "$BUILD_DIR/$PHASE/$1"; }

TIMESTAMPS_DIR=$BUILD_DIR/timestamps
mkdir -p $TIMESTAMPS_DIR

stamp_check () {
    [ -f "$TIMESTAMPS_DIR/$1" ]
}

stamp_clear () {
    rm -f "$TIMESTAMPS_DIR/$1"
}

stamp_set () {
    touch "$TIMESTAMPS_DIR/$1"
}

if [ "$FORCE" = "yes" ] ; then
    echo "Cleaning up timestamps (forcing the build)."
    rm -f $TIMESTAMPS_DIR/*
fi

if [ "$VERBOSE" = 0 ] ; then
    echo "To follow build, run: tail -F $TMPLOG"
fi

# returns 0 iff the string in $2 matches the pattern in $1
# $1: pattern
# $2: string
pattern_match ()
{
    echo "$2" | grep -q -E -e "$1"
}

# Find if a given shell program is available.
# We need to take care of the fact that the 'which <foo>' command
# may return either an empty string (Linux) or something like
# "no <foo> in ..." (Darwin). Also, we need to redirect stderr
# to /dev/null for Cygwin
#
# $1: variable name
# $2: program name
#
# Result: set $1 to the full path of the corresponding command
#         or to the empty/undefined string if not available
#
find_program ()
{
    local PROG
    PROG=`which $2 2>/dev/null`
    if [ -n "$PROG" ] ; then
        if pattern_match '^no ' "$PROG"; then
            PROG=
        fi
    fi
    eval $1="$PROG"
}

# Copy a directory, create target location if needed
#
# $1: source directory
# $2: target directory location
#
copy_directory ()
{
    local SRCDIR="$1"
    local DSTDIR="$2"
    if [ ! -d "$SRCDIR" ] ; then
        panic "Can't copy from non-directory: $SRCDIR"
    fi
    log2 "Directory copy: $SRCDIR -> $DSTDIR"
    mkdir -p "$DSTDIR" && (cd "$SRCDIR" && tar cf - *) | (tar xf - -C "$DSTDIR")
    fail_panic "Cannot copy to directory: $DSTDIR"
}

find_program CMD_WGET wget
find_program CMD_CURL curl
find_program CMD_SCP  scp

# Download a file with either 'curl', 'wget' or 'scp'
#
# $1: source URL (e.g. http://foo.com, ssh://blah, /some/path)
# $2: target file
download_file ()
{
    # Is this HTTP, HTTPS or FTP ?
    if pattern_match "^(http|https|ftp):.*" "$1"; then
        if [ -n "$CMD_WGET" ] ; then
            run $CMD_WGET -O $2 $1
        elif [ -n "$CMD_CURL" ] ; then
            run $CMD_CURL -o $2 $1
        else
            echo "Please install wget or curl on this machine"
            exit 1
        fi
        return
    fi

    # Is this SSH ?
    # Accept both ssh://<path> or <machine>:<path>
    #
    if pattern_match "^(ssh|[^:]+):.*" "$1"; then
        if [ -n "$CMD_SCP" ] ; then
            scp_src=`echo $1 | sed -e s%ssh://%%g`
            run $CMD_SCP $scp_src $2
        else
            echo "Please install scp on this machine"
            exit 1
        fi
        return
    fi

    # Is this a file copy ?
    # Accept both file://<path> or /<path>
    #
    if pattern_match "^(file://|/).*" "$1"; then
        cp_src=`echo $1 | sed -e s%^file://%%g`
        run cp -f $cp_src $2
        return
    fi

    # Unknown schema
    echo "ERROR: Unsupported source URI: $1"
    exit 1
}

# A variant of 'download_file' used to specify the target directory
# $1: source URL
# $2: target directory
download_file_to ()
{
    local URL="$1"
    local DIR="$2"
    local DST="$DIR/`basename $URL`"
    mkdir -p $DIR
    download_file "$URL" "$DST"
}

# Pack a given archive
#
# $1: archive file path (including extension)
# $2: source directory for archive content
# $3+: list of files (including patterns), all if empty
pack_archive ()
{
    local ARCHIVE="$1"
    local SRCDIR="$2"
    local SRCFILES
    local TARFLAGS ZIPFLAGS
    shift; shift;
    if [ -z "$1" ] ; then
        SRCFILES="*"
    else
        SRCFILES="$@"
    fi
    if [ "`basename $ARCHIVE`" = "$ARCHIVE" ] ; then
        ARCHIVE="`pwd`/$ARCHIVE"
    fi
    mkdir -p `dirname $ARCHIVE`
    if [ "$VERBOSE" -ge 2 ] ; then
        TARFLAGS="vcf"
        ZIPFLAGS="-9r"
    else
        TARFLAGS="cf"
        ZIPFLAGS="-9qr"
    fi
    case "$ARCHIVE" in
        *.zip)
            (cd $SRCDIR && run zip $ZIPFLAGS "$ARCHIVE" $SRCFILES)
            ;;
        *.tar)
            (cd $SRCDIR && run tar $TARFLAGS "$ARCHIVE" $SRCFILES)
            ;;
        *.tar.gz)
            (cd $SRCDIR && run tar z$TARFLAGS "$ARCHIVE" $SRCFILES)
            ;;
        *.tar.bz2)
            (cd $SRCDIR && run tar j$TARFLAGS "$ARCHIVE" $SRCFILES)
            ;;
        *)
            panic "Unsupported archive format: $ARCHIVE"
            ;;
    esac
}

no_trailing_slash ()
{
    echo ${1##/}
}

# Load the Ubuntu packages file. This is a long text file that will list
# each package for a given release.
#
# $1: Ubuntu mirror base URL (e.g. http://mirrors.us.kernel.org/)
# $2: Release name
#
get_ubuntu_packages_list ()
{
    local RELEASE=$2
    local BASE="`no_trailing_slash \"$1\"`"
    local SRCFILE DSTFILE
    for UA in $UBUNTU_ARCHS; do
        SRCFILE="$BASE/ubuntu/dists/$RELEASE/main/binary-$UA/Packages.bz2"
        DSTFILE="$DOWNLOAD_DIR/Packages-$UA.bz2"
        log "Trying to load $SRCFILE"
        download_file "$SRCFILE" "$DSTFILE"
        fail_panic "Could not download $SRCFILE"
        (cd $DOWNLOAD_DIR && bunzip2 -cf Packages-$UA.bz2 > Packages-$UA)
        fail_panic "Could not uncompress $DSTFILE to Packages-$UA"
    done

    # Write a small awk script used to extract filenames for a given package
    cat > $DOWNLOAD_DIR/extract-filename.awk <<EOF
BEGIN {
    # escape special characters in package name
    gsub("\\\\.","\\\\.",PKG)
    gsub("\\\\+","\\\\+",PKG)
    FILE = ""
    PACKAGE = ""
}

\$1 == "Package:" {
    if (\$2 == PKG) {
        PACKAGE = \$2
    } else {
        PACKAGE = ""
    }
}

\$1 == "Filename:" && PACKAGE == PKG {
    FILE = \$2
}

END {
    print FILE
}
EOF
}

# Convert an unversioned package name into a .deb package URL
#
# $1: Package name without version information (e.g. libc6-dev)
# $2: Ubuntu mirror base URL
# $3: Ubuntu arch ("i386" or "amd64")
#
get_ubuntu_package_deb_url ()
{
    # The following is an awk command to parse the Packages file and extract
    # the filename of a given package.
    local BASE="`no_trailing_slash \"$1\"`"
    local FILE=`awk -f "$DOWNLOAD_DIR/extract-filename.awk" -v PKG=$1 $DOWNLOAD_DIR/Packages-$3`
    if [ -z "$FILE" ]; then
        log "Could not find filename for package $1"
        exit 1
    fi
    echo "$2/ubuntu/$FILE"
}

# Does the host compiler generate 32-bit machine code?
# If not, add the -m32 flag to the compiler name to ensure this.
#
compute_host_flags ()
{
    HOST_CC=${CC:-gcc}
    HOST_CXX=${CXX-g++}
    if [ -n "$USE_CCACHE" ]; then
        echo -n "Checking for ccache..."
        find_program CMD_CCACHE ccache
        if [ -n "$CMD_CCACHE" ] ; then
            echo "$HOST_CC" | tr ' ' '\n' | grep -q -e "ccache"
            if [ $? = 0 ] ; then
                echo "yes (ignored)"
            else
                echo "yes"
                HOST_CC="ccache $HOST_CC"
                HOST_CXX="ccache $HOST_CXX"
            fi
        else
            echo "no"
        fi
    fi
    echo -n "Checking compiler bitness... "
    cat > "$BUILD_DIR"/conftest.c << EOF
#include <stdio.h>
int main(void) {
    printf("%d\n",sizeof(void*)*8);
    return 0;
}
EOF
    $HOST_CC -o "$BUILD_DIR"/conftest "$BUILD_DIR"/conftest.c > "$BUILD_DIR"/conftest.log 2>&1
    if [ $? != 0 ] ; then
        echo "Could not compile test program!!"
        echo "Error log is:"
        cat "$BUILD_DIR"/conftest.log
        rm "$BUID_DIR"/conftest.log
        panic "Need a working build toolchain!"
    fi
    HOST_CC_BITS=$("$BUILD_DIR"/conftest)
    echo -n "$HOST_CC_BITS"
    case $HOST_CC_BITS in
        32) # Nothing to do
            ;;
        64) # Do we need to force 32-bits
            if [ "$FORCE_32" ]; then
                echo " (forcing generation of 32-bit binaries)"
                HOST_CC=$HOST_CC" -m32"
                HOST_CXX=$HOST_CXX" -m32"
            fi
            ;;
        *)
            panic "Unknown bitness (32 or 64 expected) !!"
    esac
    echo ""
    echo "Using build C compiler: $HOST_CC"
    echo "Using build C++ compiler: $HOST_CXX"
    echo "GCC target name: $GCC_TARGET"
    echo "GMP target name: $GMP_TARGET"
    echo "GMP ABI: $GMP_ABI"
    export CC="$HOST_CC"
    export CXX="$HOST_CXX"
}

compute_host_flags

# Return the value of a given named variable
# $1: variable name
#
# example:
#    FOO=BAR
#    BAR=ZOO
#    echo `var_value $FOO`
#    will print 'ZOO'
#
var_value ()
{
    eval echo \$$1
}

var_list_append ()
{
    local VARNAME=$1
    local VARVAL=`var_value $VARNAME`
    shift
    if [ -z "$VARVAL" ] ; then
        eval $VARNAME=\"$@\"
    else
        eval $VARNAME=\"$VARVAL $@\"
    fi
}

var_list_prepend ()
{
    local VARNAME=$1
    local VARVAL=`var_value $VARNAME`
    shift
    if [ -z "$VARVAL" ] ; then
        eval $VARNAME=\"$@\"
    else
        eval $VARNAME=\"$@ $VARVAL\"
    fi
}

_list_first ()
{
    echo $1
}

_list_rest ()
{
    shift
    echo "$@"
}

_list_reverse ()
{
    local I1 I2 I3 I4 I5 I6 I7 I8 I9 REST RET
    I1=$1; I2=$2; I3=$3; I4=$I4; I5=$I5; I6=$I6; I7=$I7; I8=$I8; I9=$I9
    shift 9
    RET=$I9${I8:+" "}$I8${I7:+" "}$I7${I6:+" "}$I6${I5:+" "}$I5${I4:+" "}$I4${I3:+" "}$I3${I2:+" "}$I2${I1:+" "}$I1
    REST="$*"
    if [ "$REST" ]; then
        RET=$(_list_reverse $REST)$RET
    fi
    echo "$RET"
}

var_list_pop_first ()
{
    local VARNAME=$1
    local VARVAL=`var_value $VARNAME`
    local FIRST=`_list_first $VARVAL`
    eval $VARNAME=\"`_list_rest $VARVAL`\"
    echo "$FIRST"
}

_list_first ()
{
    echo $1
}

_list_rest ()
{
    shift
    echo "$@"
}

var_list_first ()
{
    local VAL=`var_value $1`
    _list_first $VAL
}

var_list_rest ()
{
    local VAL=`var_value $1`
    _list_rest $VAL
}

ALL_TASKS=

# Define a new task for this build script
# $1: Task name (e.g. build_stuff)
# $2: Task description
# $3: Optional: command name (will be cmd_$1 by default)
#
task_define ()
{
    local TASK="$1"
    local DESCR="$2"
    local COMMAND="${3:-cmd_$1}"

    var_list_append ALL_TASKS $TASK
    task_set $TASK name "$TASK"
    task_set $TASK descr "$DESCR"
    task_set $TASK cmd "$COMMAND"
    task_set $TASK deps ""
}

# Variant of task define for dual tasks
# This really defines two tasks named '<task>_1' and '<task>_2"
# $1: Task base name
# $2: Task description
# $3: Optional: command name (will be cmd_$1 by default)
task2_define ()
{
    local TASK="$1"
    local DESCR="$2"
    local COMMAND="${3:-cmd_$1}"

    task_define "${TASK}_1" "$DESCR 1/2" "phase_1 $COMMAND"
    task_define "${TASK}_2" "$DESCR 2/2" "phase_2 $COMMAND"
}

task_set ()
{
    local TASK="$1"
    local FIELD="$2"
    shift; shift;
    eval TASK_${TASK}__${FIELD}=\"$@\"
}

task_get ()
{
    var_value TASK_$1__$2
}

# return the list of dependencies for a given task
task_get_deps ()
{
    task_get $1 deps
}

task_get_cmd ()
{
    task_get $1 cmd
}

task_get_descr ()
{
    task_get $1 descr
}

# $1: task name
# $2+: other tasks this task depends on.
task_depends ()
{
    local TASK="$1"
    shift;
    var_list_append TASK_${TASK}__deps $@
}

# $1: dual task name
# $2+: other non-dual tasks this dual task depends on
task2_depends1 ()
{
    local TASK="$1"
    shift
    var_list_append TASK_${TASK}_1__deps $@
    var_list_append TASK_${TASK}_2__deps $@
}

# $1: dual task name
# $2+: other dual tasks this dual task depends on
task2_depends2 ()
{
    local TASK="$1"
    local DEP
    shift
    for DEP; do
        var_list_append TASK_${TASK}_1__deps ${DEP}_1
        var_list_append TASK_${TASK}_2__deps ${DEP}_2
    done
}

task_dump ()
{
    local TASK
    for TASK in $ALL_TASKS; do
        local DEPS="`task_get_deps $TASK`"
        local CMD="`task_get_cmd $TASK`"
        local DESCR="`task_get_descr $TASK`"
        echo "TASK $TASK: $DESCR: $CMD"
        echo ">  $DEPS"
    done
}

task_visit ()
{
    task_set $TASK visit 1
}

task_unvisit ()
{
    task_set $TASK visit 0
}

task_is_visited ()
{
    [ `task_get $TASK visit` = 1 ]
}

task_queue_reset ()
{
    TASK_QUEUE=
}

task_queue_push ()
{
    var_list_append TASK_QUEUE $1
}

task_queue_pop ()
{
    local FIRST=`var_list_first TASK_QUEUE`
    TASK_QUEUE=`var_list_rest TASK_QUEUE`
}

do_all_tasks ()
{
    local TASK
    local TASK_LIST=
    task_queue_reset
    # Clear visit flags
    for TASK in $ALL_TASKS; do
        task_unvisit $TASK
    done
    task_queue_push $1
    while [ -n "$TASK_QUEUE" ] ; do
        TASK=`task_queue_pop`
        if task_is_visited $TASK; then
            continue
        fi
        # Prepend the task to the list if its timestamp is not set
        if stamp_check $TASK; then
            var_list_prepend TASK_LIST $TASK
        fi
        # Add all dependencies to the work-queue
        local SUBTASK
        for SUBTASK in `task_get_deps $TASK`; do
            task_queue_push $SUBTASK
        done
        task_visit $TASK
    done

    # Now, TASK_LIST contains the
}


# Return the first item of a space-separated list
list_first () {
    set -- "$@"
    echo "$1"
}

# Append an item to a given list
list_append () {
    local ITEM=$1
    shift;
    echo $@${@:+" "}$1
}

# Return the second-to-last items of a space-separated list
list_rest () {
    set -- "$@"
    shift
    echo "$@"
}

# Reverse a space-separated list
list_reverse ()
{
    set -- "$@"
    local I1 I2 I3 I4 I5 I6 I7 I8 I9 REST RET
    I1=$1; I2=$2; I3=$3; I4=$4; I5=$5; I6=$6; I7=$7; I8=$8; I9=$9
    shift; shift; shift; shift; shift; shift; shift; shift; shift;
    RET=$I9${I9:+" "}$I8${I8:+" "}$I7${I7:+" "}$I6${I6:+" "}$I5${I5:+" "}$I4${I4:+" "}$I3${I3:+" "}$I2${I2:+" "}$I1
    REST="$*"
    if [ -n "$REST" ]; then
        RET=$(list_reverse $REST)" "$RET
    fi
    echo "$RET"
}

# Used to build the list of tasks with a tree post-order traversal, i.e.
# the list starts at the leaves and finishes with the top level task,
# so that if task(A) depends on task(B), then A will always appear _after_
# B in the result.
#
# $1: space-separated list of tasks to visit
# Out: list of all tasks in post-order
#
task_build_postorder_list ()
{
    local TASK
    local STACK="$1"
    local RET=""
    for TASK in $ALL_TASKS; do
        stamp_clear $TASK.visit
    done
    while true; do
        # Peek at stack
        TASK=$(list_first $STACK)
        #echo >&2 "STACK: ($TASK) '$STACK'"
        if [ -z "$TASK" ]; then
            break
        fi
        HAS_DEPS=
        for DEP in $(task_get_deps $TASK); do
            #echo >&2 "CHECK: '$DEP'"
            if ! stamp_check $DEP.visit; then
                STACK=$DEP" "$STACK
                #echo >&2 "PUSH: '$DEP' => '$STACK'"
                HAS_DEPS=1
            fi
        done

        if [ -z "$HAS_DEPS" ]; then
            #echo >&2 "ADD: $TASK -> '$RET'"
            STACK=$(list_rest $STACK)
            if ! stamp_check $TASK.visit; then
                RET=$RET${RET:+" "}$TASK
                stamp_set $TASK.visit
            fi
        fi
    done
    for TASK in $ALL_TASKS; do
        stamp_clear $TASK.visit
    done
    echo "$RET"
}

run_task ()
{
    # Build the list of tasks, in reverse order (from leafs to last)
    local TASKS=$(task_build_postorder_list $1)
    # Do all tasks
    local TASK DEP DESCR

    # Dump list of tasks:
#     echo "ALL TASKS:"
#     for TASK in $TASKS; do
#         echo "  $TASK"
#     done

    # Clean timestamps of any tasks whose any of its dependents needs
    # to be re-done.
    #
    for TASK in $TASKS; do
       for DEP in $(task_get_deps $TASK); do
            if ! stamp_check $DEP; then
                #echo "Redo: $TASK due to $DEP"
                stamp_clear $TASK
                break
            fi
       done
    done

    for TASK in $TASKS; do
        DESCR=$(task_get_descr $TASK)
        if stamp_check $TASK; then
            echo "Skipping: $DESCR"
            continue
        fi
        echo "Running: $DESCR"
        if [ "$VERBOSE" -ge 1 ] ; then
            (eval $(task_get_cmd $TASK))
        else
            (eval $(task_get_cmd $TASK)) >> $TMPLOG 2>&1
        fi
        if [ $? != 0 ] ; then
            echo "ERROR: Cannot $DESCR"
            exit 1
        fi

        stamp_set $TASK
    done
}

# This function is used to clone a source repository either from a given
# git base or a git reference.
# $1: project/subdir name
# $2: path to SOURCES file
toolchain_clone ()
{
    local GITFLAGS
    GITFLAGS=
    if [ "$GIT_REFERENCE" ]; then
        GITFLAGS="$GITFLAGS --shared --reference $GIT_REFERENCE/$1"
    fi
    echo "cleaning up toolchain/$1"
    rm -rf $1
    fail_panic "Could not clean $(pwd)/$1"
    echo "downloading sources for toolchain/$1"
    if [ -d "$GIT_BASE/$1" ]; then
        log "cloning $GIT_BASE/$1"
        run $GIT_CMD clone $GITFLAGS $GIT_BASE/$1 $1
    else
        log "cloning $GITPREFIX/$1.git"
        run $GIT_CMD clone $GITFLAGS $GIT_BASE/$1.git $1
    fi
    fail_panic "Could not clone $GIT_BASE/$1.git ?"
    cd $1
    if [ "$GIT_BRANCH" != "master" ] ; then
        log "checking out $GIT_BRANCH branch of $1.git"
        run $GIT_CMD checkout -b $GIT_BRANCH origin/$GIT_BRANCH
        fail_panic "Could not checkout $1 ?"
    fi
    # If --git-date is used, or we have a default
    if [ -n "$GIT_DATE" ] ; then
        REVISION=`git rev-list -n 1 --until="$GIT_DATE" HEAD`
        echo "Using sources for date '$GIT_DATE': toolchain/$1 revision $REVISION"
        run $GIT_CMD checkout $REVISION
        fail_panic "Could not checkout $1 ?"
    fi
    (printf "%-32s " "toolchain/$1.git: " && git log -1 --format=oneline) >> $2
    cd ..
}

task_define download_toolchain_sources "Download toolchain sources from $GIT_BASE "
cmd_download_toolchain_sources ()
{
    local SUBDIRS="binutils build gcc gdb gold gmp mpfr mpc isl cloog"
    (mkdir -p $TOOLCHAIN_SRC_DIR && cd $TOOLCHAIN_SRC_DIR &&
    # Create a temporary SOURCES file for the toolchain sources only
    # It's content will be copied to the final SOURCES file later.
    SOURCES_LIST=$TOOLCHAIN_SRC_DIR/SOURCES
    rm -f $SOURCES_LIST && touch $SOURCES_LIST
    for SUB in $SUBDIRS; do
        toolchain_clone $SUB $SOURCES_LIST
    done
    )
}

task_define download_ubuntu_packages_list "Download Ubuntu packages list"
cmd_download_ubuntu_packages_list ()
{
    mkdir -p $DOWNLOAD_DIR
    get_ubuntu_packages_list "$UBUNTU_MIRROR" "$UBUNTU_RELEASE"
    fail_panic "Unable to download packages list, try --ubuntu-mirror=<url> to use another archive mirror"
}

task_define download_packages "Download Ubuntu packages"
task_depends download_packages download_ubuntu_packages_list
cmd_download_packages ()
{
    local PACKAGE PKGURL

    rm -f $DOWNLOAD_DIR/SOURCES && touch $DOWNLOAD_DIR/SOURCES
    for PACKAGE in $UBUNTU_PACKAGES; do
        echo "Downloading $PACKAGE"
	    for UA in $UBUNTU_ARCHS; do
            PKGURL=`get_ubuntu_package_deb_url $PACKAGE $UBUNTU_MIRROR $UA`
            echo "URL: $PKGURL"
            download_file_to $PKGURL $DOWNLOAD_DIR
            fail_panic "Could not download $PKGURL"
        done
    done
    sha1sum $DOWNLOAD_DIR/*.deb | while read LINE; do
        PACKAGE=$(basename $(echo $LINE | awk '{ print $2;}'))
        SHA1=$(echo $LINE | awk '{ print $1; }')
        printf "%-64s %s\n" $PACKAGE $SHA1 >> $DOWNLOAD_DIR/SOURCES
    done
}

task_define build_sysroot "Build sysroot"
task_depends build_sysroot download_packages

cmd_build_sysroot ()
{
    local PACKAGE PKGURL SRC_PKG
    mkdir -p $SRC_PKG $ORG_SYSROOT_DIR
    for PACKAGE in $UBUNTU_PACKAGES; do
	    for UA in $UBUNTU_ARCHS; do
            PKGURL=`get_ubuntu_package_deb_url $PACKAGE $UBUNTU_MIRROR $UA`
            SRC_PKG=$DOWNLOAD_DIR/`basename $PKGURL`
            echo "Extracting $SRC_PKG"
            dpkg -x $SRC_PKG $ORG_SYSROOT_DIR/$UA
	    done
    done
}

# Now, we need to patch libc.so which is actually a linker script
# referencing /lib and /usr/lib. Do the same for libpthread.so
patch_library ()
{
    echo "Patching $1"
    sed -i -e "s! /lib/! !g" -e "s! /usr/lib/! !g" $1
}

# Used to setup phase 1 the run a command
phase_1 ()
{
    PHASE=1
    $@
}

# Used to setup phase 2 then run a command
phase_2 ()
{
    PHASE=1
    BINPREFIX=$(install_dir)/bin/${GCC_TARGET}-
    CC=${BINPREFIX}gcc
    CXX=${BINPREFIX}g++
    LD=${BINPREFIX}ld
    AR=${BINPREFIX}ar
    AS=${BINPREFIX}as
    RANLIB=${BINPREFIX}ranlib
    STRIP=${BINPREFIX}strip
    CC_FOR_TARGET=${BINPREFIX}gcc
    export CC CXX LD AR AS RANLIB STRIP CC_FOR_TARGET
    PHASE=2
    $@
}

# Return the list of all symbolic links in a given directory, excluding
# any links in its sub-directories.
# $1: Sub-directory path.
find_symlinks_in () {
    (cd $1 && find . -maxdepth 1 -type l) | sed -e 's|^\./||g'
}

task2_define copy_sysroot "Fix and copy sysroot"
task2_depends1 copy_sysroot build_sysroot
cmd_copy_sysroot ()
{
    local SL

    # Copy the content of $BUILD_DIR/lib to $(sysroot_dir)/usr/lib
    copy_directory $ORG_SYSROOT_DIR/i386/lib $(sysroot_dir)/usr/lib32
    copy_directory $ORG_SYSROOT_DIR/i386/usr/lib $(sysroot_dir)/usr/lib32
    copy_directory $ORG_SYSROOT_DIR/i386/usr/include $(sysroot_dir)/usr/include

    copy_directory $ORG_SYSROOT_DIR/amd64/lib $(sysroot_dir)/usr/lib
    copy_directory $ORG_SYSROOT_DIR/amd64/usr/lib $(sysroot_dir)/usr/lib
    copy_directory $ORG_SYSROOT_DIR/amd64/usr/include $(sysroot_dir)/usr/include

    for LIB in lib lib32; do
        # We need to fix the symlink like librt.so -> /lib/librt.so.1
        # in $(sysroot_dir)/usr/$LIB, they should point to librt.so.1 instead now.
        SYMLINKS=$(find_symlinks_in $(sysroot_dir)/usr/$LIB)
        cd $(sysroot_dir)/usr/$LIB
        for SL in $SYMLINKS; do
            # convert /lib/libfoo.so.<n> into 'libfoo.so.<n>' for the target
            local DST=$(readlink $SL 2>/dev/null)
            local DST2=${DST##/lib/}
            if [ "$DST2" != "$DST" ]; then
                echo "Fixing symlink $SL --> $DST"
                rm $SL && ln -s $DST2 $SL
            fi
        done
        patch_library $(sysroot_dir)/usr/$LIB/libc.so
        patch_library $(sysroot_dir)/usr/$LIB/libpthread.so
    done
}

task_define patch_toolchain_sources "Patch toolchain sources."
task_depends patch_toolchain_sources download_toolchain_sources
cmd_patch_toolchain_sources ()
{
    log "PATCHES_DIR = $PATCHES_DIR"
    if [ ! -d "$PATCHES_DIR" ]; then
        log "$PATCHES_DIR doesn't exist"
        return 0
    fi

    local PATCHES=`(cd $PATCHES_DIR && find . -name "*.patch" | sort ) 2> /dev/null`
    if [ -z "$PATCHES" ] ; then
        log "No patches files in $PATCHES_DIR"
        return 0
    fi

    PATCHES=`echo $PATCHES | sed -e s%^\./%%g`
    for PATCH in $PATCHES; do
        PATCHDIR=`dirname $PATCH`
        PATCHNAME=`basename $PATCH`
        log "Applying $PATCHNAME into $TOOLCHAIN_SRC_DIR/$PATCHDIR"
        (cd $TOOLCHAIN_SRC_DIR/$PATCHDIR && patch -p1 < $PATCHES_DIR/$PATCH)
        fail_panic "Patch failure!! Please check your patches directory!"
    done

    log "Done patching."
}

task_define prepare_toolchain_sources "Prepare toolchain sources."
if [ -n "$GIT_BASE" -o -n "$GIT_REFERENCE" ]; then
    task_depends prepare_toolchain_sources patch_toolchain_sources
fi
cmd_prepare_toolchain_sources ()
{
    return
}

task2_define configure_binutils "Configure binutils-$BINUTILS_VERSION"
task2_depends1 configure_binutils prepare_toolchain_sources
task2_depends2 configure_binutils copy_sysroot
cmd_configure_binutils ()
{
    OUT_DIR=$(build_dir_for binutils)
    mkdir -p $OUT_DIR && cd $OUT_DIR &&
    run $TOOLCHAIN_SRC_DIR/binutils/binutils-$BINUTILS_VERSION/configure \
        --prefix=$(install_dir) \
        --with-sysroot=$(sysroot_dir) \
        --target=$GCC_TARGET \
        --enable-gold=default \
        --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' \
        --with-gold-ldflags='-static-libgcc -static-libstdc++' \
        --with-bugurl=http://source.android.com/source/report-bugs.html
}

task2_define build_binutils "Build binutils-$BINUTILS_VERSION"
task2_depends2 build_binutils configure_binutils
cmd_build_binutils ()
{
    cd $(build_dir_for binutils) &&
    make $MAKE_FLAGS
}

task2_define install_binutils "Install binutils-$BINUTILS_VERSION"
task2_depends2 install_binutils build_binutils
cmd_install_binutils ()
{
    cd $(build_dir_for binutils) &&
    make install
}

task2_define extract_gmp "Extract sources for gmp-$GMP_VERSION"
task2_depends1 extract_gmp prepare_toolchain_sources
cmd_extract_gmp ()
{
    OUT_DIR=$(build_dir_for gmp)
    GMP_TARBALL=$TOOLCHAIN_SRC_DIR/gmp/gmp-$GMP_VERSION.tar.bz2
    if [ ! -f "$GMP_TARBALL" ]; then
        GMP_TARBALL=$TOOLCHAIN_SRC_DIR/tarballs/gmp-$GMP_VERSION.tar.bz2
        if [ ! -f "$GMP_TARBALL" ]; then
            panic "Can't find gmp-$GMP_VERSION sources!!"
        fi
    fi
    mkdir -p $OUT_DIR && cd $OUT_DIR &&
    tar xjf "$GMP_TARBALL"
}

task2_define configure_gmp "Configure gmp-$GMP_VERSION"
task2_depends2 configure_gmp extract_gmp install_binutils
cmd_configure_gmp ()
{
    export ABI=$GMP_ABI &&
    cd $(build_dir_for gmp) && mkdir -p build && cd build &&
    ../gmp-$GMP_VERSION/configure \
        --prefix=$(install_dir) \
        --host=$GMP_TARGET \
        --with-sysroot=$(install_dir) \
        --disable-shared
}

task2_define build_gmp "Build gmp-$GMP_VERSION"
task2_depends2 build_gmp configure_gmp
cmd_build_gmp ()
{
    export ABI=$GMP_ABI &&
    cd $(build_dir_for gmp)/build &&
    make $MAKE_FLAGS
}

task2_define install_gmp "Install gmp-$GMP_VERSION"
task2_depends2 install_gmp build_gmp
cmd_install_gmp ()
{
    cd $(build_dir_for gmp)/build &&
    make install
}

# Third, build mpfr
task2_define extract_mpfr "Extract sources from mpfr-$MPFR_VERSION"
task2_depends1 extract_mpfr prepare_toolchain_sources
cmd_extract_mpfr ()
{
    OUT_DIR=$(build_dir_for mpfr)
    MPFR_TARBALL=$TOOLCHAIN_SRC_DIR/mpfr/mpfr-$MPFR_VERSION.tar.bz2
    if [ ! -f "$MPFR_TARBALL" ]; then
        MPFR_TARBALL=$TOOLCHAIN_SRC_DIR/tarballs/mpfr-$MPFR_VERSION.tar.bz2
        if [ ! -f "$MPFR_TARBALL" ]; then
            panic "Can't find mpfr-$MPFR_VERSION sources!!"
        fi
    fi
    mkdir -p $OUT_DIR && cd $OUT_DIR &&
    tar xjf "$MPFR_TARBALL"
}

task2_define configure_mpfr "Configure mpfr-$MPFR_VERSION"
task2_depends2 configure_mpfr extract_mpfr install_gmp
cmd_configure_mpfr ()
{
    cd $(build_dir_for mpfr) && mkdir -p build && cd build &&
    run ../mpfr-$MPFR_VERSION/configure \
        --prefix=$(install_dir) \
        --host=$GMP_TARGET \
        --with-gmp=$(install_dir) \
        --with-sysroot=$(sysroot_dir) \
        --disable-shared
}

task2_define build_mpfr "Build mpfr-$MPFR_VERSION"
task2_depends2 build_mpfr configure_mpfr
cmd_build_mpfr ()
{
    cd $(build_dir_for mpfr)/build &&
    run make $MAKE_FLAGS
}

task2_define install_mpfr "Install mpfr-$MPFR_VERSION"
task2_depends2 install_mpfr build_mpfr
cmd_install_mpfr ()
{
    cd $(build_dir_for mpfr)/build &&
    run make install
}

task2_define extract_mpc "Extract sources for mpc-$MPC_VERSION"
task2_depends1 extract_mpc prepare_toolchain_sources
cmd_extract_mpc ()
{
    OUT_DIR=$(build_dir_for mpc)
    MPC_TARBALL=$TOOLCHAIN_SRC_DIR/mpc/mpc-$MPC_VERSION.tar.gz
    if [ ! -f "$MPC_TARBALL" ]; then
        MPC_TARBALL=$TOOLCHAIN_SRC_DIR/tarballs/mpc-$MPC_VERSION.tar.gz
        if [ ! -f "$MPC_TARBALL" ]; then
            panic "Can't find mpc-$MPC_VERSION sources!!"
        fi
    fi
    mkdir -p $OUT_DIR && cd $OUT_DIR &&
    tar xzf "$MPC_TARBALL"
}

task2_define configure_mpc "Configure mpc-$MPC_VERSION"
task2_depends2 configure_mpc extract_mpc install_mpfr
cmd_configure_mpc ()
{
    cd $(build_dir_for mpc) && mkdir -p build && cd build &&
    run ../mpc-$MPC_VERSION/configure \
        --prefix=$(install_dir) \
        --host=$GMP_TARGET \
        --with-gmp=$(install_dir) \
        --with-mpfr=$(install_dir) \
        --disable-shared
}

task2_define build_mpc "Build mpc-$MPC_VERSION"
task2_depends2 build_mpc configure_mpc
cmd_build_mpc ()
{
    cd $(build_dir_for mpc)/build &&
    run make $MAKE_FLAGS
}

task2_define install_mpc "Install mpc-$MPC_VERSION"
task2_depends2 install_mpc build_mpc
cmd_install_mpc ()
{
    cd $(build_dir_for mpc)/build &&
    run make install
}

task2_define extract_isl "Extract sources for isl-$ISL_VERSION"
task2_depends2 extract_isl prepare_toolchain_sources
cmd_extract_isl ()
{
    OUT_DIR=$(build_dir_for isl)
    ISL_TARBALL=$TOOLCHAIN_SRC_DIR/isl/isl-$ISL_VERSION.tar.bz2
    if [ ! -f "$ISL_TARBALL" ]; then
        panic "Can't find isl-$ISL_VERSION sources!!"
    fi
    mkdir -p $OUT_DIR && cd $OUT_DIR &&
    tar xf "$ISL_TARBALL"
}

task2_define configure_isl "Configuring isl-$ISL_VERSION"
task2_depends2 configure_isl extract_isl install_gmp
cmd_configure_isl ()
{
    cd $(build_dir_for isl) && mkdir -p build && cd build &&
    run ../isl-$ISL_VERSION/configure \
        --prefix=$(install_dir) \
        --host=$GMP_TARGET \
        --with-gmp-prefix=$(install_dir) \
        --with-sysroot=$(sysroot_dir) \
        --disable-shared
}

task2_define build_isl "Building isl-$ISL_VERSION"
task2_depends2 build_isl configure_isl
cmd_build_isl ()
{
    cd $(build_dir_for isl)/build &&
    run make $MAKE_FLAGS
}

task2_define install_isl "Installing isl-$ISL_VERSION"
task2_depends2 install_isl build_isl
cmd_install_isl ()
{
    cd $(build_dir_for isl)/build &&
    make install
}

task2_define configure_cloog "Configure Cloog-$CLOOG_VERSION"
task2_depends2 configure_cloog prepare_toolchain_sources install_gmp install_isl
cmd_configure_cloog () {
    mkdir -p $(build_dir_for cloog)/build && cd $(build_dir_for cloog)/build &&
    run $TOOLCHAIN_SRC_DIR/cloog/cloog-$CLOOG_VERSION/configure \
        --prefix=$(install_dir) \
        --host=$GMP_TARGET \
        --with-gmp-prefix=$(install_dir) \
        --with-sysroot=$(sysroot_dir) \
        --disable-shared
}

task2_define build_cloog "Building Cloog-$CLOOG_VERSION"
task2_depends2 build_cloog configure_cloog
cmd_build_cloog ()
{
    cd $(build_dir_for cloog)/build &&
    run make $MAKE_FLAGS
}

task2_define install_cloog "Installing Cloog-$CLOOG_VERSION"
task2_depends2 install_cloog build_cloog
cmd_install_cloog ()
{
    cd $(build_dir_for cloog)/build &&
    run make install
}

# Fourth, the compiler itself
task2_define configure_gcc "Configure gcc-$GCC_VERSION"
task2_depends1 configure_gcc prepare_toolchain_sources
task2_depends2 configure_gcc install_binutils install_gmp install_mpfr install_mpc install_cloog
cmd_configure_gcc ()
{
    local EXTRA_CONFIGURE_FLAGS=
    if [ "$GCC_VERSION" != "4.6" ]; then
        EXTRA_CONFIGURE_FLAGS="--with-cloog=$(install_dir)"
    fi
    OUT_DIR=$(build_dir_for gcc)
    mkdir -p $OUT_DIR && cd $OUT_DIR &&
    export CC=$HOST_CC &&
    export CC_FOR_TARGET="$HOST_CC" &&
    run $TOOLCHAIN_SRC_DIR/gcc/gcc-$GCC_VERSION/configure \
        --prefix=$(install_dir) \
        --with-sysroot=$(sysroot_dir) \
        --disable-nls \
        --with-gmp=$(install_dir) \
        --with-mpfr=$(install_dir) \
        --with-mpc=$(install_dir) \
        --target=$GCC_TARGET \
        --with-arch=x86-64 \
        --with-multilib-list=m32,m64 \
        --disable-plugin \
        --disable-docs \
        --disable-bootstrap \
        --disable-libgomp \
        --disable-libmudflap \
        --disable-libquadmath \
        --enable-target-optspace \
        --enable-gold=default \
        --enable-languages=c,c++ \
        $EXTRA_CONFIGURE_FLAGS
}

task2_define build_gcc "Build gcc-$GCC_VERSION"
task2_depends2 build_gcc configure_gcc
cmd_build_gcc ()
{
    cd $(build_dir_for gcc) &&
    make $MAKE_FLAGS
}

task2_define install_gcc "Install gcc-$GCC_VERSION"
task2_depends2 install_gcc build_gcc
cmd_install_gcc ()
{
    cd $(build_dir_for gcc) &&
    make install
}

task2_define cleanup_toolchain "Cleanup toolchain"
task2_depends2 cleanup_toolchain install_gcc
cmd_cleanup_toolchain ()
{
    # Remove un-needed directories and files
    rm -rf $(install_dir)/share
    rm -rf $(install_dir)/man
    rm -rf $(install_dir)/info
    rm -rf $(install_dir)/libexec/*/*/install-tools
    #rm -rf $(install_dir)/$GCC_TARGET/bin
    find $(install_dir) -name "*.la" -exec rm -f {} \;

    (strip $(install_dir)/bin/*)
    (strip $(install_dir)/libexec/gcc/$GCC_TARGET/*/*)
    true
}

task2_define package_toolchain "Package final toolchain"
task2_depends2 package_toolchain cleanup_toolchain
cmd_package_toolchain ()
{
    # Copy this script to the install directory
    cp -f $0 $(install_dir)
    fail_panic "Could not copy build script to install directory"

    if [ -d "$PATCHES_DIR" ]; then
        # Copy patches to the install directory
        cp -rf "$PATCHES_DIR" $(install_dir)
        fail_panic "Could not copy patch directory to install directory"
    fi

    # Copy the SOURCES file as well
    cp $DOWNLOAD_DIR/SOURCES $(install_dir)/PACKAGE_SOURCES &&
    cp $TOOLCHAIN_SRC_DIR/SOURCES $(install_dir)/TOOLCHAIN_SOURCES
    fail_panic "Could not copy SOURCES files to install directory"

    # Package everything
    pack_archive $TOOLCHAIN_ARCHIVE "`dirname $(install_dir)`" "`basename $(install_dir)`"
}

task2_define install_toolchain "Install final toolchain"
task2_depends2 install_toolchain cleanup_toolchain
cmd_install_toolchain ()
{
    copy_directory "$(install_dir)" "$PREFIX_DIR/$TOOLCHAIN_NAME"
    cp -f $0 "$PREFIX_DIR/$TOOLCHAIN_NAME/"
}

# Make sure that the second toolchain depends on the first one
task_depends configure_binutils_2 install_gcc_1

if [ "$ONLY_SYSROOT" = "yes" ]; then
    MAIN_TASK=copy_sysroot
    COMPLETION_TEXT="Done, see sysroot files in $(sysroot_dir)"
elif [ -n "$PREFIX_DIR" ]; then
    if [ -z "$BOOTSTRAP" ]; then
        MAIN_TASK=install_toolchain_1
    else
        MAIN_TASK=install_toolchain_2
    fi
    COMPLETION_TEXT="Done, see $PREFIX_DIR/$TOOLCHAIN_NAME"
else
    if [ -z "$BOOTSTRAP" ]; then
        MAIN_TASK=package_toolchain_1
    else
        MAIN_TASK=package_toolchain_2
    fi
    COMPLETION_TEXT="Done, see $TOOLCHAIN_ARCHIVE"
fi

if [ "$LIST_TASKS" ]; then
    task_dump
else
    run_task $MAIN_TASK
    echo "$COMPLETION_TEXT"
fi
