blob: 1ddd447e4c5941bc57ec3dacb1f464bf2b88dae4 [file] [log] [blame]
#!/usr/bin/env bash
OS=`uname`
HOSTARCH=`uname -m`
PARALLEL=
FETCH=0
QUIET=0
GNU_FTP=ftp://ftp.gnu.org/gnu
ARCHIVES=archives
PATCHES=./patches/
# Get absolute path, will spawn a subshell then exit so our pwd is retained
SCRIPTROOT=$(cd "$(dirname $0)" && pwd)
# Cause errors in pipes to return failure when necessary
set -o pipefail
set -e
function err() {
echo error during build
if [ "$QUIET" = "1" ]; then
echo dumping build log...
cat $SCRIPTROOT/build.log
fi
}
trap err ERR
function help()
{
echo "Options"
echo " -a <arch list> architectures to build"
echo " example: -a 'arm x86'"
echo " -c use compilation cache (ccache must be installed)"
echo " -f fetch source releases from upstream"
echo " -h|-? display this help message"
echo " -j<#> use <#> parallel workers to build"
echo " -q make the build quieter"
exit 1
}
function log()
{
if [ "$QUIET" = "1" ]; then
"$@" >> $SCRIPTROOT/build.log 2>&1
else
"$@" 2>&1 | tee -a $SCRIPTROOT/build.log
fi
}
function extract-tool()
{
#echo "extract-tool " $1 $2 $3 $4
TARFILE=${1}-${2}.tar$3
TARGETDIR=${1}-${2}
if [ -f ${TARGETDIR}/.extracted ]; then
log echo "$TARFILE already extracted into $TARGETDIR, skipping"
return 0
fi
if [ ! -f $ARCHIVES/$TARFILE ]; then
log echo "error, missing $TARFILE"
exit 1
fi
echo extracting $TARFILE
log echo extracting $TARFILE
rm -rf $TARGETDIR
tar xf $ARCHIVES/$TARFILE || exit 1
if [ ! -z "$4" ]; then
log echo patching $1
log patch -d $TARGETDIR -p1 < $4 || exit 1
fi
touch $TARGETDIR/.extracted || exit 1
}
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
export CXXFLAGS="-fbracket-depth=1024"
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
if [ $# == "0" ]; then
help
fi
while getopts a:cfhj:q? arg
do
case $arg in
a ) ARCHES=$OPTARG ;;
c ) CCACHE=1 ;;
j ) PARALLEL="-j$OPTARG" ;;
f ) FETCH=1 ;;
q ) QUIET=1 ;;
h ) help ;;
? ) help ;;
* ) echo "unrecognized option '$arg'" ; exit 1 ;;
esac
done
if [ -z "$ARCHES" ]; then
echo need to specify architectures to build
echo ie -a "arm sh"
exit 1
fi
export CC="cc"
export CXX="c++"
if [ "$CCACHE" = "1" ]; then
export CC="ccache $CC"
export CXX="ccache $CXX"
fi
log date
log echo "ARCHES='$ARCHES' PARALLEL='$PARALLEL' FETCH='$FETCH' CCACHE='$CCACHE'"
# load GCCVER and BINVER
. toolvers
if [ "$FETCH" = "1" ]; then
if [ ! -f binutils-$BINVER.tar.bz2 ]; then
log wget -P $ARCHIVES -N $GNU_FTP/binutils/binutils-$BINVER.tar.bz2
fi
if [ ! -f gcc-$GCCVER.tar.bz2 ]; then
log wget -P $ARCHIVES -N $GNU_FTP/gcc/gcc-$GCCVER/gcc-$GCCVER.tar.bz2
fi
if [ ! -f gdb-$GDBVER.tar.xz ]; then
log wget -P $ARCHIVES -N $GNU_FTP/gdb/gdb-$GDBVER.tar.xz
fi
if [ ! -f mpfr-$MPFRVER.tar.bz2 ]; then
log wget -P $ARCHIVES -N $GNU_FTP/mpfr/mpfr-$MPFRVER.tar.bz2
fi
if [ ! -f mpc-$MPCVER.tar.gz ]; then
log wget -P $ARCHIVES -N $GNU_FTP/mpc/mpc-$MPCVER.tar.gz
fi
if [ ! -f gmp-$GMPVER.tar.bz2 ]; then
log wget -P $ARCHIVES -N $GNU_FTP/gmp/gmp-$GMPVER.tar.bz2
fi
fi
if [ ! -f .extracted-stamp ]; then
extract-tool binutils $BINVER .bz2 $PATCHES/binutils-patch.txt
extract-tool gcc $GCCVER .bz2 $PATCHES/gcc-patch.txt
extract-tool gdb $GDBVER .xz $PATCHES/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
# Building Binutils
if [ ! -f $BINBUILDPATH/built.txt ]; then
echo building binutils
mkdir -p $BINBUILDPATH
pushd $BINBUILDPATH
log ../binutils-$BINVER/configure --target=$TARGET --prefix=$INSTALLPATH --disable-werror
log $MAKE $PARALLEL
log $MAKE install
touch built.txt
popd
fi
# Building GCC
if [ ! -f $GCCBUILDPATH/built.txt ]; then
echo building gcc
ARCH_OPTIONS=
if [ $ARCH == "arm" ]; then
ARCH_OPTIONS="--with-cpu=arm926ej-s --with-fpu=vfp"
fi
mkdir -p $GCCBUILDPATH
pushd $GCCBUILDPATH
log ../gcc-$GCCVER/configure --target=$TARGET --prefix=$INSTALLPATH --enable-languages=c,c++ $ARCH_OPTIONS --disable-werror
log $MAKE all-gcc $PARALLEL
log $MAKE all-target-libgcc $PARALLEL
log $MAKE install-gcc
log $MAKE install-target-libgcc
touch built.txt
popd
fi
if [ ! -f $GDBBUILDPATH/built.txt ]; then
echo building gdb
mkdir -p $GDBBUILDPATH
pushd $GDBBUILDPATH
log ../gdb-$GDBVER/configure --target=$TARGET --prefix=$INSTALLPATH --disable-werror
log make $PARALLEL
log make install
touch built.txt
popd
fi
done
echo all done