# Protocol Buffers - Google's data interchange format # Copyright 2008 Google Inc. 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 """Support for compiling protoc generated Java code.""" load("@rules_java//java/private:proto_support.bzl", "compile", "merge") # buildifier: disable=bzl-visibility # The provider is used to collect source and runtime jars in the `proto_library` dependency graph. JavaProtoAspectInfo = provider("JavaProtoAspectInfo", fields = ["jars"]) java_info_merge_for_protos = merge def java_compile_for_protos(ctx, output_jar_suffix, source_jar = None, deps = [], exports = [], injecting_rule_kind = "java_proto_library"): """Compiles Java source jar returned by proto compiler. Use this call for java_xxx_proto_library. It uses java_common.compile with some checks disabled (via javacopts) and jspecify disabled, so that the generated code passes. It also takes care that input source jar is not repackaged with a different name. When `source_jar` is `None`, the function only merges `deps` and `exports`. Args: ctx: (RuleContext) Used to call `java_common.compile` output_jar_suffix: (str) How to name the output jar. For example: `-speed.jar`. source_jar: (File) Input source jar (may be `None`). deps: (list[JavaInfo]) `deps` of the `proto_library`. exports: (list[JavaInfo]) `exports` of the `proto_library`. injecting_rule_kind: (str) Rule kind requesting the compilation. It's embedded into META-INF of the produced runtime jar, for debugging. Returns: ((JavaInfo, list[File])) JavaInfo of this target and list containing source and runtime jar, when they are created. """ if source_jar != None: path, sep, filename = ctx.label.name.rpartition("/") output_jar = ctx.actions.declare_file(path + sep + "lib" + filename + output_jar_suffix) java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java java_info = compile( ctx = ctx, output = output_jar, java_toolchain = java_toolchain, source_jars = [source_jar], deps = deps, exports = exports, output_source_jar = source_jar, injecting_rule_kind = injecting_rule_kind, javac_opts = java_toolchain._compatible_javacopts.get("proto", depset()), enable_jspecify = False, include_compilation_info = False, ) jars = [source_jar, output_jar] else: # If there are no proto sources just pass along the compilation dependencies. java_info = merge(deps + exports, merge_java_outputs = False, merge_source_jars = False) jars = [] return java_info, jars