| # Copyright (c) 2009-2024, Google LLC | |
| # All rights reserved. | |
| # | |
| # Use of this source code is governed by a BSD-style | |
| # license that can be found in the LICENSE file or at | |
| # https://developers.google.com/open-source/licenses/bsd | |
| """A Starlark implementation of the java_lite_proto_library rule.""" | |
| load("@rules_java//java/common:java_common.bzl", "java_common") | |
| load("@rules_java//java/common:java_info.bzl", "JavaInfo") | |
| load("@rules_java//java/common:proguard_spec_info.bzl", "ProguardSpecInfo") | |
| load("//bazel/common:proto_common.bzl", "proto_common") | |
| load("//bazel/common:proto_info.bzl", "ProtoInfo") | |
| load("//bazel/private:java_proto_support.bzl", "JavaProtoAspectInfo", "java_compile_for_protos", "java_info_merge_for_protos") | |
| load("//bazel/private:toolchain_helpers.bzl", "toolchains") | |
| _PROTO_TOOLCHAIN_ATTR = "_aspect_proto_toolchain_for_javalite" | |
| _JAVA_LITE_PROTO_TOOLCHAIN = Label("//bazel/private:javalite_toolchain_type") | |
| def _aspect_impl(target, ctx): | |
| """Generates and compiles Java code for a proto_library dependency graph. | |
| Args: | |
| target: (Target) The `proto_library` target. | |
| ctx: (RuleContext) The rule context. | |
| Returns: | |
| ([JavaInfo, JavaProtoAspectInfo]) A JavaInfo describing compiled Java | |
| version of`proto_library` and `JavaProtoAspectInfo` with all source and | |
| runtime jars. | |
| """ | |
| deps = [dep[JavaInfo] for dep in ctx.rule.attr.deps] | |
| exports = [exp[JavaInfo] for exp in ctx.rule.attr.exports] | |
| proto_toolchain_info = toolchains.find_toolchain( | |
| ctx, | |
| "_aspect_proto_toolchain_for_javalite", | |
| _JAVA_LITE_PROTO_TOOLCHAIN, | |
| ) | |
| source_jar = None | |
| if proto_common.experimental_should_generate_code(target[ProtoInfo], proto_toolchain_info, "java_lite_proto_library", target.label): | |
| source_jar = ctx.actions.declare_file(ctx.label.name + "-lite-src.jar") | |
| proto_common.compile( | |
| ctx.actions, | |
| target[ProtoInfo], | |
| proto_toolchain_info, | |
| [source_jar], | |
| experimental_output_files = "single", | |
| ) | |
| runtime = proto_toolchain_info.runtime | |
| if runtime: | |
| deps.append(runtime[JavaInfo]) | |
| java_info, jars = java_compile_for_protos( | |
| ctx, | |
| "-lite.jar", | |
| source_jar, | |
| deps, | |
| exports, | |
| injecting_rule_kind = "java_lite_proto_library", | |
| ) | |
| transitive_jars = [dep[JavaProtoAspectInfo].jars for dep in ctx.rule.attr.deps] | |
| return [ | |
| java_info, | |
| JavaProtoAspectInfo(jars = depset(jars, transitive = transitive_jars)), | |
| ] | |
| _java_lite_proto_aspect = aspect( | |
| implementation = _aspect_impl, | |
| attr_aspects = ["deps", "exports"], | |
| attrs = toolchains.if_legacy_toolchain({ | |
| _PROTO_TOOLCHAIN_ATTR: attr.label( | |
| default = configuration_field(fragment = "proto", name = "proto_toolchain_for_java_lite"), | |
| ), | |
| }), | |
| fragments = ["java"], | |
| required_providers = [ProtoInfo], | |
| provides = [JavaInfo, JavaProtoAspectInfo], | |
| toolchains = ["@bazel_tools//tools/jdk:toolchain_type"] + | |
| toolchains.use_toolchain(_JAVA_LITE_PROTO_TOOLCHAIN), | |
| ) | |
| def _rule_impl(ctx): | |
| """Merges results of `java_proto_aspect` in `deps`. | |
| `java_lite_proto_library` is identical to `java_proto_library` in every respect, except it | |
| builds JavaLite protos. | |
| Implementation of this rule is built on the implementation of `java_proto_library`. | |
| Args: | |
| ctx: (RuleContext) The rule context. | |
| Returns: | |
| ([JavaInfo, DefaultInfo, OutputGroupInfo, ProguardSpecInfo]) | |
| """ | |
| proto_toolchain_info = toolchains.find_toolchain( | |
| ctx, | |
| "_aspect_proto_toolchain_for_javalite", | |
| _JAVA_LITE_PROTO_TOOLCHAIN, | |
| ) | |
| for dep in ctx.attr.deps: | |
| proto_common.check_collocated(ctx.label, dep[ProtoInfo], proto_toolchain_info) | |
| runtime = proto_toolchain_info.runtime | |
| if runtime: | |
| proguard_provider_specs = runtime[ProguardSpecInfo] | |
| else: | |
| proguard_provider_specs = ProguardSpecInfo(depset()) | |
| java_info = java_info_merge_for_protos([dep[JavaInfo] for dep in ctx.attr.deps], merge_java_outputs = False) | |
| transitive_src_and_runtime_jars = depset(transitive = [dep[JavaProtoAspectInfo].jars for dep in ctx.attr.deps]) | |
| transitive_runtime_jars = depset(transitive = [java_info.transitive_runtime_jars]) | |
| if hasattr(java_common, "add_constraints"): | |
| java_info = java_common.add_constraints(java_info, constraints = ["android"]) | |
| return [ | |
| java_info, | |
| DefaultInfo( | |
| files = transitive_src_and_runtime_jars, | |
| runfiles = ctx.runfiles(transitive_files = transitive_runtime_jars), | |
| ), | |
| OutputGroupInfo(default = depset()), | |
| proguard_provider_specs, | |
| ] | |
| java_lite_proto_library = rule( | |
| implementation = _rule_impl, | |
| doc = """ | |
| <p> | |
| <code>java_lite_proto_library</code> generates Java code from <code>.proto</code> files. | |
| </p> | |
| <p> | |
| <code>deps</code> must point to <a href="protocol-buffer.html#proto_library"><code>proto_library | |
| </code></a> rules. | |
| </p> | |
| <p> | |
| Example: | |
| </p> | |
| <pre class="code"> | |
| <code class="lang-starlark"> | |
| java_library( | |
| name = "lib", | |
| runtime_deps = [":foo"], | |
| ) | |
| java_lite_proto_library( | |
| name = "foo", | |
| deps = [":bar"], | |
| ) | |
| proto_library( | |
| name = "bar", | |
| ) | |
| </code> | |
| </pre> | |
| """, | |
| attrs = { | |
| "deps": attr.label_list(providers = [ProtoInfo], aspects = [_java_lite_proto_aspect], doc = """ | |
| The list of <a href="protocol-buffer.html#proto_library"><code>proto_library</code></a> | |
| rules to generate Java code for. | |
| """), | |
| } | toolchains.if_legacy_toolchain({ | |
| _PROTO_TOOLCHAIN_ATTR: attr.label( | |
| default = configuration_field(fragment = "proto", name = "proto_toolchain_for_java_lite"), | |
| ), | |
| }), | |
| provides = [JavaInfo], | |
| toolchains = toolchains.use_toolchain(_JAVA_LITE_PROTO_TOOLCHAIN), | |
| ) | |
| # public re-export, note that we can't rename the original symbol because that changes the aspect id | |
| java_lite_proto_aspect = _java_lite_proto_aspect |