diff options
Diffstat (limited to 'tools/bash/runfiles/runfiles.bash')
-rw-r--r-- | tools/bash/runfiles/runfiles.bash | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/tools/bash/runfiles/runfiles.bash b/tools/bash/runfiles/runfiles.bash new file mode 100644 index 0000000000..d56a835bfa --- /dev/null +++ b/tools/bash/runfiles/runfiles.bash @@ -0,0 +1,113 @@ +#!/bin/bash +# +# Copyright 2018 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 Bash script defines functions to handle sh_binary/sh_test runfiles. +# +# REQUIREMENTS: +# - The RUNFILES_MANIFEST_FILE and/or the RUNFILES_DIR environment variable must +# be set to the absolute path of the runfiles manifest or the +# <rulename>.runfiles directory, respectively. +# - If RUNFILES_MANIFEST_ONLY=1 is set, then RUNFILES_MANIFEST_FILE must be set +# to the absolute path of the runfiles manifest. RUNFILES_DIR may be unset in +# this case. +# - If RUNFILES_LIB_DEBUG=1 is set, the script will print errors to stderr. + +case "$(uname -s | tr [:upper:] [:lower:])" in +msys*|mingw*|cygwin*) + # matches an absolute Windows path + _rlocation_isabs_pattern="^[a-zA-Z]:[/\\]" + ;; +*) + # matches an absolute Unix path + _rlocation_isabs_pattern="^/.*" + ;; +esac + +# Prints to stdout the runtime location of a data-dependency. +function rlocation() { + if [[ "$1" =~ $_rlocation_isabs_pattern ]]; then + # If the path is absolute, print it as-is. + echo $1 + elif [[ "$1" =~ \.\. ]]; then + if [[ "${RUNFILES_LIB_DEBUG:-}" == 1 ]]; then + echo >&2 "ERROR[runfiles.bash]: rlocation($1): contains uplevel reference" + fi + return 1 + elif [[ "$1" == \\* ]]; then + if [[ "${RUNFILES_LIB_DEBUG:-}" == 1 ]]; then + echo >&2 "ERROR[runfiles.bash]: rlocation($1): absolute path without" \ + "drive name" + fi + return 1 + else + if [[ "${RUNFILES_MANIFEST_ONLY:-}" == 1 ]]; then + if [[ -n "${RUNFILES_MANIFEST_FILE:-}" \ + && -f "${RUNFILES_MANIFEST_FILE}" ]]; then + grep -m1 "^$1 " "${RUNFILES_MANIFEST_FILE}" | cut -d ' ' -f 2- \ + || return 1 + else + if [[ "${RUNFILES_LIB_DEBUG:-}" == 1 ]]; then + echo >&2 "ERROR[runfiles.bash]: trying to use manifest-based" \ + "runfiles but RUNFILES_MANIFEST_FILE is unset or" \ + "non-existent" \ + "(RUNFILES_MANIFEST_ONLY=\"${RUNFILES_MANIFEST_ONLY:-}\"," \ + "RUNFILES_DIR=\"${RUNFILES_DIR:-}\")" + fi + return 1 + fi + elif [[ -n "${RUNFILES_DIR:-}" && -d "${RUNFILES_DIR}" ]]; then + echo "${RUNFILES_DIR}/$1" + else + if [[ "${RUNFILES_LIB_DEBUG:-}" == 1 ]]; then + echo >&2 "ERROR[runfiles.bash]: trying to use directory-based" \ + "runfiles but RUNFILES_DIR is unset or non-existent" \ + "(RUNFILES_MANIFEST_ONLY=\"${RUNFILES_MANIFEST_ONLY:-}\"," \ + "RUNFILES_MANIFEST_FILE=\"${RUNFILES_MANIFEST_FILE:-}\")" + fi + return 1 + fi + fi +} +export -f rlocation + +# Exports the environment variables that subprocesses may need to use runfiles. +# If a subprocess is a Bazel-built binary rule that also uses the runfiles +# libraries under @bazel_tools//tools/bash/runfiles, then that binary needs +# these envvars in order to initialize its own runfiles library. +function runfiles_export_envvars() { + if [[ "${RUNFILES_MANIFEST_ONLY:-}" == 1 ]]; then + if [[ -z "${RUNFILES_MANIFEST_FILE:-}" \ + && ! -f "$RUNFILES_MANIFEST_FILE" ]]; then + return 1 + fi + if [[ -z "${RUNFILES_DIR:-}" ]]; then + if [[ "$RUNFILES_MANIFEST_FILE" == */MANIFEST \ + && -d "${RUNFILES_MANIFEST_FILE%/MANIFEST}" ]]; then + export RUNFILES_DIR="${RUNFILES_MANIFEST_FILE%/MANIFEST}" + elif [[ "$RUNFILES_MANIFEST_FILE" == *runfiles_manifest \ + && -d "${RUNFILES_MANIFEST_FILE%_manifest}" ]]; then + export RUNFILES_DIR="${RUNFILES_MANIFEST_FILE%_manifest}" + fi + fi + fi + # No need to define anything if RUNFILES_MANIFEST_ONLY is not 1: it makes no + # difference whether RUNFILES_DIR is defined or not. + + export RUNFILES_MANIFEST_FILE="${RUNFILES_MANIFEST_FILE:-}" + export RUNFILES_DIR="${RUNFILES_DIR:-}" + export JAVA_RUNFILES="${RUNFILES_DIR:-}" +} +export -f runfiles_export_envvars |