Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5dbb696c authored by Alix Espino's avatar Alix Espino Committed by Gerrit Code Review
Browse files

Merge "support for multiple filegroups and resource_dirs" into main

parents d632171e 289e9c60
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -907,6 +907,9 @@ var (
		"hal_unit_tests",

		"merge_annotation_zips_test",

		// java_resources with multiple resource_dirs
		"emma",
	}

	Bp2buildModuleTypeAlwaysConvertList = []string{
+96 −4
Original line number Diff line number Diff line
@@ -391,18 +391,56 @@ func TestJavaLibraryResourcesExcludeFile(t *testing.T) {
	})
}

func TestJavaLibraryResourcesFailsWithMultipleDirs(t *testing.T) {
func TestJavaLibraryResourcesWithMultipleDirs(t *testing.T) {
	runJavaLibraryTestCase(t, Bp2buildTestCase{
		Filesystem: map[string]string{
			"res/a.res":  "",
			"res1/a.res": "",
			"res1/b.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{},
		ExpectedBazelTargets: []string{
			MakeBazelTarget("java_resources", "java-lib-1_resource_dir_res1", AttrNameToString{
				"resource_strip_prefix": `"res1"`,
				"resources":             `["res1/b.res"]`,
			}),
			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
				"additional_resources":  `["java-lib-1_resource_dir_res1"]`,
				"resources":             `["res/a.res"]`,
				"resource_strip_prefix": `"res"`,
			}),
			MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"),
		},
	})
}

func TestJavaLibraryJavaResourcesAndResourceDirs(t *testing.T) {
	runJavaLibraryTestCase(t, Bp2buildTestCase{
		Filesystem: map[string]string{
			"resdir/a.res": "",
		},
		Blueprint: `java_library {
    name: "java-lib-1",
    java_resources: ["res1", "res2"],
    java_resource_dirs: ["resdir"],
}`,
		ExpectedBazelTargets: []string{
			MakeBazelTarget("java_resources", "java-lib-1_resource_dir_resdir", AttrNameToString{
				"resource_strip_prefix": `"resdir"`,
				"resources":             `["resdir/a.res"]`,
			}),
			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
				"additional_resources":  `["java-lib-1_resource_dir_resdir"]`,
				"resource_strip_prefix": `"."`,
				"resources": `[
        "res1",
        "res2",
    ]`,
			}),
			MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"),
		},
	})
}

@@ -878,3 +916,57 @@ filegroup {
		ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
	})
}

