Bp2build: handle the case where java_library has only proto srcs
java_library doesn't accept deps when there are no srcs because
no compilation happens, but it accepts exports.
The deps from the module are not necessary for compiling the protos,
in which case they are unnecessary as deps on the java_library as well
since they are not be propagated to any dependencies.
So we can put the deps to exports and drop deps here.
Test: CI and added unit test
Bug: 285952385
Change-Id: Ie54a4ac0db592fb96fede64f0e67df309dca9c1d
diff --git a/java/java.go b/java/java.go
index 99bb1b3..a81abe6 100644
--- a/java/java.go
+++ b/java/java.go
@@ -2885,8 +2885,9 @@
// depending on the module type.
type bp2BuildJavaInfo struct {
// separates dependencies into dynamic dependencies and static dependencies.
- DepLabels *javaDependencyLabels
- hasKotlin bool
+ DepLabels *javaDependencyLabels
+ hasKotlin bool
+ onlyProtoInSrcs bool
}
func javaXsdTargetName(xsd android.XsdConfigBp2buildTargets) string {
@@ -2949,6 +2950,9 @@
staticDeps.Append(srcPartitions[xsdSrcPartition])
+ _, protoInSrcs := srcPartitions[protoSrcPartition]
+ onlyProtoInSrcs := protoInSrcs && len(srcPartitions) == 1
+
if !srcPartitions[logtagSrcPartition].IsEmpty() {
logtagsLibName := m.Name() + "_logtags"
ctx.CreateBazelTargetModule(
@@ -3086,8 +3090,9 @@
}
bp2BuildInfo := &bp2BuildJavaInfo{
- DepLabels: depLabels,
- hasKotlin: hasKotlin,
+ DepLabels: depLabels,
+ hasKotlin: hasKotlin,
+ onlyProtoInSrcs: onlyProtoInSrcs,
}
return commonAttrs, bp2BuildInfo, true
@@ -3127,16 +3132,29 @@
depLabels := bp2BuildInfo.DepLabels
deps := depLabels.Deps
+ exports := depLabels.StaticDeps
if !commonAttrs.Srcs.IsEmpty() {
- deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them
+ deps.Append(exports) // we should only append these if there are sources to use them
} else if !deps.IsEmpty() {
- ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
+ if bp2BuildInfo.onlyProtoInSrcs {
+ // java_library does not accept deps when there are no srcs because
+ // there is no compilation happening, but it accepts exports.
+ // bp2build converts this module to 2 java_libraries + java_xx_proto_library + proto_library
+ // the non-empty deps here are not necessary for compiling the protos, in which case
+ // they're unnecessary as deps on the java_library as well since they aren't
+ // being propagated to any dependencies.
+ // so we can put the deps to exports and drop deps here.
+ exports.Append(deps)
+ deps = bazel.LabelListAttribute{}
+ } else {
+ ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
+ }
}
var props bazel.BazelTargetModuleProperties
attrs := &javaLibraryAttributes{
javaCommonAttributes: commonAttrs,
Deps: deps,
- Exports: depLabels.StaticDeps,
+ Exports: exports,
}
name := m.Name()