|
|
|
# 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 = "//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(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 = """
|
|
|
|
<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),
|
|
|
|
)
|