Create a download stamp only if wget succeeds.
[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 && touch ${STAMPS}/$1.fetch
219     fi
220 }
221
222 # Log a message out to the console
223 function log {
224     echo "******************************************************************"
225     echo "* $*"
226     echo "******************************************************************"
227 }
228
229 # Unpack an archive
230 function unpack {
231     log Unpacking $*
232     # Use 'auto' mode decompression.  Replace with a switch if tar doesn't support -a
233     ARCHIVE=$(ls ${SOURCES}/$1.tar.*)
234     case ${ARCHIVE} in
235         *.bz2)
236             echo "archive type bz2"
237             TYPE=j
238             ;;
239         *.gz)
240             echo "archive type gz"
241             TYPE=z
242             ;;
243         *)
244             echo "Unknown archive type of $1"
245             echo ${ARCHIVE}
246             exit 1
247             ;;
248     esac
249     ${TAR} xf${TYPE}${TARFLAGS} ${SOURCES}/$1.tar.*
250 }
251
252 # Install a build
253 function install {
254     log $1
255     ${SUDO} make ${MAKEFLAGS} $2 $3 $4 $5 $6 $7 $8
256 }
257
258
259 mkdir -p ${STAMPS} ${SOURCES}
260
261 cd ${SOURCES}
262
263 fetch ${BINUTILS} http://ftp.gnu.org/gnu/binutils/${BINUTILS}.tar.bz2
264 fetch ${GCC} ${GCCURL}
265 fetch ${NEWLIB} ftp://sources.redhat.com/pub/newlib/${NEWLIB}.tar.gz
266 fetch ${GDB} http://ftp.gnu.org/gnu/gdb/${GDB}.tar.bz2
267
268 if [ ${OOCD_EN} != 0 ]; then
269 if [ ! -e openocd-${OOCD}.tar.bz2 ]; then
270         log "Cloning OpenOCD sources..."
271         git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd openocd-${OOCD}
272         cd openocd-${OOCD}
273         ./bootstrap
274         cd ..
275         tar cfvj openocd-${OOCD}.tar.bz2 openocd-${OOCD}
276         #git archive --format=tar --prefix=openocd-${OOCD}/ ${OOCD} | \
277         #    bzip2 --stdout > ../openocd-${OOCD}.tar.bz2
278         rm -rf openocd-${OOCD}
279 fi
280 fi
281
282 if [ ${LIBSTM32_EN} != 0 ]; then
283 if [ ! -e libcmsis-${LIBCMSIS}.tar.bz2 ]; then
284         log "Cloning libcmsis sources..."
285         git clone git://git.open-bldc.org/libcmsis.git
286         cd libcmsis
287         git archive --format=tar --prefix=libcmsis-${LIBCMSIS}/ ${LIBCMSIS} | \
288             bzip2 --stdout > ../libcmsis-${LIBCMSIS}.tar.bz2
289         cd ..
290         rm -rf libcmsis
291 fi
292
293 if [ ! -e libstm32-${LIBSTM32}.tar.bz2 ]; then
294         log "Cloning libstm32 sources..."
295         git clone git://git.open-bldc.org/libstm32.git
296         cd libstm32
297         git archive --format=tar --prefix=libstm32-${LIBSTM32}/ ${LIBSTM32} | \
298             bzip2 --stdout > ../libstm32-${LIBSTM32}.tar.bz2
299         cd ..
300         rm -rf libstm32
301 fi
302
303 if [ ! -e libstm32usb-${LIBSTM32USB}.tar.bz2 ]; then
304         log "Cloning libstm32usb sources..."
305         git clone git://git.open-bldc.org/libstm32usb.git
306         cd libstm32usb
307         git archive --format=tar --prefix=libstm32usb-${LIBSTM32USB}/ ${LIBSTM32USB} | \
308             bzip2 --stdout > ../libstm32usb-${LIBSTM32USB}.tar.bz2
309         cd ..
310         rm -rf libstm32usb
311 fi
312 fi
313
314 if [ ${LIBOPENSTM32_EN} != 0 ]; then
315 if [ ! -e libopenstm32-${LIBOPENSTM32}.tar.bz2 ]; then
316         log "Cloning libopenstm32 sources..."
317         git clone git://libopenstm32.git.sourceforge.net/gitroot/libopenstm32/libopenstm32
318         cd libopenstm32
319         git archive --format=tar --prefix=libopenstm32-${LIBOPENSTM32}/ ${LIBOPENSTM32} | \
320             bzip2 --stdout > ../libopenstm32-${LIBOPENSTM32}.tar.bz2
321         cd ..
322         rm -rf libopenstm32
323 fi
324 fi
325
326 cd ${SUMMON_DIR}
327
328 if [ ! -e build ]; then
329     mkdir build
330 fi
331
332 if [ ! -e ${STAMPS}/${BINUTILS}.build ]; then
333     unpack ${BINUTILS}
334     cd build
335     log "Configuring ${BINUTILS}"
336     ../${BINUTILS}/configure --target=${TARGET} \
337                            --prefix=${PREFIX} \
338                            --enable-interwork \
339                            --enable-multilib \
340                            --with-gnu-as \
341                            --with-gnu-ld \
342                            --disable-nls \
343                            --disable-werror \
344                            ${BINUTILFLAGS}
345     log "Building ${BINUTILS}"
346     make ${MAKEFLAGS}
347     install ${BINUTILS} install
348     cd ..
349     log "Cleaning up ${BINUTILS}"
350     touch ${STAMPS}/${BINUTILS}.build
351     rm -rf build/* ${BINUTILS}
352 fi
353
354 if [ ! -e ${STAMPS}/${GCC}-${NEWLIB}.build ]; then
355     unpack ${GCC}
356     unpack ${NEWLIB}
357
358     log "Adding newlib symlink to gcc"
359     ln -f -s `pwd`/${NEWLIB}/newlib ${GCC}
360     log "Adding libgloss symlink to gcc"
361     ln -f -s `pwd`/${NEWLIB}/libgloss ${GCC}
362
363     if [ ${DEFAULT_TO_CORTEX_M3} == 0 ] ; then
364         log "Patching gcc to add multilib support"
365         cd ${GCC}
366         patch -p0 -i ../patches/patch-gcc-config-arm-t-arm-elf.diff
367         cd ..
368     fi
369
370     cd build
371     log "Configuring ${GCC} and ${NEWLIB}"
372     ../${GCC}/configure --target=${TARGET} \
373                       --prefix=${PREFIX} \
374                       --enable-interwork \
375                       --enable-multilib \
376                       --enable-languages="c,c++" \
377                       --with-newlib \
378                       --with-gnu-as \
379                       --with-gnu-ld \
380                       --disable-nls \
381                       --disable-shared \
382                       --disable-threads \
383                       --with-headers=newlib/libc/include \
384                       --disable-libssp \
385                       --disable-libstdcxx-pch \
386                       --disable-libmudflap \
387                       --disable-libgomp \
388                       --disable-werror \
389                       --with-system-zlib \
390                       --disable-newlib-supplied-syscalls \
391                       ${GCCFLAGS}
392     log "Building ${GCC} and ${NEWLIB}"
393     make ${MAKEFLAGS}
394     install ${GCC} install
395     cd ..
396     log "Cleaning up ${GCC} and ${NEWLIB}"
397     touch ${STAMPS}/${GCC}-${NEWLIB}.build
398     rm -rf build/* ${GCC} ${NEWLIB}
399 fi
400
401 if [ ! -e ${STAMPS}/${GDB}.build ]; then
402     unpack ${GDB}
403     cd build
404     log "Configuring ${GDB}"
405     ../${GDB}/configure --target=${TARGET} \
406                       --prefix=${PREFIX} \
407                       --enable-interwork \
408                       --enable-multilib \
409                       --disable-werror \
410                       ${GDBFLAGS}
411     log "Building ${GDB}"
412     make ${MAKEFLAGS}
413     install ${GDB} install
414     cd ..
415     log "Cleaning up ${GDB}"
416     touch ${STAMPS}/${GDB}.build
417     rm -rf build/* ${GDB}
418 fi
419
420 if [ ${OOCD_EN} != 0 ]; then
421 if [ ! -e ${STAMPS}/openocd-${OOCD}.build ]; then
422     unpack openocd-${OOCD}
423     cd build
424     log "Configuring openocd-${OOCD}"
425     CFLAGS="${CFLAGS} ${OOCD_CFLAGS}" \
426     LDFLAGS="${LDFLAGS} ${OOCD_LDFLAGS}" \
427     ../openocd-${OOCD}/configure --enable-maintainer-mode \
428                                  --prefix=${PREFIX} \
429                                  --enable-dummy \
430                                  --enable-ft2232_libftdi \
431                                  --enable-usb_blaster_libftdi \
432                                  --enable-ep93xx \
433                                  --enable-at91rm9200 \
434                                  --enable-presto_libftdi \
435                                  --enable-usbprog \
436                                  --enable-jlink \
437                                  --enable-vsllink \
438                                  --enable-rlink \
439                                  --enable-arm-jtag-ew
440     log "Building openocd-${OOCD}"
441     make ${MAKEFLAGS}
442     install openocd-${OOCD} install
443     cd ..
444     log "Cleaning up openocd-${OOCD}"
445     touch ${STAMPS}/openocd-${OOCD}.build
446     rm -rf build/* ${OOCD}
447 fi
448 fi
449
450 if [ ${LIBSTM32_EN} != 0 ]; then
451 if [ ! -e ${STAMPS}/libcmsis-${LIBCMSIS}.build ]; then
452     unpack libcmsis-${LIBCMSIS}
453     cd libcmsis-${LIBCMSIS}
454     log "Building libcmsis-${LIBCMSIS}"
455     make arch_prefix=${TARGET} prefix=${PREFIX}
456     install libcmsis-${LIBCMSIS} arch_prefix=${TARGET} prefix=${PREFIX} install
457     cd ..
458     log "Cleaning up libcmsis-${LIBCMSIS}"
459     touch ${STAMPS}/libcmsis-${LIBCMSIS}.build
460     rm -rf libcmsis-${LIBCMSIS}
461 fi
462
463 if [ ! -e ${STAMPS}/libstm32-${LIBSTM32}.build ]; then
464     unpack libstm32-${LIBSTM32}
465     cd libstm32-${LIBSTM32}
466     log "Building libstm32-${LIBSTM32}"
467     make arch_prefix=${TARGET} prefix=${PREFIX}
468     install libstm32-${LIBSTM32} arch_prefix=${TARGET} prefix=${PREFIX} install
469     cd ..
470     log "Cleaning up libstm32-${LIBSTM32}"
471     touch ${STAMPS}/libstm32-${LIBSTM32}.build
472     rm -rf libstm32-${LIBSTM32}
473 fi
474
475 if [ ! -e ${STAMPS}/libstm32usb-${LIBSTM32USB}.build ]; then
476     unpack libstm32usb-${LIBSTM32USB}
477     cd libstm32usb-${LIBSTM32USB}
478     log "Building libstm32usb-${LIBSTM32USB}"
479     make arch_prefix=${TARGET} prefix=${PREFIX}
480     install libstm32usb-${LIBSTM32USB} arch_prefix=${TARGET} prefix=${PREFIX} install
481     cd ..
482     log "Cleaning up libstm32usb-${LIBSTM32USB}"
483     touch ${STAMPS}/libstm32usb-${LIBSTM32USB}.build
484     rm -rf libstm32usb-${LIBSTM32USB}
485 fi
486 fi
487
488 if [ $LIBOPENSTM32_EN != 0 ]; then
489 if [ ! -e ${STAMPS}/libopenstm32-${LIBOPENSTM32}.build ]; then
490     unpack libopenstm32-${LIBOPENSTM32}
491     cd libopenstm32-${LIBOPENSTM32}
492     log "Building libopenstm32-${LIBOPENSTM32}"
493     make PREFIX=${TARGET} DESTDIR=${PREFIX}
494     install libopenstm32-${LIBOPENSTM32} PREFIX=${TARGET} DESTDIR=${PREFIX} install
495     cd ..
496     log "Cleaning up libopenstm32-${LIBOPENSTM32}"
497     touch ${STAMPS}/libopenstm32-${LIBOPENSTM32}.build
498     rm -rf libopenstm32-${LIBOPENSTM32}
499 fi
500 fi