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.
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.
10 ######################################################################
12 ######################################################################
17 # NOTE: gcc and llvm have to be synchronized
18 # we have chosen toolchains which both are based on gcc-4.2.1
20 readonly INSTALL_ROOT=$(pwd)/toolchain/llvm-cs
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"
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
29 readonly MAKE_OPTS="-j8 VERBOSE=1"
31 readonly TMP=/tmp/llvm-cs
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)
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"
42 readonly SYSROOT="${CODE_SOURCERY_ROOT}/arm-2007q3/${CROSS_TARGET}/libc"
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
46 ######################################################################
48 ######################################################################
51 echo "######################################################################"
53 echo "######################################################################"
58 echo "......................................................................"
60 echo "......................................................................"
65 egrep "^#@" $0 | cut --bytes=3-
70 if [[ -f "$2" ]] ; then
71 echo "$2 already in place"
72 elif [[ $1 =~ 'http://' ]] ; then
73 SubBanner "downloading from $1"
76 SubBanner "copying from $1"
82 # Use this when not a lot of output is expected
86 SubBanner "${message}"
100 SubBanner "${message}"
101 echo "LOGFILE: ${log}"
104 "$@" > ${log} 2>&1 || {
108 echo "LOGFILE: ${log}"
115 ######################################################################
117 ######################################################################
119 # some sanity checks to make sure this script is run from the right place
121 if [[ $(basename $(pwd)) != "native_client" ]] ; then
122 echo "ERROR: run this script from the native_client/ dir"
126 if ! mkdir -p "${INSTALL_ROOT}" ; then
127 echo "ERROR: ${INSTALL_ROOT} can't be created."
133 # TODO(robertm): consider wiping all of ${BASE_DIR}
135 Banner "clearing dirs in ${INSTALL_ROOT}"
136 rm -rf ${INSTALL_ROOT}/*
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}
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."
154 for tool in ${CROSS_TARGET_AS} ${CROSS_TARGET_LD}; do
155 if [[ ! -e $tool ]]; then
156 echo "${tool} not found; exiting."
164 # Build basic llvm tools
165 ConfigureAndBuildLlvm() {
166 local saved_dir=$(pwd)
167 local tmpdir=${TMP}/llvm
168 Banner "Building llvm in ${tmpdir}"
173 Run "Untaring" tar jxf ${LLVM_TARBALL}
176 RunWithLog "Configure" ${TMP}/llvm.configure.log\
177 env -i PATH=/usr/bin/:/bin \
183 --enable-targets=arm \
184 --target=arm-none-linux-gnueabi \
185 --prefix=${LLVM_INSTALL_DIR} \
186 --with-llvmgccdir=${LLVMGCC_INSTALL_DIR}
188 RunWithLog "Make" ${TMP}/llvm.make.log \
189 env -i PATH=/usr/bin/:/bin \
194 RunWithLog "Installing LLVM" ${TMP}/llvm-install.log \
195 make ${MAKE_OPTS} install
201 ConfigureAndBuildGcc() {
202 local tmpdir=${TMP}/llvm-gcc
203 local saved_dir=$(pwd)
205 Banner "Building llvmgcc in ${tmpdir}"
211 Run "Untaring llvm-gcc" \
212 tar jxf ${LLVMGCC_TARBALL}
214 # NOTE: you cannot build llvm-gcc inside the source directory
217 # TODO(robertm): do we really need CROSS_TARGET_*
218 RunWithLog "Configure" ${TMP}/llvm-gcc.configure.log \
219 env -i PATH=/usr/bin/:/bin \
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 \
232 --enable-languages=c,c++ \
234 --disable-libstdcxx-pch \
236 --target=${CROSS_TARGET} \
239 --with-as=${CROSS_TARGET_AS} \
240 --with-ld=${CROSS_TARGET_LD} \
241 --with-sysroot=${SYSROOT}
243 RunWithLog "Make" ${TMP}/llvm-gcc.make.log \
244 env -i PATH=/usr/bin/:/bin:${CODE_SOURCERY_ROOT}/arm-2007q3/bin \
250 RunWithLog "Install" ${TMP}/llvm-gcc.install.log \
251 env -i PATH=/usr/bin/:/bin:${CODE_SOURCERY_ROOT}/arm-2007q3/bin \
259 ######################################################################
261 ######################################################################
262 if [ $# -eq 0 ] ; then
264 echo "ERROR: you must specify a mode on the commandline:"
276 #@ print help for all modes
277 if [ $MODE} = 'help' ] ; then
285 #@ create an llvm/cs based toolchain
286 if [ ${MODE} = 'toolchain' ] ; then
290 DownloadOrCopyAndInstallSourcery
291 ConfigureAndBuildLlvm
295 echo "ERROR: unknown mode ${MODE}"