fd49ee9ba252d8cc9ab9a7fe9f0eba96fd2b168d
[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 TARGET=arm-none-eabi            # Or: TARGET=arm-elf
6 PREFIX=${HOME}/arm-none-eabi    # Install location of your final toolchain
7 PARALLEL=""                     # Or: PARALLEL="-j 5" for 4 CPUs
8 DARWIN_OPT_PATH=/opt/local      # Path in which MacPorts or Fink is installed
9
10 BINUTILS=binutils-2.19.1
11 GCC=gcc-4.4.2
12 NEWLIB=newlib-1.17.0
13 GDB=gdb-7.1
14 LIBCMSIS=v1.10-2
15 LIBSTM32=v3.0.0-1
16 LIBSTM32USB=v3.0.1-1
17 LIBOPENSTM32=master
18 LIBSTM32_EN=0
19 LIBOPENSTM32_EN=0
20
21 SUMMON_DIR=$(pwd)
22 SOURCES=${SUMMON_DIR}/sources
23
24 export PATH="${PREFIX}/bin:${PATH}"
25
26 GCCFLAGS=
27 GDBFLAGS=
28 BINUTILFLAGS=
29
30 case "$(uname)" in
31         Linux)
32         echo "Found Linux OS."
33         ;;
34         Darwin)
35         echo "Found Darwin OS."
36         GCCFLAGS="--with-gmp=${DARWIN_OPT_PATH} \
37                   --with-mpfr=${DARWIN_OPT_PATH} \
38                   -with-libiconv-prefix=${DARWIN_OPT_PATH}"
39         ;;
40         *)
41         echo "Found unknown OS. Aborting!"
42         exit 1
43         ;;
44 esac
45
46 if [ ! -e ${SOURCES} ]; then
47     mkdir ${SOURCES}
48 fi
49
50 cd ${SOURCES}
51
52 echo "Downloading binutils sources..."
53 wget -c http://ftp.gnu.org/gnu/binutils/${BINUTILS}.tar.bz2
54
55 echo "Downloading gcc sources..."
56 wget -c http://ftp.gnu.org/gnu/gcc/${GCC}/${GCC}.tar.bz2
57
58 echo "Downloading newlib sources..."
59 wget -c --no-passive-ftp ftp://sources.redhat.com/pub/newlib/${NEWLIB}.tar.gz
60
61 echo "Downloading gdb sources..."
62 wget -c http://ftp.gnu.org/gnu/gdb/${GDB}.tar.bz2
63
64 if [ ${LIBSTM32_EN} != 0 ]; then
65 if [ ! -e libcmsis-${LIBCMSIS}.tar.bz2 ]; then
66         echo "Cloning libcmsis sources..."
67         git clone git://git.open-bldc.org/libcmsis.git
68         cd libcmsis
69         git archive --format=tar --prefix=libcmsis-${LIBCMSIS}/ ${LIBCMSIS} | \
70             bzip2 --stdout > ../libcmsis-${LIBCMSIS}.tar.bz2
71         cd ..
72         rm -rf libcmsis
73 fi
74
75 if [ ! -e libstm32-${LIBSTM32}.tar.bz2 ]; then
76         echo "Cloning libstm32 sources..."
77         git clone git://git.open-bldc.org/libstm32.git
78         cd libstm32
79         git archive --format=tar --prefix=libstm32-${LIBSTM32}/ ${LIBSTM32} | \
80             bzip2 --stdout > ../libstm32-${LIBSTM32}.tar.bz2
81         cd ..
82         rm -rf libstm32
83 fi
84
85 if [ ! -e libstm32usb-${LIBSTM32USB}.tar.bz2 ]; then
86         echo "Cloning libstm32usb sources..."
87         git clone git://git.open-bldc.org/libstm32usb.git
88         cd libstm32usb
89         git archive --format=tar --prefix=libstm32usb-${LIBSTM32USB}/ ${LIBSTM32USB} | \
90             bzip2 --stdout > ../libstm32usb-${LIBSTM32USB}.tar.bz2
91         cd ..
92         rm -rf libstm32usb
93 fi
94 fi
95
96 if [ ${LIBOPENSTM32_EN} != 0 ]; then
97 if [ ! -e libopenstm32-${LIBOPENSTM32}.tar.bz2 ]; then
98         echo "Cloning libopenstm32 sources..."
99         git clone git://libopenstm32.git.sourceforge.net/gitroot/libopenstm32/libopenstm32
100         cd libopenstm32
101         git archive --format=tar --prefix=libopenstm32-${LIBOPENSTM32}/ ${LIBOPENSTM32} | \
102             bzip2 --stdout > ../libopenstm32-${LIBOPENSTM32}.tar.bz2
103         cd ..
104         rm -rf libopenstm32
105 fi
106 fi
107
108 cd ${SUMMON_DIR}
109
110 if [ ! -e build ]; then
111     mkdir build
112 fi
113
114 if [ ! -e .${BINUTILS}.build ]; then
115     echo "******************************************************************"
116     echo "* Unpacking ${BINUTILS}"
117     echo "******************************************************************"
118     tar xfvj ${SOURCES}/${BINUTILS}.tar.bz2
119     cd build
120     echo "******************************************************************"
121     echo "* Configuring ${BINUTILS}"
122     echo "******************************************************************"
123     ../${BINUTILS}/configure --target=${TARGET} \
124                            --prefix=${PREFIX} \
125                            --enable-interwork \
126                            --enable-multilib \
127                            --with-gnu-as \
128                            --with-gnu-ld \
129                            --disable-nls \
130                            --disable-werror \
131                            ${BINUTILFLAGS} || exit
132     echo "******************************************************************"
133     echo "* Building ${BINUTILS}"
134     echo "******************************************************************"
135     make ${PARALLEL} || exit
136     echo "******************************************************************"
137     echo "* Installing ${BINUTILS}"
138     echo "******************************************************************"
139     make install || exit
140     cd ..
141     echo "******************************************************************"
142     echo "* Cleaning up ${BINUTILS}"
143     echo "******************************************************************"
144     touch .${BINUTILS}.build
145     rm -rf build/* ${BINUTILS}
146 fi
147
148 if [ ! -e .${GCC}-boot.build ]; then
149     echo "******************************************************************"
150     echo "* Unpacking ${GCC}-boot"
151     echo "******************************************************************"
152     tar xfvj ${SOURCES}/${GCC}.tar.bz2
153     cd build
154     echo "******************************************************************"
155     echo "* Configuring ${GCC}-boot"
156     echo "******************************************************************"
157     ../${GCC}/configure --target=${TARGET} \
158                       --prefix=${PREFIX} \
159                       --enable-interwork \
160                       --enable-multilib \
161                       --enable-languages="c" \
162                       --with-newlib \
163                       --without-headers \
164                       --disable-shared \
165                       --with-gnu-as \
166                       --with-gnu-ld \
167                       --disable-nls \
168                       ${GCCFLAGS} || exit
169     echo "******************************************************************"
170     echo "* Building ${GCC}-boot"
171     echo "******************************************************************"
172     make ${PARALLEL} all-gcc || exit
173     echo "******************************************************************"
174     echo "* Installing ${GCC}-boot"
175     echo "******************************************************************"
176     make install-gcc || exit
177     cd ..
178     echo "******************************************************************"
179     echo "* Cleaning up ${GCC}-boot"
180     echo "******************************************************************"
181     touch .${GCC}-boot.build
182     rm -rf build/* ${GCC}
183 fi
184
185 if [ ! -e .${NEWLIB}.build ]; then
186     echo "******************************************************************"
187     echo "* Unpacking ${NEWLIB}"
188     echo "******************************************************************"
189     tar xfvz ${SOURCES}/${NEWLIB}.tar.gz
190     cd build
191     echo "******************************************************************"
192     echo "* Configuring ${NEWLIB}"
193     echo "******************************************************************"
194     ../${NEWLIB}/configure --target=${TARGET} \
195                          --prefix=${PREFIX} \
196                          --enable-interwork \
197                          --enable-multilib \
198                          --with-gnu-as \
199                          --with-gnu-ld \
200                          --disable-nls \
201                          --disable-newlib-supplied-syscalls || exit
202     echo "******************************************************************"
203     echo "* Building ${NEWLIB}"
204     echo "******************************************************************"
205     make ${PARALLEL} || exit
206     echo "******************************************************************"
207     echo "* Installing ${NEWLIB}"
208     echo "******************************************************************"
209     make install || exit
210     cd ..
211     echo "******************************************************************"
212     echo "* Cleaning up ${NEWLIB}"
213     echo "******************************************************************"
214     touch .${NEWLIB}.build
215     rm -rf build/* ${NEWLIB}
216 fi
217
218 # Yes, you need to build gcc again!
219 if [ ! -e .${GCC}.build ]; then
220     echo "******************************************************************"
221     echo "* Unpacking ${GCC}"
222     echo "******************************************************************"
223     tar xfvj ${SOURCES}/${GCC}.tar.bz2
224     cd build
225     echo "******************************************************************"
226     echo "* Configuring ${GCC}"
227     echo "******************************************************************"
228     ../${GCC}/configure --target=${TARGET} \
229                       --prefix=${PREFIX} \
230                       --enable-interwork \
231                       --enable-multilib \
232                       --enable-languages="c,c++" \
233                       --with-newlib \
234                       --disable-shared \
235                       --with-gnu-as \
236                       --with-gnu-ld \
237                       --disable-nls \
238                      ${GCCFLAGS} || exit
239     echo "******************************************************************"
240     echo "* Building ${GCC}"
241     echo "******************************************************************"
242     make ${PARALLEL} || exit
243     echo "******************************************************************"
244     echo "* Installing ${GCC}"
245     echo "******************************************************************"
246     make install || exit
247     cd ..
248     echo "******************************************************************"
249     echo "* Cleaning up ${GCC}"
250     echo "******************************************************************"
251     touch .${GCC}.build
252     rm -rf build/* ${GCC}
253 fi
254
255 if [ ! -e .${GDB}.build ]; then
256     echo "******************************************************************"
257     echo "* Unpacking ${GDB}"
258     echo "******************************************************************"
259     tar xfvj ${SOURCES}/${GDB}.tar.bz2
260     cd build
261     echo "******************************************************************"
262     echo "* Configuring ${GDB}"
263     echo "******************************************************************"
264     ../${GDB}/configure --target=${TARGET} \
265                       --prefix=${PREFIX} \
266                       --enable-interwork \
267                       --enable-multilib \
268                       --disable-werror \
269                       ${GDBFLAGS} || exit
270     echo "******************************************************************"
271     echo "* Building ${GDB}"
272     echo "******************************************************************"
273     make ${PARALLEL} || exit
274     echo "******************************************************************"
275     echo "* Installing ${GDB}"
276     echo "******************************************************************"
277     make install || exit
278     cd ..
279     echo "******************************************************************"
280     echo "* Cleaning up ${GDB}"
281     echo "******************************************************************"
282     touch .${GDB}.build
283     rm -rf build/* ${GDB}
284 fi
285
286 if [ ${LIBSTM32_EN} != 0 ]; then
287 if [ ! -e .libcmsis-${LIBCMSIS}.build ]; then
288     echo "******************************************************************"
289     echo "* Unpacking libcmsis-${LIBCMSIS}"
290     echo "******************************************************************"
291     tar xfvj ${SOURCES}/libcmsis-${LIBCMSIS}.tar.bz2
292     cd libcmsis-${LIBCMSIS}
293     echo "******************************************************************"
294     echo "* Building libcmsis-${LIBCMSIS}"
295     echo "******************************************************************"
296     make arch_prefix=${TARGET} prefix=${PREFIX} || exit
297     echo "******************************************************************"
298     echo "* Installing libcmsis-${LIBCMSIS}"
299     echo "******************************************************************"
300     make arch_prefix=${TARGET} prefix=${PREFIX} install || exit
301     cd ..
302     echo "******************************************************************"
303     echo "* Cleaning up libcmsis-${LIBCMSIS}"
304     echo "******************************************************************"
305     touch .libcmsis-${LIBCMSIS}.build
306     rm -rf libcmsis-${LIBCMSIS}
307 fi
308
309 if [ ! -e .libstm32-${LIBSTM32}.build ]; then
310     echo "******************************************************************"
311     echo "* Unpacking libstm32-${LIBSTM32}"
312     echo "******************************************************************"
313     tar xfvj ${SOURCES}/libstm32-${LIBSTM32}.tar.bz2
314     cd libstm32-${LIBSTM32}
315     echo "******************************************************************"
316     echo "* Building libstm32-${LIBSTM32}"
317     echo "******************************************************************"
318     make arch_prefix=${TARGET} prefix=${PREFIX} || exit
319     echo "******************************************************************"
320     echo "* Installing libstm32-${LIBSTM32}"
321     echo "******************************************************************"
322     make arch_prefix=${TARGET} prefix=${PREFIX} install || exit
323     cd ..
324     echo "******************************************************************"
325     echo "* Cleaning up libstm32-${LIBSTM32}"
326     echo "******************************************************************"
327     touch .libstm32-${LIBSTM32}.build
328     rm -rf libstm32-${LIBSTM32}
329 fi
330
331 if [ ! -e .libstm32usb-${LIBSTM32USB}.build ]; then
332     echo "******************************************************************"
333     echo "* Unpacking libstm32usb-${LIBSTM32USB}"
334     echo "******************************************************************"
335     tar xfvj ${SOURCES}/libstm32usb-${LIBSTM32USB}.tar.bz2
336     cd libstm32usb-${LIBSTM32USB}
337     echo "******************************************************************"
338     echo "* Building libstm32usb-${LIBSTM32USB}"
339     echo "******************************************************************"
340     make arch_prefix=${TARGET} prefix=${PREFIX} || exit
341     echo "******************************************************************"
342     echo "* Installing libstm32usb-${LIBSTM32USB}"
343     echo "******************************************************************"
344     make arch_prefix=${TARGET} prefix=${PREFIX} install || exit
345     cd ..
346     echo "******************************************************************"
347     echo "* Cleaning up libstm32usb-${LIBSTM32USB}"
348     echo "******************************************************************"
349     touch .libstm32usb-${LIBSTM32USB}.build
350     rm -rf libstm32usb-${LIBSTM32USB}
351 fi
352 fi
353
354 if [ $LIBOPENSTM32_EN != 0 ]; then
355     echo "******************************************************************"
356     echo "* Unpacking libopenstm32-${LIBOPENSTM32}"
357     echo "******************************************************************"
358     tar xfvj ${SOURCES}/libopenstm32-${LIBOPENSTM32}.tar.bz2
359     cd libopenstm32-${LIBOPENSTM32}
360     echo "******************************************************************"
361     echo "* Building libopenstm32-${LIBOPENSTM32}"
362     echo "******************************************************************"
363     make PREFIX=${TARGET} DESTDIR=${PREFIX} || exit
364     echo "******************************************************************"
365     echo "* Installing libopenstm32-${LIBOPENSTM32}"
366     echo "******************************************************************"
367     make PREFIX=${TARGET} DESTDIR=${PREFIX} install || exit
368     cd ..
369     echo "******************************************************************"
370     echo "* Cleaning up libopenstm32-${LIBOPENSTM32}"
371     echo "******************************************************************"
372     touch .libopenstm32-${LIBOPENSTM32}.build
373     rm -rf libopenstm32-${LIBOPENSTM32}
374 fi