Blame view

RIOT/dist/tools/toolchains/build_gnuarm_naked.sh 4.64 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  #!/usr/bin/env bash
  
  # directory to install compiled binaries into
  PREFIX=${HOME}/gnuarm-naked
  
  # directory to download source files and store intermediates
  GNUARM_BUILDDIR=${GNUARM_BUILDDIR:-"/tmp/gnuarm-naked-${USER}"}
  
  #GCC_VER=4.5.1
  #GCC_MD5=dc8959e31b01a65ce10d269614815054
  GCC_VER=4.3.4
  GCC_MD5=575b3220bb8e7060939c429fc8608d22
  
  BINUTILS_VER=2.20.1
  BINUTILS_MD5=9cdfb9d6ec0578c166d3beae5e15c4e5
  
  NEWLIB_VER=1.18.0
  NEWLIB_MD5=3dae127d4aa659d72f8ea8c0ff2a7a20
  
  GDB_VER=7.2
  GDB_MD5=64260e6c56979ee750a01055f16091a5
  
  #uncomment to support multi-threaded compile
  MAKE_THREADS=-j4
  
  DOWNLOADER=wget
  DOWNLOADER_OPTS="-nv -c"
  
  #
  # Build targets
  #
  FILES=.
  
  build_binutils() {
      echo "Building binutils..."
      if [ ! -e .binutils_extracted ] ; then
          tar -xjf ${FILES}/binutils-${BINUTILS_VER}.tar.bz2
          touch .binutils_extracted
      fi
      rm -rf binutils-build && mkdir -p binutils-build && cd binutils-build &&
      ../binutils-${BINUTILS_VER}/configure --target=arm-elf --prefix=${PREFIX} --enable-interwork --enable-multilibi --with-float=soft --with-fpu=vfp &&
      make ${MAKE_THREADS} all CFLAGS=-Wformat=0 &&
      make install &&
      cd ${GNUARM_BUILDDIR}
  }
  
  build_gcc() {
      echo "Building gcc..."
      if [ ! -e .gcc_extracted ] ; then
          tar -xjf ${FILES}/gcc-core-${GCC_VER}.tar.bz2 &&
          touch .gcc_extracted
      fi
      rm -rf gcc-build && mkdir -p gcc-build && cd gcc-build &&
      ../gcc-${GCC_VER}/configure --target=arm-elf --prefix=${PREFIX} --enable-interwork --enable-multilib --enable-languages="c" --enable-lto --disable-libssp --disable-hardfloat --with-float=soft --with-fpu=vfp --without-headers &&
  
      make ${MAKE_THREADS} all &&
      make install &&
  
      cd ${GNUARM_BUILDDIR}
  }
  
  extract_newlib() {
      if [ ! -e .newlib_extracted ] ; then
          echo -n "Extracting newlib..."
          tar -xzf ${FILES}/newlib-${NEWLIB_VER}.tar.gz &&
          touch .newlib_extracted &&
          echo " Done."
      fi
  }
  
  build_newlib() {
      cd ${GNUARM_BUILDDIR} &&
  
      if [ ! -e .newlib_extracted ] ; then
          extract_newlib
      fi
  
      rm -rf newlib-build && mkdir -p newlib-build && cd newlib-build &&
      ../newlib-${NEWLIB_VER}/configure --target=arm-elf --prefix=${PREFIX} --enable-interwork --enable-multilib --disable-newlib-supplied-syscalls --enable-newlib-reent-small --enable-newlib-io-long-long --enable-newlib-io-float --with-float=soft --with-fpu=vfp &&
      #--enable-newlib-supplied-syscalls &&
      # options to try: --enable-newlib-reent-small
      make ${MAKE_THREADS} TARGET_CFLAGS=-DREENTRANT_SYSCALLS_PROVIDED all &&
      make install &&
  
      # generate zip-file to provide binary download
      cd ${PREFIX}/arm-elf &&
  
      #
      # package compiled newlib for windows users. any new version must be uploaded to the
      # webserver. see manual arm/toolchain/windows for paths and documentation.
      #
      zip -ru newlib-${NEWLIB_VER}.zip include sys-include lib/*.a lib/thumb/*.a
  
      cd ${GNUARM_BUILDDIR}
  }
  
  build_gdb() {
      echo "Building gdb..."
      if [ ! -e .gdb_extracted ] ; then
          tar -xjf ${FILES}/gdb-${GDB_VER}.tar.bz2 &&
          touch .gdb_extracted
      fi
      rm -rf gdb-build && mkdir -p gdb-build && cd gdb-build &&
      ../gdb-${GDB_VER}/configure --target=arm-elf --prefix=${PREFIX} --enable-interwork --enable-multilib &&
  
      make ${MAKE_THREADS} all CFLAGS=-D_FORTIFY_SOURCE=0 &&
      make install &&
  
      cd ${GNUARM_BUILDDIR}
  }
  
  clean() {
      echo "Cleaning up..."
      rm -rf .gdb_extracted .newlib_extracted .gcc_extracted .binutils_extracted
      rm -rf binutils-build gcc-build newlib-build gdb-build
  }
  
  export PATH=$PATH:${PREFIX}/bin
  
  download() {
      download_file http://ftp.gnu.org/gnu/binutils binutils-${BINUTILS_VER}.tar.bz2 ${BINUTILS_MD5} &&
      download_file ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-${GCC_VER} gcc-core-${GCC_VER}.tar.bz2 ${GCC_MD5} &&
      download_file http://ftp.gnu.org/gnu/gdb gdb-${GDB_VER}.tar.bz2 ${GDB_MD5}
  }
  
  download_file() {
      echo "Downloading ${1}/${2}..."
      ${DOWNLOADER} ${DOWNLOADER_OPTS} $1/$2
  
      echo -n "Checking MD5 of "
      echo "${3}  ${2}" | md5sum -c -
  }
  
  build_all() {
      echo "Starting in ${GNUARM_BUILDDIR}. Installing to ${PREFIX}."
      download &&
      build_binutils &&
      build_gcc &&
      build_gdb &&
  
      echo "Build complete."
  }
  
  usage() {
      echo "usage: ${0} build_[binutils|gcc|newlib|gdb|all]"
      echo "example: ./build_gnuarm build_all"
      echo ""
      echo "Builds a GNU ARM toolchain. installs to HOME/gnuarm, uses /tmp/gnuarm-USER as temp."
      echo "Edit to change these directories."
      echo "Run like \"MAKE_THREADS=-j4 ${0} build_all\" to speed up on multicore systems."
  }
  
  if [ -z "${1}" ]; then
      usage
      exit 1
  fi
  
  mkdir -p ${GNUARM_BUILDDIR}
  
  cd ${GNUARM_BUILDDIR}
  
  $*