From 9ad0674619f6cae2ce9195297140a4b01d988d02 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 11 Feb 2023 09:13:18 -0800 Subject: [PATCH] Only set `py_runtime.coverage_tool` for Bazel 6 and higher. (#1061) Only set `py_runtime.coverage_tool` for Bazel 6 and higher. Avoid setting it in earlier version by checking `native.bazel_version` in the repository rule and disabling it if less than Bazel 6 is detected. A warning is also printed if coverage was requested, but the Bazel version check is ignoring it. Fixes #1056 --- python/repositories.bzl | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/python/repositories.bzl b/python/repositories.bzl index e61b057d22..df72497d91 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -243,6 +243,21 @@ def _python_repository_impl(rctx): "share/**", ] + if rctx.attr.coverage_tool: + if "windows" in rctx.os.name: + coverage_tool = None + else: + coverage_tool = '"{}"'.format(rctx.attr.coverage_tool) + + coverage_attr_text = """\ + coverage_tool = select({{ + ":coverage_enabled": {coverage_tool}, + "//conditions:default": None + }}), +""".format(coverage_tool = coverage_tool) + else: + coverage_attr_text = " # coverage_tool attribute not supported by this Bazel version" + build_content = """\ # Generated by python/repositories.bzl @@ -308,10 +323,7 @@ config_setting( py_runtime( name = "py3_runtime", files = [":files"], - coverage_tool = select({{ - ":coverage_enabled": {coverage_tool}, - "//conditions:default": None, - }}), +{coverage_attr} interpreter = "{python_path}", python_version = "PY3", ) @@ -327,7 +339,7 @@ py_runtime_pair( python_path = python_bin, python_version = python_short_version, python_version_nodot = python_short_version.replace(".", ""), - coverage_tool = rctx.attr.coverage_tool if rctx.attr.coverage_tool == None or "windows" in rctx.os.name else "\"{}\"".format(rctx.attr.coverage_tool), + coverage_attr = coverage_attr_text, ) rctx.delete("python") rctx.symlink(python_bin, "python") @@ -459,6 +471,8 @@ def python_register_toolchains( distutils_content: see the distutils_content attribute in the python_repository repository rule. register_toolchains: Whether or not to register the downloaded toolchains. register_coverage_tool: Whether or not to register the downloaded coverage tool to the toolchains. + NOTE: Coverage support using the toolchain is only supported in Bazel 6 and higher. + set_python_version_constraint: When set to true, target_compatible_with for the toolchains will include a version constraint. tool_versions: a dict containing a mapping of version with SHASUM and platform info. If not supplied, the defaults in python/versions.bzl will be used. @@ -472,6 +486,19 @@ def python_register_toolchains( toolchain_repo_name = "{name}_toolchains".format(name = name) + bazel_major = int(native.bazel_version.split(".")[0]) + if bazel_major < 6: + if register_coverage_tool: + # buildifier: disable=print + print(( + "WARNING: ignoring register_coverage_tool=True when " + + "registering @{name}: Bazel 6+ required, got {version}" + ).format( + name = name, + version = native.bazel_version, + )) + register_coverage_tool = False + for platform in PLATFORMS.keys(): sha256 = tool_versions[python_version]["sha256"].get(platform, None) if not sha256: