From 2c9e8d612819840020b2d110d23fb2771b6c92f0 Mon Sep 17 00:00:00 2001 From: Wei Li Date: Fri, 5 May 2023 01:07:15 -0700 Subject: [PATCH] Change bp2build converter of module "package". 1) Use attribute name "default_package_metadata" instead of "default_applicable_licenses" in packages to better describe its use. 2) Add a filegroup "default_metadata_file" in packages to search for METADATA file in each package. 3) Include "default_metadata_file" in each package's "default_package_metadata" attribute. Bug: 275472038 Test: CIs Change-Id: I645c013c39e3190fd96c4a549d39a331aced16bd --- android/filegroup.go | 3 +- android/package.go | 27 +++++++++++-- bp2build/package_conversion_test.go | 60 +++++++++++++++++++++++++++-- ui/build/finder.go | 9 +++++ ui/build/soong.go | 2 + 5 files changed, 94 insertions(+), 7 deletions(-) diff --git a/android/filegroup.go b/android/filegroup.go index 0ca5dc50e..f30ee5143 100644 --- a/android/filegroup.go +++ b/android/filegroup.go @@ -75,7 +75,8 @@ func isFilegroupWithPattern(pattern *regexp.Regexp) bazel.LabelMapper { // https://docs.bazel.build/versions/master/be/general.html#filegroup type bazelFilegroupAttributes struct { - Srcs bazel.LabelListAttribute + Srcs bazel.LabelListAttribute + Applicable_licenses bazel.LabelListAttribute } type bazelAidlLibraryAttributes struct { diff --git a/android/package.go b/android/package.go index 2bf652126..7fbc70041 100644 --- a/android/package.go +++ b/android/package.go @@ -15,6 +15,8 @@ package android import ( + "path/filepath" + "android/soong/bazel" "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -39,8 +41,8 @@ type packageProperties struct { } type bazelPackageAttributes struct { - Default_visibility []string - Default_applicable_licenses bazel.LabelListAttribute + Default_visibility []string + Default_package_metadata bazel.LabelListAttribute } type packageModule struct { @@ -53,13 +55,32 @@ type packageModule struct { var _ Bazelable = &packageModule{} func (p *packageModule) ConvertWithBp2build(ctx TopDownMutatorContext) { + defaultPackageMetadata := bazel.MakeLabelListAttribute(BazelLabelForModuleDeps(ctx, p.properties.Default_applicable_licenses)) + // If METADATA file exists in the package, add it to package(default_package_metadata=) using a + // filegroup(name="default_metadata_file") which can be accessed later on each module in Bazel + // using attribute "applicable_licenses". + // Attribute applicable_licenses of filegroup "default_metadata_file" has to be set to [], + // otherwise Bazel reports cyclic reference error. + if existed, _, _ := ctx.Config().fs.Exists(filepath.Join(ctx.ModuleDir(), "METADATA")); existed { + ctx.CreateBazelTargetModule( + bazel.BazelTargetModuleProperties{ + Rule_class: "filegroup", + }, + CommonAttributes{Name: "default_metadata_file"}, + &bazelFilegroupAttributes{ + Srcs: bazel.MakeLabelListAttribute(BazelLabelForModuleSrc(ctx, []string{"METADATA"})), + Applicable_licenses: bazel.LabelListAttribute{Value: bazel.LabelList{Includes: []bazel.Label{}}, EmitEmptyList: true}, + }) + defaultPackageMetadata.Value.Add(&bazel.Label{Label: ":default_metadata_file"}) + } + ctx.CreateBazelTargetModule( bazel.BazelTargetModuleProperties{ Rule_class: "package", }, CommonAttributes{}, &bazelPackageAttributes{ - Default_applicable_licenses: bazel.MakeLabelListAttribute(BazelLabelForModuleDeps(ctx, p.properties.Default_applicable_licenses)), + Default_package_metadata: defaultPackageMetadata, // FIXME(asmundak): once b/221436821 is resolved Default_visibility: []string{"//visibility:public"}, }) diff --git a/bp2build/package_conversion_test.go b/bp2build/package_conversion_test.go index 3704b2d7b..ce848e42d 100644 --- a/bp2build/package_conversion_test.go +++ b/bp2build/package_conversion_test.go @@ -15,9 +15,10 @@ package bp2build import ( + "testing" + "android/soong/android" "android/soong/genrule" - "testing" ) func registerDependentModules(ctx android.RegistrationContext) { @@ -29,6 +30,7 @@ func TestPackage(t *testing.T) { tests := []struct { description string modules string + fs map[string]string expected []ExpectedRuleTarget }{ { @@ -50,8 +52,8 @@ package { "package", "", AttrNameToString{ - "default_applicable_licenses": `[":my_license"]`, - "default_visibility": `["//visibility:public"]`, + "default_package_metadata": `[":my_license"]`, + "default_visibility": `["//visibility:public"]`, }, android.HostAndDeviceDefault, }, @@ -67,6 +69,57 @@ package { }, }, }, + { + description: "package has METADATA file", + fs: map[string]string{ + "METADATA": ``, + }, + modules: ` +license { + name: "my_license", + visibility: [":__subpackages__"], + license_kinds: ["SPDX-license-identifier-Apache-2.0"], + license_text: ["NOTICE"], +} + +package { + default_applicable_licenses: ["my_license"], +} +`, + expected: []ExpectedRuleTarget{ + { + "package", + "", + AttrNameToString{ + "default_package_metadata": `[ + ":my_license", + ":default_metadata_file", + ]`, + "default_visibility": `["//visibility:public"]`, + }, + android.HostAndDeviceDefault, + }, + { + "android_license", + "my_license", + AttrNameToString{ + "license_kinds": `["SPDX-license-identifier-Apache-2.0"]`, + "license_text": `"NOTICE"`, + "visibility": `[":__subpackages__"]`, + }, + android.HostAndDeviceDefault, + }, + { + "filegroup", + "default_metadata_file", + AttrNameToString{ + "applicable_licenses": `[]`, + "srcs": `["METADATA"]`, + }, + android.HostAndDeviceDefault, + }, + }, + }, } for _, test := range tests { expected := make([]string, 0, len(test.expected)) @@ -80,6 +133,7 @@ package { ModuleTypeUnderTestFactory: android.PackageFactory, Blueprint: test.modules, ExpectedBazelTargets: expected, + Filesystem: test.fs, }) } } diff --git a/ui/build/finder.go b/ui/build/finder.go index 3f628cf7b..62079fee9 100644 --- a/ui/build/finder.go +++ b/ui/build/finder.go @@ -87,6 +87,8 @@ func NewSourceFinder(ctx Context, config Config) (f *finder.Finder) { "TEST_MAPPING", // Bazel top-level file to mark a directory as a Bazel workspace. "WORKSPACE", + // METADATA file of packages + "METADATA", }, // Bazel Starlark configuration files and all .mk files for product/board configuration. IncludeSuffixes: []string{".bzl", ".mk"}, @@ -189,6 +191,13 @@ func FindSources(ctx Context, config Config, f *finder.Finder) { ctx.Fatalf("Could not find OWNERS: %v", err) } + // Recursively look for all METADATA files. + metadataFiles := f.FindNamedAt(".", "METADATA") + err = dumpListToFile(ctx, config, metadataFiles, filepath.Join(dumpDir, "METADATA.list")) + if err != nil { + ctx.Fatalf("Could not find METADATA: %v", err) + } + // Recursively look for all TEST_MAPPING files. testMappings := f.FindNamedAt(".", "TEST_MAPPING") err = dumpListToFile(ctx, config, testMappings, filepath.Join(dumpDir, "TEST_MAPPING.list")) diff --git a/ui/build/soong.go b/ui/build/soong.go index 563199bee..18bf3b912 100644 --- a/ui/build/soong.go +++ b/ui/build/soong.go @@ -400,6 +400,8 @@ func bootstrapBlueprint(ctx Context, config Config) { pbi.Inputs = append(pbi.Inputs, config.Bp2BuildFilesMarkerFile(), filepath.Join(config.FileListDir(), "bazel.list")) + case bp2buildFilesTag: + pbi.Inputs = append(pbi.Inputs, filepath.Join(config.FileListDir(), "METADATA.list")) } invocations = append(invocations, pbi) }