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