blob: f138193c90520d16daae2c7b5527128dd13b53d6 [file] [log] [blame]
# Copyright 2019 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.
"""Toolchains required to use rules_proto."""
load("//protoc/private:prebuilt_protoc_toolchain.bzl", "GOOGLE_PROTOBUF_DEP_EDGES", "prebuilt_protoc_repo")
load("//protoc/private:protoc_toolchains.bzl", "protoc_toolchains_repo")
load("//protoc/private:versions.bzl", "PROTOC_PLATFORMS")
def _google_protobuf_alias_repo_impl(rctx):
rctx.file("BUILD", """\
# Generated by @toolchains_protoc//protoc:toolchain.bzl
package(default_visibility=["//visibility:public"])
""" + "\n".join([
"""alias(name = "{1}_proto", actual = "@{0}//:{1}_proto")""".format(rctx.attr.alias_to, wkt)
for wkt in GOOGLE_PROTOBUF_DEP_EDGES.keys()
]))
_google_protobuf_alias_repo = repository_rule(_google_protobuf_alias_repo_impl, attrs = {"alias_to": attr.string()})
def protoc_toolchains(name, version, google_protobuf = None, alias_to = "osx-aarch_64", register = True):
"""A utility method to load all Protobuf toolchains.
Args:
name: base name for generated repositories, allowing multiple protoc versions.
version: a release tag from protocolbuffers/protobuf, e.g. 'v25.3'
google_protobuf: a repository to expose the google.protobuf package, providing the well-known-types.
alias_to: a platform whose download of protoc.zip will become eager, as it will be used to back aliases for the
google_protobuf repo. We cannot rely on toolchain resolution because that doesn't give a way for a label
to reference one of the concrete toolchain targets. We don't want to use select() because that makes
cquery eager-fetch ALL platforms.
register: whether to register the resulting toolchains.
Should be True for WORKSPACE and False under bzlmod.
"""
for platform in PROTOC_PLATFORMS.keys():
prebuilt_protoc_repo(
# We must replace hyphen with underscore to workaround rules_python
# File "/output-base/external/rules_python~override/python/private/proto/py_proto_library.bzl", line 62, column 17, in _py_proto_aspect_impl
# Error in fail: Cannot generate Python code for a .proto whose path contains '-'
# (external/_main~protoc~toolchains_protoc_hub.osx-aarch_64/include/google/protobuf/any.proto).
name = ".".join([name, platform.replace("-", "_")]),
platform = platform,
version = version,
)
protoc_toolchains_repo(name = name, user_repository_name = name)
if register:
native.register_toolchains("@{}//:all".format(name))
if google_protobuf:
_google_protobuf_alias_repo(name = google_protobuf, alias_to = ".".join([name, alias_to.replace("-", "_")]))