blob: 6601d7f2a3860dd6044c7d0448bfbef82d6e1b1b [file] [log] [blame]
"""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.
"""