Compilation d'une chaine de compilation ARM (Brew, Symbian, WiMo ...)

Script compilant une chaine de compilation ARM pouvant servir pour Brew, Symbian, Windows Mobile ... n'importe quel OS fonctionnant avec un processeur ARM.

Commentaires du script :

On installe des paquets essentiels :

#!/bin/bash

#echo "Press Key - Installing ${TARGET} for build the Cross Compil Chain for Brew"
#sudo apt-get update
#sudo apt-get install libncurses5-dev gcc texinfo libmpc-dev libmpfr-dev

On définie le format de sortie du compilateur:

#Target
#TARGET=arm-none-eabi
TARGET=arm-elf

Les différentes version des composants principaux de la chaine complète de compilation :
- binutils ou GNU Binary Utilities: des outils manipulant le format binaire.
- gcc ou GNU Compiler Collection: le compilateur à proprement parlé.
- newlib ou The Red Hat newlib C Library: une librairie, écrite en C. (fournie notamment stdlib.h)
- gdb ou GNU Debugger

#Versions
BINUTILS_VER=2.20.1
GCC_VER=4.5.0
NEWLIB_VER=1.18.0
GDB_VER=7.1

Ici on lui indique où l'on veut qu'il se compile, assemble, link ... :

PREFIX=/opt/toolchains/${TARGET}_${BINUTILS_VER}_${GCC_VER}_${NEWLIB_VER}_${GDB_VER}

Et enfin un échantillon des nombreuses options à ajuster pour compiler sur un OS, plutôt qu'un autre:

#Options
BINUTILS_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --enable-interwork --enable-multilib --disable-nls --disable-shared --disable-threads --with-gcc --with-gnu-as --with-gnu-ld'
#BOOT_GCC_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --enable-interwork --enable-multilib --disable-nls --disable-shared --disable-threads --disable-libstdc++ --disable-libssp --disable-libstdcxx-pch --disable-libmudflap --disable-libgomp --with-gmp='${PREFIX}' --with-mpfr='${PREFIX}' --with-mpc='${PREFIX}' --enable-languages=c --with-newlib --with-headers=../newlib-'${NEWLIB_VER}'/newlib/libc/include --with-gcc --with-gnu-as --with-dwarf2 -v'
#--with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}'
#GCC_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --disable-nls --with-headers=yes --disable-libgomp --enable-poison-system-directories --with-float=soft --disable-werror'
GCC_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --disable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-languages=c,c++ --disable-shared --with-newlib --disable-nls --with-headers=yes --disable-libgomp --with-float=soft --disable-werror'
#--with-gmp='${PREFIX}' --with-mpfr='${PREFIX} '--with-headers=../newlib-'${NEWLIB_VER}'/newlib/libc/include --with-mpc='${PREFIX}
#GCC_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --enable-interwork --enable-multilib --disable-nls --disable-shared --disable-threads --with-gcc --with-gnu-as --with-gnu-ld --with-dwarf2 --enable-languages=c,c++ --with-newlib --with-headers=../newlib-'${NEWLIB_VER}'/newlib/libc/include --disable-libssp --disable-libstdcxx-pch --disable-libmudflap --disable-libgomp --with-gmp='${PREFIX}' --with-mpfr='${PREFIX}' --with-mpc='${PREFIX}' -v'
GDB_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --disable-nls'
NEWLIB_OPTIONS='--target='${TARGET}' --prefix='${PREFIX}' --enable-interwork --enable-multilib --disable-newlib-supplied-syscalls'

On affiche les paramètres :

#Display settings
echo "Prefix : "${PREFIX}
echo "binutils options : "${BINUTILS_OPTIONS}
echo "gcc options : "${GCC_OPTIONS}
echo "gdb options : "${GDB_OPTIONS}
echo "newlib options : "${NEWLIB_OPTIONS}

On test les sources de chaque composants, après téléchargement :

echo "Press Key - Downloading CCC from web"
test ! -f binutils-${BINUTILS_VER}.tar.bz2 && wget http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VER}.tar.bz2
test ! -f gcc-core-${GCC_VER}.tar.bz2 && wget http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VER}/gcc-core-${GCC_VER}.tar.bz2
test ! -f gcc-g++-${GCC_VER}.tar.bz2 && wget http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VER}/gcc-g++-${GCC_VER}.tar.bz2
test ! -f newlib-${NEWLIB_VER}.tar.gz && wget ftp://sources.redhat.com/pub/newlib/newlib-${NEWLIB_VER}.tar.gz
test ! -f gdb-${GDB_VER}.tar.bz2 && wget http://ftp.gnu.org/gnu/gdb/gdb-${GDB_VER}.tar.bz2

Avant la compilation on nettoie une éventuelle, précédente compilation:

echo "Press Key - Cleaning ..."
rm -rf binutils-${BINUTILS_VER} newlib-${NEWLIB_VER} gdb-${GDB_VER} ${TARGET} gcc-${GCC_VER}
rm -rf ${PREFIX}

Et on prépare :

mkdir ${PREFIX}
mkdir ${PREFIX}/bin
export PATH=${PATH}:${PREFIX}/bin
echo "Path : "${PATH}

On décompresse :

tar jxvf binutils-${BINUTILS_VER}.tar.bz2
tar jxvf gcc-core-${GCC_VER}.tar.bz2
tar jxvf gcc-g++-${GCC_VER}.tar.bz2
tar zxvf newlib-${NEWLIB_VER}.tar.gz
tar jxvf gdb-${GDB_VER}.tar.bz2

Et on compile :

echo "Press Key - Building of binutils !"
cd binutils-${BINUTILS_VER}
mkdir build
cd build
../configure ${BINUTILS_OPTIONS}
make
make install
cd ../..

echo "Press Key - Building of boot gcc !"
read -n 1 c #getchar
cd gcc-${GCC_VER}
mkdir build
cd build
#mkdir -p host-i686-pc-linux-gnu/fixincludes
../configure ${GCC_OPTIONS} #2>err.log
#mkdir -p libiberty libcpp fixincludes
echo "boot gcc make " > ../err.log
make all-gcc 2>> ../err.log
echo "install boot gcc " >> ../err.log
make install-gcc 2>> ../err.log
cd ../..

echo "Press Key - Building of newlib !"
read -n 1 c #getchar
cd newlib-${NEWLIB_VER}
mkdir build
cd build
../configure ${NEWLIB_OPTIONS}
make
make install
cd ../..

echo "Press Key - Building of full gcc"
read -n 1 c #getchar
cd gcc-${GCC_VER}/build
../configure ${GCC_OPTIONS} #2>err.log
echo "full gcc make " >> ../err.log
make all 2>> ../err.log
echo "full gcc make install" >> ../err.log
make install 2>> ../err.log
cd ../..

echo "Press Key - Building of gdb !"
read -n 1 c #getchar
cd gdb-${GDB_VER}
mkdir build
cd build
../configure ${GDB_OPTIONS}
make
make install
cd ../..

Lien vers le script complet arm-none-eabi.sh.