| """Repository rule for Python autoconfiguration. |
| |
| `python_configure` depends on the following environment variables: |
| |
| * `PYTHON_BIN_PATH`: location of python binary. |
| """ |
| |
| _PYTHON_BIN_PATH = "PYTHON_BIN_PATH" |
| |
| def _tpl(repository_ctx, tpl, substitutions = {}, out = None): |
| if not out: |
| out = tpl |
| repository_ctx.template( |
| out, |
| Label("//third_party/py:%s.tpl" % tpl), |
| substitutions, |
| ) |
| |
| def _fail(msg): |
| """Output failure message when auto configuration fails.""" |
| red = "\033[0;31m" |
| no_color = "\033[0m" |
| fail("%sPython Configuration Error:%s %s\n" % (red, no_color, msg)) |
| |
| def _get_python_bin(repository_ctx): |
| """Gets the python bin path.""" |
| python_bin = repository_ctx.os.environ.get(_PYTHON_BIN_PATH) |
| if python_bin != None: |
| return python_bin |
| python_bin_path = repository_ctx.which("python") |
| if python_bin_path != None: |
| return str(python_bin_path) |
| _fail("Cannot find python in PATH, please make sure " + |
| "python is installed and add its directory in PATH, or --define " + |
| "%s='/something/else'.\nPATH=%s" % ( |
| _PYTHON_BIN_PATH, |
| repository_ctx.os.environ.get("PATH", ""), |
| )) |
| |
| def _create_local_python_repository(repository_ctx): |
| """Creates the repository containing files set up to build with Python.""" |
| python_bin = _get_python_bin(repository_ctx) |
| _tpl(repository_ctx, "BUILD", { |
| "%{PYTHON_BIN_PATH}": python_bin, |
| }) |
| |
| def _python_autoconf_impl(repository_ctx): |
| """Implementation of the python_autoconf repository rule.""" |
| _create_local_python_repository(repository_ctx) |
| |
| python_configure = repository_rule( |
| implementation = _python_autoconf_impl, |
| environ = [ |
| _PYTHON_BIN_PATH, |
| ], |
| ) |
| """Detects and configures the local Python toolchain. |
| |
| Add the following to your WORKSPACE FILE: |
| |
| ```python |
| load("//third_party/py:python_configure.bzl", "python_configure") |
| |
| python_configure(name = "local_config_py_toolchain") |
| |
| register_toolchains("@local_config_py_toolchain//:py_toolchain") |
| ``` |
| |
| Args: |
| name: A unique name for this workspace rule. |
| """ |