| OLD | NEW |
| (Empty) |
| 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 | |
| 4 # be 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}-a
s" | |
| 40 readonly CROSS_TARGET_LD="${CODE_SOURCERY_ROOT}/arm-2007q3/bin/${CROSS_TARGET}-l
d" | |
| 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/pub
lic/arm-none-linux-gnueabi/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gn
u.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 | |
| OLD | NEW |