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