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