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