#!/bin/bash

# Tested on 
# - Fedora Core 13
# - Ubuntu 11.04

# First, detect distribution
DISTRIBUTION=""

if [ -e "/etc/redhat-release" ]; then
	DISTRIBUTION="redhat"
elif [ -e "/etc/debian_version" ]; then
        DISTRIBUTION="debian"
fi

if [ "$DISTRIBUTION" == "" ]; then
	echo "Unknown distribution"
	exit 1
fi

function ensureInstalled ()
{
	PACKAGE=$1

	if [ "$DISTRIBUTION" == "redhat" ]; then
		rpm -ql $PACKAGE > /dev/null
		if [ $? -ne 0 ]; then
			sudo yum install $PACKAGE
		fi
	fi
	if [ "$DISTRIBUTION" == "debian" ]; then
		dpkg -L $PACKAGE > /dev/null
		if [ $? -ne 0 ]; then
			sudo apt-get install $PACKAGE
		fi
	fi
}

if [ "$DISTRIBUTION" == "redhat" ]; then
	ensureInstalled gmp-devel
	ensureInstalled mpfr-devel
	ensureInstalled libmpc-devel
elif [ "$DISTRIBUTION" == "debian" ]; then
	ensureInstalled libgmp3-dev
	ensureInstalled libmpfr-dev
	ensureInstalled libmpc-dev
fi


function gitUpdate()
{
	SRC_ROOT=$1
	DIR=$2
	URL=$3
	if [ -e "$DIR" ]; then
		cd $DIR
		echo "Updating $DIR..."
		git pull
	else
		cd $SRC_ROOT
		git clone "$URL" "$DIR"
        fi
}

# Prepare the root area
export MSP430_ROOT=${PWD}
mkdir -p ${MSP430_ROOT}

SRC_ROOT="${MSP430_ROOT}"
BINUTILS_DIR="${SRC_ROOT}/binutils"
GCC_DIR="${SRC_ROOT}/gcc"
MSP430_LIBC_DIR="${SRC_ROOT}/msp430-libc"
MSP430_MCU_DIR="${SRC_ROOT}/msp430mcu"
MSPGCC_DIR="${SRC_ROOT}/mspgcc"

echo "Checkout root is $SRC_ROOT"

gitUpdate "$SRC_ROOT" "$BINUTILS_DIR" "git://mspgcc.git.sourceforge.net/gitroot/mspgcc/binutils"
gitUpdate "$SRC_ROOT" "$GCC_DIR" "git://mspgcc.git.sourceforge.net/gitroot/mspgcc/gcc"
gitUpdate "$SRC_ROOT" "$MSP430_LIBC_DIR" "git://mspgcc.git.sourceforge.net/gitroot/mspgcc/msp430-libc"
gitUpdate "$SRC_ROOT" "$MSP430_MCU_DIR" "git://mspgcc.git.sourceforge.net/gitroot/mspgcc/msp430mcu"
gitUpdate "$SRC_ROOT" "$MSPGCC_DIR" "git://mspgcc.git.sourceforge.net/gitroot/mspgcc/mspgcc"

INSTALL_DIR="${MSP430_ROOT}/install"
BUILD_ROOT="${MSP430_ROOT}/BUILD"

mkdir -p $INSTALL_DIR

mkdir -p $BUILD_ROOT/binutils/dev
cd $BUILD_ROOT/binutils/dev
$BINUTILS_DIR/configure \
  --target=msp430 \
  --prefix=${INSTALL_DIR} \
  2>&1 | tee co
make 2>&1 | tee mo
make check-gas RUNTESTFLAGS=msp430.exp
make install 2>&1 | tee moi

export PATH="${INSTALL_DIR}/bin:${PATH}"

mkdir -p ${BUILD_ROOT}/gcc/dev
cd ${BUILD_ROOT}/gcc/dev
${GCC_DIR}/configure \
  --target=msp430 \
  --enable-languages=c,c++ \
  --prefix=${INSTALL_DIR} \
  2>&1 | tee co
make 2>&1 | tee mo
make check-gcc RUNTESTFLAGS=msp430.exp
make install 2>&1 | tee moi

cd ${MSP430_LIBC_DIR}/src
rm -rf Build
make PREFIX=${INSTALL_DIR} 2>&1 | tee mo
make PREFIX=${INSTALL_DIR} install 2>&1 | tee moi

cd ${MSP430_MCU_DIR}
sh scripts/install.sh ${INSTALL_DIR}

