#!/bin/sh

#
# A script to build the crossutils for a set of platforms.
# Note:cygwin seems to like to have all platforms qualified.
#

BASE=~

# where to store the built tree of binutils?
DESTDIR=${BASE}/cross

# directory where logs go
LOGDIR=${BASE}/logs

# where can I decrunch and build?
WORKDIR=${BASE}/buildme

# where is the binutils archive?
BINUTILSPATH=~

# what is it's base name?
BINUTILSBASE=binutils

# what is the version part of the archive?
BINUTILSVERSION=2.14

# is binutils archive gz or bz2? 
BINUTILS_GZIP=no

# what i6868 platform do you want/need to build for?
MYINTEL=i686

# target info, OSes per processor with "WIN" as special case

BSD="freebsd netbsd openbsd"
TARGETS_WIN="cygwin mingw32 msdosdjgpp"
TARGETS_I386="${BSD} linux solaris darwin"
TARGETS_X86_64="${BSD} linux"
TARGETS_POWERPC="${BSD} linux darwin"
TARGETS_SPARC="${BSD} linux solaris"
#TARGETS_M68k=   


# I use the below because my default system is dual proc.
#EXTRAOPT=-j 4

###########################################################################
# don't edit below
#
#
#
#

LD_FLAGS="${LD_FLAGS} -static"
LDFLAGS="${LD_FLAGS} -s"
CFLAGS="${CFLAGS} -static"
CPPFLAGS="${CPPFLAGS} -static"
CXXFLAGS="${CXXFLAGS} -static"

#
# Make a list of targets
#

TARGETS=""

for OS in ${TARGETS_WIN}; do
TARGETS="${TARGETS} ${MYINTEL}-${OS}"
done;

for OS in ${TARGETS_I386}; do
TARGETS="${TARGETS} ${MYINTEL}-${OS}"
done;

for OS in ${TARGETS_X86_64}; do
TARGETS="${TARGETS} x86_64-${OS}"
done;

for OS in ${TARGETS_POWERPC}; do
TARGETS="${TARGETS} powerpc-${OS}"
done;

for OS in ${TARGETS_SPARC}; do
TARGETS="${TARGETS} sparc-${OS}"
done;

for OS in ${TARGETS_M68K}; do
TARGETS="${TARGETS} m68k-${OS}"
done;

#
# force slash
#

DESTDIR=${DESTDIR%/}/
WORKDIR=${WORKDIR%/}/
LOGDIR=${LOGDIR%/}/
BINUTILSPATH=${BINUTILSPATH%/}/
BINUTILSARCHIVE=${BINUTILSPATH}${BINUTILSBASE}-${BINUTILSVERSION}
MAKE=make

#
# Make sure they exist
#
 
mkdir -p $DESTDIR
mkdir -p $WORKDIR
mkdir -p $LOGDIR

#
# BSD? -> gmake
#

SYSTEM=`uname -s`

case "$SYSTEM" in
 *BSD*) MAKE=gmake
  ;;
 *bsd*) MAKE=gmake  
  ;;
esac

#
# tar.gz or .tar.bz2 ?
#

if [ $BINUTILS_GZIP = "no" ] ; then
BINUTILSARCHIVE=${BINUTILSARCHIVE}.tar.bz2
else
BINUTILSARCHIVE=${BINUTILSARCHIVE}.tar.gz
fi

#
# depack or clean  dir
#

cd ${WORKDIR}

if [ ! -d ${WORKDIR}${BINUTILSBASE}-${BINUTILSVERSION} ]; then
if [ $BINUTILS_GZIP = "no" ]; then
bzip2 -dc  $BINUTILSARCHIVE |tar xvf -       >  ${LOGDIR}log-extract
else
tar xvzf $BINUTILSARCHIVE  >  ${LOGDIR}log-extract
fi

if [ ! $? = 0 ]; then
echo DECRUNCHING OF ${BINUTILSARCHIVE} failed
exit
fi
else 
echo It seams that you already have a build directory. Skipping.
cd ${WORKDIR}${BINUTILSBASE}-${BINUTILSVERSION}
${MAKE} clean >/dev/null
fi

cd ${WORKDIR}${BINUTILSBASE}-${BINUTILSVERSION}

#
# build loop.
#

FAILURES=""
for a in $TARGETS; do
if [ ! -f ${DESTDIR}bin/${a}-as ] ; then
rm ./config.cache
find ./ -type f -name config.cache -exec /bin/rm {} \;
echo Building $a
{ ./configure --disable-nls --disable-shared --target=$a --prefix=${DESTDIR} && ${MAKE} $(EXTRAOPT) && ${MAKE} install && ${MAKE} clean; } > ${LOGDIR}log-${a} 2>&1

if [ ! $? = 0 ]; then
echo $a FAILES!
FAILURES="${FAILURES} ${a}"
fi
fi
done;

echo Failed targets:  ${FAILURES}
