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