summaryrefslogtreecommitdiffstats
path: root/tools/clang/scripts/package.sh
blob: 2b23808fafe85759a86acbcdb8576cc219bc2f98 (plain)
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
#!/bin/bash
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This script will check out llvm and clang, and then package the results up
# to a tgz file.

gcc_toolchain=

# Parse command line options.
while [[ $# > 0 ]]; do
  case $1 in
    --gcc-toolchain)
      shift
      if [[ $# == 0 ]]; then
        echo "--gcc-toolchain requires an argument."
        exit 1
      fi
      if [[ -x "$1/bin/gcc" ]]; then
        gcc_toolchain=$1
      else
        echo "Invalid --gcc-toolchain: '$1'."
        echo "'$1/bin/gcc' does not appear to be valid."
        exit 1
      fi
      ;;

    --help)
      echo "usage: $0 [--gcc-toolchain <prefix>]"
      echo
      echo "--gcc-toolchain: Set the prefix for which GCC version should"
      echo "    be used for building. For example, to use gcc in"
      echo "    /opt/foo/bin/gcc, use '--gcc-toolchain '/opt/foo"
      echo
      exit 1
      ;;
    *)
      echo "Unknown argument: '$1'."
      echo "Use --help for help."
      exit 1
      ;;
  esac
  shift
done


THIS_DIR="$(dirname "${0}")"
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm"
LLVM_BOOTSTRAP_DIR="${THIS_DIR}/../../../third_party/llvm-bootstrap"
LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install"
LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build"
LLVM_BIN_DIR="${LLVM_BUILD_DIR}/Release+Asserts/bin"
LLVM_LIB_DIR="${LLVM_BUILD_DIR}/Release+Asserts/lib"

echo "Diff in llvm:" | tee buildlog.txt
svn stat "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt
svn diff "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt
echo "Diff in llvm/tools/clang:" | tee -a buildlog.txt
svn stat "${LLVM_DIR}/tools/clang" 2>&1 | tee -a buildlog.txt
svn diff "${LLVM_DIR}/tools/clang" 2>&1 | tee -a buildlog.txt
echo "Diff in llvm/projects/compiler-rt:" | tee -a buildlog.txt
svn stat "${LLVM_DIR}/projects/compiler-rt" 2>&1 | tee -a buildlog.txt
svn diff "${LLVM_DIR}/projects/compiler-rt" 2>&1 | tee -a buildlog.txt

echo "Starting build" | tee -a buildlog.txt

set -exu

# Do a clobber build.
rm -rf "${LLVM_BOOTSTRAP_DIR}"
rm -rf "${LLVM_BOOTSTRAP_INSTALL_DIR}"
rm -rf "${LLVM_BUILD_DIR}"
extra_flags=
if [[ -n "${gcc_toolchain}" ]]; then
  extra_flags="--gcc-toolchain ${gcc_toolchain}"
fi
"${THIS_DIR}"/update.sh --bootstrap --force-local-build --run-tests \
    ${extra_flags} 2>&1 | tee -a buildlog.txt

R=$("${LLVM_BIN_DIR}/clang" --version | \
     sed -ne 's/clang version .*(trunk \([0-9]*\))/\1/p')

PDIR=clang-$R
rm -rf $PDIR
mkdir $PDIR
mkdir $PDIR/bin
mkdir $PDIR/lib

if [ "$(uname -s)" = "Darwin" ]; then
  SO_EXT="dylib"
else
  SO_EXT="so"
fi

# Copy buildlog over.
cp buildlog.txt $PDIR/

# Copy clang into pdir, symlink clang++ to it.
cp "${LLVM_BIN_DIR}/clang" $PDIR/bin/
(cd $PDIR/bin && ln -sf clang clang++)
cp "${LLVM_BIN_DIR}/llvm-symbolizer" $PDIR/bin/
if [ "$(uname -s)" = "Darwin" ]; then
  cp "${LLVM_BIN_DIR}/libc++.1.${SO_EXT}" $PDIR/bin/
  (cd $PDIR/bin && ln -sf libc++.1.dylib libc++.dylib)
fi

# Copy plugins. Some of the dylibs are pretty big, so copy only the ones we
# care about.
cp "${LLVM_LIB_DIR}/libFindBadConstructs.${SO_EXT}" $PDIR/lib

BLINKGCPLUGIN_LIBNAME=\
$(grep LIBRARYNAME "$THIS_DIR"/../blink_gc_plugin/Makefile \
    | cut -d ' ' -f 3)
cp "${LLVM_LIB_DIR}/lib${BLINKGCPLUGIN_LIBNAME}.${SO_EXT}" $PDIR/lib

if [[ -n "${gcc_toolchain}" ]]; then
  # Copy the stdlibc++.so.6 we linked Clang against so it can run.
  cp "${LLVM_LIB_DIR}/libstdc++.so.6" $PDIR/lib
fi

# Copy built-in headers (lib/clang/3.2/include).
# libcompiler-rt puts all kinds of libraries there too, but we want only some.
if [ "$(uname -s)" = "Darwin" ]; then
  # Keep only the OSX (ASan and profile) and iossim (ASan) runtime libraries:
  # Release+Asserts/lib/clang/*/lib/darwin/libclang_rt.{asan,profile}_*
  find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/darwin*' \
       ! -name '*asan_osx*' ! -name '*asan_iossim*' ! -name '*profile_osx*' | \
      xargs rm
  # Fix LC_ID_DYLIB for the ASan dynamic libraries to be relative to
  # @executable_path.
  # TODO(glider): this is transitional. We'll need to fix the dylib name
  # either in our build system, or in Clang. See also http://crbug.com/344836.
  ASAN_DYLIB_NAMES="libclang_rt.asan_osx_dynamic.dylib
    libclang_rt.asan_iossim_dynamic.dylib"
  for ASAN_DYLIB_NAME in $ASAN_DYLIB_NAMES
  do
    ASAN_DYLIB=$(find "${LLVM_LIB_DIR}/clang" \
                      -type f -path "*${ASAN_DYLIB_NAME}")
    install_name_tool -id @executable_path/${ASAN_DYLIB_NAME} "${ASAN_DYLIB}"
  done
else
  # Keep only
  # Release+Asserts/lib/clang/*/lib/linux/libclang_rt.{[atm]san,profile,ubsan}-*.a
  find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/linux*' \
       ! -name '*[atm]san*' ! -name '*profile*' ! -name '*ubsan*' | xargs rm
fi

cp -R "${LLVM_LIB_DIR}/clang" $PDIR/lib

tar zcf $PDIR.tgz -C $PDIR bin lib buildlog.txt

if [ "$(uname -s)" = "Darwin" ]; then
  PLATFORM=Mac
else
  PLATFORM=Linux_x64
fi

echo To upload, run:
echo gsutil cp -a public-read $PDIR.tgz \
     gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz