# 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" # TODO: replace with toolchain type located in protobuf _JAVA_LITE_PROTO_TOOLCHAIN = "@rules_java//java/proto:lite_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(specs = 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 = """

java_lite_proto_library generates Java code from .proto files.

deps must point to proto_library rules.

Example:


java_library(
    name = "lib",
    runtime_deps = [":foo"],
)

java_lite_proto_library(
    name = "foo",
    deps = [":bar"],
)

proto_library(
    name = "bar",
)

""", attrs = { "deps": attr.label_list(providers = [ProtoInfo], aspects = [_java_lite_proto_aspect], doc = """ The list of proto_library 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), )