Fix name in proto_lang_toolchain rule
Added a wrapper for proto_lang_toolchain in order to have two implementations - one with public proto_compiler attribute, and the other one with the private one.
Restructured proto_lang_toolchain rules' implementation - merged two rule's definitions into one.
PiperOrigin-RevId: 447016335
diff --git a/src/main/starlark/builtins_bzl/common/exports.bzl b/src/main/starlark/builtins_bzl/common/exports.bzl
index ad07ebe..54fcfc2 100755
--- a/src/main/starlark/builtins_bzl/common/exports.bzl
+++ b/src/main/starlark/builtins_bzl/common/exports.bzl
@@ -25,7 +25,7 @@
load("@_builtins//:common/objc/linking_support.bzl", "linking_support")
load("@_builtins//:common/proto/proto_common.bzl", "proto_common_do_not_use")
load("@_builtins//:common/proto/proto_library.bzl", "proto_library")
-load("@_builtins//:common/proto/proto_lang_toolchain.bzl", "proto_lang_toolchain")
+load("@_builtins//:common/proto/proto_lang_toolchain_wrapper.bzl", "proto_lang_toolchain")
load("@_builtins//:common/java/proto/java_lite_proto_library.bzl", "java_lite_proto_library")
load("@_builtins//:common/cc/cc_library.bzl", "cc_library")
diff --git a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl
index 18f8178..d5b25fa 100644
--- a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl
+++ b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl
@@ -16,7 +16,6 @@
load(":common/proto/proto_common.bzl", "ProtoLangToolchainInfo")
load(":common/proto/proto_semantics.bzl", "semantics")
-load(":common/rule_util.bzl", "merge_attrs")
ProtoInfo = _builtins.toplevel.ProtoInfo
proto_common = _builtins.toplevel.proto_common
@@ -54,65 +53,38 @@
),
]
-proto_lang_toolchain_attrs = {
- "progress_message": attr.string(default = "Generating proto_library %{label}"),
- "mnemonic": attr.string(default = "GenProto"),
- "command_line": attr.string(mandatory = True),
- "plugin_format_flag": attr.string(),
- "plugin": attr.label(
- executable = True,
- cfg = "exec",
- ),
- "runtime": attr.label(),
- "blacklisted_protos": attr.label_list(
- providers = [ProtoInfo],
- ),
-}
-
-proto_lang_toolchain_custom_protoc = rule(
- implementation = _rule_impl,
- attrs = merge_attrs(
- proto_lang_toolchain_attrs,
- {
- "proto_compiler": attr.label(
- cfg = "exec",
- executable = True,
- ),
- },
- ),
- provides = [ProtoLangToolchainInfo],
- fragments = ["proto"] + semantics.EXTRA_FRAGMENTS,
-)
-
-proto_lang_toolchain_default_protoc = rule(
- implementation = _rule_impl,
- attrs = merge_attrs(
- proto_lang_toolchain_attrs,
- {
- "_proto_compiler": attr.label(
- cfg = "exec",
- executable = True,
- allow_files = True,
- default = configuration_field("proto", "proto_compiler"),
- ),
- },
- ),
- provides = [ProtoLangToolchainInfo],
- fragments = ["proto"] + semantics.EXTRA_FRAGMENTS,
-)
-
-def proto_lang_toolchain(
- name = None,
- proto_compiler = None,
- **kwargs):
- if proto_compiler != None:
- proto_lang_toolchain_custom_protoc(
- name = name,
- proto_compiler = proto_compiler,
- **kwargs
- )
- else:
- proto_lang_toolchain_default_protoc(
- name = name,
- **kwargs
- )
+def make_proto_lang_toolchain(custom_proto_compiler):
+ return rule(
+ _rule_impl,
+ attrs = dict(
+ {
+ "progress_message": attr.string(default = "Generating proto_library %{label}"),
+ "mnemonic": attr.string(default = "GenProto"),
+ "command_line": attr.string(mandatory = True),
+ "plugin_format_flag": attr.string(),
+ "plugin": attr.label(
+ executable = True,
+ cfg = "exec",
+ ),
+ "runtime": attr.label(),
+ "blacklisted_protos": attr.label_list(
+ providers = [ProtoInfo],
+ ),
+ },
+ **({
+ "proto_compiler": attr.label(
+ cfg = "exec",
+ executable = True,
+ ),
+ } if custom_proto_compiler else {
+ "_proto_compiler": attr.label(
+ cfg = "exec",
+ executable = True,
+ allow_files = True,
+ default = configuration_field("proto", "proto_compiler"),
+ ),
+ })
+ ),
+ provides = [ProtoLangToolchainInfo],
+ fragments = ["proto"] + semantics.EXTRA_FRAGMENTS,
+ )
diff --git a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_custom_protoc.bzl b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_custom_protoc.bzl
new file mode 100644
index 0000000..b4157f6
--- /dev/null
+++ b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_custom_protoc.bzl
@@ -0,0 +1,23 @@
+# Copyright 2021 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.
+
+"""Defines a proto_lang_toolchain rule class with custom proto compiler.
+
+There are two physical rule classes for proto_lang_toolchain and we want both of them
+to have a name string of "proto_lang_toolchain".
+"""
+
+load(":common/proto/proto_lang_toolchain.bzl", "make_proto_lang_toolchain")
+
+proto_lang_toolchain = make_proto_lang_toolchain(custom_proto_compiler = True)
diff --git a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_default_protoc.bzl b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_default_protoc.bzl
new file mode 100644
index 0000000..7345bc3
--- /dev/null
+++ b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_default_protoc.bzl
@@ -0,0 +1,23 @@
+# Copyright 2021 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.
+
+"""Defines a proto_lang_toolchain rule class with default proto compiler.
+
+There are two physical rule classes for proto_lang_toolchain and we want both of them
+to have a name string of "proto_lang_toolchain".
+"""
+
+load(":common/proto/proto_lang_toolchain.bzl", "make_proto_lang_toolchain")
+
+proto_lang_toolchain = make_proto_lang_toolchain(custom_proto_compiler = False)
diff --git a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_wrapper.bzl b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_wrapper.bzl
new file mode 100644
index 0000000..075e6d7
--- /dev/null
+++ b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain_wrapper.bzl
@@ -0,0 +1,35 @@
+# Copyright 2021 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.
+
+"""Macro encapsulating the proto_lang_toolchain implementation.
+
+This is needed since proto compiler can be defined, or used as a default one.
+There are two implementations of proto_lang_toolchain - one with public proto_compiler attribute, and the other one with private compiler.
+"""
+
+load(":common/proto/proto_lang_toolchain_default_protoc.bzl", toolchain_default_protoc = "proto_lang_toolchain")
+load(":common/proto/proto_lang_toolchain_custom_protoc.bzl", toolchain_custom_protoc = "proto_lang_toolchain")
+
+def proto_lang_toolchain(
+ proto_compiler = None,
+ **kwargs):
+ if proto_compiler != None:
+ toolchain_custom_protoc(
+ proto_compiler = proto_compiler,
+ **kwargs
+ )
+ else:
+ toolchain_default_protoc(
+ **kwargs
+ )