summaryrefslogtreecommitdiff
path: root/contrib/arm-toolchain-build.sh
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/arm-toolchain-build.sh')
-rw-r--r--contrib/arm-toolchain-build.sh374
1 files changed, 374 insertions, 0 deletions
diff --git a/contrib/arm-toolchain-build.sh b/contrib/arm-toolchain-build.sh
new file mode 100644
index 0000000..fd75a65
--- /dev/null
+++ b/contrib/arm-toolchain-build.sh
@@ -0,0 +1,374 @@
+#!/bin/bash
+#
+# Written by Uwe Hermann <uwe@hermann-uwe.de>, released as public domain.
+# Modified by Piotr Esden-Tempski <piotr@esden.net>, released as public domain.
+# Modified by Christophe Duparquet <e39@free.fr>, released as public domain.
+
+# NOTE by esden:
+#
+# This script was contributed by Cristophe it contains several implementation
+# improvements. I did not test it myself and I know that it lacks support for
+# linaro GCC. I currenty have no time to integrate the improvements into the
+# original summon-arm-toolchain. It is a nice reference where SAR should go
+# implementationwise, IMHO. Maybe someone with some more time on their hands
+# would help out here and incorporate the improvements into the original SAR
+# that more up to date and has additional features. It would be very
+# appreciated.
+#
+# Also take a look into the HOW-TO-SUBMIT section of the main README what is
+# the prefered way to submit patches to SAR.
+
+# This script will build a GNU ARM toolchain in the directory arm-toolchain.
+# Process can be suspended and restarted at will.
+# Packages are downloaded to arm-toolchain/archives/.
+# Packages are extracted to arm-toolchain/sources/.
+# Packages are built in arm-toolchain/build/.
+# arm-toolchain/install contains the result of make install for each tool.
+# arm-toolchain/status contains the status of each part of the process (logs, errors...)
+
+
+# PACKAGE_DESCRIPTION = BASE_URL ARCHIVE_BASENAME PACKAGE_VERSION ARCHIVE_TYPE URL_OPTIONS
+#
+BINUTILS="http://ftp.gnu.org/gnu/binutils binutils 2.19.1 tar.bz2"
+GCC="ftp://ftp.lip6.fr/pub/gcc/releases/gcc-4.4.4 gcc 4.4.4 tar.bz2"
+GDB="http://ftp.gnu.org/gnu/gdb gdb 7.1 tar.bz2"
+NEWLIB="ftp://sources.redhat.com/pub/newlib newlib 1.18.0 tar.gz --no-passive-ftp"
+INSIGHT="ftp://sourceware.org/pub/insight/releases insight 6.8-1 tar.bz2"
+
+LIBCMSIS="git://git.open-bldc.org libcmsis git dir"
+LIBSTM32="git://git.open-bldc.org libstm32 git dir"
+LIBSTM32USB="git://git.open-bldc.org libstm32usb git dir"
+LIBOPENSTM32="git://libopenstm32.git.sourceforge.net/gitroot/libopenstm32 libopenstm32 git dir"
+
+
+TARGET=arm-none-eabi # Or: TARGET=arm-elf
+
+BASEDIR=$(pwd)/arm-toolchain # Base directory
+ARCHIVES=${BASEDIR}/archives # Where to store downloaded packages
+SOURCES=${BASEDIR}/sources # Where to extract packages
+BUILD=${BASEDIR}/build # Where to build packages
+STATUS=${BASEDIR}/status # Where to store building process status
+PREFIX=${BASEDIR}/install # Install location of your final toolchain
+
+PARALLEL=-j$(getconf _NPROCESSORS_ONLN)
+
+export PATH="${PREFIX}/bin:${PATH}"
+mkdir -p ${ARCHIVES} ${SOURCES} ${BUILD} ${STATUS}
+
+
+die() {
+ echo -e "\n\n**FAIL**"
+ tail ${CMD}
+ # echo -e "\nIn ${ERR} :"
+ tail ${ERR}
+ echo
+ exit
+}
+
+
+context() {
+ URL=$1
+ ANAME=$2
+ AVERSION=$3
+ ATYPE=$4
+ URL_OPTIONS=$5
+
+ SOURCE=$ANAME-$AVERSION
+ ARCHIVE=$SOURCE.$ATYPE
+}
+
+
+fetch() {
+ CMD=${STATUS}/${SOURCE}.fetch.cmd
+ LOG=${STATUS}/${SOURCE}.fetch.log
+ ERR=${STATUS}/${SOURCE}.fetch.errors
+ DONE=${STATUS}/${SOURCE}.fetch.done
+
+ if [ -e ${DONE} ]; then
+ echo "${SOURCE} already fetched"
+ return
+ fi
+
+ case ${URL} in
+ http://*)
+ COMMAND=wget
+ ;;
+ ftp://*)
+ COMMAND=wget
+ ;;
+ git://*)
+ COMMAND=git
+ ;;
+ *)
+ echo "${URL}: unknown protocol." >${ERR}
+ die
+ esac
+
+ case $COMMAND in
+ wget)
+ cd "$ARCHIVES"
+ echo -n "Downloading $ARCHIVE ... "
+ echo wget -c $URL_OPTIONS "$URL/$ARCHIVE" >${CMD}
+ wget -c $URL_OPTIONS "$URL/$ARCHIVE" >${LOG} 2>${ERR} || die
+ ;;
+ git)
+ cd "$SOURCES"
+ rm -rf "$ANAME-git"
+ echo -n "Downloading $SOURCE ... "
+ echo git clone "$URL/$ANAME.git" >${CMD}
+ ((git clone "$URL/$ANAME.git" || git clone "$URL/$ANAME") \
+ && mv ${ANAME} ${ANAME}-git) >${LOG} 2>${ERR} || die
+ ;;
+ esac
+ echo "OK."
+ touch ${DONE}
+}
+
+
+extract() {
+ CMD=${STATUS}/${SOURCE}.extract.cmd
+ LOG=${STATUS}/${SOURCE}.extract.log
+ ERR=${STATUS}/${SOURCE}.extract.errors
+ DONE=${STATUS}/${SOURCE}.extract.done
+
+ cd ${BASEDIR}
+ if [ -e ${DONE} ] ; then
+ echo "${SOURCE} already extracted"
+ else
+ echo -n "Extracting ${SOURCE} ... "
+ cd ${SOURCES}
+ case ${ATYPE} in
+ tar.gz)
+ COMMAND=xvzf
+ ;;
+ tar.bz2)
+ COMMAND=xvjf
+ ;;
+ dir)
+ COMMAND=""
+ cp -a "$SOURCES/$SOURCE" "$BUILD/$SOURCE"
+ ;;
+ *)
+ if [ -d ${ARCHIVES}/${ARCHIVE} ] ; then
+ ln -s ${ARCHIVES}/${ARCHIVE} .
+ ln -s ${ARCHIVES}/${ARCHIVE} ${BUILD}
+ touch ${DONE}
+ return
+ else
+ echo "${ARCHIVE}: unknown archive format." >${ERR}
+ die
+ fi
+ esac
+ if [ -n "$COMMAND" ] ; then
+ echo "tar $COMMAND ${ARCHIVES}/${ARCHIVE}" >${CMD}
+ tar $COMMAND ${ARCHIVES}/${ARCHIVE} >${LOG} 2>${ERR} || die
+ fi
+ echo "OK."
+ touch ${DONE}
+ fi
+}
+
+
+configure() {
+ OPTIONS=$*
+
+ unset ZPASS
+ [ -z "$PASS" ] || ZPASS=".$PASS"
+ CMD=${STATUS}/${SOURCE}.configure${ZPASS}.cmd
+ LOG=${STATUS}/${SOURCE}.configure${ZPASS}.log
+ ERR=${STATUS}/${SOURCE}.configure${ZPASS}.errors
+ DONE=${STATUS}/${SOURCE}.configure${ZPASS}.done
+
+ cd ${BASEDIR}
+ if [ -e ${DONE} ]; then
+ echo "${SOURCE} already configured"
+ else
+ echo -n "Configuring ${SOURCE} ... "
+ mkdir -p ${BUILD}/${SOURCE}
+ cd ${BUILD}/${SOURCE}
+ echo "${SOURCES}/${SOURCE}/configure $OPTIONS" >${CMD}
+ ${SOURCES}/${SOURCE}/configure $OPTIONS >${LOG} 2>${ERR} || die
+ echo "OK."
+ touch ${DONE}
+ fi
+ unset PASS ZPASS
+}
+
+
+domake() {
+ WHAT=$1 ; shift
+ OPTIONS=$*
+
+ [ -z "$WHAT" ] || ZWHAT=".$WHAT"
+ [ -z "$PASS" ] || ZPASS=".$PASS"
+ CMD=${STATUS}/${SOURCE}.make${ZWHAT}${ZPASS}.cmd
+ LOG=${STATUS}/${SOURCE}.make${ZWHAT}${ZPASS}.log
+ ERR=${STATUS}/${SOURCE}.make${ZWHAT}${ZPASS}.errors
+ DONE=${STATUS}/${SOURCE}.make${ZWHAT}${ZPASS}.done
+
+ cd ${BASEDIR}
+ if [ -e ${DONE} ]; then
+ echo "Make ${SOURCE} \"${WHAT}\" already done"
+ else
+ echo -n "Make ${SOURCE} \"${WHAT}\" ... "
+ cd ${BUILD}/${SOURCE}
+ echo "make ${WHAT} $OPTIONS" >${CMD}
+ make ${PARALLEL} ${WHAT} $OPTIONS >${LOG} 2>${ERR} || die
+ echo "OK."
+ touch ${DONE}
+ fi
+ unset PASS ZPASS ZWHAT
+}
+
+
+# Binutils
+#
+context $BINUTILS
+fetch
+extract
+configure \
+ --target=${TARGET} \
+ --prefix=${PREFIX} \
+ --enable-interwork \
+ --enable-multilib \
+ --with-gnu-as \
+ --with-gnu-ld \
+ --disable-nls \
+ --disable-werror
+domake
+domake install
+
+
+# GCC pass 1
+#
+context $GCC
+fetch
+extract
+PASS=1 configure \
+ --target=${TARGET} \
+ --prefix=${PREFIX} \
+ --enable-interwork \
+ --enable-multilib \
+ --enable-languages="c" \
+ --with-newlib \
+ --without-headers \
+ --disable-shared \
+ --with-gnu-as \
+ --with-gnu-ld \
+ --disable-nls \
+ --disable-werror
+PASS=1 domake all-gcc
+PASS=1 domake install-gcc
+
+
+# Newlib
+#
+context $NEWLIB
+fetch
+extract
+configure \
+ --target=${TARGET} \
+ --prefix=${PREFIX} \
+ --enable-interwork \
+ --enable-multilib \
+ --with-gnu-as \
+ --with-gnu-ld \
+ --disable-nls \
+ --disable-werror \
+ --disable-newlib-supplied-syscalls
+domake
+domake install
+
+
+# GCC pass 2
+#
+context $GCC
+# rm -rf ${BUILD}/${SOURCE}
+# rm ${STATUS}/${SOURCE}.configure.done
+PASS=2 configure \
+ --target=${TARGET} \
+ --prefix=${PREFIX} \
+ --enable-interwork \
+ --enable-multilib \
+ --enable-languages="c,c++" \
+ --with-newlib \
+ --disable-shared \
+ --with-gnu-as \
+ --with-gnu-ld \
+ --disable-nls \
+ --disable-werror
+PASS=2 domake
+PASS=2 domake install
+
+
+# GDB
+#
+context $GDB
+fetch
+extract
+configure \
+ --target=${TARGET} \
+ --prefix=${PREFIX} \
+ --enable-interwork \
+ --enable-multilib \
+ --disable-werror
+domake
+domake install
+
+
+# Insight
+#
+context $INSIGHT
+fetch
+extract
+configure \
+ --target=${TARGET} \
+ --prefix=${PREFIX} \
+ --enable-languages=c,c++ \
+ --enable-thumb \
+ --enable-interwork \
+ --enable-multilib \
+ --enable-tui \
+ --with-newlib \
+ --disable-werror \
+ --disable-libada \
+ --disable-libssp \
+ --with-expat
+domake
+domake install
+
+
+# libcmsis
+#
+context $LIBCMSIS
+fetch
+extract
+domake "" arch_prefix=${TARGET} prefix=${PREFIX}
+domake install arch_prefix=${TARGET} prefix=${PREFIX}
+
+
+# libstm32
+#
+context $LIBSTM32
+fetch
+extract
+domake "" arch_prefix=${TARGET} prefix=${PREFIX}
+domake install arch_prefix=${TARGET} prefix=${PREFIX}
+
+
+# libstm32usb
+#
+context $LIBSTM32USB
+fetch
+extract
+domake "" arch_prefix=${TARGET} prefix=${PREFIX}
+domake install arch_prefix=${TARGET} prefix=${PREFIX}
+
+
+# libopenstm32
+#
+context $LIBOPENSTM32
+fetch
+extract
+domake "" DESTDIR=${PREFIX} PREFIX=${TARGET}
+domake install DESTDIR=${PREFIX} PREFIX=${TARGET}