== Toolchain Directory Structure == For this tutorial, we will put the toolchain in '''{{{/arm}}}''' directory rather than the usual {{{/usr/local}}}. I prefer this approach since it's easier to manage (for example, to delete everything when things don't work or when we're finished with it, or to put it on portable drive to be carried to different system). We'll put files related to installation in '''{{{/arm/setup}}}''' directory: {{{ /arm +- setup +- download --> Put downloaded .tgz files here +- srcs --> Unpack .tgz source files here +- objs --> Build sources here }}} Once the toolchain is built, they'll be installed in these directories: {{{ /arm +- arm-elf +- bin +- include +- info +- lib .. etc.. }}} This tutorial assumes that you have write access to '''{{{/arm}}}''' directory. == Prepare Toolchains == === Download Latest binutils, GCC, and newlib === Download latest toolchain: * binutils: http://ftp.gnu.org/gnu/binutils/ * gcc: http://ftp.gnu.org/gnu/gcc/ * newlib: ftp://sources.redhat.com/pub/newlib/index.html {{{ $ mkdir -p /arm/setup/download $ cd /arm/setup/download $ wget -c http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2 $ wget -c http://ftp.gnu.org/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2 $ wget -c ftp://sources.redhat.com/pub/newlib/newlib-1.16.0.tar.gz }}} You will also need '''mkinfo''' from '''texinfo''' package to build the toolchain (for building the manuals etc). On Debian based system (Debian, Ubuntu, etc.) you can install it with: {{{ $ sudo apt-get install texinfo }}} Or if you're with !RedHat (Fedora, etc), you can install it with: {{{ $ yum install texinfo }}} === Preparing to build === ==== Unpack archives ==== {{{ $ mkdir -p /arm/setup/srcs $ cd /arm/setup/srcs $ tar xjf ../download/binutils-2.18.tar.bz2 $ tar xjf ../download/gcc-3.4.6.tar.bz2 $ tar xzf ../download/newlib-1.16.0.tar.gz }}} === Build Everything === ==== Build binutils ==== {{{ $ mkdir -p /arm/setup/objs/binutils-arm $ cd /arm/setup/objs/binutils-arm $ ../../srcs/binutils-2.18/configure --target=arm-elf --prefix=/arm $ make $ make install }}} ''(if you're wondering, that will take 5 minutes on a Core2Duo 2GHz)'' ==== Update binutils Path ==== Before we build gcc and the rest of the toolchain, add the path to (thew newly installed) binutils. (if you're using Bash): {{{ $ export PATH=/arm/bin:$PATH }}} ==== Build gcc ==== First prepare newlib to be built along with gcc: {{{ $ cd /arm/setup/srcs/gcc-3.4.6 $ ln -sd ../newlib-1.16.0/newlib . }}} Now lets build the beast: {{{ $ mkdir -p /arm/setup/objs/gcc-arm $ cd /arm/setup/objs/gcc-arm $ ../../srcs/gcc-3.4.6/configure --target=arm-elf --prefix=/arm --enable-threads \ --with-cpu=arm9 --enable-languages=c,c++ \ --disable-nls --with-newlib --disable-shared \ --with-float=soft $ make $ make install $ cd .. }}} ''(if you're wondering again, that will take about 8 minutes on a Core2Duo 2GHz)'' == PJSIP == === Build === {{{ $ cd /your/pjproject/directory $ make distclean $ ./aconfigure --host=arm-elf --disable-floating-point --disable-sound CFLAGS='-msoft-float' $ make dep $ make }}} == Common Problems == === Link Errors Because of Floating Point Mismatch === You may get error about ''configure not being able to create executable'', and {{{config.log}}} reveals error message similar to: ''ERROR: foo uses hardware FP, whereas bar uses software FP'' I think, this error was caused by lack of {{{--with-float=soft}}} when configuring gcc.