#!/bin/bash

#
# Build a mingw64 compiler for doing x64 compiles.
#

###
### CYGWIN :: Make sure that cygwin is mouting its file systems in binmode.
###

#
# Specify the architectures for which the tools are to be built
#
TARGS="${TARGS:-x86_64-pc-mingw64 }"

# Let's be nice
renice 10 -p $$

# If any thing goes wrong, we'll bail out.
set -e

#
# Specify the versions
#
GCC=gcc-4.1.1
BINUTILS=binutils-2.17
W32API=w32api-3.6
# BINUTILS=binutils-2.16.91-20060119-1
CYGWIN_SNAP=20060403 # You may need to find a more recent one.
export PATH=/bin:/usr/bin:/usr/local/bin

#
# Where to install
#
# PREFIX="${PREFIX:-~/tiano/}"
PREFIX="${PREFIX:-/opt/tiano/}"

#
# Where to get the GNU tools
#
BINUTILS_URL=ftp://ftp.ibiblio.org/pub/mirrors/gnu/ftp/gnu/binutils/${BINUTILS}.tar.bz2
GCC_URL=ftp://mirrors.kernel.org/gnu/gcc/$GCC/$GCC.tar.bz2
CYG_LOC=http://cygwin.com/snapshots/cygwin-src-${CYGWIN_SNAP}.tar.bz2
W32API_LOC=http://superb-west.dl.sourceforge.net/sourceforge/mingw/${W32API}-src.tar.gz
# export http_proxy=http://proxy.dp.intel.com:911
# export ftp_proxy=http://proxy.dp.intel.com:911

#
# Uncomment one of the following depending upon which your system provides
#
#GET_COMMAND="curl --remote-name"
GET_COMMAND="wget -nc --no-directories --retr-symlinks "

#
# Allow environment to override some programs
#
MAKE="${MAKE:-make}"
export MAKE
SHELL="${SHELL:-/bin/sh}"
export SHELL

#
# Get the source
# If you don't have curl on your machine, try using
#     wget --passive-ftp --no-directories --retr-symlinks <<url>>
# If that doesn't work, try without the --passive-ftp option.
#
getSource() {
    ${GET_COMMAND}  "${BINUTILS_URL}" &
    ${GET_COMMAND}  "${GCC_URL}" &
    ${GET_COMMAND}  "${CYG_LOC}" &
    ${GET_COMMAND}  "${W32API_LOC}" &
    wait
}

#
# Unpack the source
#
unpackSource() {
    (rm -rf "${BINUTILS}"
    tar jxf "${BINUTILS}.tar.bz2"
    ) &

    (rm -rf "${GCC}"
    tar jxf "${GCC}.tar.bz2"
    ) &

    (rm -rf cygwin-snapshot-${CYGWIN_SNAP}-1/
    tar jxf cygwin-src-${CYGWIN_SNAP}.tar.bz2
    ) &

    (rm -rf ${W32API}
    tar zxf ${W32API}-src.tar.gz
    ) &

    wait

    # Apply patches
    (cd ${GCC}; patch -p1 < ../gcc_4.1.1.x86_64.061113.diff
    )

    (cd ${BINUTILS}; patch -p1 < ../binutils.diff
    )

    wait
}

CONF_SHELL="${CONF_SHELL:-/bin/bash}"
# CONF_SHELL="${CONF_SHELL:-echo}"

#
# Build
#
build() {
    for targ in $TARGS
    do (
        export pref=${PREFIX}${targ}
        export PATH="${pref}/bin:$PATH"

        ( mkdir -p build-binutils-$targ
        cd build-binutils-$targ
        "${CONF_SHELL}" "../${BINUTILS}/configure" \
            --disable-nls "--target=${targ}" "--prefix=${pref}"
        ${MAKE} -j1 -w all
        ${MAKE} -w install
        ) >> ${targ}.log 2>&1 

        (
            mkdir -p $pref/$targ/sys-include;
            cp -fr cygwin-snapshot-${CYGWIN_SNAP}-1/newlib/libc/include/* $pref/$targ/sys-include
            cp -fr cygwin-snapshot-${CYGWIN_SNAP}-1/winsup/cygwin/include/* $pref/$targ/sys-include
        ) 

        (
            mkdir -p $pref/$targ/include;
            cp -fr ${W32API}/include/* $pref/$targ/sys-include;
        ) 

        ( mkdir -p build-gcc-$targ
        cd build-gcc-$targ
        "${CONF_SHELL}" "../${GCC}/configure" "--target=${targ}" "--prefix=${pref}" \
            --with-gnu-as --with-gnu-ld --without-headers --with-newlib --verbose \
            --disable-libssp \
            --disable-nls --enable-languages=c
        ${MAKE} -j1 -w all
        ${MAKE} -w install 
        ) >> ${targ}.log 2>&1
    ) &
    done

    wait
}



#
# Do everything
#
# Comment out any activities you wish to omit
#
getSource
unpackSource
build
