blob: 97f31d9fa21e697f8cd16c9dff25f0b949fbb5e3 [file] [log] [blame]
Brian Silvermand1c19fb2016-07-07 00:10:57 -07001#!/bin/bash
2
3# The bazel script calls this instead of the bazel-real binary which is
4# installed next to it. This script downloads a specific version of Bazel and
5# then calls that.
6
7# Alternatively, if the environment variable BAZEL_OVERRIDE is set, that will be
8# run directly (after printing a message). That is intended for testing only.
9
10# This script operates based on the assumption that any directory of the correct
11# name is a fully extracted, valid Bazel installation. It is careful to avoid
12# putting an invalid directory at that name at any point.
13
14set -e
15set -u
16set -o pipefail
17
18if [[ -n "${BAZEL_OVERRIDE+x}" ]]; then
19 tput setaf 1 >&2
20 echo -n "Actually calling " >&2
21 tput setaf 3 >&2
22 echo "${BAZEL_OVERRIDE}" >&2
23 tput sgr0 >&2
24 exec "${BAZEL_OVERRIDE}" "$@"
25fi
26
Philipp Schrader9670a2a2023-01-11 01:20:16 -080027readonly VERSION="6.0.0"
Brian Silvermand1c19fb2016-07-07 00:10:57 -070028
Austin Schuhe3ce2722019-02-17 15:09:46 -080029readonly DOWNLOAD_DIR="${HOME}/.cache/bazel"
Brian Silvermand1c19fb2016-07-07 00:10:57 -070030# Directory to unpack bazel into. This must change whenever bazel changes.
31readonly VERSION_DIR="${DOWNLOAD_DIR}/${VERSION}-v1"
32readonly VERSION_BAZEL="${VERSION_DIR}/usr/bin/bazel"
33
34# Creating might fail if another invocation is racing us.
35if [[ ! -d "${DOWNLOAD_DIR}" ]]; then
Austin Schuhbf852792019-02-18 11:06:41 -080036 mkdir -p "${DOWNLOAD_DIR}" || true
Brian Silvermand1c19fb2016-07-07 00:10:57 -070037fi
38if [[ ! -d "${DOWNLOAD_DIR}" ]]; then
39 echo "Failed to create ${DOWNLOAD_DIR}" >&2
40 exit 1
41fi
42
Austin Schuh137d9452018-07-07 15:42:36 -070043readonly INSTALLER_NAME="bazel_${VERSION}.xz"
Maxwell Henderson7a93a652023-06-24 15:17:09 -070044readonly DOWNLOAD_URL="https://software.frc971.org/Build-Dependencies/${INSTALLER_NAME}"
Brian Silvermand1c19fb2016-07-07 00:10:57 -070045
46if [[ ! -d "${VERSION_DIR}" ]]; then
47 echo "Downloading Bazel version ${VERSION} from ${DOWNLOAD_URL}..." >&2
48
49 # A temporary directory which is definitely on the same filesystem as our final
50 # destination, which is important so we can atomically move it.
51 # If this move is non-atomic, then a concurrent Bazel command (like the verifier
52 # uses several of) could use a half-copied Bazel installation.
Philipp Schradere21f1582018-01-18 05:08:55 +000053 mkdir -p "${HOME}/.cache/bazel"
Austin Schuh6b046d42018-01-04 20:20:24 -080054 DOWNLOAD_TEMP_DIR="$(mktemp --directory --tmpdir="${HOME}/.cache/bazel")"
Brian Silvermand1c19fb2016-07-07 00:10:57 -070055 TEMP_DIR="$(mktemp --directory --tmpdir="${DOWNLOAD_DIR}")"
Austin Schuh6b046d42018-01-04 20:20:24 -080056 readonly DOWNLOAD_TEMP_DIR
Brian Silvermand1c19fb2016-07-07 00:10:57 -070057 readonly TEMP_DIR
58
Austin Schuh6b046d42018-01-04 20:20:24 -080059 ( cd "${DOWNLOAD_TEMP_DIR}"
60 # Now, download into the ~/.cache folder
61 if [ ! -e "${HOME}/.cache/bazel/${INSTALLER_NAME}" ];
62 then
Brian Silverman3464d532019-12-18 20:15:20 -080063 NOISINESS=--silent
Austin Schuh137d9452018-07-07 15:42:36 -070064 if [ -t 0 ] ; then
Brian Silverman3464d532019-12-18 20:15:20 -080065 echo on terminal
66 NOISINESS=
Austin Schuh137d9452018-07-07 15:42:36 -070067 fi
Brian Silverman3464d532019-12-18 20:15:20 -080068 curl --output "${INSTALLER_NAME}" "${DOWNLOAD_URL}" ${NOISINESS}
Austin Schuh6b046d42018-01-04 20:20:24 -080069 mv "${INSTALLER_NAME}" "${HOME}/.cache/bazel/${INSTALLER_NAME}"
70 fi
71 rm -rf "${DOWNLOAD_TEMP_DIR}"
72 )
73
Brian Silvermand1c19fb2016-07-07 00:10:57 -070074 ( cd "${TEMP_DIR}"
Brian Silvermand1c19fb2016-07-07 00:10:57 -070075 echo "Unpacking Bazel version ${VERSION}..." >&2
Austin Schuh137d9452018-07-07 15:42:36 -070076 mkdir -p extracted/usr/bin
77 xz -d ${HOME}/.cache/bazel/${INSTALLER_NAME} -c > extracted/usr/bin/bazel-real
78 chmod a+x extracted/usr/bin/bazel-real
Brian Silvermand1c19fb2016-07-07 00:10:57 -070079 )
80
81 touch "${TEMP_DIR}/extracted/usr/bin/bazel.bazelrc"
82
83 # Careful: somebody else might have already done it. If they manage to make
84 # the move between our check and our move, then we'll end up with a random
85 # extracted directory which won't do anybody any harm. If somebody else does
86 # that first, then our move will fail.
87 if [[ ! -d "${VERSION_DIR}" ]]; then
88 mv "${TEMP_DIR}/extracted" "${VERSION_DIR}" || true
89 fi
90 if [[ ! -d "${VERSION_DIR}" ]]; then
91 echo "Failed to create ${VERSION_DIR}" >&2
92 exit 1
93 fi
94 rm -rf "${TEMP_DIR}"
95 echo "Done downloading Bazel version ${VERSION}"
96fi
97
Austin Schuh77cc2c32016-12-28 22:01:38 -080098ENVIRONMENT_VARIABLES=()
99ENVIRONMENT_VARIABLES+=(HOSTNAME="${HOSTNAME}")
100ENVIRONMENT_VARIABLES+=(SHELL="${SHELL}")
101ENVIRONMENT_VARIABLES+=(USER="${USER}")
Brian Silverman3983eb82018-08-05 11:42:36 -0700102ENVIRONMENT_VARIABLES+=(PATH="/usr/bin:/bin")
Austin Schuh77cc2c32016-12-28 22:01:38 -0800103ENVIRONMENT_VARIABLES+=(HOME="${HOME}")
Austin Schuh77cc2c32016-12-28 22:01:38 -0800104ENVIRONMENT_VARIABLES+=(TERM="${TERM}")
Brian Silverman3983eb82018-08-05 11:42:36 -0700105ENVIRONMENT_VARIABLES+=(LANG="${LANG:-C}")
Philipp Schrader394e5672022-02-15 22:09:42 -0800106ENVIRONMENT_VARIABLES+=(BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1)
Brianfcf3ee72017-03-05 13:30:54 -0800107
Adam Snaider770b97b2023-08-04 21:07:48 -0700108if [[ ! -z "${CARGO_BAZEL_REPIN+x}" ]]; then
109 ENVIRONMENT_VARIABLES+=(CARGO_BAZEL_REPIN="${CARGO_BAZEL_REPIN}")
110fi
111
Austin Schuh77cc2c32016-12-28 22:01:38 -0800112if [[ ! -z "${DISPLAY+x}" ]]; then
113 ENVIRONMENT_VARIABLES+=(DISPLAY="${DISPLAY}")
114fi
115
Austin Schuh47d8bef2020-08-26 21:54:38 -0700116if [[ ! -z "${SSH_AUTH_SOCK+x}" ]]; then
117 ENVIRONMENT_VARIABLES+=(SSH_AUTH_SOCK="${SSH_AUTH_SOCK}")
118fi
119
Lee Mracekf8d73cb2019-01-04 03:26:24 -0800120if [[ ! -z "${LOGNAME+x}" ]]; then
121 ENVIRONMENT_VARIABLES+=(LOGNAME="${LOGNAME}")
122fi
123
Brian Silvermand1c19fb2016-07-07 00:10:57 -0700124if [[ -x "${VERSION_BAZEL}-real" ]]; then
125 exec -a "${VERSION_BAZEL}" env -i \
Austin Schuh77cc2c32016-12-28 22:01:38 -0800126 "${ENVIRONMENT_VARIABLES[@]}" \
Brian Silvermand1c19fb2016-07-07 00:10:57 -0700127 "${VERSION_BAZEL}-real" "$@"
128fi
129if [[ -x "${VERSION_BAZEL}" ]]; then
130 exec env -i \
Austin Schuh77cc2c32016-12-28 22:01:38 -0800131 "${ENVIRONMENT_VARIABLES[@]}" \
Brian Silvermand1c19fb2016-07-07 00:10:57 -0700132 "${VERSION_BAZEL}" "$@"
133fi
134
135echo "Can't find the real bazel!" >&2
136exit 1