blob: 7e0e906574162a9d6605cea76df01d17a343e85b [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"
68 ;;
69 -b|--branch)
70 shift
71 LLVM_BRANCH="$1"
72 shift
73 ;;
74 -p|--llvm-project)
75 shift
76 PROJ="$1"
77 if [ "$PROJ" == "cfe" ]; then
78 PROJ="clang"
79 fi
80 if ! contains_project "$PROJ" ; then
81 LLVM_PROJECTS="$LLVM_PROJECTS $PROJ"
82 CMAKE_LLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLED_PROJECTS;$PROJ"
83 else
84 echo "Project '$PROJ' is already enabled, ignoring extra occurences."
85 fi
86 shift
87 ;;
88 -i|--install-target)
89 shift
90 CMAKE_INSTALL_TARGETS="$CMAKE_INSTALL_TARGETS $1"
91 shift
92 ;;
93 --)
94 shift
95 CMAKE_ARGS="$*"
96 shift $#
97 ;;
98 -h|--help)
99 show_usage
100 exit 0
101 ;;
102 *)
103 echo "Unknown option: $1"
104 exit 1
105 esac
106done
107
108if [ "$CMAKE_INSTALL_TARGETS" == "" ]; then
109 echo "No install targets. Please pass one or more --install-target."
110 exit 1
111fi
112
113if [ "$LLVM_BRANCH" == "" ]; then
114 LLVM_BRANCH="trunk"
115fi
116
117if [ "$LLVM_SVN_REVISION" != "" ]; then
118 SVN_REV_ARG="-r$LLVM_SVN_REVISION"
119else
120 SVN_REV_ARG=""
121fi
122
123CLANG_BUILD_DIR=/tmp/clang-build
124CLANG_INSTALL_DIR=/tmp/clang-install
125
126mkdir "$CLANG_BUILD_DIR"
127
128# Get the sources from svn.
129echo "Checking out sources from svn"
130mkdir "$CLANG_BUILD_DIR/src"
131for LLVM_PROJECT in $LLVM_PROJECTS; do
132 if [ "$LLVM_PROJECT" == "clang" ]; then
133 SVN_PROJECT="cfe"
134 else
135 SVN_PROJECT="$LLVM_PROJECT"
136 fi
137
138 echo "Checking out http://llvm.org/svn/llvm-project/$SVN_PROJECT to $CLANG_BUILD_DIR/src/$LLVM_PROJECT"
139 # FIXME: --trust-server-cert is required to workaround 'SSL issuer is not
140 # trusted' error. Using https seems preferable to http either way,
141 # albeit this is not secure.
142 svn co -q $SVN_REV_ARG --trust-server-cert \
143 "https://llvm.org/svn/llvm-project/$SVN_PROJECT/$LLVM_BRANCH" \
144 "$CLANG_BUILD_DIR/src/$LLVM_PROJECT"
145done
146
147pushd "$CLANG_BUILD_DIR"
148
149# Run the build as specified in the build arguments.
150echo "Running build"
151mkdir "$CLANG_BUILD_DIR/build"
152cmake -GNinja \
153 -DCMAKE_INSTALL_PREFIX="$CLANG_INSTALL_DIR" \
154 -DLLVM_ENABLE_PROJECTS="$CMAKE_LLVM_ENABLE_PROJECTS" \
155 $CMAKE_ARGS \
156 "$CLANG_BUILD_DIR/src/llvm"
157ninja $CMAKE_INSTALL_TARGETS
158
159popd
160
161# Pack the installed clang into an archive.
162echo "Archiving clang installation to /tmp/clang.tar.gz"
163cd "$CLANG_INSTALL_DIR"
164tar -czf /tmp/clang.tar.gz *
165
166# Cleanup.
167rm -rf "$CLANG_BUILD_DIR" "$CLANG_INSTALL_DIR"
168
169echo "Done"