| OLD | NEW |
| (Empty) |
| 1 #!/bin/bash | |
| 2 # Copyright (c) 2012 The Chromium 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 will check out llvm and clang, and then package the results up | |
| 7 # to a tgz file. | |
| 8 | |
| 9 gcc_toolchain= | |
| 10 | |
| 11 # Parse command line options. | |
| 12 while [[ $# > 0 ]]; do | |
| 13 case $1 in | |
| 14 --gcc-toolchain) | |
| 15 shift | |
| 16 if [[ $# == 0 ]]; then | |
| 17 echo "--gcc-toolchain requires an argument." | |
| 18 exit 1 | |
| 19 fi | |
| 20 if [[ -x "$1/bin/gcc" ]]; then | |
| 21 gcc_toolchain=$1 | |
| 22 else | |
| 23 echo "Invalid --gcc-toolchain: '$1'." | |
| 24 echo "'$1/bin/gcc' does not appear to be valid." | |
| 25 exit 1 | |
| 26 fi | |
| 27 ;; | |
| 28 | |
| 29 --help) | |
| 30 echo "usage: $0 [--gcc-toolchain <prefix>]" | |
| 31 echo | |
| 32 echo "--gcc-toolchain: Set the prefix for which GCC version should" | |
| 33 echo " be used for building. For example, to use gcc in" | |
| 34 echo " /opt/foo/bin/gcc, use '--gcc-toolchain '/opt/foo" | |
| 35 echo | |
| 36 exit 1 | |
| 37 ;; | |
| 38 *) | |
| 39 echo "Unknown argument: '$1'." | |
| 40 echo "Use --help for help." | |
| 41 exit 1 | |
| 42 ;; | |
| 43 esac | |
| 44 shift | |
| 45 done | |
| 46 | |
| 47 | |
| 48 THIS_DIR="$(dirname "${0}")" | |
| 49 LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" | |
| 50 LLVM_BOOTSTRAP_DIR="${THIS_DIR}/../../../third_party/llvm-bootstrap" | |
| 51 LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install" | |
| 52 LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build" | |
| 53 LLVM_BIN_DIR="${LLVM_BUILD_DIR}/Release+Asserts/bin" | |
| 54 LLVM_LIB_DIR="${LLVM_BUILD_DIR}/Release+Asserts/lib" | |
| 55 STAMP_FILE="${LLVM_DIR}/../llvm-build/cr_build_revision" | |
| 56 | |
| 57 echo "Diff in llvm:" | tee buildlog.txt | |
| 58 svn stat "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt | |
| 59 svn diff "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt | |
| 60 echo "Diff in llvm/tools/clang:" | tee -a buildlog.txt | |
| 61 svn stat "${LLVM_DIR}/tools/clang" 2>&1 | tee -a buildlog.txt | |
| 62 svn diff "${LLVM_DIR}/tools/clang" 2>&1 | tee -a buildlog.txt | |
| 63 echo "Diff in llvm/compiler-rt:" | tee -a buildlog.txt | |
| 64 svn stat "${LLVM_DIR}/compiler-rt" 2>&1 | tee -a buildlog.txt | |
| 65 svn diff "${LLVM_DIR}/compiler-rt" 2>&1 | tee -a buildlog.txt | |
| 66 echo "Diff in llvm/projects/libcxx:" | tee -a buildlog.txt | |
| 67 svn stat "${LLVM_DIR}/projects/libcxx" 2>&1 | tee -a buildlog.txt | |
| 68 svn diff "${LLVM_DIR}/projects/libcxx" 2>&1 | tee -a buildlog.txt | |
| 69 echo "Diff in llvm/projects/libcxxabi:" | tee -a buildlog.txt | |
| 70 svn stat "${LLVM_DIR}/projects/libcxxabi" 2>&1 | tee -a buildlog.txt | |
| 71 svn diff "${LLVM_DIR}/projects/libcxxabi" 2>&1 | tee -a buildlog.txt | |
| 72 | |
| 73 | |
| 74 echo "Starting build" | tee -a buildlog.txt | |
| 75 | |
| 76 set -exu | |
| 77 set -o pipefail | |
| 78 | |
| 79 # Do a clobber build. | |
| 80 rm -rf "${LLVM_BOOTSTRAP_DIR}" | |
| 81 rm -rf "${LLVM_BOOTSTRAP_INSTALL_DIR}" | |
| 82 rm -rf "${LLVM_BUILD_DIR}" | |
| 83 extra_flags= | |
| 84 if [[ -n "${gcc_toolchain}" ]]; then | |
| 85 extra_flags="--gcc-toolchain ${gcc_toolchain}" | |
| 86 fi | |
| 87 "${THIS_DIR}"/update.sh --bootstrap --force-local-build --run-tests \ | |
| 88 ${extra_flags} 2>&1 | tee -a buildlog.txt | |
| 89 | |
| 90 R=$(cat "${STAMP_FILE}") | |
| 91 | |
| 92 PDIR=clang-$R | |
| 93 rm -rf $PDIR | |
| 94 mkdir $PDIR | |
| 95 mkdir $PDIR/bin | |
| 96 mkdir $PDIR/lib | |
| 97 | |
| 98 GOLDDIR=llvmgold-$R | |
| 99 if [ "$(uname -s)" = "Linux" ]; then | |
| 100 mkdir -p $GOLDDIR/lib | |
| 101 fi | |
| 102 | |
| 103 if [ "$(uname -s)" = "Darwin" ]; then | |
| 104 SO_EXT="dylib" | |
| 105 else | |
| 106 SO_EXT="so" | |
| 107 fi | |
| 108 | |
| 109 # Copy buildlog over. | |
| 110 cp buildlog.txt $PDIR/ | |
| 111 | |
| 112 # Copy clang into pdir, symlink clang++ to it. | |
| 113 cp "${LLVM_BIN_DIR}/clang" $PDIR/bin/ | |
| 114 (cd $PDIR/bin && ln -sf clang clang++) | |
| 115 cp "${LLVM_BIN_DIR}/llvm-symbolizer" $PDIR/bin/ | |
| 116 if [ "$(uname -s)" = "Darwin" ]; then | |
| 117 cp "${LLVM_BIN_DIR}/libc++.1.${SO_EXT}" $PDIR/bin/ | |
| 118 (cd $PDIR/bin && ln -sf libc++.1.dylib libc++.dylib) | |
| 119 fi | |
| 120 | |
| 121 # Copy libc++ headers. | |
| 122 if [ "$(uname -s)" = "Darwin" ]; then | |
| 123 mkdir $PDIR/include | |
| 124 cp -R "${LLVM_BOOTSTRAP_INSTALL_DIR}/include/c++" $PDIR/include | |
| 125 fi | |
| 126 | |
| 127 # Copy plugins. Some of the dylibs are pretty big, so copy only the ones we | |
| 128 # care about. | |
| 129 cp "${LLVM_LIB_DIR}/libFindBadConstructs.${SO_EXT}" $PDIR/lib | |
| 130 cp "${LLVM_LIB_DIR}/libBlinkGCPlugin.${SO_EXT}" $PDIR/lib | |
| 131 | |
| 132 # Copy gold plugin on Linux. | |
| 133 if [ "$(uname -s)" = "Linux" ]; then | |
| 134 cp "${LLVM_LIB_DIR}/LLVMgold.${SO_EXT}" $GOLDDIR/lib | |
| 135 fi | |
| 136 | |
| 137 if [[ -n "${gcc_toolchain}" ]]; then | |
| 138 # Copy the stdlibc++.so.6 we linked Clang against so it can run. | |
| 139 cp "${LLVM_LIB_DIR}/libstdc++.so.6" $PDIR/lib | |
| 140 fi | |
| 141 | |
| 142 # Copy built-in headers (lib/clang/3.x.y/include). | |
| 143 # compiler-rt builds all kinds of libraries, but we want only some. | |
| 144 if [ "$(uname -s)" = "Darwin" ]; then | |
| 145 # Keep only the OSX (ASan and profile) and iossim (ASan) runtime libraries: | |
| 146 # Release+Asserts/lib/clang/*/lib/darwin/libclang_rt.{asan,profile}_* | |
| 147 find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/darwin*' \ | |
| 148 ! -name '*asan_osx*' ! -name '*asan_iossim*' ! -name '*profile_osx*' | \ | |
| 149 xargs rm | |
| 150 # Fix LC_ID_DYLIB for the ASan dynamic libraries to be relative to | |
| 151 # @executable_path. | |
| 152 # TODO(glider): this is transitional. We'll need to fix the dylib name | |
| 153 # either in our build system, or in Clang. See also http://crbug.com/344836. | |
| 154 ASAN_DYLIB_NAMES="libclang_rt.asan_osx_dynamic.dylib | |
| 155 libclang_rt.asan_iossim_dynamic.dylib" | |
| 156 for ASAN_DYLIB_NAME in $ASAN_DYLIB_NAMES | |
| 157 do | |
| 158 ASAN_DYLIB=$(find "${LLVM_LIB_DIR}/clang" \ | |
| 159 -type f -path "*${ASAN_DYLIB_NAME}") | |
| 160 install_name_tool -id @executable_path/${ASAN_DYLIB_NAME} "${ASAN_DYLIB}" | |
| 161 strip -x "${ASAN_DYLIB}" | |
| 162 done | |
| 163 else | |
| 164 # Keep only | |
| 165 # Release+Asserts/lib/clang/*/lib/linux/libclang_rt.{[atm]san,san,ubsan,profil
e}-*.a | |
| 166 # , but not dfsan. | |
| 167 find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/linux*' \ | |
| 168 ! -name '*[atm]san*' ! -name '*ubsan*' ! -name '*libclang_rt.san*' \ | |
| 169 ! -name '*profile*' | xargs rm -v | |
| 170 # Strip the debug info from the runtime libraries. | |
| 171 find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/linux*' ! -name '*.syms' | xa
rgs strip -g | |
| 172 fi | |
| 173 | |
| 174 cp -vR "${LLVM_LIB_DIR}/clang" $PDIR/lib | |
| 175 | |
| 176 if [ "$(uname -s)" = "Darwin" ]; then | |
| 177 tar zcf $PDIR.tgz -C $PDIR bin include lib buildlog.txt | |
| 178 else | |
| 179 tar zcf $PDIR.tgz -C $PDIR bin lib buildlog.txt | |
| 180 fi | |
| 181 | |
| 182 if [ "$(uname -s)" = "Linux" ]; then | |
| 183 tar zcf $GOLDDIR.tgz -C $GOLDDIR lib | |
| 184 fi | |
| 185 | |
| 186 if [ "$(uname -s)" = "Darwin" ]; then | |
| 187 PLATFORM=Mac | |
| 188 else | |
| 189 PLATFORM=Linux_x64 | |
| 190 fi | |
| 191 | |
| 192 echo To upload, run: | |
| 193 echo gsutil cp -a public-read $PDIR.tgz \ | |
| 194 gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz | |
| 195 if [ "$(uname -s)" = "Linux" ]; then | |
| 196 echo gsutil cp -a public-read $GOLDDIR.tgz \ | |
| 197 gs://chromium-browser-clang/$PLATFORM/$GOLDDIR.tgz | |
| 198 fi | |
| 199 | |
| 200 # FIXME: Warn if the file already exists on the server. | |
| OLD | NEW |