| #!/bin/bash |
| |
| # The bazel script calls this instead of the bazel-real binary which is |
| # installed next to it. This script downloads a specific version of Bazel and |
| # then calls that. |
| |
| # Alternatively, if the environment variable BAZEL_OVERRIDE is set, that will be |
| # run directly (after printing a message). That is intended for testing only. |
| |
| # This script operates based on the assumption that any directory of the correct |
| # name is a fully extracted, valid Bazel installation. It is careful to avoid |
| # putting an invalid directory at that name at any point. |
| |
| set -e |
| set -u |
| set -o pipefail |
| |
| if [[ -n "${BAZEL_OVERRIDE+x}" ]]; then |
| tput setaf 1 >&2 |
| echo -n "Actually calling " >&2 |
| tput setaf 3 >&2 |
| echo "${BAZEL_OVERRIDE}" >&2 |
| tput sgr0 >&2 |
| exec "${BAZEL_OVERRIDE}" "$@" |
| fi |
| |
| readonly VERSION="7.2.0rc1" |
| |
| readonly DOWNLOAD_DIR="${HOME}/.cache/bazel" |
| # Directory to unpack bazel into. This must change whenever bazel changes. |
| readonly VERSION_DIR="${DOWNLOAD_DIR}/${VERSION}-v1" |
| readonly VERSION_BAZEL="${VERSION_DIR}/usr/bin/bazel" |
| |
| # Creating might fail if another invocation is racing us. |
| if [[ ! -d "${DOWNLOAD_DIR}" ]]; then |
| mkdir -p "${DOWNLOAD_DIR}" || true |
| fi |
| if [[ ! -d "${DOWNLOAD_DIR}" ]]; then |
| echo "Failed to create ${DOWNLOAD_DIR}" >&2 |
| exit 1 |
| fi |
| |
| readonly INSTALLER_NAME="bazel-${VERSION}-linux-x86_64" |
| readonly DOWNLOAD_URL="https://software.frc971.org/Build-Dependencies/github.com/bazelbuild/bazel/releases/download/${VERSION}/${INSTALLER_NAME}" |
| |
| if [[ ! -d "${VERSION_DIR}" ]]; then |
| echo "Downloading Bazel version ${VERSION} from ${DOWNLOAD_URL}..." >&2 |
| |
| # A temporary directory which is definitely on the same filesystem as our final |
| # destination, which is important so we can atomically move it. |
| # If this move is non-atomic, then a concurrent Bazel command (like the verifier |
| # uses several of) could use a half-copied Bazel installation. |
| mkdir -p "${HOME}/.cache/bazel" |
| DOWNLOAD_TEMP_DIR="$(mktemp --directory --tmpdir="${HOME}/.cache/bazel")" |
| TEMP_DIR="$(mktemp --directory --tmpdir="${DOWNLOAD_DIR}")" |
| readonly DOWNLOAD_TEMP_DIR |
| readonly TEMP_DIR |
| |
| ( cd "${DOWNLOAD_TEMP_DIR}" |
| # Now, download into the ~/.cache folder |
| if [ ! -e "${HOME}/.cache/bazel/${INSTALLER_NAME}" ]; |
| then |
| NOISINESS=--silent |
| if [ -t 0 ] ; then |
| echo on terminal |
| NOISINESS= |
| fi |
| curl --output "${INSTALLER_NAME}" "${DOWNLOAD_URL}" ${NOISINESS} |
| mv "${INSTALLER_NAME}" "${HOME}/.cache/bazel/${INSTALLER_NAME}" |
| fi |
| rm -rf "${DOWNLOAD_TEMP_DIR}" |
| ) |
| |
| ( cd "${TEMP_DIR}" |
| echo "Copying Bazel version ${VERSION}..." >&2 |
| mkdir -p extracted/usr/bin |
| cp ${HOME}/.cache/bazel/${INSTALLER_NAME} extracted/usr/bin/bazel-real |
| chmod a+x extracted/usr/bin/bazel-real |
| ) |
| |
| touch "${TEMP_DIR}/extracted/usr/bin/bazel.bazelrc" |
| |
| # Careful: somebody else might have already done it. If they manage to make |
| # the move between our check and our move, then we'll end up with a random |
| # extracted directory which won't do anybody any harm. If somebody else does |
| # that first, then our move will fail. |
| if [[ ! -d "${VERSION_DIR}" ]]; then |
| mv "${TEMP_DIR}/extracted" "${VERSION_DIR}" || true |
| fi |
| if [[ ! -d "${VERSION_DIR}" ]]; then |
| echo "Failed to create ${VERSION_DIR}" >&2 |
| exit 1 |
| fi |
| rm -rf "${TEMP_DIR}" |
| echo "Done downloading Bazel version ${VERSION}" |
| fi |
| |
| ENVIRONMENT_VARIABLES=() |
| ENVIRONMENT_VARIABLES+=(HOSTNAME="${HOSTNAME}") |
| ENVIRONMENT_VARIABLES+=(SHELL="${SHELL}") |
| ENVIRONMENT_VARIABLES+=(USER="${USER}") |
| ENVIRONMENT_VARIABLES+=(PATH="${PATH}") |
| ENVIRONMENT_VARIABLES+=(HOME="${HOME}") |
| ENVIRONMENT_VARIABLES+=(TERM="${TERM}") |
| ENVIRONMENT_VARIABLES+=(LANG="${LANG:-C}") |
| ENVIRONMENT_VARIABLES+=(BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1) |
| |
| if [[ ! -z "${CARGO_BAZEL_REPIN+x}" ]]; then |
| ENVIRONMENT_VARIABLES+=(CARGO_BAZEL_REPIN="${CARGO_BAZEL_REPIN}") |
| fi |
| |
| if [[ ! -z "${DISPLAY+x}" ]]; then |
| ENVIRONMENT_VARIABLES+=(DISPLAY="${DISPLAY}") |
| fi |
| |
| if [[ ! -z "${SSH_AUTH_SOCK+x}" ]]; then |
| ENVIRONMENT_VARIABLES+=(SSH_AUTH_SOCK="${SSH_AUTH_SOCK}") |
| fi |
| |
| if [[ ! -z "${LOGNAME+x}" ]]; then |
| ENVIRONMENT_VARIABLES+=(LOGNAME="${LOGNAME}") |
| fi |
| |
| if [[ -x "${VERSION_BAZEL}-real" ]]; then |
| exec -a "${VERSION_BAZEL}" env -i \ |
| "${ENVIRONMENT_VARIABLES[@]}" \ |
| "${VERSION_BAZEL}-real" "$@" |
| fi |
| if [[ -x "${VERSION_BAZEL}" ]]; then |
| exec env -i \ |
| "${ENVIRONMENT_VARIABLES[@]}" \ |
| "${VERSION_BAZEL}" "$@" |
| fi |
| |
| echo "Can't find the real bazel!" >&2 |
| exit 1 |