| #!/usr/bin/env bash |
| |
| OS=`uname` |
| HOSTARCH=`uname -m` |
| ARCHSUFFIX=.xz |
| PARALLEL=-j8 |
| GNU_FTP=ftp://ftp.gnu.org/gnu |
| |
| 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" = "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 |
| ARCHSUFFIX=.bz2 |
| wget -N $GNU_FTP/binutils/binutils-$BINVER.tar$ARCHSUFFIX |
| wget -N $GNU_FTP/gcc/gcc-$GCCVER/gcc-$GCCVER.tar$ARCHSUFFIX |
| wget -N $GNU_FTP/gdb/gdb-$GDBVER.tar$ARCHSUFFIX |
| fi |
| |
| if [ ! -d binutils-$BINVER.patched ]; then |
| echo extracting binutils-$BINVER.tar${ARCHSUFFIX} |
| rm -rf binutils-$BINVER |
| tar xf binutils-$BINVER.tar${ARCHSUFFIX} || exit 1 |
| echo patching binutils |
| patch -d binutils-$BINVER -p1 < binutils-patch.txt || exit 1 |
| rm -rf binutils-$BINVER.patched |
| mv binutils-$BINVER binutils-$BINVER.patched |
| fi |
| if [ ! -d gcc-$GCCVER.patched ]; then |
| echo extracting gcc-$GCCVER.tar${ARCHSUFFIX} |
| rm -rf gcc-$GCCVER |
| tar xf gcc-$GCCVER.tar${ARCHSUFFIX} || exit 1 |
| echo patching gcc |
| patch -d gcc-$GCCVER -p1 < gcc-patch.txt || exit 1 |
| |
| rm -rf gcc-$GCCVER.patched |
| mv gcc-$GCCVER gcc-$GCCVER.patched |
| fi |
| if [ ! -d gdb-$GDBVER.patched ]; then |
| echo extracting gdb-$GDBVER.tar${ARCHSUFFIX} |
| rm -rf gdb-$GDBVER |
| tar xf gdb-$GDBVER.tar${ARCHSUFFIX} || exit 1 |
| echo patching gdb |
| patch -d gdb-$GDBVER -p1 < gdb-patch.txt || exit 1 |
| |
| rm -rf gdb-$GDBVER.patched |
| mv gdb-$GDBVER gdb-$GDBVER.patched |
| fi |
| |
| 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.patched/configure --target=$TARGET --prefix=$INSTALLPATH && |
| #$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.patched/configure --target=$TARGET --prefix=$INSTALLPATH --enable-languages=c,c++ $ARCH_OPTIONS && |
| $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.patched/configure --target=$TARGET --prefix=$INSTALLPATH && |
| make $PARALLEL && |
| make install && |
| touch built.txt || exit 1 |
| popd |
| fi |
| done |