58ae6891051c46382dc699852213c451771b2b0d
[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 Piot Esden-Tempski <piotr@esden.net>, released as public domain.
4
5 TARGET=arm-elf                           # Or: TARGET=arm-none-eabi
6 PREFIX=${HOME}/arm-elf                   # Install location of your final toolchain
7 PARALLEL=""                              # Or: PARALLEL="-j 5" for 4 CPU's
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.0
12 NEWLIB=newlib-1.17.0
13 GDB=gdb-6.8
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 export PATH="${PREFIX}/bin:${PATH}"
22
23 case "$(uname)" in
24         Linux)
25         echo "Found Linux OS."
26         GCCFLAGS=
27         GDBFLAGS=
28         ;;
29         Darwin)
30         echo "Found Darwin OS."
31         GCCFLAGS="--with-gmp=${DARWIN_OPT_PATH} \
32                   --with-mpfr=${DARWIN_OPT_PATH} \
33                   -with-libiconv-prefix=${DARWIN_OPT_PATH}"
34         GDBFLAGS="--disable-werror"
35         ;;
36         *)
37         echo "Found Unknown OS. Aborting!"
38         exit 1
39         ;;
40 esac
41
42 if [ ! -e sources ]; then
43     mkdir sources
44 fi
45
46 cd sources
47 if [ ! -e ${BINUTILS}.tar.bz2 ]; then
48         echo "Downloading binutils sources..."
49         wget -c http://ftp.gnu.org/gnu/binutils/${BINUTILS}.tar.bz2
50 fi
51
52 if [ ! -e ${GCC}.tar.bz2 ]; then
53         echo "Downloading gcc sources..."
54         wget -c ftp://ftp.gnu.org/gnu/gcc/${GCC}/${GCC}.tar.bz2
55 fi
56
57 if [ ! -e ${NEWLIB}.tar.gz ]; then
58         echo "Downloading newlib sources..."
59         wget -c ftp://sources.redhat.com/pub/newlib/${NEWLIB}.tar.gz
60 fi
61
62 if [ ! -e ${GDB}.tar.bz2 ]; then
63         echo "Downloading gdb sources..."
64         wget -c ftp://ftp.gnu.org/gnu/gdb/${GDB}.tar.bz2
65 fi
66
67 if [ ${LIBSTM32_EN} != 0 ]; then
68 if [ ! -e libcmsis-${LIBCMSIS}.tar.bz2 ]; then
69         echo "Cloning libcmsis sources..."
70         git clone git://git.open-bldc.org/libcmsis.git
71         cd libcmsis
72         git archive --format=tar --prefix=libcmsis-${LIBCMSIS}/ ${LIBCMSIS} | \
73             bzip2 --stdout > ../libcmsis-${LIBCMSIS}.tar.bz2
74         cd ..
75         rm -rf libcmsis
76 fi
77
78 if [ ! -e libstm32-${LIBSTM32}.tar.bz2 ]; then
79         echo "Cloning libstm32 sources..."
80         git clone git://git.open-bldc.org/libstm32.git
81         cd libstm32
82         git archive --format=tar --prefix=libstm32-${LIBSTM32}/ ${LIBSTM32} | \
83             bzip2 --stdout > ../libstm32-${LIBSTM32}.tar.bz2
84         cd ..
85         rm -rf libstm32
86 fi
87
88 if [ ! -e libstm32usb-${LIBSTM32USB}.tar.bz2 ]; then
89         echo "Cloning libstm32usb sources..."
90         git clone git://git.open-bldc.org/libstm32usb.git
91         cd libstm32usb
92         git archive --format=tar --prefix=libstm32usb-${LIBSTM32USB}/ ${LIBSTM32USB} | \
93             bzip2 --stdout > ../libstm32usb-${LIBSTM32USB}.tar.bz2
94         cd ..
95         rm -rf libstm32usb
96 fi
97 fi
98
99 if [ ${LIBOPENSTM32_EN} != 0 ]; then
100 if [ ! -e libopenstm32-${LIBOPENSTM32}.tar.bz2 ]; then
101         echo "Cloning libopenstm32 sources..."
102         git clone git://libopenstm32.git.sourceforge.net/gitroot/libopenstm32
103         cd libopenstm32
104         git archive --format=tar --prefix=libopenstm32-${LIBOPENSTM32}/ ${LIBOPENSTM32} | \
105             bzip2 --stdout > ../libopenstm32-${LIBOPENSTM32}.tar.bz2
106         cd ..
107         rm -rf libopenstm32
108 fi
109 fi
110
111 cd ..
112
113 if [ ! -e build ]; then
114     mkdir build
115 fi
116
117 if [ ! -e .${BINUTILS}.build ]; then
118     echo "******************************************************************"
119     echo "* Unpacking ${BINUTILS}"
120     echo "******************************************************************"
121     tar xfvj sources/${BINUTILS}.tar.bz2
122     cd build
123     echo "******************************************************************"
124     echo "* Configuring ${BINUTILS}"
125     echo "******************************************************************"
126     ../${BINUTILS}/configure --target=${TARGET} \
127                            --prefix=${PREFIX} \
128                            --enable-interwork \
129                            --enable-multilib \
130                            --with-gnu-as \
131                            --with-gnu-ld \
132                            --disable-nls || exit
133     echo "******************************************************************"
134     echo "* Building ${BINUTILS}"
135     echo "******************************************************************"
136     make ${PARALLEL} || exit
137     echo "******************************************************************"
138     echo "* Installing ${BINUTILS}"
139     echo "******************************************************************"
140     make install || exit
141     cd ..
142     echo "******************************************************************"
143     echo "* Cleaning up ${BINUTILS}"
144     echo "******************************************************************"
145     touch .${BINUTILS}.build
146     rm -rf build/* ${BINUTILS}
147 fi
148
149 if [ ! -e .${GCC}-boot.build ]; then
150     echo "******************************************************************"
151     echo "* Unpacking ${GCC}-boot"
152     echo "******************************************************************"
153     tar xfvj sources/${GCC}.tar.bz2
154     cd build
155     echo "******************************************************************"
156     echo "* Configuring ${GCC}-boot"
157     echo "******************************************************************"
158     ../${GCC}/configure --target=${TARGET} \
159                       --prefix=${PREFIX} \
160                       --enable-interwork \
161                       --enable-multilib \
162                       --enable-languages="c" \
163                       --with-newlib \
164                       --without-headers \
165                       --disable-shared \
166                       --with-gnu-as \
167                       --with-gnu-ld \
168                       --disable-nls \
169                       ${GCCFLAGS} || exit
170     echo "******************************************************************"
171     echo "* Building ${GCC}-boot"
172     echo "******************************************************************"
173     make ${PARALLEL} all-gcc || exit
174     echo "******************************************************************"
175     echo "* Installing ${GCC}-boot"
176     echo "******************************************************************"
177     make install-gcc || exit
178     cd ..
179     echo "******************************************************************"
180     echo "* Cleaning up ${GCC}-boot"
181     echo "******************************************************************"
182     touch .${GCC}-boot.build
183     rm -rf build/* ${GCC}
184 fi
185
186 if [ ! -e .${NEWLIB}.build ]; then
187     echo "******************************************************************"
188     echo "* Unpacking ${NEWLIB}"
189     echo "******************************************************************"
190     tar xfvz sources/${NEWLIB}.tar.gz
191     cd build
192     echo "******************************************************************"
193     echo "* Configuring ${NEWLIB}"
194     echo "******************************************************************"
195     ../${NEWLIB}/configure --target=${TARGET} \
196                          --prefix=${PREFIX} \
197                          --enable-interwork \
198                          --enable-multilib \
199                          --with-gnu-as \
200                          --with-gnu-ld \
201                          --disable-nls \
202                          --disable-newlib-supplied-syscalls || exit
203     echo "******************************************************************"
204     echo "* Building ${NEWLIB}"
205     echo "******************************************************************"
206     make ${PARALLEL} || exit
207     echo "******************************************************************"
208     echo "* Installing ${NEWLIB}"
209     echo "******************************************************************"
210     make install || exit
211     cd ..
212     echo "******************************************************************"
213     echo "* Cleaning up ${NEWLIB}"
214     echo "******************************************************************"
215     touch .${NEWLIB}.build
216     rm -rf build/* ${NEWLIB}
217 fi
218
219 # Yes, you need to build gcc again!
220 if [ ! -e .${GCC}.build ]; then
221     echo "******************************************************************"
222     echo "* Unpacking ${GCC}"
223     echo "******************************************************************"
224     tar xfvj sources/${GCC}.tar.bz2
225     cd build
226     echo "******************************************************************"
227     echo "* Configuring ${GCC}"
228     echo "******************************************************************"
229     ../${GCC}/configure --target=${TARGET} \
230                       --prefix=${PREFIX} \
231                       --enable-interwork \
232                       --enable-multilib \
233                       --enable-languages="c,c++" \
234                       --with-newlib \
235                       --disable-shared \
236                       --with-gnu-as \
237                       --with-gnu-ld \
238                       --disable-nls \
239                       ${GCCFLAGS} || exit
240     echo "******************************************************************"
241     echo "* Building ${GCC}"
242     echo "******************************************************************"
243     make ${PARALLEL} || exit
244     echo "******************************************************************"
245     echo "* Installing ${GCC}"
246     echo "******************************************************************"
247     make install || exit
248     cd ..
249     echo "******************************************************************"
250     echo "* Cleaning up ${GCC}"
251     echo "******************************************************************"
252     touch .${GCC}.build
253     rm -rf build/* ${GCC}
254 fi
255
256 if [ ! -e .${GDB}.build ]; then
257     echo "******************************************************************"
258     echo "* Unpacking ${GDB}"
259     echo "******************************************************************"
260     tar xfvj sources/${GDB}.tar.bz2
261     cd build
262     echo "******************************************************************"
263     echo "* Configuring ${GDB}"
264     echo "******************************************************************"
265     ../${GDB}/configure --target=${TARGET} \
266                       --prefix=${PREFIX} \
267                       --enable-interwork \
268                       --enable-multilib \
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