95da9dbc3ab346f07b08fdbcef3ec71e7f26b496
[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-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
48 echo "Downloading binutils sources..."
49 wget -c http://ftp.gnu.org/gnu/binutils/${BINUTILS}.tar.bz2
50
51 echo "Downloading gcc sources..."
52 wget -c ftp://ftp.gnu.org/gnu/gcc/${GCC}/${GCC}.tar.bz2
53
54 echo "Downloading newlib sources..."
55 wget -c ftp://sources.redhat.com/pub/newlib/${NEWLIB}.tar.gz
56
57 echo "Downloading gdb sources..."
58 wget -c ftp://ftp.gnu.org/gnu/gdb/${GDB}.tar.bz2
59
60 if [ ${LIBSTM32_EN} != 0 ]; then
61 if [ ! -e libcmsis-${LIBCMSIS}.tar.bz2 ]; then
62         echo "Cloning libcmsis sources..."
63         git clone git://git.open-bldc.org/libcmsis.git
64         cd libcmsis
65         git archive --format=tar --prefix=libcmsis-${LIBCMSIS}/ ${LIBCMSIS} | \
66             bzip2 --stdout > ../libcmsis-${LIBCMSIS}.tar.bz2
67         cd ..
68         rm -rf libcmsis
69 fi
70
71 if [ ! -e libstm32-${LIBSTM32}.tar.bz2 ]; then
72         echo "Cloning libstm32 sources..."
73         git clone git://git.open-bldc.org/libstm32.git
74         cd libstm32
75         git archive --format=tar --prefix=libstm32-${LIBSTM32}/ ${LIBSTM32} | \
76             bzip2 --stdout > ../libstm32-${LIBSTM32}.tar.bz2
77         cd ..
78         rm -rf libstm32
79 fi
80
81 if [ ! -e libstm32usb-${LIBSTM32USB}.tar.bz2 ]; then
82         echo "Cloning libstm32usb sources..."
83         git clone git://git.open-bldc.org/libstm32usb.git
84         cd libstm32usb
85         git archive --format=tar --prefix=libstm32usb-${LIBSTM32USB}/ ${LIBSTM32USB} | \
86             bzip2 --stdout > ../libstm32usb-${LIBSTM32USB}.tar.bz2
87         cd ..
88         rm -rf libstm32usb
89 fi
90 fi
91
92 if [ ${LIBOPENSTM32_EN} != 0 ]; then
93 if [ ! -e libopenstm32-${LIBOPENSTM32}.tar.bz2 ]; then
94         echo "Cloning libopenstm32 sources..."
95         git clone git://libopenstm32.git.sourceforge.net/gitroot/libopenstm32/libopenstm32
96         cd libopenstm32
97         git archive --format=tar --prefix=libopenstm32-${LIBOPENSTM32}/ ${LIBOPENSTM32} | \
98             bzip2 --stdout > ../libopenstm32-${LIBOPENSTM32}.tar.bz2
99         cd ..
100         rm -rf libopenstm32
101 fi
102 fi
103
104 cd ..
105
106 if [ ! -e build ]; then
107     mkdir build
108 fi
109
110 if [ ! -e .${BINUTILS}.build ]; then
111     echo "******************************************************************"
112     echo "* Unpacking ${BINUTILS}"
113     echo "******************************************************************"
114     tar xfvj sources/${BINUTILS}.tar.bz2
115     cd build
116     echo "******************************************************************"
117     echo "* Configuring ${BINUTILS}"
118     echo "******************************************************************"
119     ../${BINUTILS}/configure --target=${TARGET} \
120                            --prefix=${PREFIX} \
121                            --enable-interwork \
122                            --enable-multilib \
123                            --with-gnu-as \
124                            --with-gnu-ld \
125                            --disable-nls || exit
126     echo "******************************************************************"
127     echo "* Building ${BINUTILS}"
128     echo "******************************************************************"
129     make ${PARALLEL} || exit
130     echo "******************************************************************"
131     echo "* Installing ${BINUTILS}"
132     echo "******************************************************************"
133     make install || exit
134     cd ..
135     echo "******************************************************************"
136     echo "* Cleaning up ${BINUTILS}"
137     echo "******************************************************************"
138     touch .${BINUTILS}.build
139     rm -rf build/* ${BINUTILS}
140 fi
141
142 if [ ! -e .${GCC}-boot.build ]; then
143     echo "******************************************************************"
144     echo "* Unpacking ${GCC}-boot"
145     echo "******************************************************************"
146     tar xfvj sources/${GCC}.tar.bz2
147     cd build
148     echo "******************************************************************"
149     echo "* Configuring ${GCC}-boot"
150     echo "******************************************************************"
151     ../${GCC}/configure --target=${TARGET} \
152                       --prefix=${PREFIX} \
153                       --enable-interwork \
154                       --enable-multilib \
155                       --enable-languages="c" \
156                       --with-newlib \
157                       --without-headers \
158                       --disable-shared \
159                       --with-gnu-as \
160                       --with-gnu-ld \
161                       --disable-nls \
162                       ${GCCFLAGS} || exit
163     echo "******************************************************************"
164     echo "* Building ${GCC}-boot"
165     echo "******************************************************************"
166     make ${PARALLEL} all-gcc || exit
167     echo "******************************************************************"
168     echo "* Installing ${GCC}-boot"
169     echo "******************************************************************"
170     make install-gcc || exit
171     cd ..
172     echo "******************************************************************"
173     echo "* Cleaning up ${GCC}-boot"
174     echo "******************************************************************"
175     touch .${GCC}-boot.build
176     rm -rf build/* ${GCC}
177 fi
178
179 if [ ! -e .${NEWLIB}.build ]; then
180     echo "******************************************************************"
181     echo "* Unpacking ${NEWLIB}"
182     echo "******************************************************************"
183     tar xfvz sources/${NEWLIB}.tar.gz
184     cd build
185     echo "******************************************************************"
186     echo "* Configuring ${NEWLIB}"
187     echo "******************************************************************"
188     ../${NEWLIB}/configure --target=${TARGET} \
189                          --prefix=${PREFIX} \
190                          --enable-interwork \
191                          --enable-multilib \
192                          --with-gnu-as \
193                          --with-gnu-ld \
194                          --disable-nls \
195                          --disable-newlib-supplied-syscalls || exit
196     echo "******************************************************************"
197     echo "* Building ${NEWLIB}"
198     echo "******************************************************************"
199     make ${PARALLEL} || exit
200     echo "******************************************************************"
201     echo "* Installing ${NEWLIB}"
202     echo "******************************************************************"
203     make install || exit
204     cd ..
205     echo "******************************************************************"
206     echo "* Cleaning up ${NEWLIB}"
207     echo "******************************************************************"
208     touch .${NEWLIB}.build
209     rm -rf build/* ${NEWLIB}
210 fi
211
212 # Yes, you need to build gcc again!
213 if [ ! -e .${GCC}.build ]; then
214     echo "******************************************************************"
215     echo "* Unpacking ${GCC}"
216     echo "******************************************************************"
217     tar xfvj sources/${GCC}.tar.bz2
218     cd build
219     echo "******************************************************************"
220     echo "* Configuring ${GCC}"
221     echo "******************************************************************"
222     ../${GCC}/configure --target=${TARGET} \
223                       --prefix=${PREFIX} \
224                       --enable-interwork \
225                       --enable-multilib \
226                       --enable-languages="c,c++" \
227                       --with-newlib \
228                       --disable-shared \
229                       --with-gnu-as \
230                       --with-gnu-ld \
231                       --disable-nls \
232                       ${GCCFLAGS} || exit
233     echo "******************************************************************"
234     echo "* Building ${GCC}"
235     echo "******************************************************************"
236     make ${PARALLEL} || exit
237     echo "******************************************************************"
238     echo "* Installing ${GCC}"
239     echo "******************************************************************"
240     make install || exit
241     cd ..
242     echo "******************************************************************"
243     echo "* Cleaning up ${GCC}"
244     echo "******************************************************************"
245     touch .${GCC}.build
246     rm -rf build/* ${GCC}
247 fi
248
249 if [ ! -e .${GDB}.build ]; then
250     echo "******************************************************************"
251     echo "* Unpacking ${GDB}"
252     echo "******************************************************************"
253     tar xfvj sources/${GDB}.tar.bz2
254     cd build
255     echo "******************************************************************"
256     echo "* Configuring ${GDB}"
257     echo "******************************************************************"
258     ../${GDB}/configure --target=${TARGET} \
259                       --prefix=${PREFIX} \
260                       --enable-interwork \
261                       --enable-multilib \
262                       ${GDBFLAGS} || exit
263     echo "******************************************************************"
264     echo "* Building ${GDB}"
265     echo "******************************************************************"
266     make ${PARALLEL} || exit
267     echo "******************************************************************"
268     echo "* Installing ${GDB}"
269     echo "******************************************************************"
270     make install || exit
271     cd ..
272     echo "******************************************************************"
273     echo "* Cleaning up ${GDB}"
274     echo "******************************************************************"
275     touch .${GDB}.build
276     rm -rf build/* ${GDB}
277 fi
278
279 if [ ${LIBSTM32_EN} != 0 ]; then
280 if [ ! -e .libcmsis-${LIBCMSIS}.build ]; then
281     echo "******************************************************************"
282     echo "* Unpacking libcmsis-${LIBCMSIS}"
283     echo "******************************************************************"
284     tar xfvj sources/libcmsis-${LIBCMSIS}.tar.bz2
285     cd libcmsis-${LIBCMSIS}
286     echo "******************************************************************"
287     echo "* Building libcmsis-${LIBCMSIS}"
288     echo "******************************************************************"
289     make arch_prefix=${TARGET} prefix=${PREFIX} || exit
290     echo "******************************************************************"
291     echo "* Installing libcmsis-${LIBCMSIS}"
292     echo "******************************************************************"
293     make arch_prefix=${TARGET} prefix=${PREFIX} install || exit
294     cd ..
295     echo "******************************************************************"
296     echo "* Cleaning up libcmsis-${LIBCMSIS}"
297     echo "******************************************************************"
298     touch .libcmsis-${LIBCMSIS}.build
299     rm -rf libcmsis-${LIBCMSIS}
300 fi
301
302 if [ ! -e .libstm32-${LIBSTM32}.build ]; then
303     echo "******************************************************************"
304     echo "* Unpacking libstm32-${LIBSTM32}"
305     echo "******************************************************************"
306     tar xfvj sources/libstm32-${LIBSTM32}.tar.bz2
307     cd libstm32-${LIBSTM32}
308     echo "******************************************************************"
309     echo "* Building libstm32-${LIBSTM32}"
310     echo "******************************************************************"
311     make arch_prefix=${TARGET} prefix=${PREFIX} || exit
312     echo "******************************************************************"
313     echo "* Installing libstm32-${LIBSTM32}"
314     echo "******************************************************************"
315     make arch_prefix=${TARGET} prefix=${PREFIX} install || exit
316     cd ..
317     echo "******************************************************************"
318     echo "* Cleaning up libstm32-${LIBSTM32}"
319     echo "******************************************************************"
320     touch .libstm32-${LIBSTM32}.build
321     rm -rf libstm32-${LIBSTM32}
322 fi
323
324 if [ ! -e .libstm32usb-${LIBSTM32USB}.build ]; then
325     echo "******************************************************************"
326     echo "* Unpacking libstm32usb-${LIBSTM32USB}"
327     echo "******************************************************************"
328     tar xfvj sources/libstm32usb-${LIBSTM32USB}.tar.bz2
329     cd libstm32usb-${LIBSTM32USB}
330     echo "******************************************************************"
331     echo "* Building libstm32usb-${LIBSTM32USB}"
332     echo "******************************************************************"
333     make arch_prefix=${TARGET} prefix=${PREFIX} || exit
334     echo "******************************************************************"
335     echo "* Installing libstm32usb-${LIBSTM32USB}"
336     echo "******************************************************************"
337     make arch_prefix=${TARGET} prefix=${PREFIX} install || exit
338     cd ..
339     echo "******************************************************************"
340     echo "* Cleaning up libstm32usb-${LIBSTM32USB}"
341     echo "******************************************************************"
342     touch .libstm32usb-${LIBSTM32USB}.build
343     rm -rf libstm32usb-${LIBSTM32USB}
344 fi
345 fi
346
347 if [ $LIBOPENSTM32_EN != 0 ]; then
348     echo "******************************************************************"
349     echo "* Unpacking libopenstm32-${LIBOPENSTM32}"
350     echo "******************************************************************"
351     tar xfvj sources/libopenstm32-${LIBOPENSTM32}.tar.bz2
352     cd libopenstm32-${LIBOPENSTM32}
353     echo "******************************************************************"
354     echo "* Building libopenstm32-${LIBOPENSTM32}"
355     echo "******************************************************************"
356     make PREFIX=${TARGET} DESTDIR=${PREFIX} || exit
357     echo "******************************************************************"
358     echo "* Installing libopenstm32-${LIBOPENSTM32}"
359     echo "******************************************************************"
360     make PREFIX=${TARGET} DESTDIR=${PREFIX} install || exit
361     cd ..
362     echo "******************************************************************"
363     echo "* Cleaning up libopenstm32-${LIBOPENSTM32}"
364     echo "******************************************************************"
365     touch .libopenstm32-${LIBOPENSTM32}.build
366     rm -rf libopenstm32-${LIBOPENSTM32}
367 fi