func TestJavaLibraryJavaResourcesMultipleFilegroup(t *testing.T) {
	runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{
		Filesystem: map[string]string{
			"a.res": "",
		},
		Description: "with java_resources that has multiple filegroups",
		Blueprint: `java_library {
    name: "java-lib-1",
    srcs: ["a.java"],
    java_resources: ["a.res", ":filegroup1", ":filegroup2"],
    bazel_module: { bp2build_available: true },
}

filegroup {
    name: "filegroup1",
    path: "foo",
    srcs: ["foo/a"],
}

filegroup {
    name: "filegroup2",
    path: "bar",
    srcs: ["bar/a"],
}
`,
		ExpectedBazelTargets: []string{
			MakeBazelTarget("java_resources", "java-lib-1_filegroup_resources_filegroup1", AttrNameToString{
				"resource_strip_prefix": `"foo"`,
				"resources":             `[":filegroup1"]`,
			}),
			MakeBazelTarget("java_resources", "java-lib-1_filegroup_resources_filegroup2", AttrNameToString{
				"resource_strip_prefix": `"bar"`,
				"resources":             `[":filegroup2"]`,
			}),
			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
				"srcs":                  `["a.java"]`,
				"resources":             `["a.res"]`,
				"resource_strip_prefix": `"."`,
				"additional_resources": `[
        "java-lib-1_filegroup_resources_filegroup1",
        "java-lib-1_filegroup_resources_filegroup2",
    ]`,
			}),
			MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"),
			MakeBazelTargetNoRestrictions("filegroup", "filegroup1", AttrNameToString{
				"srcs": `["foo/a"]`}),
			MakeBazelTargetNoRestrictions("filegroup", "filegroup2", AttrNameToString{
				"srcs": `["bar/a"]`}),
		},
	}, func(ctx android.RegistrationContext) {
		ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
	})
}
+56 −18
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ package java
import (
	"fmt"
	"path/filepath"
	"sort"
	"strings"

	"android/soong/bazel"
@@ -2756,32 +2757,41 @@ func addCLCFromDep(ctx android.ModuleContext, depModule android.Module,
type javaResourcesAttributes struct {
	Resources             bazel.LabelListAttribute
	Resource_strip_prefix *string
	Additional_resources  bazel.LabelListAttribute
}

func (m *Library) javaResourcesGetSingleFilegroupStripPrefix(ctx android.TopDownMutatorContext) (string, bool) {
	if otherM, ok := ctx.ModuleFromName(m.properties.Java_resources[0]); ok && len(m.properties.Java_resources) == 1 {
func (m *Library) getResourceFilegroupStripPrefix(ctx android.TopDownMutatorContext, resourceFilegroup string) (*string, bool) {
	if otherM, ok := ctx.ModuleFromName(resourceFilegroup); ok {
		if fg, isFilegroup := otherM.(android.FileGroupPath); isFilegroup {
			return filepath.Join(ctx.OtherModuleDir(otherM), fg.GetPath(ctx)), true
			return proptools.StringPtr(filepath.Join(ctx.OtherModuleDir(otherM), fg.GetPath(ctx))), true
		}
	}
	return "", false
	return proptools.StringPtr(""), false
}

func (m *Library) convertJavaResourcesAttributes(ctx android.TopDownMutatorContext) *javaResourcesAttributes {
	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.")
	}
	additionalJavaResourcesMap := make(map[string]*javaResourcesAttributes)

	if m.properties.Java_resources != nil {
		if prefix, ok := m.javaResourcesGetSingleFilegroupStripPrefix(ctx); ok {
			resourceStripPrefix = proptools.StringPtr(prefix)
		for _, res := range m.properties.Java_resources {
			if prefix, isFilegroup := m.getResourceFilegroupStripPrefix(ctx, res); isFilegroup {
				otherM, _ := ctx.ModuleFromName(res)
				resourcesTargetName := ctx.ModuleName() + "_filegroup_resources_" + otherM.Name()
				additionalJavaResourcesMap[resourcesTargetName] = &javaResourcesAttributes{
					Resources:             bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, []string{res})),
					Resource_strip_prefix: prefix,
				}
			} else {
				resources.Append(android.BazelLabelForModuleSrc(ctx, []string{res}))
			}
		}

		if !resources.IsEmpty() {
			resourceStripPrefix = proptools.StringPtr(ctx.ModuleDir())
		}
		resources.Append(android.BazelLabelForModuleSrc(ctx, m.properties.Java_resources))
	}

	//TODO(b/179889880) handle case where glob includes files outside package
@@ -2792,23 +2802,51 @@ func (m *Library) convertJavaResourcesAttributes(ctx android.TopDownMutatorConte
		m.properties.Exclude_java_resources,
	)

	for i, resDep := range resDeps {
	for _, 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)")
		prefix := proptools.StringPtr(dir.String())
		resourcesTargetName := ctx.ModuleName() + "_resource_dir_" + dir.String()
		additionalJavaResourcesMap[resourcesTargetName] = &javaResourcesAttributes{
			Resources:             bazel.MakeLabelListAttribute(bazel.MakeLabelList(android.RootToModuleRelativePaths(ctx, files))),
			Resource_strip_prefix: prefix,
		}
	}

	var additionalResourceLabels bazel.LabelList
	if len(additionalJavaResourcesMap) > 0 {
		var additionalResources []string
		for resName, _ := range additionalJavaResourcesMap {
			additionalResources = append(additionalResources, resName)
		}
		sort.Strings(additionalResources)

		for i, resName := range additionalResources {
			resAttr := additionalJavaResourcesMap[resName]
			if resourceStripPrefix == nil && i == 0 {
				resourceStripPrefix = resAttr.Resource_strip_prefix
				resources = resAttr.Resources.Value
			} else {
				ctx.CreateBazelTargetModule(
					bazel.BazelTargetModuleProperties{
						Rule_class:        "java_resources",
						Bzl_load_location: "//build/bazel/rules/java:java_resources.bzl",
					},
					android.CommonAttributes{Name: resName},
					resAttr,
				)
				additionalResourceLabels.Append(android.BazelLabelForModuleSrc(ctx, []string{resName}))
			}
		}

	}

	return &javaResourcesAttributes{
		Resources:             bazel.MakeLabelListAttribute(resources),
		Resource_strip_prefix: resourceStripPrefix,
		Additional_resources:  bazel.MakeLabelListAttribute(additionalResourceLabels),
	}
}