|  | #!/bin/sh | 
|  |  | 
|  | # Don't set -e because we don't have robust trapping and printing of errors. | 
|  | set -u | 
|  |  | 
|  | # We use /bin/sh rather than /bin/bash for portability. See discussion here: | 
|  | # https://groups.google.com/forum/?nomobile=true#!topic/bazel-dev/4Ql_7eDcLC0 | 
|  | # We do lose the ability to set -o pipefail. | 
|  |  | 
|  | STRICT="%STRICT%" | 
|  |  | 
|  | if [ "$STRICT" = "1" ]; then | 
|  | FAILURE_HEADER="\ | 
|  | Error occurred while attempting to use the default Python toolchain \ | 
|  | (@rules_python//python:autodetecting_toolchain)." | 
|  | else | 
|  | FAILURE_HEADER="\ | 
|  | Error occurred while attempting to use the non-strict autodetecting Python \ | 
|  | toolchain (@rules_python//python:autodetecting_toolchain_nonstrict)." | 
|  | fi | 
|  |  | 
|  | die() { | 
|  | echo "$FAILURE_HEADER" 1>&2 | 
|  | echo "$1" 1>&2 | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | # We use `which` to locate the Python interpreter command on PATH. `command -v` | 
|  | # is another option, but it doesn't check whether the file it finds has the | 
|  | # executable bit. | 
|  | # | 
|  | # A tricky situation happens when this wrapper is invoked as part of running a | 
|  | # tool, e.g. passing a py_binary target to `ctx.actions.run()`. Bazel will unset | 
|  | # the PATH variable. Then the shell will see there's no PATH and initialize its | 
|  | # own, sometimes without exporting it. This causes `which` to fail and this | 
|  | # script to think there's no Python interpreter installed. To avoid this we | 
|  | # explicitly pass PATH to each `which` invocation. We can't just export PATH | 
|  | # because that would modify the environment seen by the final user Python | 
|  | # program. | 
|  | # | 
|  | # See also: | 
|  | # | 
|  | #     https://github.com/bazelbuild/continuous-integration/issues/578 | 
|  | #     https://github.com/bazelbuild/bazel/issues/8414 | 
|  | #     https://github.com/bazelbuild/bazel/issues/8415 | 
|  |  | 
|  | # Try the "python%VERSION%" command name first, then fall back on "python". | 
|  | PYTHON_BIN="$(PATH="$PATH" which python%VERSION% 2> /dev/null)" | 
|  | USED_FALLBACK="0" | 
|  | if [ -z "${PYTHON_BIN:-}" ]; then | 
|  | PYTHON_BIN="$(PATH="$PATH" which python 2>/dev/null)" | 
|  | USED_FALLBACK="1" | 
|  | fi | 
|  | if [ -z "${PYTHON_BIN:-}" ]; then | 
|  | die "Neither 'python%VERSION%' nor 'python' were found on the target \ | 
|  | platform's PATH, which is: | 
|  |  | 
|  | $PATH | 
|  |  | 
|  | Please ensure an interpreter is available on this platform (and marked \ | 
|  | executable), or else register an appropriate Python toolchain as per the \ | 
|  | documentation for py_runtime_pair \ | 
|  | (https://github.com/bazelbuild/rules_python/blob/master/docs/python.md#py_runtime_pair)." | 
|  | fi | 
|  |  | 
|  | if [ "$STRICT" = "1" ]; then | 
|  | # Verify that we grabbed an interpreter with the right version. | 
|  | VERSION_STR="$("$PYTHON_BIN" -V 2>&1)" \ | 
|  | || die "Could not get interpreter version via '$PYTHON_BIN -V'" | 
|  | if ! echo "$VERSION_STR" | grep -q " %VERSION%\." ; then | 
|  | die "According to '$PYTHON_BIN -V', version is '$VERSION_STR', but we \ | 
|  | need version %VERSION%. PATH is: | 
|  |  | 
|  | $PATH | 
|  |  | 
|  | Please ensure an interpreter with version %VERSION% is available on this \ | 
|  | platform as 'python%VERSION%' or 'python', or else register an appropriate \ | 
|  | Python toolchain as per the documentation for py_runtime_pair \ | 
|  | (https://github.com/bazelbuild/rules_python/blob/master/docs/python.md#py_runtime_pair). | 
|  |  | 
|  | Note that prior to Bazel 0.27, there was no check to ensure that the \ | 
|  | interpreter's version matched the version declared by the target (#4815). If \ | 
|  | your build worked prior to Bazel 0.27, and you're sure your targets do not \ | 
|  | require Python %VERSION%, you can opt out of this version check by using the \ | 
|  | non-strict autodetecting toolchain instead of the standard autodetecting \ | 
|  | toolchain. This can be done by passing the flag \ | 
|  | \`--extra_toolchains=@rules_python//python:autodetecting_toolchain_nonstrict\` \ | 
|  | on the command line or adding it to your bazelrc." | 
|  | fi | 
|  | fi | 
|  |  | 
|  | exec "$PYTHON_BIN" "$@" |