Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / native_client / pnacl / unsupported / llvm-cs-toolchain-creator.sh
1 #!/bin/bash
2 # Copyright 2010 The Native Client Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5 #
6 #@ This script builds and llvm/cs based cross toolchain for
7 #@ benchmarking puposes
8 #@ NOTE: It must be run from the native_client/ directory.
9
10 ######################################################################
11 # Config
12 ######################################################################
13
14 set -o nounset
15 set -o errexit
16
17 # NOTE: gcc and llvm have to be synchronized
18 #       we have chosen toolchains which both are based on gcc-4.2.1
19
20 readonly INSTALL_ROOT=$(pwd)/toolchain/llvm-cs
21
22 readonly CROSS_TARGET=arm-none-linux-gnueabi
23 readonly LLVM_INSTALL_DIR="${INSTALL_ROOT}/${CROSS_TARGET}/llvm"
24 readonly LLVMGCC_INSTALL_DIR="${INSTALL_ROOT}/${CROSS_TARGET}/llvm-gcc-4.2"
25
26 readonly LLVMGCC_TARBALL=$(pwd)/../third_party/llvm/llvm-gcc-4.2-88663.tar.bz2
27 readonly LLVM_TARBALL=$(pwd)/../third_party/llvm/llvm-88663.tar.bz2
28
29 readonly MAKE_OPTS="-j8 VERBOSE=1"
30
31 readonly TMP=/tmp/llvm-cs
32
33 # These are simple compiler wrappers to force 32bit builds
34 readonly CC32=$(readlink -f tools/llvm/mygcc32)
35 readonly CXX32=$(readlink -f tools/llvm/myg++32)
36
37
38 readonly CODE_SOURCERY_ROOT=${INSTALL_ROOT}/codesourcery
39 readonly CROSS_TARGET_AS="${CODE_SOURCERY_ROOT}/arm-2007q3/bin/${CROSS_TARGET}-as"
40 readonly CROSS_TARGET_LD="${CODE_SOURCERY_ROOT}/arm-2007q3/bin/${CROSS_TARGET}-ld"
41
42 readonly SYSROOT="${CODE_SOURCERY_ROOT}/arm-2007q3/${CROSS_TARGET}/libc"
43
44 readonly CS_URL=http://www.codesourcery.com/sgpp/lite/arm/portal/package1787/public/arm-none-linux-gnueabi/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
45
46 ######################################################################
47 # Helper
48 ######################################################################
49
50 Banner() {
51   echo "######################################################################"
52   echo "$@"
53   echo "######################################################################"
54 }
55
56
57 SubBanner() {
58   echo "......................................................................"
59   echo "$@"
60   echo "......................................................................"
61 }
62
63
64 Usage() {
65   egrep "^#@" $0 | cut --bytes=3-
66 }
67
68
69 DownloadOrCopy() {
70   if [[ -f "$2" ]] ; then
71     echo "$2 already in place"
72   elif [[ $1 =~  'http://' ]] ; then
73     SubBanner "downloading from $1"
74     wget $1 -O $2
75   else
76     SubBanner "copying from $1"
77     cp $1 $2
78   fi
79 }
80
81
82 # Use this when not a lot of output is expected
83 Run() {
84   local message=$1
85   shift
86   SubBanner "${message}"
87   echo "COMMMAND: $@"
88   "$@" || {
89     echo
90     Banner "ERROR: $@"
91     exit -1
92   }
93 }
94
95
96 RunWithLog() {
97   local message=$1
98   local log=$2
99   shift 2
100   SubBanner "${message}"
101   echo "LOGFILE: ${log}"
102   echo "PWD: $(pwd)"
103   echo "COMMMAND: $@"
104   "$@" > ${log} 2>&1 || {
105     tail -1000 ${log}
106     echo
107     Banner "ERROR"
108     echo "LOGFILE: ${log}"
109     echo "PWD: $(pwd)"
110     echo "COMMMAND: $@"
111     exit -1
112   }
113 }
114
115 ######################################################################
116 #
117 ######################################################################
118
119 # some sanity checks to make sure this script is run from the right place
120 PathSanityCheck() {
121   if [[ $(basename $(pwd)) != "native_client" ]] ; then
122     echo "ERROR: run this script from the native_client/ dir"
123     exit -1
124   fi
125
126   if ! mkdir -p "${INSTALL_ROOT}" ; then
127      echo "ERROR: ${INSTALL_ROOT} can't be created."
128     exit -1
129   fi
130 }
131
132
133 # TODO(robertm): consider wiping all of ${BASE_DIR}
134 ClearInstallDir() {
135   Banner "clearing dirs in ${INSTALL_ROOT}"
136   rm -rf ${INSTALL_ROOT}/*
137 }
138
139
140 DownloadOrCopyAndInstallSourcery() {
141   local tarball="${TMP}/${CS_URL##*/}"
142   DownloadOrCopy ${CS_URL} ${tarball}
143   rm -rf ${CODE_SOURCERY_ROOT}
144   mkdir -p ${CODE_SOURCERY_ROOT}
145   tar jxf  ${tarball} -C  ${CODE_SOURCERY_ROOT}
146
147   # Verify our CodeSourcery toolchain installation.
148   if [[ ! -d "${SYSROOT}" ]]; then
149     echo -n "Error: CodeSourcery does not contain libc for ${CROSS_TARGET}: "
150     echo "${SYSROOT} not found."
151     exit -1
152   fi
153
154   for tool in ${CROSS_TARGET_AS} ${CROSS_TARGET_LD}; do
155     if [[ ! -e $tool ]]; then
156       echo "${tool} not found; exiting."
157       exit -1
158     fi
159   done
160 }
161
162
163
164 # Build basic llvm tools
165 ConfigureAndBuildLlvm() {
166   local saved_dir=$(pwd)
167   local tmpdir=${TMP}/llvm
168   Banner "Building llvm in ${tmpdir}"
169   rm -rf ${tmpdir}
170   mkdir -p ${tmpdir}
171   cd ${tmpdir}
172
173   Run "Untaring" tar jxf ${LLVM_TARBALL}
174   cd llvm
175
176   RunWithLog "Configure" ${TMP}/llvm.configure.log\
177       env -i PATH=/usr/bin/:/bin \
178           CC=${CC32} \
179           CXX=${CXX32} \
180           ./configure \
181           --disable-jit \
182           --enable-optimized \
183           --enable-targets=arm \
184           --target=arm-none-linux-gnueabi \
185           --prefix=${LLVM_INSTALL_DIR} \
186           --with-llvmgccdir=${LLVMGCC_INSTALL_DIR}
187
188   RunWithLog "Make" ${TMP}/llvm.make.log \
189     env -i PATH=/usr/bin/:/bin \
190            CC=${CC32} \
191            CXX=${CXX32} \
192            make ${MAKE_OPTS}
193
194   RunWithLog "Installing LLVM" ${TMP}/llvm-install.log \
195        make ${MAKE_OPTS} install
196
197   cd ${saved_dir}
198 }
199
200
201 ConfigureAndBuildGcc() {
202   local tmpdir=${TMP}/llvm-gcc
203   local saved_dir=$(pwd)
204
205   Banner "Building llvmgcc in ${tmpdir}"
206
207   rm -rf ${tmpdir}
208   mkdir -p ${tmpdir}
209   cd ${tmpdir}
210
211   Run "Untaring llvm-gcc" \
212     tar jxf ${LLVMGCC_TARBALL}
213
214   # NOTE: you cannot build llvm-gcc inside the source directory
215   mkdir -p build
216   cd build
217   # TODO(robertm): do we really need CROSS_TARGET_*
218   RunWithLog "Configure" ${TMP}/llvm-gcc.configure.log \
219       env -i PATH=/usr/bin/:/bin \
220           CC=${CC32} \
221           CXX=${CXX32} \
222           CFLAGS="-Dinhibit_libc" \
223           CXXFLAGS="-Dinhibit_libc" \
224           ../llvm-gcc-4.2/configure \
225           --prefix=${LLVMGCC_INSTALL_DIR} \
226           --enable-llvm=${LLVM_INSTALL_DIR} \
227           --program-prefix=llvm- \
228           --disable-libmudflap \
229           --disable-decimal-float \
230           --disable-libssp \
231           --disable-libgomp \
232           --enable-languages=c,c++ \
233           --disable-threads \
234           --disable-libstdcxx-pch \
235           --disable-shared \
236           --target=${CROSS_TARGET} \
237           --with-arch=armv6 \
238           --with-fpu=vfp \
239           --with-as=${CROSS_TARGET_AS} \
240           --with-ld=${CROSS_TARGET_LD} \
241           --with-sysroot=${SYSROOT}
242
243   RunWithLog "Make" ${TMP}/llvm-gcc.make.log \
244       env -i PATH=/usr/bin/:/bin:${CODE_SOURCERY_ROOT}/arm-2007q3/bin \
245           CC=${CC32} \
246           CXX=${CXX32} \
247           make \
248           ${MAKE_OPTS}
249
250   RunWithLog "Install" ${TMP}/llvm-gcc.install.log \
251       env -i PATH=/usr/bin/:/bin:${CODE_SOURCERY_ROOT}/arm-2007q3/bin \
252           make install
253
254   cd ${saved_dir}
255 }
256
257
258
259 ######################################################################
260 # Main
261 ######################################################################
262 if [ $# -eq 0 ] ; then
263   echo
264   echo "ERROR: you must specify a mode on the commandline:"
265   echo
266   Usage
267   exit -1
268 fi
269
270 MODE=$1
271 shift
272
273 #@
274 #@ help
275 #@
276 #@   print help for all modes
277 if [ $MODE} = 'help' ] ; then
278   Usage
279   exit 0
280 fi
281
282 #@
283 #@ toolchain
284 #@
285 #@    create an llvm/cs based toolchain
286 if [ ${MODE} = 'toolchain' ] ; then
287   mkdir -p ${TMP}
288   PathSanityCheck
289   ClearInstallDir
290   DownloadOrCopyAndInstallSourcery
291   ConfigureAndBuildLlvm
292   ConfigureAndBuildGcc
293 fi
294
295 echo "ERROR: unknown mode ${MODE}"
296 exit -1