blob: aef4e0cbca2cd0df4fe1c772c4b9f494cbf54a63 [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() {
14 usage=$(cat << EOF
15Usage: build_install_llvm.sh [options] -- [cmake-args]
16
17Checkout svn sources and run cmake with the specified arguments. Used
18inside docker container.
19Passes additional -DCMAKE_INSTALL_PREFIX and archives the contents of
20the directory to /tmp/clang.tar.gz.
21
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
28 -p|--llvm-project name of an svn project to checkout. Will also add the
29 project to a list LLVM_ENABLE_PROJECTS, passed to CMake.
30 For clang, please use 'clang', not 'cfe'.
31 Project 'llvm' is always included and ignored, if
32 specified.
33 Can be specified multiple times.
34 -i|--install-target name of a cmake install target to build and include in
35 the resulting archive. Can be specified multiple times.
36Required options: At least one --install-target.
37
38All options after '--' are passed to CMake invocation.
39EOF
40)
41 echo "$usage"
42}
43
44LLVM_SVN_REV=""
45LLVM_BRANCH=""
46CMAKE_ARGS=""
47CMAKE_INSTALL_TARGETS=""
48# We always checkout llvm
49LLVM_PROJECTS="llvm"
50CMAKE_LLVM_ENABLE_PROJECTS=""
51
52function contains_project() {
53 local TARGET_PROJ="$1"
54 local PROJ
55 for PROJ in $LLVM_PROJECTS; do
56 if [ "$PROJ" == "$TARGET_PROJ" ]; then
57 return 0
58 fi
59 done
60 return 1
61}
62
63while [[ $# -gt 0 ]]; do
64 case "$1" in
65 -r|--revision)
66 shift
67 LLVM_SVN_REV="$1"
Ilya Biryukov4d7234c2017-07-03 15:16:27 +000068 shift
Ilya Biryukovaf351da2017-06-30 09:46:45 +000069 ;;
70 -b|--branch)
71 shift
72 LLVM_BRANCH="$1"
73 shift
74 ;;
75 -p|--llvm-project)
76 shift
77 PROJ="$1"
78 if [ "$PROJ" == "cfe" ]; then
79 PROJ="clang"
80 fi
81 if ! contains_project "$PROJ" ; then
82 LLVM_PROJECTS="$LLVM_PROJECTS $PROJ"
Ilya Biryukov13cde862017-07-06 13:10:55 +000083 if [ "$CMAKE_LLVM_ENABLE_PROJECTS" != "" ]; then
84 CMAKE_LLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLE_PROJECTS;"
85 fi
86 CMAKE_LLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLED_PROJECTS$PROJ"
Ilya Biryukovaf351da2017-06-30 09:46:45 +000087 else
88 echo "Project '$PROJ' is already enabled, ignoring extra occurences."
89 fi
90 shift
91 ;;
92 -i|--install-target)
93 shift
94 CMAKE_INSTALL_TARGETS="$CMAKE_INSTALL_TARGETS $1"
95 shift
96 ;;
97 --)
98 shift
99 CMAKE_ARGS="$*"
100 shift $#
101 ;;
102 -h|--help)
103 show_usage
104 exit 0
105 ;;
106 *)
107 echo "Unknown option: $1"
108 exit 1
109 esac
110done
111
112if [ "$CMAKE_INSTALL_TARGETS" == "" ]; then
113 echo "No install targets. Please pass one or more --install-target."
114 exit 1
115fi
116
117if [ "$LLVM_BRANCH" == "" ]; then
118 LLVM_BRANCH="trunk"
119fi
120
121if [ "$LLVM_SVN_REVISION" != "" ]; then
122 SVN_REV_ARG="-r$LLVM_SVN_REVISION"
123else
124 SVN_REV_ARG=""
125fi
126
127CLANG_BUILD_DIR=/tmp/clang-build
128CLANG_INSTALL_DIR=/tmp/clang-install
129
130mkdir "$CLANG_BUILD_DIR"
131
132# Get the sources from svn.
133echo "Checking out sources from svn"
134mkdir "$CLANG_BUILD_DIR/src"
135for LLVM_PROJECT in $LLVM_PROJECTS; do
136 if [ "$LLVM_PROJECT" == "clang" ]; then
137 SVN_PROJECT="cfe"
138 else
139 SVN_PROJECT="$LLVM_PROJECT"
140 fi
141
Ilya Biryukov13cde862017-07-06 13:10:55 +0000142 echo "Checking out https://llvm.org/svn/llvm-project/$SVN_PROJECT to $CLANG_BUILD_DIR/src/$LLVM_PROJECT"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000143 # FIXME: --trust-server-cert is required to workaround 'SSL issuer is not
144 # trusted' error. Using https seems preferable to http either way,
145 # albeit this is not secure.
146 svn co -q $SVN_REV_ARG --trust-server-cert \
147 "https://llvm.org/svn/llvm-project/$SVN_PROJECT/$LLVM_BRANCH" \
148 "$CLANG_BUILD_DIR/src/$LLVM_PROJECT"
149done
150
Ilya Biryukov13cde862017-07-06 13:10:55 +0000151mkdir "$CLANG_BUILD_DIR/build"
152pushd "$CLANG_BUILD_DIR/build"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000153
154# Run the build as specified in the build arguments.
155echo "Running build"
Ilya Biryukovaf351da2017-06-30 09:46:45 +0000156cmake -GNinja \
157 -DCMAKE_INSTALL_PREFIX="$CLANG_INSTALL_DIR" \
158 -DLLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLE_PROJECTS" \
159 $CMAKE_ARGS \
160 "$CLANG_BUILD_DIR/src/llvm"
161ninja $CMAKE_INSTALL_TARGETS
162
163popd
164
165# Pack the installed clang into an archive.
166echo "Archiving clang installation to /tmp/clang.tar.gz"
167cd "$CLANG_INSTALL_DIR"
168tar -czf /tmp/clang.tar.gz *
169
170# Cleanup.
171rm -rf "$CLANG_BUILD_DIR" "$CLANG_INSTALL_DIR"
172
173echo "Done"