diff --git a/android/filegroup.go b/android/filegroup.go index b36238cd1..98d0eaf66 100644 --- a/android/filegroup.go +++ b/android/filegroup.go @@ -49,9 +49,10 @@ func (bfg *bazelFilegroup) GenerateAndroidBuildActions(ctx ModuleContext) {} func FilegroupBp2Build(ctx TopDownMutatorContext) { fg, ok := ctx.Module().(*fileGroup) - if !ok { + if !ok || !fg.properties.Bazel_module.Bp2build_available { return } + attrs := &bazelFilegroupAttributes{ Srcs: BazelLabelForModuleSrcExcludes(ctx, fg.properties.Srcs, fg.properties.Exclude_srcs), } diff --git a/bazel/properties.go b/bazel/properties.go index fbbbfe6f6..65f37e347 100644 --- a/bazel/properties.go +++ b/bazel/properties.go @@ -17,6 +17,9 @@ package bazel type bazelModuleProperties struct { // The label of the Bazel target replacing this Soong module. Label string + + // If true, bp2build will generate the converted Bazel target for this module. + Bp2build_available bool } // Properties contains common module properties for Bazel migration purposes. diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go index 2c293eae7..2c553c629 100644 --- a/bp2build/build_conversion.go +++ b/bp2build/build_conversion.go @@ -213,6 +213,8 @@ func generateBazelTarget(ctx bpToBuildContext, m blueprint.Module) BazelTarget { // Delete it from being generated in the BUILD file. delete(props.Attrs, "bzl_load_location") + delete(props.Attrs, "bp2build_available") + // Return the Bazel target with rule class and attributes, ready to be // code-generated. attributes := propsToAttributes(props.Attrs) diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go index 081b0e564..27212d135 100644 --- a/bp2build/build_conversion_test.go +++ b/bp2build/build_conversion_test.go @@ -228,6 +228,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { name: "foo", string_list_prop: ["a", "b"], string_prop: "a", + bazel_module: { bp2build_available: true }, }`, expectedBazelTarget: `custom( name = "foo", @@ -382,6 +383,7 @@ func TestGenerateBazelTargetModules_OneToMany_LoadedFromStarlark(t *testing.T) { { bp: `custom { name: "bar", + bazel_module: { bp2build_available: true }, }`, expectedBazelTarget: `my_library( name = "bar", @@ -474,6 +476,7 @@ genrule { bp: `filegroup { name: "fg_foo", srcs: [], + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{ `filegroup( @@ -491,6 +494,7 @@ genrule { bp: `filegroup { name: "fg_foo", srcs: ["a", "b"], + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`filegroup( name = "fg_foo", @@ -510,6 +514,7 @@ genrule { name: "fg_foo", srcs: ["a", "b"], exclude_srcs: ["a"], + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`filegroup( name = "fg_foo", @@ -527,6 +532,7 @@ genrule { bp: `filegroup { name: "foo", srcs: ["**/*.txt"], + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`filegroup( name = "foo", @@ -552,6 +558,7 @@ genrule { bp: `filegroup { name: "foo", srcs: ["a.txt"], + bazel_module: { bp2build_available: true }, }`, dir: "other", expectedBazelTargets: []string{`filegroup( @@ -567,6 +574,7 @@ genrule { "other/Android.bp": `filegroup { name: "fg_foo", srcs: ["**/*.txt"], + bazel_module: { bp2build_available: true }, }`, "other/a.txt": "", "other/b.txt": "", @@ -585,6 +593,7 @@ genrule { ":foo", "c", ], + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`filegroup( name = "foobar", @@ -612,6 +621,7 @@ genrule { out: ["foo_tool.out"], srcs: ["foo_tool.in"], cmd: "cp $(in) $(out)", + bazel_module: { bp2build_available: true }, } genrule { @@ -620,6 +630,7 @@ genrule { srcs: ["foo.in"], tools: [":foo.tool"], cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{ `genrule( @@ -658,7 +669,8 @@ genrule { out: ["foo_tool.out", "foo_tool2.out"], srcs: ["foo_tool.in"], cmd: "cp $(in) $(out)", - } + bazel_module: { bp2build_available: true }, +} genrule { name: "foo", @@ -666,6 +678,7 @@ genrule { srcs: ["foo.in"], tools: [":foo.tools"], cmd: "$(locations :foo.tools) -s $(out) $(in)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`genrule( name = "foo", @@ -705,6 +718,7 @@ genrule { srcs: ["foo.in"], tool_files: [":foo.tool"], cmd: "$(locations :foo.tool) -s $(out) $(in)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`genrule( name = "foo", @@ -734,6 +748,7 @@ genrule { srcs: [":other.tool"], tool_files: [":foo.tool"], cmd: "$(locations :foo.tool) -s $(out) $(location :other.tool)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`genrule( name = "foo", @@ -763,6 +778,7 @@ genrule { srcs: ["foo.in"], tool_files: [":foo.tool", ":other.tool"], cmd: "$(location) -s $(out) $(in)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`genrule( name = "foo", @@ -793,6 +809,7 @@ genrule { srcs: ["foo.in"], tools: [":foo.tool", ":other.tool"], cmd: "$(locations) -s $(out) $(in)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`genrule( name = "foo", @@ -822,6 +839,7 @@ genrule { out: ["foo.out"], srcs: ["foo.in"], cmd: "cp $(in) $(out)", + bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`genrule( name = "foo", @@ -927,6 +945,7 @@ genrule { out: ["out"], srcs: ["in1"], defaults: ["gen_defaults"], + bazel_module: { bp2build_available: true }, } `, expectedBazelTarget: `genrule( @@ -961,6 +980,7 @@ genrule { srcs: ["in1"], defaults: ["gen_defaults"], cmd: "do-something $(in) $(out)", + bazel_module: { bp2build_available: true }, } `, expectedBazelTarget: `genrule( @@ -999,6 +1019,7 @@ genrule { name: "gen", out: ["out"], defaults: ["gen_defaults1", "gen_defaults2"], + bazel_module: { bp2build_available: true }, } `, expectedBazelTarget: `genrule( @@ -1045,6 +1066,7 @@ genrule { name: "gen", out: ["out"], defaults: ["gen_defaults1"], + bazel_module: { bp2build_available: true }, } `, expectedBazelTarget: `genrule( @@ -1097,3 +1119,80 @@ genrule { } } } + +func TestAllowlistingBp2buildTargets(t *testing.T) { + testCases := []struct { + moduleTypeUnderTest string + moduleTypeUnderTestFactory android.ModuleFactory + moduleTypeUnderTestBp2BuildMutator bp2buildMutator + bp string + expectedCount int + description string + }{ + { + description: "explicitly unavailable", + moduleTypeUnderTest: "filegroup", + moduleTypeUnderTestFactory: android.FileGroupFactory, + moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build, + bp: `filegroup { + name: "foo", + srcs: ["a", "b"], + bazel_module: { bp2build_available: false }, +}`, + expectedCount: 0, + }, + { + description: "implicitly unavailable", + moduleTypeUnderTest: "filegroup", + moduleTypeUnderTestFactory: android.FileGroupFactory, + moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build, + bp: `filegroup { + name: "foo", + srcs: ["a", "b"], +}`, + expectedCount: 0, + }, + { + description: "explicitly available", + moduleTypeUnderTest: "filegroup", + moduleTypeUnderTestFactory: android.FileGroupFactory, + moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build, + bp: `filegroup { + name: "foo", + srcs: ["a", "b"], + bazel_module: { bp2build_available: true }, +}`, + expectedCount: 1, + }, + { + description: "generates more than 1 target if needed", + moduleTypeUnderTest: "custom", + moduleTypeUnderTestFactory: customModuleFactory, + moduleTypeUnderTestBp2BuildMutator: customBp2BuildMutatorFromStarlark, + bp: `custom { + name: "foo", + bazel_module: { bp2build_available: true }, +}`, + expectedCount: 3, + }, + } + + dir := "." + for _, testCase := range testCases { + config := android.TestConfig(buildDir, nil, testCase.bp, nil) + ctx := android.NewTestContext(config) + ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory) + ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator) + ctx.RegisterForBazelConversion() + + _, errs := ctx.ParseFileList(dir, []string{"Android.bp"}) + android.FailIfErrored(t, errs) + _, errs = ctx.ResolveDependencies(config) + android.FailIfErrored(t, errs) + + bazelTargets := GenerateBazelTargets(ctx.Context.Context, Bp2Build)[dir] + if actualCount := len(bazelTargets); actualCount != testCase.expectedCount { + t.Fatalf("%s: Expected %d bazel target, got %d", testCase.description, testCase.expectedCount, actualCount) + } + } +} diff --git a/bp2build/bzl_conversion_test.go b/bp2build/bzl_conversion_test.go index f2a405854..30c1a5b6a 100644 --- a/bp2build/bzl_conversion_test.go +++ b/bp2build/bzl_conversion_test.go @@ -86,6 +86,10 @@ custom = rule( "soong_module_name": attr.string(mandatory = True), "soong_module_variant": attr.string(), "soong_module_deps": attr.label_list(providers = [SoongModuleInfo]), + # bazel_module start +# "label": attr.string(), +# "bp2build_available": attr.bool(), + # bazel_module end "bool_prop": attr.bool(), "bool_ptr_prop": attr.bool(), "int64_ptr_prop": attr.int(), diff --git a/bp2build/testing.go b/bp2build/testing.go index b5f5448be..1f0ada28e 100644 --- a/bp2build/testing.go +++ b/bp2build/testing.go @@ -27,6 +27,8 @@ type customModule struct { android.ModuleBase props customProps + + bazelProps bazel.Properties } // OutputFiles is needed because some instances of this module use dist with a @@ -42,6 +44,7 @@ func (m *customModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { func customModuleFactoryBase() android.Module { module := &customModule{} module.AddProperties(&module.props) + module.AddProperties(&module.bazelProps) return module } @@ -124,6 +127,10 @@ func (m *customBazelModule) GenerateAndroidBuildActions(ctx android.ModuleContex func customBp2BuildMutator(ctx android.TopDownMutatorContext) { if m, ok := ctx.Module().(*customModule); ok { + if !m.bazelProps.Bazel_module.Bp2build_available { + return + } + attrs := &customBazelModuleAttributes{ String_prop: m.props.String_prop, String_list_prop: m.props.String_list_prop, @@ -143,6 +150,10 @@ func customBp2BuildMutator(ctx android.TopDownMutatorContext) { // module to target. func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) { if m, ok := ctx.Module().(*customModule); ok { + if !m.bazelProps.Bazel_module.Bp2build_available { + return + } + baseName := m.Name() attrs := &customBazelModuleAttributes{} diff --git a/genrule/genrule.go b/genrule/genrule.go index 427c99583..a500c2739 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -800,7 +800,7 @@ func BazelGenruleFactory() android.Module { func GenruleBp2Build(ctx android.TopDownMutatorContext) { m, ok := ctx.Module().(*Module) - if !ok { + if !ok || !m.properties.Bazel_module.Bp2build_available { return }