| #!/bin/bash | |
| # Copyright 2015 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. | |
| set -e | |
| # Bazel self-extractable installer | |
| # Installation and etc prefix can be overriden from command line | |
| install_prefix=${1:-"/usr/local"} | |
| progname="$0" | |
| echo "Bazel installer" | |
| echo "---------------" | |
| echo | |
| echo "Bazel is bundled with software licensed under the GPLv2 with Classpath exception." | |
| echo "You can find the sources next to the installer on our release page:" | |
| echo " https://github.com/bazelbuild/bazel/releases" | |
| echo | |
| cat <<'EOF' | |
| %release_info% | |
| EOF | |
| usage() { | |
| echo "Usage: $progname [options]" >&2 | |
| echo "Options are:" >&2 | |
| echo " --prefix=/some/path set the prefix path (default=/usr/local)." >&2 | |
| echo " --bin= set the binary folder path (default=%prefix%/bin)." >&2 | |
| echo " --base= set the base install path (default=%prefix%/lib/bazel)." >&2 | |
| echo " --user configure for user install, expands to:" >&2 | |
| echo ' --bin=$HOME/bin --base=$HOME/.bazel' >&2 | |
| echo " --skip-uncompress skip uncompressing the base image until the" >&2 | |
| echo " first bazel invocation" >&2 | |
| exit 1 | |
| } | |
| prefix="/usr/local" | |
| bin="%prefix%/bin" | |
| base="%prefix%/lib/bazel" | |
| should_uncompress=true | |
| for opt in "${@}"; do | |
| case $opt in | |
| --prefix=*) | |
| prefix="$(echo "$opt" | cut -d '=' -f 2-)" | |
| ;; | |
| --bin=*) | |
| bin="$(echo "$opt" | cut -d '=' -f 2-)" | |
| ;; | |
| --base=*) | |
| base="$(echo "$opt" | cut -d '=' -f 2-)" | |
| ;; | |
| --user) | |
| bin="$HOME/bin" | |
| base="$HOME/.bazel" | |
| ;; | |
| --skip-uncompress) | |
| should_uncompress=false | |
| ;; | |
| *) | |
| usage | |
| ;; | |
| esac | |
| done | |
| bin="${bin//%prefix%/${prefix}}" | |
| base="${base//%prefix%/${prefix}}" | |
| test_write() { | |
| local file="$1" | |
| while [ "$file" != "/" ] && [ -n "${file}" ] && [ ! -e "$file" ]; do | |
| file="$(dirname "${file}")" | |
| done | |
| [ -w "${file}" ] || { | |
| echo >&2 | |
| echo "The Bazel installer must have write access to $1!" >&2 | |
| echo "Consider using the --user flag to install Bazel under $HOME/bin instead." >&2 | |
| echo >&2 | |
| usage | |
| } | |
| } | |
| # Test for dependencies | |
| # unzip | |
| if ! which unzip >/dev/null; then | |
| echo >&2 | |
| echo "unzip not found, please install the corresponding package." >&2 | |
| echo "See http://bazel.build/docs/install.html for more information on" >&2 | |
| echo "dependencies of Bazel." >&2 | |
| exit 1 | |
| fi | |
| # java | |
| if [ -z "${JAVA_HOME-}" ]; then | |
| case "$(uname -s | tr 'A-Z' 'a-z')" in | |
| linux) | |
| JAVA_HOME="$(readlink -f $(which javac) 2>/dev/null | sed 's_/bin/javac__')" || true | |
| BASHRC="~/.bashrc" | |
| ;; | |
| freebsd) | |
| JAVA_HOME="/usr/local/openjdk8" | |
| BASHRC="~/.bashrc" | |
| ;; | |
| darwin) | |
| JAVA_HOME="$(/usr/libexec/java_home -v ${JAVA_VERSION}+ 2> /dev/null)" || true | |
| BASHRC="~/.bash_profile" | |
| ;; | |
| esac | |
| fi | |
| # Only check for an installed JDK if this version of Bazel does not contain a | |
| # bundled JDK. | |
| case "$0" in | |
| *without-jdk*) | |
| if [ ! -x "${JAVA_HOME}/bin/javac" ]; then | |
| echo >&2 | |
| echo "Java not found, please install the corresponding package." >&2 | |
| echo "See http://bazel.build/docs/install.html for more information on" >&2 | |
| echo "dependencies of Bazel." >&2 | |
| exit 1 | |
| fi | |
| ;; | |
| esac | |
| # Test for write access | |
| test_write "${bin}" | |
| test_write "${base}" | |
| # Do the actual installation | |
| echo -n "Uncompressing." | |
| # Cleaning-up, with some guards. | |
| rm -f "${bin}/bazel" | |
| if [ -d "${base}" -a -x "${base}/bin/bazel" ]; then | |
| rm -fr "${base}" | |
| fi | |
| mkdir -p ${bin} ${base} ${base}/bin ${base}/etc | |
| echo -n . | |
| unzip -q "${BASH_SOURCE[0]}" bazel bazel-real bazel-complete.bash _bazel -d "${base}/bin" | |
| echo -n . | |
| chmod 0755 "${base}/bin/bazel" "${base}/bin/bazel-real" | |
| echo -n . | |
| chmod -R og-w "${base}" | |
| chmod -R og+rX "${base}" | |
| chmod -R u+rwX "${base}" | |
| echo -n . | |
| ln -s "${base}/bin/bazel" "${bin}/bazel" | |
| echo -n . | |
| if [ "${should_uncompress}" = true ] && [ "${UID}" -ne 0 ]; then | |
| # Uncompress the bazel base install for faster startup time | |
| "${bin}/bazel" help >/dev/null | |
| fi | |
| echo . | |
| cat <<EOF | |
| Bazel is now installed! | |
| Make sure you have "${bin}" in your path. You can also activate bash | |
| completion by adding the following line to your ${BASHRC}: | |
| source ${base}/bin/bazel-complete.bash | |
| See http://bazel.build/docs/getting-started.html to start a new project! | |
| EOF | |
| exit 0 |