From 4dbd0e868875c6a839fc00b62f3701f8d9db6445 Mon Sep 17 00:00:00 2001 From: Zi Wang Date: Thu, 21 Sep 2023 16:00:45 -0700 Subject: [PATCH] Pass java_library libs and static_libs to java_*_proto_library If a java_library module has proto srcs, a java_*_proto_library target will be created for it. Proto sources are generated and then compiled by a java_library target. We need to pass the libs and static_libs of the java_library module to this java_library target so that the compile-time classpath is correct. Test: updated unit tests and CI Bug: 301469542 Change-Id: I05b2efce6fda2223e85728b3c4c7b1815d04c3dd --- android/allowlists/allowlists.go | 3 ++- bp2build/java_proto_conversion_test.go | 22 +++++++++++++++++----- java/java.go | 25 ++++++++++++++----------- java/proto.go | 17 ++++++++++++----- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 5c8e5e31c..843f9775f 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -947,6 +947,7 @@ var ( "gson", "GsonBuildConfig.java", "gson_version_generator", + "lab-resource-grpc", } Bp2buildModuleTypeAlwaysConvertList = []string{ @@ -969,8 +970,8 @@ var ( "java_sdk_library_import", "license", "linker_config", - "ndk_library", "ndk_headers", + "ndk_library", "sysprop_library", "xsd_config", // go/keep-sorted end diff --git a/bp2build/java_proto_conversion_test.go b/bp2build/java_proto_conversion_test.go index 3d55eb27a..4e96efe5e 100644 --- a/bp2build/java_proto_conversion_test.go +++ b/bp2build/java_proto_conversion_test.go @@ -141,17 +141,22 @@ func TestJavaProtoDefault(t *testing.T) { func TestJavaLibsAndOnlyProtoSrcs(t *testing.T) { runJavaProtoTestCase(t, Bp2buildTestCase{ Description: "java_library that has only proto srcs", - StubbedBuildDefinitions: []string{"java-lib"}, + StubbedBuildDefinitions: []string{"java-lib-1", "java-lib-2"}, Blueprint: `java_library_static { name: "java-protos", srcs: ["a.proto"], - libs: ["java-lib"], + libs: ["java-lib-1"], + static_libs: ["java-lib-2"], java_version: "7", sdk_version: "current", } java_library_static { - name: "java-lib", + name: "java-lib-1", +} + +java_library_static { + name: "java-lib-2", } `, ExpectedBazelTargets: []string{ @@ -162,12 +167,19 @@ java_library_static { "java_lite_proto_library", "java-protos_java_proto_lite", AttrNameToString{ - "deps": `[":java-protos_proto"]`, + "deps": `[":java-protos_proto"]`, + "additional_proto_deps": `[ + ":java-lib-1-neverlink", + ":java-lib-2", + ]`, "java_version": `"7"`, "sdk_version": `"current"`, }), MakeBazelTarget("java_library", "java-protos", AttrNameToString{ - "exports": `[":java-protos_java_proto_lite"]`, + "exports": `[ + ":java-lib-2", + ":java-protos_java_proto_lite", + ]`, "java_version": `"7"`, "sdk_version": `"current"`, }), diff --git a/java/java.go b/java/java.go index d5aeb7cb2..fbad4f390 100644 --- a/java/java.go +++ b/java/java.go @@ -3067,17 +3067,6 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.Bp2buildMutatorContext } } - protoDepLabel := bp2buildProto(ctx, &m.Module, srcPartitions[protoSrcPartition]) - // Soong does not differentiate between a java_library and the Bazel equivalent of - // a java_proto_library + proto_library pair. Instead, in Soong proto sources are - // listed directly in the srcs of a java_library, and the classes produced - // by protoc are included directly in the resulting JAR. Thus upstream dependencies - // that depend on a java_library with proto sources can link directly to the protobuf API, - // and so this should be a static dependency. - if protoDepLabel != nil { - staticDeps.Append(bazel.MakeSingleLabelListAttribute(*protoDepLabel)) - } - depLabels := &javaDependencyLabels{} depLabels.Deps = deps @@ -3093,6 +3082,20 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.Bp2buildMutatorContext } depLabels.StaticDeps.Append(staticDeps) + var additionalProtoDeps bazel.LabelListAttribute + additionalProtoDeps.Append(depLabels.Deps) + additionalProtoDeps.Append(depLabels.StaticDeps) + protoDepLabel := bp2buildProto(ctx, &m.Module, srcPartitions[protoSrcPartition], additionalProtoDeps) + // Soong does not differentiate between a java_library and the Bazel equivalent of + // a java_proto_library + proto_library pair. Instead, in Soong proto sources are + // listed directly in the srcs of a java_library, and the classes produced + // by protoc are included directly in the resulting JAR. Thus upstream dependencies + // that depend on a java_library with proto sources can link directly to the protobuf API, + // and so this should be a static dependency. + if protoDepLabel != nil { + depLabels.StaticDeps.Append(bazel.MakeSingleLabelListAttribute(*protoDepLabel)) + } + hasKotlin := !kotlinSrcs.IsEmpty() commonAttrs.kotlinAttributes = &kotlinAttributes{ Kotlincflags: &m.properties.Kotlincflags, diff --git a/java/proto.go b/java/proto.go index 2ed7b27e9..48adadcc9 100644 --- a/java/proto.go +++ b/java/proto.go @@ -151,11 +151,17 @@ type protoAttributes struct { // a specific .proto file module explicitly. Transitive_deps bazel.LabelListAttribute + // This is the libs and the static_libs of the original java_library module. + // On the bazel side, after proto sources are generated in java_*_proto_library, a java_library + // will compile them. The libs and static_libs from the original java_library module need + // to be linked because they are necessary in compile-time classpath. + Additional_proto_deps bazel.LabelListAttribute + Sdk_version bazel.StringAttribute Java_version bazel.StringAttribute } -func bp2buildProto(ctx android.Bp2buildMutatorContext, m *Module, protoSrcs bazel.LabelListAttribute) *bazel.Label { +func bp2buildProto(ctx android.Bp2buildMutatorContext, m *Module, protoSrcs bazel.LabelListAttribute, AdditionalProtoDeps bazel.LabelListAttribute) *bazel.Label { protoInfo, ok := android.Bp2buildProtoProperties(ctx, &m.ModuleBase, protoSrcs) if !ok { return nil @@ -184,10 +190,11 @@ func bp2buildProto(ctx android.Bp2buildMutatorContext, m *Module, protoSrcs baze } protoAttrs := &protoAttributes{ - Deps: bazel.MakeLabelListAttribute(protoInfo.Proto_libs), - Transitive_deps: bazel.MakeLabelListAttribute(protoInfo.Transitive_proto_libs), - Java_version: bazel.StringAttribute{Value: m.properties.Java_version}, - Sdk_version: bazel.StringAttribute{Value: m.deviceProperties.Sdk_version}, + Deps: bazel.MakeLabelListAttribute(protoInfo.Proto_libs), + Transitive_deps: bazel.MakeLabelListAttribute(protoInfo.Transitive_proto_libs), + Additional_proto_deps: AdditionalProtoDeps, + Java_version: bazel.StringAttribute{Value: m.properties.Java_version}, + Sdk_version: bazel.StringAttribute{Value: m.deviceProperties.Sdk_version}, } name := m.Name() + suffix