From 79985819fedb7af103e19318064deb1b0b8fa240 Mon Sep 17 00:00:00 2001 From: Sam Delmerico Date: Wed, 23 Mar 2022 20:20:42 +0000 Subject: [PATCH] convert java_resources with bp2build Test: b build --platforms=//build/bazel/platforms:linux_x86 //external/jarjar:jarjar-binary and try to use on a jar Change-Id: Id6f4e6937687fd575360fbacaeda55c41922636e --- android/allowlists/allowlists.go | 2 + bp2build/java_library_conversion_test.go | 105 +++++++++++++++++++++++ java/java.go | 45 +++++++++- java/java_resources.go | 42 ++++++--- 4 files changed, 182 insertions(+), 12 deletions(-) diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 28dc8b452..5384b0927 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -108,6 +108,7 @@ var ( "external/icu": Bp2BuildDefaultTrueRecursively, "external/icu/android_icu4j": Bp2BuildDefaultFalse, // java rules incomplete "external/icu/icu4j": Bp2BuildDefaultFalse, // java rules incomplete + "external/jarjar": Bp2BuildDefaultTrueRecursively, "external/javapoet": Bp2BuildDefaultTrueRecursively, "external/jemalloc_new": Bp2BuildDefaultTrueRecursively, "external/jsoncpp": Bp2BuildDefaultTrueRecursively, @@ -308,6 +309,7 @@ var ( "libprotobuf-internal-python-srcs", // TODO(b/210751803), we don't handle path property for filegroups "libprotobuf-java-full", // TODO(b/210751803), we don't handle path property for filegroups "libprotobuf-java-util-full", // TODO(b/210751803), we don't handle path property for filegroups + "auto_value_plugin_resources", // TODO(b/210751803), we don't handle path property for filegroups // go deps: "analyze_bcpf", // depends on bpmodify a blueprint_go_binary. diff --git a/bp2build/java_library_conversion_test.go b/bp2build/java_library_conversion_test.go index 3b6636975..e4d9cbcac 100644 --- a/bp2build/java_library_conversion_test.go +++ b/bp2build/java_library_conversion_test.go @@ -267,3 +267,108 @@ func TestJavaLibraryLogTags(t *testing.T) { }), }}) } + +func TestJavaLibraryResources(t *testing.T) { + runJavaLibraryTestCase(t, bp2buildTestCase{ + filesystem: map[string]string{ + "res/a.res": "", + "res/b.res": "", + "res/dir1/b.res": "", + }, + blueprint: `java_library { + name: "java-lib-1", + java_resources: ["res/a.res", "res/b.res"], +}`, + expectedBazelTargets: []string{ + makeBazelTarget("java_library", "java-lib-1", attrNameToString{ + "resources": `[ + "res/a.res", + "res/b.res", + ]`, + }), + }, + }) +} + +func TestJavaLibraryResourceDirs(t *testing.T) { + runJavaLibraryTestCase(t, bp2buildTestCase{ + filesystem: map[string]string{ + "res/a.res": "", + "res/b.res": "", + "res/dir1/b.res": "", + }, + blueprint: `java_library { + name: "java-lib-1", + java_resource_dirs: ["res"], +}`, + expectedBazelTargets: []string{ + makeBazelTarget("java_library", "java-lib-1", attrNameToString{ + "resource_strip_prefix": `"res"`, + "resources": `[ + "res/a.res", + "res/b.res", + "res/dir1/b.res", + ]`, + }), + }, + }) +} + +func TestJavaLibraryResourcesExcludeDir(t *testing.T) { + runJavaLibraryTestCase(t, bp2buildTestCase{ + filesystem: map[string]string{ + "res/a.res": "", + "res/exclude/b.res": "", + }, + blueprint: `java_library { + name: "java-lib-1", + java_resource_dirs: ["res"], + exclude_java_resource_dirs: ["res/exclude"], +}`, + expectedBazelTargets: []string{ + makeBazelTarget("java_library", "java-lib-1", attrNameToString{ + "resource_strip_prefix": `"res"`, + "resources": `["res/a.res"]`, + }), + }, + }) +} + +func TestJavaLibraryResourcesExcludeFile(t *testing.T) { + runJavaLibraryTestCase(t, bp2buildTestCase{ + filesystem: map[string]string{ + "res/a.res": "", + "res/dir1/b.res": "", + "res/dir1/exclude.res": "", + }, + blueprint: `java_library { + name: "java-lib-1", + java_resource_dirs: ["res"], + exclude_java_resources: ["res/dir1/exclude.res"], +}`, + expectedBazelTargets: []string{ + makeBazelTarget("java_library", "java-lib-1", attrNameToString{ + "resource_strip_prefix": `"res"`, + "resources": `[ + "res/a.res", + "res/dir1/b.res", + ]`, + }), + }, + }) +} + +func TestJavaLibraryResourcesFailsWithMultipleDirs(t *testing.T) { + runJavaLibraryTestCase(t, bp2buildTestCase{ + filesystem: map[string]string{ + "res/a.res": "", + "res1/a.res": "", + }, + blueprint: `java_library { + name: "java-lib-1", + java_resource_dirs: ["res", "res1"], +}`, + expectedErr: fmt.Errorf("bp2build does not support more than one directory in java_resource_dirs (b/226423379)"), + expectedBazelTargets: []string{}, + }) +} diff --git a/java/java.go b/java/java.go index 13f4c807e..079d4b9e7 100644 --- a/java/java.go +++ b/java/java.go @@ -2018,7 +2018,49 @@ func addCLCFromDep(ctx android.ModuleContext, depModule android.Module, } } +type javaResourcesAttributes struct { + Resources bazel.LabelListAttribute + Resource_strip_prefix *string +} + +func (m *Library) convertJavaResourcesAttributes(ctx android.TopDownMutatorContext) *javaResourcesAttributes { + var resources bazel.LabelList + var resourceStripPrefix *string + + if m.properties.Java_resources != nil { + resources.Append(android.BazelLabelForModuleSrc(ctx, m.properties.Java_resources)) + } + + //TODO(b/179889880) handle case where glob includes files outside package + resDeps := ResourceDirsToFiles( + ctx, + m.properties.Java_resource_dirs, + m.properties.Exclude_java_resource_dirs, + m.properties.Exclude_java_resources, + ) + + for i, resDep := range resDeps { + dir, files := resDep.dir, resDep.files + + resources.Append(bazel.MakeLabelList(android.RootToModuleRelativePaths(ctx, files))) + + // Bazel includes the relative path from the WORKSPACE root when placing the resource + // inside the JAR file, so we need to remove that prefix + resourceStripPrefix = proptools.StringPtr(dir.String()) + if i > 0 { + // TODO(b/226423379) allow multiple resource prefixes + ctx.ModuleErrorf("bp2build does not support more than one directory in java_resource_dirs (b/226423379)") + } + } + + return &javaResourcesAttributes{ + Resources: bazel.MakeLabelListAttribute(resources), + Resource_strip_prefix: resourceStripPrefix, + } +} + type javaCommonAttributes struct { + *javaResourcesAttributes Srcs bazel.LabelListAttribute Plugins bazel.LabelListAttribute Javacopts bazel.StringListAttribute @@ -2095,7 +2137,8 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) } commonAttrs := &javaCommonAttributes{ - Srcs: javaSrcs, + Srcs: javaSrcs, + javaResourcesAttributes: m.convertJavaResourcesAttributes(ctx), Plugins: bazel.MakeLabelListAttribute( android.BazelLabelForModuleDeps(ctx, m.properties.Plugins), ), diff --git a/java/java_resources.go b/java/java_resources.go index 787d74a0d..b0dc5a1cf 100644 --- a/java/java_resources.go +++ b/java/java_resources.go @@ -33,8 +33,13 @@ var resourceExcludes = []string{ "**/*~", } -func ResourceDirsToJarArgs(ctx android.ModuleContext, - resourceDirs, excludeResourceDirs, excludeResourceFiles []string) (args []string, deps android.Paths) { +type resourceDeps struct { + dir android.Path + files android.Paths +} + +func ResourceDirsToFiles(ctx android.BaseModuleContext, + resourceDirs, excludeResourceDirs, excludeResourceFiles []string) (deps []resourceDeps) { var excludeDirs []string var excludeFiles []string @@ -55,21 +60,36 @@ func ResourceDirsToJarArgs(ctx android.ModuleContext, dirs := ctx.Glob(android.PathForSource(ctx, ctx.ModuleDir()).Join(ctx, resourceDir).String(), excludeDirs) for _, dir := range dirs { files := ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), excludeFiles) + deps = append(deps, resourceDeps{ + dir: dir, + files: files, + }) + } + } + return deps +} + +func ResourceDirsToJarArgs(ctx android.ModuleContext, + resourceDirs, excludeResourceDirs, excludeResourceFiles []string) (args []string, deps android.Paths) { + resDeps := ResourceDirsToFiles(ctx, resourceDirs, excludeResourceDirs, excludeResourceFiles) + + for _, resDep := range resDeps { + dir, files := resDep.dir, resDep.files + + if len(files) > 0 { + args = append(args, "-C", dir.String()) deps = append(deps, files...) - if len(files) > 0 { - args = append(args, "-C", dir.String()) - - for _, f := range files { - path := f.String() - if !strings.HasPrefix(path, dir.String()) { - panic(fmt.Errorf("path %q does not start with %q", path, dir)) - } - args = append(args, "-f", pathtools.MatchEscape(path)) + for _, f := range files { + path := f.String() + if !strings.HasPrefix(path, dir.String()) { + panic(fmt.Errorf("path %q does not start with %q", path, dir)) } + args = append(args, "-f", pathtools.MatchEscape(path)) } } + } return args, deps