From d5fe1330774ee9e6342b08e371fdefce5c0d6214 Mon Sep 17 00:00:00 2001 From: Romain Jobredeaux Date: Thu, 4 May 2023 14:54:45 -0400 Subject: [PATCH] Provide a resource_prefix_strip for java_resources in bp2build. Although paths to resource files in a Bazel java_library should be relative to the package, the directory structure in the resulting jar will have resources under the full path from the top-level of the workspace, e.g. if a library in "a/BUILD" has java_resouces as "res/res.txt" then by default the res.txt file would appear under "a/res/res.txt". Fix this by adding a resource_strip_prefix in that case. Test: Unit tests Change-Id: If4325126f5c19a2a8fb83ee09bc3a95a18673fe3 --- bp2build/java_binary_host_conversion_test.go | 14 +++++++++----- bp2build/java_library_conversion_test.go | 16 ++++++++++------ java/java.go | 5 +++++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/bp2build/java_binary_host_conversion_test.go b/bp2build/java_binary_host_conversion_test.go index c821f590e..e51f608bd 100644 --- a/bp2build/java_binary_host_conversion_test.go +++ b/bp2build/java_binary_host_conversion_test.go @@ -259,17 +259,20 @@ func TestJavaBinaryHostKotlinWithResources(t *testing.T) { runJavaBinaryHostTestCase(t, Bp2buildTestCase{ Description: "java_binary_host with srcs, libs, resources.", Filesystem: map[string]string{ - "test.mf": "Main-Class: com.android.test.MainClass", - "res/a.res": "", - "res/b.res": "", - }, - Blueprint: `java_binary_host { + "adir/test.mf": "Main-Class: com.android.test.MainClass", + "adir/res/a.res": "", + "adir/res/b.res": "", + "adir/Android.bp": `java_binary_host { name: "java-binary-host", manifest: "test.mf", srcs: ["a.java", "b.kt"], java_resources: ["res/a.res", "res/b.res"], + bazel_module: { bp2build_available: true }, } `, + }, + Dir: "adir", + Blueprint: "", ExpectedBazelTargets: []string{ MakeBazelTarget("kt_jvm_library", "java-binary-host_lib", AttrNameToString{ "srcs": `[ @@ -280,6 +283,7 @@ func TestJavaBinaryHostKotlinWithResources(t *testing.T) { "res/a.res", "res/b.res", ]`, + "resource_strip_prefix": `"adir"`, "target_compatible_with": `select({ "//build/bazel/platforms/os:android": ["@platforms//:incompatible"], "//conditions:default": [], diff --git a/bp2build/java_library_conversion_test.go b/bp2build/java_library_conversion_test.go index 24b763bcf..60766f42a 100644 --- a/bp2build/java_library_conversion_test.go +++ b/bp2build/java_library_conversion_test.go @@ -283,21 +283,25 @@ func TestJavaLibraryLogTags(t *testing.T) { func TestJavaLibraryResources(t *testing.T) { runJavaLibraryTestCase(t, Bp2buildTestCase{ + Dir: "adir", Filesystem: map[string]string{ - "res/a.res": "", - "res/b.res": "", - "res/dir1/b.res": "", - }, - Blueprint: `java_library { + "adir/res/a.res": "", + "adir/res/b.res": "", + "adir/res/dir1/b.res": "", + "adir/Android.bp": `java_library { name: "java-lib-1", - java_resources: ["res/a.res", "res/b.res"], + java_resources: ["res/a.res", "res/b.res"], + bazel_module: { bp2build_available: true }, }`, + }, + Blueprint: "", ExpectedBazelTargets: []string{ MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ "resources": `[ "res/a.res", "res/b.res", ]`, + "resource_strip_prefix": `"adir"`, }), MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), }, diff --git a/java/java.go b/java/java.go index 0da73281b..cb8003dcc 100644 --- a/java/java.go +++ b/java/java.go @@ -2707,8 +2707,13 @@ func (m *Library) convertJavaResourcesAttributes(ctx android.TopDownMutatorConte var resources bazel.LabelList var resourceStripPrefix *string + if m.properties.Java_resources != nil && len(m.properties.Java_resource_dirs) > 0 { + ctx.ModuleErrorf("bp2build doesn't support both java_resources and java_resource_dirs being set on the same module.") + } + if m.properties.Java_resources != nil { resources.Append(android.BazelLabelForModuleSrc(ctx, m.properties.Java_resources)) + resourceStripPrefix = proptools.StringPtr(ctx.ModuleDir()) } //TODO(b/179889880) handle case where glob includes files outside package