#!/bin/bash # Copyright 2014 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script bootstraps building a Bazel binary without Bazel then # use this compiled Bazel to bootstrap Bazel itself. It can also # be provided with a previous version of Bazel to bootstrap Bazel # itself. # The resulting binary can be found at output/bazel. set -o errexit # Correct PATH on Windows, to avoid using "FIND.EXE" instead of "/usr/bin/find" # etc, leading to confusing errors. export BAZEL_OLD_PATH=$PATH case "$(uname -s | tr [:upper:] [:lower:])" in msys*|mingw*|cygwin*) # Check that the PATH is set up correctly by attempting to locate `[`. # This ensures that `which` is installed correctly and can succeed, while # also avoids accidentally locating a tool that exists in plain Windows too # (like "find" for "FIND.EXE"). which [ >&/dev/null || export PATH="/bin:/usr/bin:$PATH" esac # Check that the bintools can be found, otherwise we would see very confusing # error messages. hash tr >&/dev/null || { echo >&2 "ERROR: cannot locate GNU coreutils; check your PATH." echo >&2 " (You may need to run 'export PATH=/bin:/usr/bin:\$PATH)'" exit 1 } cd "$(dirname "$0")" # Set the default verbose mode in buildenv.sh so that we do not display command # output unless there is a failure. We do this conditionally to offer the user # a chance of overriding this in case they want to do so. : ${VERBOSE:=no} source scripts/bootstrap/buildenv.sh mkdir -p output : ${BAZEL:=} # # Create an initial binary so we can host ourself # if [ ! -x "${BAZEL}" ]; then new_step 'Building Bazel from scratch' source scripts/bootstrap/compile.sh fi # # Bootstrap bazel using the previous bazel binary = release binary # if [ "${EMBED_LABEL-x}" = "x" ]; then # Add a default label when unspecified git_sha1=$(git_sha1) EMBED_LABEL="$(get_last_version) (@${git_sha1:-non-git})" fi if [[ $PLATFORM == "darwin" ]] && \ xcodebuild -showsdks 2> /dev/null | grep -q '\-sdk iphonesimulator'; then EXTRA_BAZEL_ARGS="${EXTRA_BAZEL_ARGS-} --define IPHONE_SDK=1" fi source scripts/bootstrap/bootstrap.sh new_step 'Building Bazel with Bazel' display "." log "Building output/bazel" # We set host and target platform directly since the defaults in @bazel_tools # have not yet been generated. bazel_build "src:bazel${EXE_EXT}" \ --experimental_host_platform=//tools/platforms:host_platform \ --experimental_platforms=//tools/platforms:target_platform \ || fail "Could not build Bazel" bazel_bin_path="$(get_bazel_bin_path)/src/bazel${EXE_EXT}" [ -e "$bazel_bin_path" ] \ || fail "Could not find freshly built Bazel binary at '$bazel_bin_path'" cp -f "$bazel_bin_path" "output/bazel${EXE_EXT}" \ || fail "Could not copy '$bazel_bin_path' to 'output/bazel${EXE_EXT}'" chmod 0755 "output/bazel${EXE_EXT}" BAZEL="$(pwd)/output/bazel${EXE_EXT}" clear_log display "Build successful! Binary is here: ${BAZEL}"