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
|