# Copyright 2024 The Bazel Authors. All rights reserved. # # 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 # # http://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. """whl_library aliases for multi_pip_parse.""" load("//python/private:full_version.bzl", "full_version") load(":render_pkg_aliases.bzl", "NO_MATCH_ERROR_MESSAGE_TEMPLATE") def _whl_library_alias_impl(rctx): rules_python = rctx.attr._rules_python_workspace.workspace_name if rctx.attr.default_version: default_repo_prefix = rctx.attr.version_map[rctx.attr.default_version] else: default_repo_prefix = None version_map = rctx.attr.version_map.items() build_content = ["# Generated by python/pip.bzl"] for alias_name in ["pkg", "whl", "data", "dist_info"]: build_content.append(_whl_library_render_alias_target( alias_name = alias_name, default_repo_prefix = default_repo_prefix, minor_mapping = rctx.attr.minor_mapping, rules_python = rules_python, version_map = version_map, wheel_name = rctx.attr.wheel_name, )) rctx.file("BUILD.bazel", "\n".join(build_content)) def _whl_library_render_alias_target( *, alias_name, default_repo_prefix, minor_mapping, rules_python, version_map, wheel_name): alias = ["""\ alias( name = "{alias_name}", actual = select({{""".format(alias_name = alias_name)] for [python_version, repo_prefix] in version_map: alias.append("""\ "@{rules_python}//python/config_settings:is_python_{full_python_version}": "{actual}",""".format( full_python_version = full_version(version = python_version, minor_mapping = minor_mapping), actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( repo_prefix = repo_prefix, wheel_name = wheel_name, alias_name = alias_name, ), rules_python = rules_python, )) if default_repo_prefix: default_actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( repo_prefix = default_repo_prefix, wheel_name = wheel_name, alias_name = alias_name, ) alias.append(' "//conditions:default": "{default_actual}",'.format( default_actual = default_actual, )) alias.append(" },") # Close select expression condition dict if not default_repo_prefix: supported_versions = sorted([python_version for python_version, _ in version_map]) alias.append(' no_match_error="""{}""",'.format( NO_MATCH_ERROR_MESSAGE_TEMPLATE.format( supported_versions = ", ".join(supported_versions), rules_python = rules_python, ), )) alias.append(" ),") # Close the select expression alias.append(' visibility = ["//visibility:public"],') alias.append(")") # Close the alias() expression return "\n".join(alias) whl_library_alias = repository_rule( _whl_library_alias_impl, attrs = { "default_version": attr.string( mandatory = False, doc = "Optional Python version in major.minor format, e.g. '3.10'." + "The Python version of the wheel to use when the versions " + "from `version_map` don't match. This allows the default " + "(version unaware) rules to match and select a wheel. If " + "not specified, then the default rules won't be able to " + "resolve a wheel and an error will occur.", ), "minor_mapping": attr.string_dict(mandatory = True), "version_map": attr.string_dict(mandatory = True), "wheel_name": attr.string(mandatory = True), "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), }, )