b005afc18fd49ec7b654880df05f60e2629afccc
[fw/cortex-toolchain] / summon-arm-toolchain
1 #!/bin/bash
2 # Written by Uwe Hermann <uwe@hermann-uwe.de>, released as public domain.
3 # Modified by Piotr Esden-Tempski <piotr@esden.net>, released as public domain.
4
5 #
6 # Requirements (example is for Debian, replace package names as needed):
7 #
8 # apt-get install flex bison libgmp3-dev libmpfr-dev libncurses5-dev \
9 # libmpc-dev autoconf texinfo build-essential
10 #
11 # Or on Ubuntu Maverick give `apt-get build-dep gcc-4.5` a try.
12 #
13
14 # Stop if any command fails
15 set -e
16
17 ##############################################################################
18 # Default settings section
19 # You probably want to customize those
20 # You can also pass them as parameters to the script
21 ##############################################################################
22 TARGET=arm-none-eabi            # Or: TARGET=arm-elf
23 PREFIX=${HOME}/sat      # Install location of your final toolchain
24 DARWIN_OPT_PATH=/opt/local      # Path in which MacPorts or Fink is installed
25 # Set to 'sudo' if you need superuser privileges while installing
26 SUDO=
27 # Set to 1 to be quieter while running
28 QUIET=0
29 # Set to 1 to use linaro gcc instead of the FSF gcc
30 USE_LINARO=1
31 # Set to 1 to enable building of OpenOCD
32 OOCD_EN=1
33 # Set to 1 to build libstm32 provided by ST
34 LIBSTM32_EN=0
35 # Set to 1 to build libopenstm32 an open source library for stm32
36 LIBOPENSTM32_EN=1
37 # Make the gcc default to Cortex-M3
38 DEFAULT_TO_CORTEX_M3=0
39 # Override automatic detection of cpus to compile on
40 CPUS=
41
42 ##############################################################################
43 # Parsing command line parameters
44 ##############################################################################
45
46 while [ $# -gt 0 ]; do
47         case $1 in
48                 TARGET=*)
49                 TARGET=$(echo $1 | sed 's,^TARGET=,,')
50                 ;;
51                 PREFIX=*)
52                 PREFIX=$(echo $1 | sed 's,^PREFIX=,,')
53                 ;;
54                 DARWIN_OPT_PATH=*)
55                 DARWIN_OPT_PATH=$(echo $1 | sed 's,^DARWIN_OPT_PATH=,,')
56                 ;;
57                 SUDO=*)
58                 SUDO=$(echo $1 | sed 's,^SUDO=,,')
59                 ;;
60                 QUIET=*)
61                 QUIET=$(echo $1 | sed 's,^QUIET=,,')
62                 ;;
63                 USE_LINARO=*)
64                 USE_LINARO=$(echo $1 | sed 's,^USE_LINARO=,,')
65                 ;;
66                 OOCD_EN=*)
67                 OOCD_EN=$(echo $1 | sed 's,^OOCD_EN=,,')
68                 ;;
69                 LIBSTM32_EN=*)
70                 LIBSTM32_EN=$(echo $1 | sed 's,^LIBSTM32_EN=,,')
71                 ;;
72                 LIBOPENSTM32_EN=*)
73                 LIBOPENSTM32_EN=$(echo $1 | sed 's,^LIBOPENSTM32_EN=,,')
74                 ;;
75                 DEFAULT_TO_CORTEX_M3=*)
76                 DEFAULT_TO_CORTEX_M3=$(echo $1 | sed 's,^DEFAULT_TO_CORTEX_M3=,,')
77                 ;;
78                 CPUS=*)
79                 CPUS=$(echo $1 | sed 's,^CPUS=,,')
80                 ;;
81                 *)
82                 echo "Unknown parameter: $1"
83                 exit 1
84                 ;;
85         esac
86
87         shift # shifting parameter list to access the next one
88 done
89
90 echo "Settings used for this build are:"
91 echo "TARGET=$TARGET"
92 echo "PREFIX=$PREFIX"
93 echo "DARWIN_OPT_PATH=$DARWIN_OPT_PATH"
94 echo "SUDO=$SUDO"
95 echo "QUIET=$QUIET"
96 echo "USE_LINARO=$USE_LINARO"
97 echo "OOCD_EN=$OOCD_EN"
98 echo "LIBSTM32_EN=$LIBSTM32_EN"
99 echo "LIBOPENSTM32_EN=$LIBOPENSTM32_EN"
100 echo "DEFAULT_TO_CORTEX_M3=$DEFAULT_TO_CORTEX_M3"
101 echo "CPUS=$CPUS"
102
103 ##############################################################################
104 # Version and download url settings section
105 ##############################################################################
106 if [ ${USE_LINARO} == 0 ] ; then
107         # For FSF GCC:
108         GCCVERSION=4.5.2
109         GCC=gcc-${GCCVERSION}
110         GCCURL=http://ftp.gnu.org/gnu/gcc/${GCC}/${GCC}.tar.gz
111 else
112         # For the Linaro GCC:
113         GCCRELEASE=4.5-2011.02-0
114         GCCVERSION=4.5-2011.02-0
115         GCC=gcc-linaro-${GCCVERSION}
116         GCCURL=http://launchpad.net/gcc-linaro/4.5/${GCCRELEASE}/+download/${GCC}.tar.bz2
117 fi
118
119 BINUTILS=binutils-2.21
120 NEWLIB=newlib-1.19.0
121 GDB=gdb-7.2
122 OOCD=master
123 LIBCMSIS=v1.10-3
124 LIBSTM32=v3.0.0-2
125 LIBSTM32USB=v3.0.1-1
126 LIBOPENSTM32=master
127
128 ##############################################################################
129 # Flags section
130 ##############################################################################
131
132 if [ "x${CPUS}" == "x" ]; then
133         if which getconf > /dev/null; then
134                 CPUS=$(getconf _NPROCESSORS_ONLN)
135         else
136                 CPUS=1
137         fi
138
139         PARALLEL=-j$((CPUS + 1))
140 else
141         PARALLEL=-j${CPUS}
142 fi
143
144 echo "${CPUS} cpu's detected running make with '${PARALLEL}' flag"
145
146 GDBFLAGS=
147 BINUTILFLAGS=
148
149 if [ ${DEFAULT_TO_CORTEX_M3} == 0 ] ; then
150         GCCFLAGS=
151 else
152         # To default to the Cortex-M3:
153         GCCFLAGS="--with-arch=armv7-m --with-mode=thumb --with-float=soft"
154 fi
155
156 # Pull in the local configuration, if any
157 if [ -f local.sh ]; then
158     . ./local.sh
159 fi
160
161 MAKEFLAGS=${PARALLEL}
162 TARFLAGS=v
163
164 if [ ${QUIET} != 0 ]; then
165     TARFLAGS=
166     MAKEFLAGS="${MAKEFLAGS} -s"
167 fi
168
169 export PATH="${PREFIX}/bin:${PATH}"
170
171 SUMMON_DIR=$(pwd)
172 SOURCES=${SUMMON_DIR}/sources
173 STAMPS=${SUMMON_DIR}/stamps
174
175
176 ##############################################################################
177 # Tool section
178 ##############################################################################
179 TAR=tar
180
181 ##############################################################################
182 # OS and Tooldetection section
183 # Detects which tools and flags to use
184 ##############################################################################
185
186 case "$(uname)" in
187         Linux)
188         echo "Found Linux OS."
189         ;;
190         Darwin)
191         echo "Found Darwin OS."
192         GCCFLAGS="${GCCFLAGS} \
193                   --with-gmp=${DARWIN_OPT_PATH} \
194                   --with-mpfr=${DARWIN_OPT_PATH} \
195                   --with-mpc=${DARWIN_OPT_PATH} \
196                   --with-libiconv-prefix=${DARWIN_OPT_PATH}"
197         OOCD_CFLAGS="-I/opt/mine/include -I/opt/local/include"
198         OOCD_LDFLAGS="-L/opt/mine/lib -L/opt/local/lib"
199         ;;
200         CYGWIN*)
201         echo "Found CygWin that means Windows most likely."
202         ;;
203         *)
204         echo "Found unknown OS. Aborting!"
205         exit 1
206         ;;
207 esac
208
209 ##############################################################################
210 # Building section
211 # You probably don't have to touch anything after this
212 ##############################################################################
213
214 # Fetch a versioned file from a URL
215 function fetch {
216     if [ ! -e ${STAMPS}/$1.fetch ]; then
217         log "Downloading $1 sources..."
218         wget -c --no-passive-ftp $2
219         touch ${STAMPS}/$1.fetch
220     fi
221 }
222
223 # Log a message out to the console
224 function log {
225     echo "******************************************************************"
226     echo "* $*"
227     echo "******************************************************************"
228 }
229
230 # Unpack an archive
231 function unpack {
232     log Unpacking $*
233     # Use 'auto' mode decompression.  Replace with a switch if tar doesn't support -a
234     ARCHIVE=$(ls ${SOURCES}/$1.tar.*)
235     case ${ARCHIVE} in
236         *.bz2)
237             echo "archive type bz2"
238             TYPE=j
239             ;;
240         *.gz)
241             echo "archive type gz"
242             TYPE=z
243             ;;
244         *)
245             echo "Unknown archive type of $1"
246             echo ${ARCHIVE}
247             exit 1
248             ;;
249     esac
250     ${TAR} xf${TYPE}${TARFLAGS} ${SOURCES}/$1.tar.*
251 }
252
253 # Install a build
254 function install {
255     log $1
256     ${SUDO} make ${MAKEFLAGS} $2 $3 $4 $5 $6 $7 $8
257 }
258
259
260 mkdir -p ${STAMPS} ${SOURCES}
261
262 cd ${SOURCES}
263
264 fetch ${BINUTILS} http://ftp.gnu.org/gnu/binutils/${BINUTILS}.tar.bz2
265 fetch ${GCC} ${GCCURL}
266 fetch ${NEWLIB} ftp://sources.redhat.com/pub/newlib/${NEWLIB}.tar.gz
267 fetch ${GDB} http://ftp.gnu.org/gnu/gdb/${GDB}.tar.bz2
268
269 if [ ${OOCD_EN} != 0 ]; then
270 if [ ! -e openocd-${OOCD}.tar.bz2 ]; then
271         log "Cloning OpenOCD sources..."
272         git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd openocd-${OOCD}
273         cd openocd-${OOCD}
274         ./bootstrap
275         cd ..
276         tar cfvj openocd-${OOCD}.tar.bz2 openocd-${OOCD}
277         #git archive --format=tar --prefix=openocd-${OOCD}/ ${OOCD} | \
278         #    bzip2 --stdout > ../openocd-${OOCD}.tar.bz2
279         rm -rf openocd-${OOCD}
280 fi
281 fi
282
283 if [ ${LIBSTM32_EN} != 0 ]; then
284 if [ ! -e libcmsis-${LIBCMSIS}.tar.bz2 ]; then
285         log "Cloning libcmsis sources..."
286         git clone git://git.open-bldc.org/libcmsis.git
287         cd libcmsis
288         git archive --format=tar --prefix=libcmsis-${LIBCMSIS}/ ${LIBCMSIS} | \
289             bzip2 --stdout > ../libcmsis-${LIBCMSIS}.tar.bz2
290         cd ..
291         rm -rf libcmsis
292 fi
293
294 if [ ! -e libstm32-${LIBSTM32}.tar.bz2 ]; then
295         log "Cloning libstm32 sources..."
296         git clone git://git.open-bldc.org/libstm32.git
297         cd libstm32
298         git archive --format=tar --prefix=libstm32-${LIBSTM32}/ ${LIBSTM32} | \
299             bzip2 --stdout > ../libstm32-${LIBSTM32}.tar.bz2
300         cd ..
301         rm -rf libstm32
302 fi
303
304 if [ ! -e libstm32usb-${LIBSTM32USB}.tar.bz2 ]; then
305         log "Cloning libstm32usb sources..."
306         git clone git://git.open-bldc.org/libstm32usb.git
307         cd libstm32usb
308         git archive --format=tar --prefix=libstm32usb-${LIBSTM32USB}/ ${LIBSTM32USB} | \
309             bzip2 --stdout > ../libstm32usb-${LIBSTM32USB}.tar.bz2
310         cd ..
311         rm -rf libstm32usb
312 fi
313 fi
314
315 if [ ${LIBOPENSTM32_EN} != 0 ]; then
316 if [ ! -e libopenstm32-${LIBOPENSTM32}.tar.bz2 ]; then
317         log "Cloning libopenstm32 sources..."
318         git clone git://libopenstm32.git.sourceforge.net/gitroot/libopenstm32/libopenstm32
319         cd libopenstm32
320         git archive --format=tar --prefix=libopenstm32-${LIBOPENSTM32}/ ${LIBOPENSTM32} | \
321             bzip2 --stdout > ../libopenstm32-${LIBOPENSTM32}.tar.bz2
322         cd ..
323         rm -rf libopenstm32
324 fi
325 fi
326
327 cd ${SUMMON_DIR}
328
329 if [ ! -e build ]; then
330     mkdir build
331 fi
332
333 if [ ! -e ${STAMPS}/${BINUTILS}.build ]; then
334     unpack ${BINUTILS}
335     cd build
336     log "Configuring ${BINUTILS}"
337     ../${BINUTILS}/configure --target=${TARGET} \
338                            --prefix=${PREFIX} \
339                            --enable-interwork \
340                            --enable-multilib \
341                            --with-gnu-as \
342                            --with-gnu-ld \
343                            --disable-nls \
344                            --disable-werror \
345                            ${BINUTILFLAGS}
346     log "Building ${BINUTILS}"
347     make ${MAKEFLAGS}
348     install ${BINUTILS} install
349     cd ..
350     log "Cleaning up ${BINUTILS}"
351     touch ${STAMPS}/${BINUTILS}.build
352     rm -rf build/* ${BINUTILS}
353 fi
354
355 if [ ! -e ${STAMPS}/${GCC}-${NEWLIB}.build ]; then
356     unpack ${GCC}
357     unpack ${NEWLIB}
358
359     log "Adding newlib symlink to gcc"
360     ln -f -s `pwd`/${NEWLIB}/newlib ${GCC}
361     log "Adding libgloss symlink to gcc"
362     ln -f -s `pwd`/${NEWLIB}/libgloss ${GCC}
363
364     if [ ${DEFAULT_TO_CORTEX_M3} == 0 ] ; then
365         log "Patching gcc to add multilib support"
366         cd ${GCC}
367         patch -p0 -i ../patches/patch-gcc-config-arm-t-arm-elf.diff
368         cd ..
369     fi
370
371     cd build
372     log "Configuring ${GCC} and ${NEWLIB}"
373     ../${GCC}/configure --target=${TARGET} \
374                       --prefix=${PREFIX} \
375                       --enable-interwork \
376                       --enable-multilib \
377                       --enable-languages="c,c++" \
378                       --with-newlib \
379                       --with-gnu-as \
380                       --with-gnu-ld \
381                       --disable-nls \
382                       --disable-shared \
383                       --disable-threads \
384                       --with-headers=newlib/libc/include \
385                       --disable-libssp \
386                       --disable-libstdcxx-pch \
387                       --disable-libmudflap \
388                       --disable-libgomp \
389                       --disable-werror \
390                       --with-system-zlib \
391                       --disable-newlib-supplied-syscalls \
392                       ${GCCFLAGS}
393     log "Building ${GCC} and ${NEWLIB}"
394     make ${MAKEFLAGS}
395     install ${GCC} install
396     cd ..
397     log "Cleaning up ${GCC} and ${NEWLIB}"
398     touch ${STAMPS}/${GCC}-${NEWLIB}.build
399     rm -rf build/* ${GCC} ${NEWLIB}
400 fi
401
402 if [ ! -e ${STAMPS}/${GDB}.build ]; then
403     unpack ${GDB}
404     cd build
405     log "Configuring ${GDB}"
406     ../${GDB}/configure --target=${TARGET} \
407                       --prefix=${PREFIX} \
408                       --enable-interwork \
409                       --enable-multilib \
410                       --disable-werror \
411                       ${GDBFLAGS}
412     log "Building ${GDB}"
413     make ${MAKEFLAGS}
414     install ${GDB} install
415     cd ..
416     log "Cleaning up ${GDB}"
417     touch ${STAMPS}/${GDB}.build
418     rm -rf build/* ${GDB}
419 fi
420
421 if [ ${OOCD_EN} != 0 ]; then
422 if [ ! -e ${STAMPS}/openocd-${OOCD}.build ]; then
423     unpack openocd-${OOCD}
424     cd build
425     log "Configuring openocd-${OOCD}"
426     CFLAGS="${CFLAGS} ${OOCD_CFLAGS}" \
427     LDFLAGS="${LDFLAGS} ${OOCD_LDFLAGS}" \
428     ../openocd-${OOCD}/configure --enable-maintainer-mode \
429                                  --prefix=${PREFIX} \
430                                  --enable-dummy \
431                                  --enable-ft2232_libftdi \
432                                  --enable-usb_blaster_libftdi \
433                                  --enable-ep93xx \
434                                  --enable-at91rm9200 \
435                                  --enable-presto_libftdi \
436                                  --enable-usbprog \
437                                  --enable-jlink \
438                                  --enable-vsllink \
439                                  --enable-rlink \
440                                  --enable-arm-jtag-ew
441     log "Building openocd-${OOCD}"
442     make ${MAKEFLAGS}
443     install openocd-${OOCD} install
444     cd ..
445     log "Cleaning up openocd-${OOCD}"
446     touch ${STAMPS}/openocd-${OOCD}.build
447     rm -rf build/* ${OOCD}
448 fi
449 fi
450
451 if [ ${LIBSTM32_EN} != 0 ]; then
452 if [ ! -e ${STAMPS}/libcmsis-${LIBCMSIS}.build ]; then
453     unpack libcmsis-${LIBCMSIS}
454     cd libcmsis-${LIBCMSIS}
455     log "Building libcmsis-${LIBCMSIS}"
456     make arch_prefix=${TARGET} prefix=${PREFIX}
457     install libcmsis-${LIBCMSIS} arch_prefix=${TARGET} prefix=${PREFIX} install
458     cd ..
459     log "Cleaning up libcmsis-${LIBCMSIS}"
460     touch ${STAMPS}/libcmsis-${LIBCMSIS}.build
461     rm -rf libcmsis-${LIBCMSIS}
462 fi
463
464 if [ ! -e ${STAMPS}/libstm32-${LIBSTM32}.build ]; then
465     unpack libstm32-${LIBSTM32}
466     cd libstm32-${LIBSTM32}
467     log "Building libstm32-${LIBSTM32}"
468     make arch_prefix=${TARGET} prefix=${PREFIX}
469     install libstm32-${LIBSTM32} arch_prefix=${TARGET} prefix=${PREFIX} install
470     cd ..
471     log "Cleaning up libstm32-${LIBSTM32}"
472     touch ${STAMPS}/libstm32-${LIBSTM32}.build
473     rm -rf libstm32-${LIBSTM32}
474 fi
475
476 if [ ! -e ${STAMPS}/libstm32usb-${LIBSTM32USB}.build ]; then
477     unpack libstm32usb-${LIBSTM32USB}
478     cd libstm32usb-${LIBSTM32USB}
479     log "Building libstm32usb-${LIBSTM32USB}"
480     make arch_prefix=${TARGET} prefix=${PREFIX}
481     install libstm32usb-${LIBSTM32USB} arch_prefix=${TARGET} prefix=${PREFIX} install
482     cd ..
483     log "Cleaning up libstm32usb-${LIBSTM32USB}"
484     touch ${STAMPS}/libstm32usb-${LIBSTM32USB}.build
485     rm -rf libstm32usb-${LIBSTM32USB}
486 fi
487 fi
488
489 if [ $LIBOPENSTM32_EN != 0 ]; then
490 if [ ! -e ${STAMPS}/libopenstm32-${LIBOPENSTM32}.build ]; then
491     unpack libopenstm32-${LIBOPENSTM32}
492     cd libopenstm32-${LIBOPENSTM32}
493     log "Building libopenstm32-${LIBOPENSTM32}"
494     make PREFIX=${TARGET} DESTDIR=${PREFIX}
495     install libopenstm32-${LIBOPENSTM32} PREFIX=${TARGET} DESTDIR=${PREFIX} install
496     cd ..
497     log "Cleaning up libopenstm32-${LIBOPENSTM32}"
498     touch ${STAMPS}/libopenstm32-${LIBOPENSTM32}.build
499     rm -rf libopenstm32-${LIBOPENSTM32}
500 fi
501 fi