blob: 7e5ac1e580722d4f7e6622a2ec55bd458ec0d93d [file] [log] [blame]
Ilya Biryukovaf351da2017-06-30 09:46:45 +00001#!/usr/bin/env bash
2#===- llvm/utils/docker/scripts/build_install_llvm.sh ---------------------===//
3#
4# The LLVM Compiler Infrastructure
5#
6# This file is distributed under the University of Illinois Open Source
7# License. See LICENSE.TXT for details.
8#
9#===-----------------------------------------------------------------------===//
10
11set -e
12
13function show_usage() {
Don Hinton1e4f6022017-07-31 15:18:57 +000014 cat << EOF
Ilya Biryukovaf351da2017-06-30 09:46:45 +000015Usage: build_install_llvm.sh [options] -- [cmake-args]
16
17Checkout svn sources and run cmake with the specified arguments. Used
18inside docker container.
Ilya Biryukovd9502012018-03-26 15:12:30 +000019Passes additional -DCMAKE_INSTALL_PREFIX and puts the build results into
20/tmp/clang-install/ directory.
Ilya Biryukovaf351da2017-06-30 09:46:45 +000021
22Available options:
23 -h|--help show this help message
24 -b|--branch svn branch to checkout, i.e. 'trunk',
25 'branches/release_40'
26 (default: 'trunk')
27 -r|--revision svn revision to checkout
Ilya Biryukov75db0812017-12-20 14:39:07 +000028 -c|--cherrypick revision to cherry-pick. Can be specified multiple times.
29 Cherry-picks are performed in the sorted order using the
30 following command:
31 'svn patch <(svn diff -c \$rev)'.
Ilya Biryukovaf351da2017-06-30 09:46:45 +000032 -p|--llvm-project name of an svn project to checkout. Will also add the
33 project to a list LLVM_ENABLE_PROJECTS, passed to CMake.
34 For clang, please use 'clang', not 'cfe'.
35 Project 'llvm' is always included and ignored, if
36 specified.
37 Can be specified multiple times.
38 -i|--install-target name of a cmake install target to build and include in
39 the resulting archive. Can be specified multiple times.
40Required options: At least one --install-target.
41
42All options after '--' are passed to CMake invocation.
43EOF
Ilya Biryukovaf351da2017-06-30 09:46:45 +000044}
45
46LLVM_SVN_REV=""
Ilya Biryukov75db0812017-12-20 14:39:07 +000047CHERRYPICKS=""
Ilya Biryukovaf351da2017-06-30 09:46:45 +000048LLVM_BRANCH=""
49CMAKE_ARGS=""
50CMAKE_INSTALL_TARGETS=""
51# We always checkout llvm
52LLVM_PROJECTS="llvm"
53CMAKE_LLVM_ENABLE_PROJECTS=""
Ilya Biryukove421fc82017-07-20 08:30:44 +000054CLANG_TOOLS_EXTRA_ENABLED=0
Ilya Biryukovaf351da2017-06-30 09:46:45 +000055
56function contains_project() {
57 local TARGET_PROJ="$1"
58 local PROJ
59 for PROJ in $LLVM_PROJECTS; do
60 if [ "$PROJ" == "$TARGET_PROJ" ]; then
61 return 0
62 fi
63 done
64 return 1
65}
66
Ilya Biryukove421fc82017-07-20 08:30:44 +000067function append_project() {
68 local PROJ="$1"
69
70 LLVM_PROJECTS="$LLVM_PROJECTS $PROJ"
71 if [ "$CMAKE_LLVM_ENABLE_PROJECTS" != "" ]; then
72 CMAKE_LLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLE_PROJECTS;$PROJ"
73 else
74 CMAKE_LLVM_ENABLE_PROJECTS="$PROJ"
75 fi
76}
77
Ilya Biryukovaf351da2017-06-30 09:46:45 +000078while [[ $# -gt 0 ]]; do
79 case "$1" in
80 -r|--revision)
81 shift
82 LLVM_SVN_REV="$1"
Ilya Biryukov4d7234c2017-07-03 15:16:27 +000083 shift
Ilya Biryukovaf351da2017-06-30 09:46:45 +000084 ;;
Ilya Biryukov75db0812017-12-20 14:39:07 +000085 -c|--cherrypick)
86 shift
87 CHERRYPICKS="$CHERRYPICKS $1"
88 shift
89 ;;
Ilya Biryukovaf351da2017-06-30 09:46:45 +000090 -b|--branch)
91 shift
92 LLVM_BRANCH="$1"
93 shift
94 ;;
95 -p|--llvm-project)
96 shift
97 PROJ="$1"
Ilya Biryukove421fc82017-07-20 08:30:44 +000098 shift
99
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000100 if [ "$PROJ" == "cfe" ]; then
101 PROJ="clang"
102 fi
Ilya Biryukove421fc82017-07-20 08:30:44 +0000103
104 if [ "$PROJ" == "clang-tools-extra" ]; then
105 if [ $CLANG_TOOLS_EXTRA_ENABLED -ne 0 ]; then
Malcolm Parsons21e545d2018-01-24 10:33:39 +0000106 echo "Project 'clang-tools-extra' is already enabled, ignoring extra occurrences."
Ilya Biryukove421fc82017-07-20 08:30:44 +0000107 else
108 CLANG_TOOLS_EXTRA_ENABLED=1
Ilya Biryukov13cde862017-07-06 13:10:55 +0000109 fi
Ilya Biryukove421fc82017-07-20 08:30:44 +0000110
111 continue
112 fi
113
114 if ! contains_project "$PROJ" ; then
115 append_project "$PROJ"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000116 else
Malcolm Parsons21e545d2018-01-24 10:33:39 +0000117 echo "Project '$PROJ' is already enabled, ignoring extra occurrences."
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000118 fi
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000119 ;;
120 -i|--install-target)
121 shift
122 CMAKE_INSTALL_TARGETS="$CMAKE_INSTALL_TARGETS $1"
123 shift
124 ;;
125 --)
126 shift
127 CMAKE_ARGS="$*"
128 shift $#
129 ;;
130 -h|--help)
131 show_usage
132 exit 0
133 ;;
134 *)
135 echo "Unknown option: $1"
136 exit 1
137 esac
138done
139
140if [ "$CMAKE_INSTALL_TARGETS" == "" ]; then
141 echo "No install targets. Please pass one or more --install-target."
142 exit 1
143fi
144
Ilya Biryukove421fc82017-07-20 08:30:44 +0000145if [ $CLANG_TOOLS_EXTRA_ENABLED -ne 0 ]; then
146 if ! contains_project "clang"; then
147 echo "Project 'clang-tools-extra' was enabled without 'clang'."
148 echo "Adding 'clang' to a list of projects."
149
150 append_project "clang"
151 fi
152fi
153
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000154if [ "$LLVM_BRANCH" == "" ]; then
155 LLVM_BRANCH="trunk"
156fi
157
Ilya Biryukovb2c07942017-08-23 15:36:44 +0000158if [ "$LLVM_SVN_REV" != "" ]; then
159 SVN_REV_ARG="-r$LLVM_SVN_REV"
160 echo "Checking out svn revision r$LLVM_SVN_REV."
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000161else
162 SVN_REV_ARG=""
Ilya Biryukovb2c07942017-08-23 15:36:44 +0000163 echo "Checking out latest svn revision."
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000164fi
165
Ilya Biryukov75db0812017-12-20 14:39:07 +0000166# Sort cherrypicks and remove duplicates.
167CHERRYPICKS="$(echo "$CHERRYPICKS" | xargs -n1 | sort | uniq | xargs)"
168
169function apply_cherrypicks() {
170 local CHECKOUT_DIR="$1"
171
172 [ "$CHERRYPICKS" == "" ] || echo "Applying cherrypicks"
173 pushd "$CHECKOUT_DIR"
174
175 # This function is always called on a sorted list of cherrypicks.
176 for CHERRY_REV in $CHERRYPICKS; do
177 echo "Cherry-picking r$CHERRY_REV into $CHECKOUT_DIR"
178
179 local PATCH_FILE="$(mktemp)"
180 svn diff -c $CHERRY_REV > "$PATCH_FILE"
181 svn patch "$PATCH_FILE"
182 rm "$PATCH_FILE"
183 done
184
185 popd
186}
187
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000188CLANG_BUILD_DIR=/tmp/clang-build
189CLANG_INSTALL_DIR=/tmp/clang-install
190
191mkdir "$CLANG_BUILD_DIR"
192
193# Get the sources from svn.
194echo "Checking out sources from svn"
195mkdir "$CLANG_BUILD_DIR/src"
196for LLVM_PROJECT in $LLVM_PROJECTS; do
197 if [ "$LLVM_PROJECT" == "clang" ]; then
198 SVN_PROJECT="cfe"
199 else
200 SVN_PROJECT="$LLVM_PROJECT"
201 fi
202
Ilya Biryukov13cde862017-07-06 13:10:55 +0000203 echo "Checking out https://llvm.org/svn/llvm-project/$SVN_PROJECT to $CLANG_BUILD_DIR/src/$LLVM_PROJECT"
Ilya Biryukov827c8ac2017-08-18 09:37:23 +0000204 svn co -q $SVN_REV_ARG \
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000205 "https://llvm.org/svn/llvm-project/$SVN_PROJECT/$LLVM_BRANCH" \
206 "$CLANG_BUILD_DIR/src/$LLVM_PROJECT"
Ilya Biryukov75db0812017-12-20 14:39:07 +0000207
208 # We apply cherrypicks to all repositories regardless of whether the revision
209 # changes this repository or not. For repositories not affected by the
210 # cherrypick, applying the cherrypick is a no-op.
211 apply_cherrypicks "$CLANG_BUILD_DIR/src/$LLVM_PROJECT"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000212done
213
Ilya Biryukove421fc82017-07-20 08:30:44 +0000214if [ $CLANG_TOOLS_EXTRA_ENABLED -ne 0 ]; then
215 echo "Checking out https://llvm.org/svn/llvm-project/clang-tools-extra to $CLANG_BUILD_DIR/src/clang/tools/extra"
Ilya Biryukov827c8ac2017-08-18 09:37:23 +0000216 svn co -q $SVN_REV_ARG \
Ilya Biryukove421fc82017-07-20 08:30:44 +0000217 "https://llvm.org/svn/llvm-project/clang-tools-extra/$LLVM_BRANCH" \
218 "$CLANG_BUILD_DIR/src/clang/tools/extra"
Ilya Biryukov75db0812017-12-20 14:39:07 +0000219
220 apply_cherrypicks "$CLANG_BUILD_DIR/src/clang/tools/extra"
Ilya Biryukove421fc82017-07-20 08:30:44 +0000221fi
222
Ilya Biryukov8b62e082017-09-15 13:35:54 +0000223CHECKSUMS_FILE="/tmp/checksums/checksums.txt"
224
225if [ -f "$CHECKSUMS_FILE" ]; then
226 echo "Validating checksums for LLVM checkout..."
227 python "$(dirname $0)/llvm_checksum/llvm_checksum.py" -c "$CHECKSUMS_FILE" \
228 --partial --multi_dir "$CLANG_BUILD_DIR/src"
229else
230 echo "Skipping checksumming checks..."
231fi
232
Ilya Biryukov13cde862017-07-06 13:10:55 +0000233mkdir "$CLANG_BUILD_DIR/build"
234pushd "$CLANG_BUILD_DIR/build"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000235
236# Run the build as specified in the build arguments.
237echo "Running build"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000238cmake -GNinja \
239 -DCMAKE_INSTALL_PREFIX="$CLANG_INSTALL_DIR" \
240 -DLLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLE_PROJECTS" \
241 $CMAKE_ARGS \
242 "$CLANG_BUILD_DIR/src/llvm"
243ninja $CMAKE_INSTALL_TARGETS
244
245popd
246
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000247# Cleanup.
Ilya Biryukovd9502012018-03-26 15:12:30 +0000248rm -rf "$CLANG_BUILD_DIR"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000249
250echo "Done"