blob: b2894daaae426ab1cfaab223bd3164f3967ea3df [file] [log] [blame]
#!/usr/bin/env bash
OS=`uname`
HOSTARCH=`uname -m`
PARALLEL=-j8
GNU_FTP=ftp://ftp.gnu.org/gnu
FETCH=1
ARCHIVES=archives
if [ "x$ARCHES" = "x" ]; then
echo need to specify architectures to build in the ARCHES environment variable
echo ie. ARCHES=\"arm sh\"
exit 1
fi
if [ "$OS" = "Linux" ]; then
COUNT=`grep processor /proc/cpuinfo | wc -l`
PARALLEL=-j`expr $COUNT + $COUNT`
fi
if [ "$OS" = "Darwin" ]; then
export CPPFLAGS=-I/opt/local/include
export LDFLAGS=-L/opt/local/lib
fi
if [ "$OS" = "FreeBSD" ]; then
export CPPFLAGS=-I/usr/local/include
export LDFLAGS=-L/usr/local/lib
fi
MAKE=make
if [ "$OS" = "FreeBSD" ]; then
MAKE=gmake
fi
if [ "$HOSTARCH" = "amd64" ]; then
HOSTARCH=x86_64
fi
# load GCCVER and BINVER
. toolvers
if [ "$FETCH" = "1" ]; then
if [ ! -f binutils-$BINVER.tar.bz2 ]; then
wget -P $ARCHIVES -N $GNU_FTP/binutils/binutils-$BINVER.tar.bz2
fi
if [ ! -f gcc-$GCCVER.tar.bz2 ]; then
wget -P $ARCHIVES -N $GNU_FTP/gcc/gcc-$GCCVER/gcc-$GCCVER.tar.bz2
fi
if [ ! -f gdb-$GDBVER.tar.bz2 ]; then
wget -P $ARCHIVES -N $GNU_FTP/gdb/gdb-$GDBVER.tar.bz2
fi
if [ ! -f mpfr-$MPFRVER.tar.bz2 ]; then
wget -P $ARCHIVES -N $GNU_FTP/mpfr/mpfr-$MPFRVER.tar.bz2
fi
if [ ! -f mpc-$MPCVER.tar.gz ]; then
wget -P $ARCHIVES -N $GNU_FTP/mpc/mpc-$MPCVER.tar.gz
fi
if [ ! -f gmp-$GMPVER.tar.bz2 ]; then
wget -P $ARCHIVES -N $GNU_FTP/gmp/gmp-$GMPVER.tar.bz2
fi
fi
function extract-tool()
{
#echo "extract-tool " $1 $2 $3 $4
TARFILE=${1}-${2}.tar$3
TARGETDIR=${1}-${2}
if [ -f ${TARGETDIR}/.extracted ]; then
echo "$TARFILE already extracted into $TARGETDIR, skipping"
return 0
fi
if [ ! -f $ARCHIVES/$TARFILE ]; then
echo "error, missing $TARFILE"
exit 1
fi
echo extracting $TARFILE
rm -rf $TARGETDIR
tar xf $ARCHIVES/$TARFILE || exit 1
if [ ! -z "$4" ]; then
echo patching $1
patch -d $TARGETDIR -p1 < $4 || exit 1
fi
touch $TARGETDIR/.extracted || exit 1
}
if [ ! -f .extracted-stamp ]; then
extract-tool binutils $BINVER .bz2 binutils-patch.txt
extract-tool gcc $GCCVER .bz2 gcc-patch.txt
extract-tool gdb $GDBVER .bz2 gdb-patch.txt
extract-tool gmp $GMPVER .bz2
extract-tool mpc $MPCVER .gz
extract-tool mpfr $MPFRVER .bz2
touch .extracted-stamp
fi
# link the last three libs into gcc
pushd gcc-$GCCVER
ln -sf ../gmp-$GMPVER gmp
ln -sf ../mpc-$MPCVER mpc
ln -sf ../mpfr-$MPFRVER mpfr
popd
for ARCH in $ARCHES; do
if [ "$ARCH" == "arm" ]; then
TARGET=arm-eabi
else
TARGET=$ARCH-elf
fi
INSTALLPATH=`pwd`/$TARGET-$GCCVER-$OS-$HOSTARCH
BINBUILDPATH=build-binutils-$BINVER-$ARCH-$OS-$HOSTARCH
GCCBUILDPATH=build-gcc-$GCCVER-$ARCH-$OS-$HOSTARCH
GDBBUILDPATH=build-gdb-$GDBVER-$ARCH-$OS-$HOSTARCH
export PATH=$INSTALLPATH/bin:$PATH
if [ ! -f $BINBUILDPATH/built.txt ]; then
mkdir -p $BINBUILDPATH
pushd $BINBUILDPATH &&
../binutils-$BINVER/configure --target=$TARGET --prefix=$INSTALLPATH --disable-werror &&
#$MAKE configure-host &&
$MAKE $PARALLEL &&
$MAKE install &&
touch built.txt || exit 1
popd
fi
if [ ! -f $GCCBUILDPATH/built.txt ]; then
ARCH_OPTIONS=
if [ $ARCH == "arm" ]; then
ARCH_OPTIONS="--with-cpu=arm926ej-s --with-fpu=vfp"
fi
mkdir -p $GCCBUILDPATH
pushd $GCCBUILDPATH &&
../gcc-$GCCVER/configure --target=$TARGET --prefix=$INSTALLPATH --enable-languages=c,c++ $ARCH_OPTIONS --disable-werror &&
$MAKE all-gcc $PARALLEL &&
$MAKE all-target-libgcc $PARALLEL &&
$MAKE install-gcc &&
$MAKE install-target-libgcc &&
touch built.txt || exit 1
popd
fi
if [ ! -f $GDBBUILDPATH/built.txt ]; then
mkdir -p $GDBBUILDPATH
pushd $GDBBUILDPATH &&
../gdb-$GDBVER/configure --target=$TARGET --prefix=$INSTALLPATH --disable-werror &&
make $PARALLEL &&
make install &&
touch built.txt || exit 1
popd
fi
done