diff --git a/py/private/entry.tmpl.sh b/py/private/entry.tmpl.sh index 03b38050..9417af3a 100644 --- a/py/private/entry.tmpl.sh +++ b/py/private/entry.tmpl.sh @@ -90,6 +90,7 @@ ln -snf "${VENV_SOURCE}/lib" "${VENV_LOCATION}/lib" mkdir "${VBIN_LOCATION}" 2>/dev/null || true ln -snf ${VENV_SOURCE}/bin/* "${VBIN_LOCATION}/" ln -snf "${PYTHON_LOCATION}" "${VBIN_LOCATION}/python3" +ln -snf "${VBIN_LOCATION}/python3" "${VBIN_LOCATION}/python" echo "home = ${VBIN_LOCATION}" > "${VENV_LOCATION}/pyvenv.cfg" echo "include-system-site-packages = false" >> "${VENV_LOCATION}/pyvenv.cfg" diff --git a/py/private/py_binary.bzl b/py/private/py_binary.bzl index ff0bc07b..d6cd97ee 100644 --- a/py/private/py_binary.bzl +++ b/py/private/py_binary.bzl @@ -23,12 +23,14 @@ def _py_binary_rule_imp(ctx): "BAZEL_TARGET_NAME": ctx.attr.name, }, **ctx.attr.env) + python_interpreter_path = interpreter.python.path if interpreter.uses_interpreter_path else to_manifest_path(ctx, interpreter.python) + common_substitutions = { "{{BASH_BIN}}": bash_bin, "{{BASH_RLOCATION_FN}}": BASH_RLOCATION_FUNCTION, "{{BINARY_ENTRY_POINT}}": to_manifest_path(ctx, main), "{{INTERPRETER_FLAGS}}": " ".join(interpreter.flags), - "{{PYTHON_INTERPRETER_PATH}}": to_manifest_path(ctx, interpreter.python), + "{{PYTHON_INTERPRETER_PATH}}": python_interpreter_path, "{{RUN_BINARY_ENTRY_POINT}}": "true", "{{VENV_SOURCE}}": to_manifest_path(ctx, venv_info.venv_directory), "{{VENV_NAME}}": "%s.venv" % ctx.attr.name, diff --git a/py/private/utils.bzl b/py/private/utils.bzl index b8850c79..e93a47ee 100644 --- a/py/private/utils.bzl +++ b/py/private/utils.bzl @@ -15,14 +15,28 @@ def resolve_toolchain(ctx): py3_toolchain = toolchain_info.py3_runtime + interpreter = None + uses_interpreter_path = False + if py3_toolchain.interpreter != None: files = depset([py3_toolchain.interpreter], transitive = [py3_toolchain.files]) + interpreter = py3_toolchain.interpreter else: files = py3_toolchain.files + interpreter = struct( + path = py3_toolchain.interpreter_path, + short_path = py3_toolchain.interpreter_path, + ) + files = depset([]) + uses_interpreter_path = True + + if interpreter == None: + fail("Unable to resolve interpreter to a path or file. Ensure `interpreter` or `interpreter_file` is defined on the py3_runtime") return struct( toolchain = py3_toolchain, files = files, - python = py3_toolchain.interpreter, + python = interpreter, + uses_interpreter_path = uses_interpreter_path, flags = ["-B", "-s", "-I"], ) diff --git a/py/private/venv/venv.bzl b/py/private/venv/venv.bzl index df719a4a..8c9f2a14 100644 --- a/py/private/venv/venv.bzl +++ b/py/private/venv/venv.bzl @@ -125,7 +125,6 @@ def _make_venv(ctx, name = None, main = None, strip_pth_workspace_root = None): **{ "{{WHL_REQUIREMENTS_FILE}}": to_manifest_path(ctx, whl_requirements), "{{PTH_FILE}}": to_manifest_path(ctx, pth), - "{{PYTHON_INTERPRETER_PATH}}": interpreter.python.path, "{{VENV_LOCATION}}": "${BUILD_WORKSPACE_DIRECTORY}/.%s" % name, "{{USE_MANIFEST_PATH}}": "true", } @@ -143,7 +142,7 @@ def _make_venv(ctx, name = None, main = None, strip_pth_workspace_root = None): inputs = venv_creation_depset, command = make_venv_for_action_sh.path, tools = [ - interpreter.toolchain.files, + interpreter.files, ], progress_message = "Creating virtual environment for %{label}", mnemonic = "CreateVenv",