diff --git a/bp2build/java_library_conversion_test.go b/bp2build/java_library_conversion_test.go index 00056f8ff..e37fa627a 100644 --- a/bp2build/java_library_conversion_test.go +++ b/bp2build/java_library_conversion_test.go @@ -53,11 +53,13 @@ java_library { ExpectedBazelTargets: []string{ MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ "srcs": `["a.java"]`, - "deps": `[":java-lib-2"]`, + "deps": `[":java-lib-2-neverlink"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), MakeBazelTarget("java_library", "java-lib-2", AttrNameToString{ "srcs": `["b.java"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-2"), }, }) } @@ -87,11 +89,12 @@ java_library { MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ "srcs": `["a.java"]`, "deps": `[ - ":java-lib-2", + ":java-lib-2-neverlink", ":java-lib-3", ]`, "exports": `[":java-lib-3"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -113,6 +116,7 @@ java_library { MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ "exports": `[":java-lib-2"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -152,6 +156,7 @@ java_plugin { MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ "plugins": `[":java-plugin-1"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }, func(ctx android.RegistrationContext) { ctx.RegisterModuleType("java_plugin", java.PluginFactory) @@ -170,6 +175,7 @@ func TestJavaLibraryJavaVersion(t *testing.T) { "srcs": `["a.java"]`, "javacopts": `["-source 11 -target 11"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -193,6 +199,7 @@ func TestJavaLibraryErrorproneJavacflagsEnabledManually(t *testing.T) { ]`, "srcs": `["a.java"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -212,6 +219,7 @@ func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledByDefault(t *testing.T "javacopts": `["-Xsuper-fast"]`, "srcs": `["a.java"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -232,6 +240,7 @@ func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledManually(t *testing.T) "javacopts": `["-Xsuper-fast"]`, "srcs": `["a.java"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -265,6 +274,7 @@ func TestJavaLibraryLogTags(t *testing.T) { ":example_lib_logtags", ]`, }), + MakeNeverlinkDuplicateTarget("java_library", "example_lib"), }}) } @@ -286,6 +296,7 @@ func TestJavaLibraryResources(t *testing.T) { "res/b.res", ]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -310,6 +321,7 @@ func TestJavaLibraryResourceDirs(t *testing.T) { "res/dir1/b.res", ]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -330,6 +342,7 @@ func TestJavaLibraryResourcesExcludeDir(t *testing.T) { "resource_strip_prefix": `"res"`, "resources": `["res/a.res"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -354,6 +367,7 @@ func TestJavaLibraryResourcesExcludeFile(t *testing.T) { "res/dir1/b.res", ]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, }) } @@ -406,6 +420,7 @@ func TestJavaLibraryAidl(t *testing.T) { "b.java", ]`, }), + MakeNeverlinkDuplicateTarget("java_library", "example_lib"), }}) } @@ -435,6 +450,7 @@ java_library { "exports": `[":example_lib_java_aidl_library"]`, "srcs": `["a.java"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "example_lib"), }, }, func(ctx android.RegistrationContext) { ctx.RegisterModuleType("filegroup", android.FileGroupFactory) @@ -490,6 +506,7 @@ java_library { ":random_other_files", ]`, }), + MakeNeverlinkDuplicateTarget("java_library", "example_lib"), MakeBazelTargetNoRestrictions("filegroup", "random_other_files", AttrNameToString{ "srcs": `[ "a.java", @@ -529,6 +546,7 @@ java_library { MakeBazelTarget("java_library", "foo", AttrNameToString{ "exports": `[":foo_java_aidl_library"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "foo"), }, }, func(ctx android.RegistrationContext) { ctx.RegisterModuleType("filegroup", android.FileGroupFactory) diff --git a/bp2build/java_library_host_conversion_test.go b/bp2build/java_library_host_conversion_test.go index edd8690af..14854c06a 100644 --- a/bp2build/java_library_host_conversion_test.go +++ b/bp2build/java_library_host_conversion_test.go @@ -48,7 +48,15 @@ java_library_host { ExpectedBazelTargets: []string{ MakeBazelTarget("java_library", "java-lib-host-1", AttrNameToString{ "srcs": `["a.java"]`, - "deps": `[":java-lib-host-2"]`, + "deps": `[":java-lib-host-2-neverlink"]`, + "target_compatible_with": `select({ + "//build/bazel/platforms/os:android": ["@platforms//:incompatible"], + "//conditions:default": [], + })`, + }), + MakeBazelTarget("java_library", "java-lib-host-1-neverlink", AttrNameToString{ + "exports": `[":java-lib-host-1"]`, + "neverlink": `True`, "target_compatible_with": `select({ "//build/bazel/platforms/os:android": ["@platforms//:incompatible"], "//conditions:default": [], @@ -60,6 +68,14 @@ java_library_host { "target_compatible_with": `select({ "//build/bazel/platforms/os:android": ["@platforms//:incompatible"], "//conditions:default": [], + })`, + }), + MakeBazelTarget("java_library", "java-lib-host-2-neverlink", AttrNameToString{ + "exports": `[":java-lib-host-2"]`, + "neverlink": `True`, + "target_compatible_with": `select({ + "//build/bazel/platforms/os:android": ["@platforms//:incompatible"], + "//conditions:default": [], })`, }), }, diff --git a/bp2build/java_proto_conversion_test.go b/bp2build/java_proto_conversion_test.go index df0df2fee..d25b7c4ee 100644 --- a/bp2build/java_proto_conversion_test.go +++ b/bp2build/java_proto_conversion_test.go @@ -91,6 +91,7 @@ func TestJavaProto(t *testing.T) { MakeBazelTarget("java_library", "java-protos", AttrNameToString{ "exports": fmt.Sprintf(`[":%s"]`, javaLibraryName), }), + MakeNeverlinkDuplicateTarget("java_library", "java-protos"), }, }) } @@ -119,6 +120,7 @@ func TestJavaProtoDefault(t *testing.T) { "exports": `[":java-protos_java_proto_lite"]`, "javacopts": `["-source 1.7 -target 1.7"]`, }), + MakeNeverlinkDuplicateTarget("java_library", "java-protos"), }, }) } diff --git a/bp2build/testing.go b/bp2build/testing.go index 0f1a8b237..4e63d1995 100644 --- a/bp2build/testing.go +++ b/bp2build/testing.go @@ -532,3 +532,10 @@ func makeCcStubSuiteTargets(name string, attrs AttrNameToString) string { } return MakeBazelTarget("cc_stub_suite", name+"_stub_libs", stubSuiteAttrs) } + +func MakeNeverlinkDuplicateTarget(moduleType string, name string) string { + return MakeBazelTarget(moduleType, name+"-neverlink", AttrNameToString{ + "neverlink": `True`, + "exports": `[":` + name + `"]`, + }) +} diff --git a/java/java.go b/java/java.go index 5c2461f58..e37a77e46 100644 --- a/java/java.go +++ b/java/java.go @@ -2622,7 +2622,7 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) if m.properties.Libs != nil { // TODO 244210934 ALIX Check if this else statement breaks presubmits get rid of it if it doesn't - if strings.HasPrefix(ctx.ModuleType(), "java_binary") { + if strings.HasPrefix(ctx.ModuleType(), "java_binary") || strings.HasPrefix(ctx.ModuleType(), "java_library") { for _, d := range m.properties.Libs { neverlinkLabel := android.BazelLabelForModuleDepSingle(ctx, d) neverlinkLabel.Label = neverlinkLabel.Label + "-neverlink" @@ -2690,12 +2690,21 @@ func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) { Deps: deps, Exports: depLabels.StaticDeps, } + name := m.Name() if !bp2BuildInfo.hasKotlinSrcs && len(m.properties.Common_srcs) == 0 { props = bazel.BazelTargetModuleProperties{ Rule_class: "java_library", Bzl_load_location: "//build/bazel/rules/java:library.bzl", } + + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: name}, attrs) + neverlinkProp := true + neverLinkAttrs := &javaLibraryAttributes{ + Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}), + Neverlink: bazel.BoolAttribute{Value: &neverlinkProp}, + } + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: name + "-neverlink"}, neverLinkAttrs) } else { attrs.Common_srcs = bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, m.properties.Common_srcs)) @@ -2703,10 +2712,10 @@ func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) { Rule_class: "kt_jvm_library", Bzl_load_location: "@rules_kotlin//kotlin:jvm_library.bzl", } + // TODO (b/244210934): create neverlink-duplicate target once kt_jvm_library supports neverlink attribute + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: name}, attrs) } - name := m.Name() - ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: name}, attrs) } type javaBinaryHostAttributes struct {