Redirected rules: proto_library, proto_toolchain, proto_lang_toolchain Modules and providers: proto_common, ProtoInfo, ProtoLangToolchainInfo The structure follows proposal: https://docs.google.com/document/d/1L1JFgjpZ7SrBinb24DC_5nTIELeYDacikcme-YcA7xs/edit?usp=drive_open&ouid=102306600948089647787 PiperOrigin-RevId: 622117921pull/16323/head
parent
9a61f11fa5
commit
d4d34abd7d
10 changed files with 130 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||||
|
"""proto_common""" |
||||||
|
|
||||||
|
load("//bazel/private:native.bzl", "native_proto_common") |
||||||
|
|
||||||
|
proto_common = native_proto_common |
@ -0,0 +1,5 @@ |
|||||||
|
"""ProtoInfo""" |
||||||
|
|
||||||
|
load("//bazel/private:native.bzl", "NativeProtoInfo") |
||||||
|
|
||||||
|
ProtoInfo = NativeProtoInfo |
@ -0,0 +1,5 @@ |
|||||||
|
"""ProtoLangToolchainInfo""" |
||||||
|
|
||||||
|
load("//bazel/common:proto_common.bzl", "proto_common") |
||||||
|
|
||||||
|
ProtoLangToolchainInfo = proto_common.ProtoLangToolchainInfo |
@ -0,0 +1,5 @@ |
|||||||
|
"""Renames toplevel symbols so they can be exported in Starlark under the same name""" |
||||||
|
|
||||||
|
NativeProtoInfo = ProtoInfo |
||||||
|
|
||||||
|
native_proto_common = proto_common_do_not_use |
@ -0,0 +1,47 @@ |
|||||||
|
"""A Starlark implementation of the proto_toolchain rule.""" |
||||||
|
|
||||||
|
load("//bazel/common:proto_common.bzl", "proto_common") |
||||||
|
load("//bazel/common:proto_lang_toolchain_info.bzl", "ProtoLangToolchainInfo") |
||||||
|
|
||||||
|
def _impl(ctx): |
||||||
|
kwargs = {} |
||||||
|
if getattr(proto_common, "INCOMPATIBLE_PASS_TOOLCHAIN_TYPE", False): |
||||||
|
kwargs["toolchain_type"] = "//third_party/bazel_rules/rules_proto/proto:toolchain_type" |
||||||
|
|
||||||
|
return [ |
||||||
|
DefaultInfo( |
||||||
|
files = depset(), |
||||||
|
runfiles = ctx.runfiles(), |
||||||
|
), |
||||||
|
platform_common.ToolchainInfo( |
||||||
|
proto = ProtoLangToolchainInfo( |
||||||
|
out_replacement_format_flag = ctx.attr.command_line, |
||||||
|
output_files = ctx.attr.output_files, |
||||||
|
plugin = None, |
||||||
|
runtime = None, |
||||||
|
proto_compiler = ctx.attr.proto_compiler.files_to_run, |
||||||
|
protoc_opts = ctx.fragments.proto.experimental_protoc_opts, |
||||||
|
progress_message = ctx.attr.progress_message, |
||||||
|
mnemonic = ctx.attr.mnemonic, |
||||||
|
**kwargs |
||||||
|
), |
||||||
|
), |
||||||
|
] |
||||||
|
|
||||||
|
proto_toolchain = rule( |
||||||
|
_impl, |
||||||
|
attrs = |
||||||
|
{ |
||||||
|
"progress_message": attr.string(default = "Generating Descriptor Set proto_library %{label}"), |
||||||
|
"mnemonic": attr.string(default = "GenProtoDescriptorSet"), |
||||||
|
"command_line": attr.string(default = "--descriptor_set_out=%s"), |
||||||
|
"output_files": attr.string(values = ["single", "multiple", "legacy"], default = "single"), |
||||||
|
"proto_compiler": attr.label( |
||||||
|
cfg = "exec", |
||||||
|
executable = True, |
||||||
|
allow_files = True, # Used by mocks in tests. Consider fixing tests and removing it. |
||||||
|
), |
||||||
|
}, |
||||||
|
provides = [platform_common.ToolchainInfo], |
||||||
|
fragments = ["proto"], |
||||||
|
) |
@ -0,0 +1,3 @@ |
|||||||
|
"""proto_library rule""" |
||||||
|
|
||||||
|
proto_library = native.proto_library |
@ -0,0 +1,34 @@ |
|||||||
|
"""proto_lang_toolchain rule""" |
||||||
|
|
||||||
|
load("//bazel/common:proto_common.bzl", "proto_common") |
||||||
|
|
||||||
|
def proto_lang_toolchain(*, name, toolchain_type = None, exec_compatible_with = [], target_compatible_with = [], **attrs): |
||||||
|
"""Creates a proto_lang_toolchain and corresponding toolchain target. |
||||||
|
|
||||||
|
Toolchain target is only created when toolchain_type is set. |
||||||
|
|
||||||
|
https://docs.bazel.build/versions/master/be/protocol-buffer.html#proto_lang_toolchain |
||||||
|
|
||||||
|
Args: |
||||||
|
|
||||||
|
name: name of the toolchain |
||||||
|
toolchain_type: The toolchain type |
||||||
|
exec_compatible_with: ([constraints]) List of constraints the prebuild binaries is compatible with. |
||||||
|
target_compatible_with: ([constraints]) List of constraints the target libraries are compatible with. |
||||||
|
**attrs: Rule attributes |
||||||
|
""" |
||||||
|
|
||||||
|
if getattr(proto_common, "INCOMPATIBLE_PASS_TOOLCHAIN_TYPE", False): |
||||||
|
attrs["toolchain_type"] = toolchain_type |
||||||
|
|
||||||
|
# buildifier: disable=native-proto |
||||||
|
native.proto_lang_toolchain(name = name, **attrs) |
||||||
|
|
||||||
|
if toolchain_type: |
||||||
|
native.toolchain( |
||||||
|
name = name + "_toolchain", |
||||||
|
toolchain_type = toolchain_type, |
||||||
|
exec_compatible_with = exec_compatible_with, |
||||||
|
target_compatible_with = target_compatible_with, |
||||||
|
toolchain = name, |
||||||
|
) |
@ -0,0 +1,26 @@ |
|||||||
|
"""Macro wrapping the proto_toolchain implementation. |
||||||
|
|
||||||
|
The macro additionally creates toolchain target when toolchain_type is given. |
||||||
|
""" |
||||||
|
|
||||||
|
load("//bazel/private:proto_toolchain_rule.bzl", _proto_toolchain_rule = "proto_toolchain") |
||||||
|
|
||||||
|
def proto_toolchain(*, name, proto_compiler, exec_compatible_with = []): |
||||||
|
"""Creates a proto_toolchain and toolchain target for proto_library. |
||||||
|
|
||||||
|
Toolchain target is suffixed with "_toolchain". |
||||||
|
|
||||||
|
Args: |
||||||
|
name: name of the toolchain |
||||||
|
proto_compiler: (Label) of either proto compiler sources or prebuild binaries |
||||||
|
exec_compatible_with: ([constraints]) List of constraints the prebuild binary is compatible with. |
||||||
|
""" |
||||||
|
_proto_toolchain_rule(name = name, proto_compiler = proto_compiler) |
||||||
|
|
||||||
|
native.toolchain( |
||||||
|
name = name + "_toolchain", |
||||||
|
toolchain_type = "//third_party/bazel_rules/rules_proto/proto:toolchain_type", |
||||||
|
exec_compatible_with = exec_compatible_with, |
||||||
|
target_compatible_with = [], |
||||||
|
toolchain = name, |
||||||
|
) |
Loading…
Reference in new issue