#!/bin/bash
# $Id: eBuild-uCLinux,v 1.1.2.20 2005/02/25 17:12:44 release Exp $

# Exit on any error.
set -e

# Don't tweak these for each branch.  Instead, use command line arguements!
RELEASE=frv-050408
REVISION=1
HOST=i686-pc-linux-gnulibc2.2
BUILD=$HOST
TARGET=frv-uclinux
ARCH=frv
TOOLCONF=""
NATIVE=""
LANGUAGES="c,c++" # ,java
PREFIX=/opt/redhat/${RELEASE}-${REVISION}
TOPDIR=`pwd`
EXECPREFIX=$PREFIX/H-$HOST
TOOLCHAIN=$TOPDIR/X-tools-build
UCLIBC=$TOPDIR/X-uclibc-build
SRCTOP=$TOPDIR/sources
DEVO=$SRCTOP/tools-src
ABIHEADERS=$SRCTOP/header-src
UCLIBCSRC=$SRCTOP/uclibc-src
SYSROOT=$EXECPREFIX/${TARGET}/sys-root

while [ $# -ne 0 ]; do
    option=$1
    shift

    optarg=""
    case $option in
    --*=*)
        optarg=`echo $option | sed -e 's/^[^=]*=//'`
        ;;
    esac

    case $option in
    --x|-x|--debug|-D)
        set -x
        ;;
    --topd*)
        TOPDIR=$optarg
	TOOLCHAIN=$TOPDIR/X-tools-build
	UCLIBC=$TOPDIR/X-uclibc-build
        ;;
    --native*)
        NATIVE=$optarg
        ;;
    --lang*)
        LANGUAGES=$optarg
        ;;
    --sysroot*)
        SYSROOT=$optarg
        ;;
    --prefix*)
        PREFIX=$optarg
	EXECPREFIX=$PREFIX/H-$HOST
        ;;
    --host*)
        HOST=$optarg
	EXECPREFIX=$PREFIX/H-$HOST
        ;;
    --target*)
        TARGET=$optarg
	SYSROOT=$EXECPREFIX/${TARGET}/sys-root
        ;;
    --build*)
        BUILD=$optarg
        ;;
    --arch*)
        ARCH=$optarg
        ;;
    --toolconf*)
        TOOLCONF="$optarg"
        ;;
    --rev*)
        REVISION=$optarg
	PREFIX=/opt/redhat/${RELEASE}-${REVISION}
	EXECPREFIX=$PREFIX/H-$HOST
	SYSROOT=$EXECPREFIX/${TARGET}/sys-root
        ;;
    --rel*)
        RELEASE=$optarg
	PREFIX=/opt/redhat/${RELEASE}-${REVISION}
	EXECPREFIX=$PREFIX/H-$HOST
	SYSROOT=$EXECPREFIX/${TARGET}/sys-root
        ;;
    --srctop*)
	SRCTOP="$optarg"
	DEVO=$SRCTOP/tools-src
	ABIHEADERS=$SRCTOP/header-src
	UCLIBCSRC=$SRCTOP/uclibc-src
        ;;
    --uclibcsrc*)
        case "$optarg" in
          /*) UCLIBCSRC="$optarg" ;;
          *)  UCLIBCSRC="$SRCTOP/$optarg" ;;
	esac
        ;;
    --abiheaders*)
        case "$optarg" in
          /*) ABIHEADERS="$optarg" ;;
          *)  ABIHEADERS="$SRCTOP/$optarg" ;;
	esac
        ;;
    --devo*)
        case "$optarg" in
          /*) DEVO="$optarg" ;;
          *)  DEVO="$SRCTOP/$optarg" ;;
	esac
        ;;
    esac
done

if [ X"$NATIVE" != X ]; then
  PATH="$NATIVE/H-$BUILD/bin:$PATH"
else
  PATH="$NATIVE/H-$BUILD/bin:$EXECPREFIX/bin:$PATH"
fi
export PATH

# Our UTF-8 support sucks hard. Make the build not take three years
export LANG=C

function xterm-title () {
    if [ $TERM = xterm ]; then
        echo -e "\033]2;$@\007"
    fi
}

function check_make()
{
    mkdir -p $1

    if [ ! -d $1 ]; then
	echo "Cannot create $1. Abort."
	exit 1
    fi
}

check_make $PREFIX
check_make $TOPDIR
check_make $SYSROOT
check_make $UCLIBC

# Configure uClibc so it builds its headers

xterm-title "Building uClibc generated headers"

mkdir -p $UCLIBC
rsync -a --delete $UCLIBCSRC/ $UCLIBC/
cd $UCLIBC
cp extra/Configs/Config.${ARCH}.default .config
make TARGET_ARCH=${ARCH} KERNEL_SOURCE=$ABIHEADERS/usr oldconfig
make TARGET_ARCH=${ARCH} KERNEL_SOURCE=$ABIHEADERS/usr headers

# Set up the sysroot
xterm-title "Copying header files into sysroot $SYSROOT"

mkdir -p $SYSROOT/usr
make PREFIX=$SYSROOT TARGET_ARCH=${ARCH} KERNEL_SOURCE=$ABIHEADERS/usr install_dev

# Build toolchain basics...

xterm-title "Configuring toolchain"

rm -rf $TOOLCHAIN
mkdir -p $TOOLCHAIN
cd $TOOLCHAIN
$DEVO/configure --host=${HOST} --build=${BUILD} --target=${TARGET} --with-sysroot=${SYSROOT}  --prefix=${PREFIX} --exec-prefix=${EXECPREFIX} --enable-languages=${LANGUAGES} ${TOOLCONF}

xterm-title "Building binutils"
make all-binutils all-gas all-ld 

xterm-title "Building GCC and static libgcc"
make configure-gcc
make -C gcc SHLIB_LINK= all

xterm-title "Installing binutils and GCC into $PREFIX"

make install-binutils install-gas install-ld
make -C gcc SHLIB_LINK= install

# Build uClibc

xterm-title "Building uClibc"

cd $UCLIBC
make CROSS=$EXECPREFIX/bin/${TARGET}- CC="$EXECPREFIX/bin/${TARGET}-gcc" KERNEL_SOURCE=$ABIHEADERS/usr

xterm-title "Installing uClibc into $SYSROOT"

rm -rf $SYSROOT
make PREFIX=$SYSROOT CROSS=$EXECPREFIX/bin/${TARGET}- KERNEL_SOURCE=$ABIHEADERS/usr install

# Now the rest...

xterm-title "Building shared libgcc and remainder of toolchain"

cd $TOOLCHAIN
rm -f gcc/libgcc.mk
make -C gcc clean
make

xterm-title "Final install of toolchain"
make install

# Rebuild uClibc

xterm-title "Building uClibc"

cd $UCLIBC
make clean
cp extra/Configs/Config.${ARCH}.default .config
make TARGET_ARCH=${ARCH} KERNEL_SOURCE=$ABIHEADERS/usr oldconfig
make CROSS=$EXECPREFIX/bin/${TARGET}- CC="$EXECPREFIX/bin/${TARGET}-gcc" KERNEL_SOURCE=$ABIHEADERS/usr

xterm-title "Installing final uClibc into $SYSROOT"

rm -rf $SYSROOT
make PREFIX=$SYSROOT CROSS=$EXECPREFIX/bin/${TARGET}- KERNEL_SOURCE=$ABIHEADERS/usr install
