xref: /aosp_15_r20/build/bazel/rules/java/proto.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules:proto_file_utils.bzl", "proto_file_utils")
16*7594170eSAndroid Build Coastguard Workerload(":library.bzl", "java_library")
17*7594170eSAndroid Build Coastguard Worker
18*7594170eSAndroid Build Coastguard Workerdef _java_proto_sources_gen_rule_impl(ctx):
19*7594170eSAndroid Build Coastguard Worker    out_flags = []
20*7594170eSAndroid Build Coastguard Worker    plugin_executable = None
21*7594170eSAndroid Build Coastguard Worker    out_arg = None
22*7594170eSAndroid Build Coastguard Worker    if ctx.attr.plugin:
23*7594170eSAndroid Build Coastguard Worker        plugin_executable = ctx.executable.plugin
24*7594170eSAndroid Build Coastguard Worker    else:
25*7594170eSAndroid Build Coastguard Worker        out_arg = "--java_out"
26*7594170eSAndroid Build Coastguard Worker        if ctx.attr.out_format:
27*7594170eSAndroid Build Coastguard Worker            out_flags.append(ctx.attr.out_format)
28*7594170eSAndroid Build Coastguard Worker
29*7594170eSAndroid Build Coastguard Worker    srcs = []
30*7594170eSAndroid Build Coastguard Worker    proto_infos = []
31*7594170eSAndroid Build Coastguard Worker
32*7594170eSAndroid Build Coastguard Worker    for dep in ctx.attr.deps:
33*7594170eSAndroid Build Coastguard Worker        proto_infos.append(dep[ProtoInfo])
34*7594170eSAndroid Build Coastguard Worker
35*7594170eSAndroid Build Coastguard Worker    out_jar = _generate_java_proto_action(
36*7594170eSAndroid Build Coastguard Worker        proto_infos = proto_infos,
37*7594170eSAndroid Build Coastguard Worker        protoc = ctx.executable._protoc,
38*7594170eSAndroid Build Coastguard Worker        ctx = ctx,
39*7594170eSAndroid Build Coastguard Worker        out_flags = out_flags,
40*7594170eSAndroid Build Coastguard Worker        plugin_executable = plugin_executable,
41*7594170eSAndroid Build Coastguard Worker        out_arg = out_arg,
42*7594170eSAndroid Build Coastguard Worker        transitive_proto_infos = [dep[ProtoInfo] for dep in ctx.attr.transitive_deps],
43*7594170eSAndroid Build Coastguard Worker    )
44*7594170eSAndroid Build Coastguard Worker    srcs.append(out_jar)
45*7594170eSAndroid Build Coastguard Worker
46*7594170eSAndroid Build Coastguard Worker    return [
47*7594170eSAndroid Build Coastguard Worker        DefaultInfo(files = depset(direct = srcs)),
48*7594170eSAndroid Build Coastguard Worker    ]
49*7594170eSAndroid Build Coastguard Worker
50*7594170eSAndroid Build Coastguard Workerjava_proto_sources_gen = rule(
51*7594170eSAndroid Build Coastguard Worker    implementation = _java_proto_sources_gen_rule_impl,
52*7594170eSAndroid Build Coastguard Worker    attrs = {
53*7594170eSAndroid Build Coastguard Worker        "deps": attr.label_list(
54*7594170eSAndroid Build Coastguard Worker            providers = [ProtoInfo],
55*7594170eSAndroid Build Coastguard Worker            doc = """
56*7594170eSAndroid Build Coastguard Workerproto_library or any other target exposing ProtoInfo provider with *.proto files
57*7594170eSAndroid Build Coastguard Worker""",
58*7594170eSAndroid Build Coastguard Worker            mandatory = True,
59*7594170eSAndroid Build Coastguard Worker        ),
60*7594170eSAndroid Build Coastguard Worker        "transitive_deps": attr.label_list(
61*7594170eSAndroid Build Coastguard Worker            providers = [ProtoInfo],
62*7594170eSAndroid Build Coastguard Worker            doc = """
63*7594170eSAndroid Build Coastguard Workerproto_library that will be added to aprotoc -I when compiling the direct .proto sources.
64*7594170eSAndroid Build Coastguard WorkerWARNING: This is an experimental attribute and is expected to be deprecated in the future.
65*7594170eSAndroid Build Coastguard Worker""",
66*7594170eSAndroid Build Coastguard Worker        ),
67*7594170eSAndroid Build Coastguard Worker        "_protoc": attr.label(
68*7594170eSAndroid Build Coastguard Worker            default = Label("//external/protobuf:aprotoc"),
69*7594170eSAndroid Build Coastguard Worker            executable = True,
70*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
71*7594170eSAndroid Build Coastguard Worker        ),
72*7594170eSAndroid Build Coastguard Worker        "plugin": attr.label(
73*7594170eSAndroid Build Coastguard Worker            executable = True,
74*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
75*7594170eSAndroid Build Coastguard Worker        ),
76*7594170eSAndroid Build Coastguard Worker        "out_format": attr.string(
77*7594170eSAndroid Build Coastguard Worker            doc = """
78*7594170eSAndroid Build Coastguard WorkerOptional argument specifying the out format, e.g. lite.
79*7594170eSAndroid Build Coastguard WorkerIf not provided, defaults to full protos.
80*7594170eSAndroid Build Coastguard Worker""",
81*7594170eSAndroid Build Coastguard Worker        ),
82*7594170eSAndroid Build Coastguard Worker    },
83*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
84*7594170eSAndroid Build Coastguard Worker)
85*7594170eSAndroid Build Coastguard Worker
86*7594170eSAndroid Build Coastguard Workerdef _generate_java_proto_action(
87*7594170eSAndroid Build Coastguard Worker        proto_infos,
88*7594170eSAndroid Build Coastguard Worker        protoc,
89*7594170eSAndroid Build Coastguard Worker        ctx,
90*7594170eSAndroid Build Coastguard Worker        plugin_executable,
91*7594170eSAndroid Build Coastguard Worker        out_arg,
92*7594170eSAndroid Build Coastguard Worker        out_flags,
93*7594170eSAndroid Build Coastguard Worker        transitive_proto_infos):
94*7594170eSAndroid Build Coastguard Worker    return proto_file_utils.generate_jar_proto_action(
95*7594170eSAndroid Build Coastguard Worker        proto_infos,
96*7594170eSAndroid Build Coastguard Worker        protoc,
97*7594170eSAndroid Build Coastguard Worker        ctx,
98*7594170eSAndroid Build Coastguard Worker        out_flags,
99*7594170eSAndroid Build Coastguard Worker        plugin_executable = plugin_executable,
100*7594170eSAndroid Build Coastguard Worker        out_arg = out_arg,
101*7594170eSAndroid Build Coastguard Worker        mnemonic = "JavaProtoGen",
102*7594170eSAndroid Build Coastguard Worker        transitive_proto_infos = transitive_proto_infos,
103*7594170eSAndroid Build Coastguard Worker    )
104*7594170eSAndroid Build Coastguard Worker
105*7594170eSAndroid Build Coastguard Workerdef _java_proto_library(
106*7594170eSAndroid Build Coastguard Worker        name,
107*7594170eSAndroid Build Coastguard Worker        deps = [],
108*7594170eSAndroid Build Coastguard Worker        transitive_deps = [],
109*7594170eSAndroid Build Coastguard Worker        plugin = None,
110*7594170eSAndroid Build Coastguard Worker        out_format = None,
111*7594170eSAndroid Build Coastguard Worker        proto_dep = None,
112*7594170eSAndroid Build Coastguard Worker        sdk_version = "core_current",
113*7594170eSAndroid Build Coastguard Worker        **kwargs):
114*7594170eSAndroid Build Coastguard Worker    proto_sources_name = name + "_proto_gen"
115*7594170eSAndroid Build Coastguard Worker
116*7594170eSAndroid Build Coastguard Worker    java_proto_sources_gen(
117*7594170eSAndroid Build Coastguard Worker        name = proto_sources_name,
118*7594170eSAndroid Build Coastguard Worker        deps = deps,
119*7594170eSAndroid Build Coastguard Worker        transitive_deps = transitive_deps,
120*7594170eSAndroid Build Coastguard Worker        plugin = plugin,
121*7594170eSAndroid Build Coastguard Worker        out_format = out_format,
122*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
123*7594170eSAndroid Build Coastguard Worker    )
124*7594170eSAndroid Build Coastguard Worker
125*7594170eSAndroid Build Coastguard Worker    deps = kwargs.pop("additional_proto_deps", [])
126*7594170eSAndroid Build Coastguard Worker    if proto_dep and proto_dep not in deps:
127*7594170eSAndroid Build Coastguard Worker        deps.append(proto_dep)
128*7594170eSAndroid Build Coastguard Worker
129*7594170eSAndroid Build Coastguard Worker    java_library(
130*7594170eSAndroid Build Coastguard Worker        name = name,
131*7594170eSAndroid Build Coastguard Worker        srcs = [proto_sources_name],
132*7594170eSAndroid Build Coastguard Worker        deps = deps,
133*7594170eSAndroid Build Coastguard Worker        sdk_version = sdk_version,
134*7594170eSAndroid Build Coastguard Worker        exports = [proto_dep],
135*7594170eSAndroid Build Coastguard Worker        **kwargs
136*7594170eSAndroid Build Coastguard Worker    )
137*7594170eSAndroid Build Coastguard Worker
138*7594170eSAndroid Build Coastguard Workerdef java_nano_proto_library(
139*7594170eSAndroid Build Coastguard Worker        name,
140*7594170eSAndroid Build Coastguard Worker        plugin = "//external/protobuf:protoc-gen-javanano",
141*7594170eSAndroid Build Coastguard Worker        **kwargs):
142*7594170eSAndroid Build Coastguard Worker    _java_proto_library(
143*7594170eSAndroid Build Coastguard Worker        name,
144*7594170eSAndroid Build Coastguard Worker        plugin = plugin,
145*7594170eSAndroid Build Coastguard Worker        proto_dep = "//external/protobuf:libprotobuf-java-nano",
146*7594170eSAndroid Build Coastguard Worker        **kwargs
147*7594170eSAndroid Build Coastguard Worker    )
148*7594170eSAndroid Build Coastguard Worker
149*7594170eSAndroid Build Coastguard Workerdef java_micro_proto_library(
150*7594170eSAndroid Build Coastguard Worker        name,
151*7594170eSAndroid Build Coastguard Worker        plugin = "//external/protobuf:protoc-gen-javamicro",
152*7594170eSAndroid Build Coastguard Worker        **kwargs):
153*7594170eSAndroid Build Coastguard Worker    _java_proto_library(
154*7594170eSAndroid Build Coastguard Worker        name,
155*7594170eSAndroid Build Coastguard Worker        plugin = plugin,
156*7594170eSAndroid Build Coastguard Worker        proto_dep = "//external/protobuf:libprotobuf-java-micro",
157*7594170eSAndroid Build Coastguard Worker        **kwargs
158*7594170eSAndroid Build Coastguard Worker    )
159*7594170eSAndroid Build Coastguard Worker
160*7594170eSAndroid Build Coastguard Workerdef java_lite_proto_library(
161*7594170eSAndroid Build Coastguard Worker        name,
162*7594170eSAndroid Build Coastguard Worker        plugin = None,
163*7594170eSAndroid Build Coastguard Worker        **kwargs):
164*7594170eSAndroid Build Coastguard Worker    _java_proto_library(
165*7594170eSAndroid Build Coastguard Worker        name,
166*7594170eSAndroid Build Coastguard Worker        plugin = plugin,
167*7594170eSAndroid Build Coastguard Worker        out_format = "lite",
168*7594170eSAndroid Build Coastguard Worker        proto_dep = "//external/protobuf:libprotobuf-java-lite",
169*7594170eSAndroid Build Coastguard Worker        **kwargs
170*7594170eSAndroid Build Coastguard Worker    )
171*7594170eSAndroid Build Coastguard Worker
172*7594170eSAndroid Build Coastguard Workerdef java_stream_proto_library(
173*7594170eSAndroid Build Coastguard Worker        name,
174*7594170eSAndroid Build Coastguard Worker        plugin = "//frameworks/base/tools/streaming_proto:protoc-gen-javastream",
175*7594170eSAndroid Build Coastguard Worker        **kwargs):
176*7594170eSAndroid Build Coastguard Worker    _java_proto_library(
177*7594170eSAndroid Build Coastguard Worker        name,
178*7594170eSAndroid Build Coastguard Worker        plugin = plugin,
179*7594170eSAndroid Build Coastguard Worker        **kwargs
180*7594170eSAndroid Build Coastguard Worker    )
181*7594170eSAndroid Build Coastguard Worker
182*7594170eSAndroid Build Coastguard Workerdef java_proto_library(
183*7594170eSAndroid Build Coastguard Worker        name,
184*7594170eSAndroid Build Coastguard Worker        plugin = None,
185*7594170eSAndroid Build Coastguard Worker        **kwargs):
186*7594170eSAndroid Build Coastguard Worker    _java_proto_library(
187*7594170eSAndroid Build Coastguard Worker        name,
188*7594170eSAndroid Build Coastguard Worker        plugin = plugin,
189*7594170eSAndroid Build Coastguard Worker        proto_dep = "//external/protobuf:libprotobuf-java-full",
190*7594170eSAndroid Build Coastguard Worker        **kwargs
191*7594170eSAndroid Build Coastguard Worker    )
192