| # Copyright 2019 Google LLC |
| # |
| # 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 |
| # |
| # https://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. |
| |
| """Automatically detects and configures for native python building.""" |
| |
| _ENV_PYTHON_BIN = "PYTHON_BIN" |
| |
| def _python_configure_impl(repository_ctx): |
| # Symlink build_defs.bzl into the new repository. |
| repository_ctx.symlink(repository_ctx.attr._build_defs, "build_defs.bzl") |
| |
| python_bin = _get_python_bin(repository_ctx) |
| generate_script = repository_ctx.path(repository_ctx.attr._generate_script) |
| |
| # print("Generator: %s" % generate_script) |
| exec_result = repository_ctx.execute([python_bin, generate_script]) |
| if exec_result.return_code != 0: |
| fail(("Failed to execute python configure script: %s %s " + |
| "(stderr follows)\n%s") % ( |
| python_bin, |
| generate_script, |
| exec_result.stderr, |
| )) |
| build_contents = exec_result.stdout |
| |
| # print("Build contents: %s" % build_contents) |
| # print("Stderr: %s" % (exec_result.stderr,)) |
| repository_ctx.file("BUILD", build_contents) |
| |
| # Now parse the build_contents for directives on how to setup the repo. |
| build_lines = build_contents.splitlines() |
| SYMLINK_PREFIX = "# SYMLINK: " |
| for build_line in build_lines: |
| if build_line.startswith(SYMLINK_PREFIX): |
| symlink_from, symlink_to = build_line[len(SYMLINK_PREFIX):].split("\t") |
| |
| # print('SYMLINK:', symlink_from, symlink_to) |
| repository_ctx.symlink(symlink_from, symlink_to) |
| |
| python_configure = repository_rule( |
| implementation = _python_configure_impl, |
| environ = [ |
| _ENV_PYTHON_BIN, |
| "PATH", |
| ], |
| attrs = { |
| "_generate_script": attr.label( |
| default = Label("//build_tools/python:generate_build.py"), |
| allow_single_file = True, |
| ), |
| "_build_defs": attr.label( |
| default = Label("//build_tools/python:build_defs.bzl"), |
| allow_single_file = True, |
| ), |
| }, |
| ) |
| |
| def _get_python_bin(repository_ctx): |
| python_bin = repository_ctx.os.environ.get(_ENV_PYTHON_BIN) |
| if python_bin != None: |
| print("Using python binary from %s = %s" % ( |
| _ENV_PYTHON_BIN, |
| python_bin, |
| )) # buildozer: disable=print |
| |
| return python_bin |
| python_bin_path = repository_ctx.which("python") |
| if python_bin != None: |
| print("Using python from system PATH: %s" % (python_bin,)) # buildozer: disable=print |
| return str(python_bin) # buildozer: disable=print |
| |
| fail(( |
| "Unable to find python binary (via %s on PATH %s) " + |
| "Note that PATH resolution on Windows is unreliable. Prefer " + |
| "explicit configuration." |
| ) % ( |
| _ENV_PYTHON_BIN, |
| repository_ctx.os.environ.get("PATH", ""), |
| )) |