blob: 7d9be4cbb1573b8783af0f28441a91ae80906469 [file] [log] [blame]
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +01001#!/bin/bash
2
Damien Martin-Guillerezf88f4d82015-09-25 13:56:55 +00003# Copyright 2014 The Bazel Authors. All rights reserved.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +01004#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000017# This script bootstraps building a Bazel binary without Bazel then
18# use this compiled Bazel to bootstrap Bazel itself. It can also
19# be provided with a previous version of Bazel to bootstrap Bazel
20# itself.
21# The resulting binary can be found at output/bazel.
David Mankin5cafe132015-05-28 20:20:56 +000022
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010023set -o errexit
24
Laszlo Csomorf5525e82017-01-30 18:11:58 +000025# Correct PATH on Windows, to avoid using "FIND.EXE" instead of "/usr/bin/find"
26# etc, leading to confusing errors.
27export BAZEL_OLD_PATH=$PATH
28case "$(uname -s | tr [:upper:] [:lower:])" in
29msys*|mingw*)
30 # Check that the PATH is set up correctly by attempting to locate `[`.
31 # This ensures that `which` is installed correctly and can succeed, while
32 # also avoids accidentally locating a tool that exists in plain Windows too
33 # (like "find" for "FIND.EXE").
34 which [ >&/dev/null || export PATH="/bin:/usr/bin:$PATH"
35esac
36
37# Check that the bintools can be found, otherwise we would see very confusing
38# error messages.
39which [ >&/dev/null || {
40 echo >&2 "ERROR: cannot locate GNU bintools; check your PATH."
41 echo >&2 " (You may need to run 'export PATH=/bin:/usr/bin:\$PATH)'"
42 exit 1
43}
44
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010045cd "$(dirname "$0")"
46
Julio Merino5909d9d2016-02-25 21:44:31 +000047# Set the default verbose mode in buildenv.sh so that we do not display command
48# output unless there is a failure. We do this conditionally to offer the user
49# a chance of overriding this in case they want to do so.
50: ${VERBOSE:=no}
51
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000052source scripts/bootstrap/buildenv.sh
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010053
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000054function usage() {
Kristina Chodorow84450b82016-01-28 15:16:02 +000055 [ -n "${1:-compile}" ] && echo "Invalid command(s): $1" >&2
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000056 echo "syntax: $0 [command[,command]* [BAZEL_BIN [BAZEL_SUM]]]" >&2
57 echo " General purpose commands:" >&2
Kristina Chodorow84450b82016-01-28 15:16:02 +000058 echo " compile = compile the bazel binary (default)" >&2
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000059 echo " Commands for developers:" >&2
Kristina Chodorow84450b82016-01-28 15:16:02 +000060 echo " all = compile,determinism,test" >&2
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000061 echo " determinism = test for stability of Bazel builds" >&2
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +000062 echo " srcs = test that //:srcs contains all the sources" >&2
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000063 echo " test = run the full test suite of Bazel" >&2
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010064 exit 1
65}
66
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000067function parse_options() {
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +000068 local keywords="(compile|all|determinism|bootstrap|srcs|test)"
Kristina Chodorow84450b82016-01-28 15:16:02 +000069 COMMANDS="${1:-compile}"
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000070 [[ "${COMMANDS}" =~ ^$keywords(,$keywords)*$ ]] || usage "$@"
71 DO_COMPILE=
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000072 DO_CHECKSUM=
73 DO_FULL_CHECKSUM=1
74 DO_TESTS=
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +000075 DO_SRCS_TEST=
Kristina Chodorow84450b82016-01-28 15:16:02 +000076 [[ "${COMMANDS}" =~ (compile|all) ]] && DO_COMPILE=1
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000077 [[ "${COMMANDS}" =~ (bootstrap|determinism|all) ]] && DO_CHECKSUM=1
78 [[ "${COMMANDS}" =~ (bootstrap) ]] && DO_FULL_CHECKSUM=
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +000079 [[ "${COMMANDS}" =~ (srcs|all) ]] && DO_SRCS_TEST=1
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000080 [[ "${COMMANDS}" =~ (test|all) ]] && DO_TESTS=1
81
82 BAZEL_BIN=${2:-"bazel-bin/src/bazel"}
Damien Martin-Guillerez4f892812015-07-02 08:38:58 +000083 BAZEL_SUM=${3:-"x"}
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010084}
85
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000086parse_options "${@}"
Kristina Chodorow8c6b3bb2015-04-09 19:05:34 +000087
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000088mkdir -p output
89: ${BAZEL:=${2-}}
Kristina Chodorowac271142015-03-06 16:00:46 +000090
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +000091#
92# Create an initial binary so we can host ourself
93#
94if [ ! -x "${BAZEL}" ]; then
95 display "$INFO You can skip this first step by providing a path to the bazel binary as second argument:"
96 display "$INFO $0 ${COMMANDS} /path/to/bazel"
97 new_step 'Building Bazel from scratch'
98 source scripts/bootstrap/compile.sh
Kristina Chodorowdccd81f2016-02-01 17:42:07 +000099 # The DO_COMPILE flow will actually create the bazel binary and set BAZEL.
100 DO_COMPILE=1
Daniel Wagner-Hall13ba3312015-03-20 05:45:45 +0000101fi
102
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000103#
104# Bootstrap bazel using the previous bazel binary = release binary
105#
Damien Martin-Guillereza377af02015-06-24 12:04:27 +0000106if [ "${EMBED_LABEL-x}" = "x" ]; then
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000107 # Add a default label when unspecified
108 git_sha1=$(git_sha1)
Damien Martin-Guillerez28e67b52016-03-14 11:01:31 +0000109 EMBED_LABEL="$(get_last_version) (@${git_sha1:-non-git})"
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100110fi
111
Damien Martin-Guillerez3d796fe2016-01-11 10:07:57 +0000112if [[ $PLATFORM == "darwin" ]] && \
113 xcodebuild -showsdks 2> /dev/null | grep -q '\-sdk iphonesimulator'; then
Damien Martin-Guillerez1540d8f2016-09-07 11:49:39 +0000114 EXTRA_BAZEL_ARGS="${EXTRA_BAZEL_ARGS-} --define IPHONE_SDK=1"
Dmitry Lomovac6ed792015-12-22 19:24:00 +0000115fi
Yun Pengcb8a5e22017-03-08 14:30:49 +0000116
117case "${PLATFORM}" in
118msys*|mingw*)
119 EXTRA_BAZEL_ARGS="${EXTRA_BAZEL_ARGS-} --cpu=x64_windows_msys --host_cpu=x64_windows_msys"
120esac
121
Damien Martin-Guillerez3d796fe2016-01-11 10:07:57 +0000122source scripts/bootstrap/bootstrap.sh
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100123
Lukacs Berki0d5d5222015-10-12 13:24:44 +0000124if [ $DO_COMPILE ]; then
125 new_step 'Building Bazel with Bazel'
126 display "."
Damien Martin-Guillerez50fce862016-01-18 11:30:10 +0000127 log "Building output/bazel"
Laszlo Csomor9f7180f2016-09-27 13:07:43 +0000128 bazel_build "src:bazel${EXE_EXT}" \
129 || fail "Could not build Bazel"
130 bazel_bin_path="$(get_bazel_bin_path)/src/bazel${EXE_EXT}"
131 [ -e "$bazel_bin_path" ] \
132 || fail "Could not find freshly built Bazel binary at '$bazel_bin_path'"
133 cp -f "$bazel_bin_path" "output/bazel${EXE_EXT}" \
134 || fail "Could not copy '$bazel_bin_path' to 'output/bazel${EXE_EXT}'"
Dmitry Lomov9d40a602016-02-15 16:15:03 +0000135 chmod 0755 "output/bazel${EXE_EXT}"
136 BAZEL="$(pwd)/output/bazel${EXE_EXT}"
Lukacs Berki0d5d5222015-10-12 13:24:44 +0000137fi
138
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000139#
140# Output is deterministic between two bootstrapped bazel binary using the actual tools and the
141# released binary.
142#
143if [ $DO_CHECKSUM ]; then
144 new_step "Determinism test"
Damien Martin-Guillerez4349f942015-06-24 13:28:08 +0000145 if [ ! -f ${BAZEL_SUM:-x} ]; then
146 BAZEL_SUM=bazel-out/bazel_checksum
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000147 log "First build"
148 bootstrap_test ${BAZEL} ${BAZEL_SUM}
149 else
150 BOOTSTRAP=${BAZEL}
151 fi
152 if [ "${BAZEL_SUM}" != "${OUTPUT_DIR}/bazel_checksum" ]; then
153 cp ${BAZEL_SUM} ${OUTPUT_DIR}/bazel_checksum
154 fi
155 if [ $DO_FULL_CHECKSUM ]; then
156 log "Second build"
157 bootstrap_test ${BOOTSTRAP} bazel-out/bazel_checksum
158 log "Comparing output"
159 (diff -U 0 ${OUTPUT_DIR}/bazel_checksum bazel-out/bazel_checksum >&2) \
160 || fail "Differences detected in outputs!"
161 fi
162fi
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100163
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000164#
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +0000165# Test that //:srcs contains all the sources
166#
167if [ $DO_SRCS_TEST ]; then
168 new_step "Checking that //:srcs contains all the sources"
169 log "Querying //:srcs"
170 ${BAZEL} query 'kind("source file", deps(//:srcs))' 2>/dev/null \
171 | grep -v '^@' \
Ulf Adams161c4a32016-12-05 17:25:21 +0000172 | sed -e 's|^//||' | sed -e 's|^:||' | sed -e 's|:|/|' \
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +0000173 | sort -u >"${OUTPUT_DIR}/srcs-query"
174
175 log "Finding all files"
Damien Martin-Guillerezca407f02016-07-04 13:07:08 +0000176 # SRCS_EXCLUDES can be overriden to adds some more exceptions for the find
177 # commands (for CI systems).
178 SRCS_EXCLUDES=${SRCS_EXCLUDES-XXXXXXXXXXXXXX1268778dfsdf4}
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +0000179 # See file BUILD for the list of grep -v exceptions.
180 # tools/defaults package is hidden by Bazel so cannot be put in the srcs.
Ulf Adams161c4a32016-12-05 17:25:21 +0000181 find . -type f | sed -e 's|./||' \
Adam Michael9b7330f2017-03-23 18:40:51 +0000182 | grep -v '^bazel-' \
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +0000183 | grep -v '^\.' | grep -v '^out/' | grep -v '^output/' \
Klaus Aehlig0a050862016-11-11 17:26:44 +0000184 | grep -v '^derived' \
Damien Martin-Guillerezca407f02016-07-04 13:07:08 +0000185 | grep -Ev "${SRCS_EXCLUDES}" \
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +0000186 | grep -v '^tools/defaults/BUILD' \
187 | sort -u >"${OUTPUT_DIR}/srcs-find"
188
189 log "Diffing"
Ulf Adams161c4a32016-12-05 17:25:21 +0000190 res="$(diff -U 0 "${OUTPUT_DIR}/srcs-find" "${OUTPUT_DIR}/srcs-query" | sed -e 's|^-||' | grep -Ev '^(@@|\+\+|--)' || true)"
Damien Martin-Guillerez7d265e02016-07-01 13:33:48 +0000191
192 if [ -n "${res}" ]; then
193 fail "//:srcs filegroup do not contains all the sources, missing:
194${res}"
195 fi
196fi
197
198#
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000199# Tests
200#
201if [ $DO_TESTS ]; then
202 new_step "Running tests"
203 display "."
Lukacs Berki678ba232015-09-03 13:28:55 +0000204
Damien Martin-Guillerezb81f90c2015-09-04 15:52:26 +0000205 ndk_target="$(get_bind_target //external:android_ndk_for_testing)"
206 sdk_target="$(get_bind_target //external:android_sdk_for_testing)"
207 if [ "$ndk_target" = "//:dummy" -o "$sdk_target" = "//:dummy" ]; then
Lukacs Berki678ba232015-09-03 13:28:55 +0000208 display "$WARNING Android SDK or NDK are not set in the WORKSPACE file. Android tests will not be run."
209 fi
210
Damien Martin-Guillerez338dc562015-06-23 17:15:12 +0000211 [ -n "$JAVAC_VERSION" ] || get_java_version
Damien Martin-Guillerez0ad9f5e2016-04-20 13:58:08 +0000212 if [[ ! "${BAZEL_TEST_FILTERS-}" =~ "-jdk8" ]]; then
213 if [ "8" -gt ${JAVAC_VERSION#*.} ] || [ "${JAVA_VERSION}" = "1.7" ]; then
214 display "$WARNING Your version of Java is lower than 1.8!"
215 display "$WARNING Deactivating Java 8 tests, please use a JDK 8 to fully"
216 display "$WARNING test Bazel."
217 if [ -n "${BAZEL_TEST_FILTERS-}" ]; then
218 BAZEL_TEST_FILTERS="${BAZEL_TEST_FILTERS},-jdk8"
219 else
220 BAZEL_TEST_FILTERS="-jdk8"
221 fi
Damien Martin-Guillerez338dc562015-06-23 17:15:12 +0000222 fi
223 fi
Klaus Aehlig276a8cd2016-07-11 12:06:07 +0000224 $BAZEL --bazelrc=${BAZELRC} --nomaster_bazelrc \
225 ${BAZEL_DIR_STARTUP_OPTIONS} \
226 test \
Damien Martin-Guillerez338dc562015-06-23 17:15:12 +0000227 --test_tag_filters="${BAZEL_TEST_FILTERS-}" \
Damien Martin-Guillerez7cf300e2015-06-16 12:31:03 +0000228 --build_tests_only \
Damien Martin-Guillerez04d46ab2016-04-13 19:27:56 +0000229 --nolegacy_bazel_java_test \
Damien Martin-Guillerez0ad9f5e2016-04-20 13:58:08 +0000230 --define JAVA_VERSION=${JAVA_VERSION} \
Damien Martin-Guillerez3d796fe2016-01-11 10:07:57 +0000231 ${EXTRA_BAZEL_ARGS} \
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000232 -k --test_output=errors //src/... //third_party/ijar/... //scripts/... \
233 || fail "Tests failed"
Damien Martin-Guillerezd6f48082015-06-05 10:50:43 +0000234fi
235
Damien Martin-Guillerezd47a8ef2015-06-10 11:54:50 +0000236clear_log
237display "Build successful! Binary is here: ${BAZEL}"