diff options
| -rw-r--r-- | android/allowlists/allowlists.go | 7 | ||||
| -rw-r--r-- | android/license.go | 47 | ||||
| -rw-r--r-- | android/license_kind.go | 31 | ||||
| -rw-r--r-- | android/module.go | 4 | ||||
| -rw-r--r-- | android/package.go | 26 | ||||
| -rw-r--r-- | bp2build/Android.bp | 3 | ||||
| -rw-r--r-- | bp2build/androidbp_to_build_templates.go | 7 | ||||
| -rw-r--r-- | bp2build/build_conversion.go | 30 | ||||
| -rw-r--r-- | bp2build/conversion.go | 12 | ||||
| -rw-r--r-- | bp2build/license_conversion_test.go | 81 | ||||
| -rw-r--r-- | bp2build/license_kind_conversion_test.go | 69 | ||||
| -rw-r--r-- | bp2build/package_conversion_test.go | 85 | ||||
| -rw-r--r-- | bp2build/testing.go | 17 | ||||
| -rw-r--r-- | tests/lib.sh | 1 |
14 files changed, 399 insertions, 21 deletions
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 872e6a0ca..f8f73386f 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -37,6 +37,7 @@ const ( var ( Bp2buildDefaultConfig = Bp2BuildConfig{ + "art": Bp2BuildDefaultTrue, "art/libartbase": Bp2BuildDefaultTrueRecursively, "art/libartpalette": Bp2BuildDefaultTrueRecursively, "art/libdexfile": Bp2BuildDefaultTrueRecursively, @@ -54,6 +55,7 @@ var ( "build/soong/cc/libbuildversion": Bp2BuildDefaultTrue, // Skip tests subdir "build/soong/cc/ndkstubgen": Bp2BuildDefaultTrue, "build/soong/cc/symbolfile": Bp2BuildDefaultTrue, + "build/soong/licenses": Bp2BuildDefaultTrue, "build/soong/linkerconfig": Bp2BuildDefaultTrueRecursively, "build/soong/scripts": Bp2BuildDefaultTrueRecursively, @@ -98,6 +100,7 @@ var ( "external/aac": Bp2BuildDefaultTrueRecursively, "external/arm-optimized-routines": Bp2BuildDefaultTrueRecursively, "external/auto/android-annotation-stubs": Bp2BuildDefaultTrueRecursively, + "external/auto": Bp2BuildDefaultTrue, "external/auto/common": Bp2BuildDefaultTrueRecursively, "external/auto/service": Bp2BuildDefaultTrueRecursively, "external/boringssl": Bp2BuildDefaultTrueRecursively, @@ -234,6 +237,7 @@ var ( "prebuilts/runtime/mainline/platform/sdk": Bp2BuildDefaultTrueRecursively, "prebuilts/sdk/current/extras/app-toolkit": Bp2BuildDefaultTrue, "prebuilts/sdk/current/support": Bp2BuildDefaultTrue, + "prebuilts/tools": Bp2BuildDefaultTrue, "prebuilts/tools/common/m2": Bp2BuildDefaultTrue, "system/apex": Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures @@ -275,6 +279,7 @@ var ( "system/libprocinfo": Bp2BuildDefaultTrue, "system/libziparchive": Bp2BuildDefaultTrueRecursively, "system/logging": Bp2BuildDefaultTrueRecursively, + "system/media": Bp2BuildDefaultTrue, "system/media/audio": Bp2BuildDefaultTrueRecursively, "system/media/audio_utils": Bp2BuildDefaultTrueRecursively, "system/memory/libion": Bp2BuildDefaultTrueRecursively, @@ -306,6 +311,7 @@ var ( // external/bazelbuild-rules_android/... is needed by mixed builds, otherwise mixed builds analysis fails // e.g. ERROR: Analysis of target '@soong_injection//mixed_builds:buildroot' failed "external/bazelbuild-rules_android":/* recursive = */ true, + "external/bazelbuild-rules_license":/* recursive = */ true, "external/bazelbuild-kotlin-rules":/* recursive = */ true, "external/bazel-skylib":/* recursive = */ true, "external/guava":/* recursive = */ true, @@ -494,6 +500,7 @@ var ( } Bp2buildModuleTypeAlwaysConvertList = []string{ + "license", "linker_config", "java_import", "java_import_host", diff --git a/android/license.go b/android/license.go index ebee05576..cde5e6e6e 100644 --- a/android/license.go +++ b/android/license.go @@ -15,7 +15,10 @@ package android import ( + "android/soong/bazel" + "fmt" "github.com/google/blueprint" + "os" ) type licenseKindDependencyTag struct { @@ -48,14 +51,55 @@ type licenseProperties struct { Visibility []string } +var _ Bazelable = &licenseModule{} + type licenseModule struct { ModuleBase DefaultableModuleBase SdkBase + BazelModuleBase properties licenseProperties } +type bazelLicenseAttributes struct { + License_kinds []string + Copyright_notice *string + License_text bazel.LabelAttribute + Package_name *string + Visibility []string +} + +func (m *licenseModule) ConvertWithBp2build(ctx TopDownMutatorContext) { + attrs := &bazelLicenseAttributes{ + License_kinds: m.properties.License_kinds, + Copyright_notice: m.properties.Copyright_notice, + Package_name: m.properties.Package_name, + Visibility: m.properties.Visibility, + } + + // TODO(asmundak): Soong supports multiple license texts while Bazel's license + // rule does not. Have android_license create a genrule to concatenate multiple + // license texts. + if len(m.properties.License_text) > 1 && ctx.Config().IsEnvTrue("BP2BUILD_VERBOSE") { + fmt.Fprintf(os.Stderr, "warning: using only the first license_text item from //%s:%s\n", + ctx.ModuleDir(), m.Name()) + } + if len(m.properties.License_text) >= 1 { + attrs.License_text.SetValue(BazelLabelForModuleSrcSingle(ctx, m.properties.License_text[0])) + } + + ctx.CreateBazelTargetModule( + bazel.BazelTargetModuleProperties{ + Rule_class: "android_license", + Bzl_load_location: "//build/bazel/rules/license:license.bzl", + }, + CommonAttributes{ + Name: m.Name(), + }, + attrs) +} + func (m *licenseModule) DepsMutator(ctx BottomUpMutatorContext) { ctx.AddVariationDependencies(nil, licenseKindTag, m.properties.License_kinds...) } @@ -78,7 +122,7 @@ func LicenseFactory() Module { module := &licenseModule{} base := module.base() - module.AddProperties(&base.nameProperties, &module.properties) + module.AddProperties(&base.nameProperties, &module.properties, &base.commonProperties.BazelConversionStatus) // The visibility property needs to be checked and parsed by the visibility module. setPrimaryVisibilityProperty(module, "visibility", &module.properties.Visibility) @@ -86,6 +130,7 @@ func LicenseFactory() Module { InitSdkAwareModule(module) initAndroidModuleBase(module) InitDefaultableModule(module) + InitBazelModule(module) return module } diff --git a/android/license_kind.go b/android/license_kind.go index 838deddd2..24b91e4c2 100644 --- a/android/license_kind.go +++ b/android/license_kind.go @@ -14,6 +14,8 @@ package android +import "android/soong/bazel" + func init() { RegisterLicenseKindBuildComponents(InitRegistrationContext) } @@ -32,13 +34,39 @@ type licenseKindProperties struct { Visibility []string } +var _ Bazelable = &licenseKindModule{} + type licenseKindModule struct { ModuleBase DefaultableModuleBase + BazelModuleBase properties licenseKindProperties } +type bazelLicenseKindAttributes struct { + Conditions []string + Url string + Visibility []string +} + +func (m *licenseKindModule) ConvertWithBp2build(ctx TopDownMutatorContext) { + attrs := &bazelLicenseKindAttributes{ + Conditions: m.properties.Conditions, + Url: m.properties.Url, + Visibility: m.properties.Visibility, + } + ctx.CreateBazelTargetModule( + bazel.BazelTargetModuleProperties{ + Rule_class: "license_kind", + Bzl_load_location: "@rules_license//rules:license_kind.bzl", + }, + CommonAttributes{ + Name: m.Name(), + }, + attrs) +} + func (m *licenseKindModule) DepsMutator(ctx BottomUpMutatorContext) { // Nothing to do. } @@ -51,13 +79,14 @@ func LicenseKindFactory() Module { module := &licenseKindModule{} base := module.base() - module.AddProperties(&base.nameProperties, &module.properties) + module.AddProperties(&base.nameProperties, &module.properties, &base.commonProperties.BazelConversionStatus) // The visibility property needs to be checked and parsed by the visibility module. setPrimaryVisibilityProperty(module, "visibility", &module.properties.Visibility) initAndroidModuleBase(module) InitDefaultableModule(module) + InitBazelModule(module) return module } diff --git a/android/module.go b/android/module.go index 5908233a2..a0725bc8c 100644 --- a/android/module.go +++ b/android/module.go @@ -1169,7 +1169,9 @@ func (attrs *CommonAttributes) fillCommonBp2BuildModuleAttrs(ctx *topDownMutator mod := ctx.Module().base() // Assert passed-in attributes include Name if len(attrs.Name) == 0 { - ctx.ModuleErrorf("CommonAttributes in fillCommonBp2BuildModuleAttrs expects a `.Name`!") + if ctx.ModuleType() != "package" { + ctx.ModuleErrorf("CommonAttributes in fillCommonBp2BuildModuleAttrs expects a `.Name`!") + } } depsToLabelList := func(deps []string) bazel.LabelListAttribute { diff --git a/android/package.go b/android/package.go index 878e4c4ed..2bf652126 100644 --- a/android/package.go +++ b/android/package.go @@ -15,6 +15,7 @@ package android import ( + "android/soong/bazel" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -37,12 +38,33 @@ type packageProperties struct { Default_applicable_licenses []string } +type bazelPackageAttributes struct { + Default_visibility []string + Default_applicable_licenses bazel.LabelListAttribute +} + type packageModule struct { ModuleBase + BazelModuleBase properties packageProperties } +var _ Bazelable = &packageModule{} + +func (p *packageModule) ConvertWithBp2build(ctx TopDownMutatorContext) { + ctx.CreateBazelTargetModule( + bazel.BazelTargetModuleProperties{ + Rule_class: "package", + }, + CommonAttributes{}, + &bazelPackageAttributes{ + Default_applicable_licenses: bazel.MakeLabelListAttribute(BazelLabelForModuleDeps(ctx, p.properties.Default_applicable_licenses)), + // FIXME(asmundak): once b/221436821 is resolved + Default_visibility: []string{"//visibility:public"}, + }) +} + func (p *packageModule) GenerateAndroidBuildActions(ModuleContext) { // Nothing to do. } @@ -59,7 +81,7 @@ func (p *packageModule) qualifiedModuleId(ctx BaseModuleContext) qualifiedModule func PackageFactory() Module { module := &packageModule{} - module.AddProperties(&module.properties) + module.AddProperties(&module.properties, &module.commonProperties.BazelConversionStatus) // The name is the relative path from build root to the directory containing this // module. Set that name at the earliest possible moment that information is available @@ -76,5 +98,7 @@ func PackageFactory() Module { // its checking and parsing phases so make it the primary licenses property. setPrimaryLicensesProperty(module, "default_applicable_licenses", &module.properties.Default_applicable_licenses) + InitBazelModule(module) + return module } diff --git a/bp2build/Android.bp b/bp2build/Android.bp index 3d9fc5a2b..7c9af1a82 100644 --- a/bp2build/Android.bp +++ b/bp2build/Android.bp @@ -63,8 +63,11 @@ bootstrap_go_package { "java_library_host_conversion_test.go", "java_plugin_conversion_test.go", "java_proto_conversion_test.go", + "license_conversion_test.go", + "license_kind_conversion_test.go", "linker_config_conversion_test.go", "ndk_headers_conversion_test.go", + "package_conversion_test.go", "performance_test.go", "prebuilt_etc_conversion_test.go", "python_binary_conversion_test.go", diff --git a/bp2build/androidbp_to_build_templates.go b/bp2build/androidbp_to_build_templates.go index 5fed4fab5..9b21c3278 100644 --- a/bp2build/androidbp_to_build_templates.go +++ b/bp2build/androidbp_to_build_templates.go @@ -23,7 +23,7 @@ load("//build/bazel/queryview_rules:soong_module.bzl", "soong_module") // A macro call in the BUILD file representing a Soong module, with space // for expanding more attributes. - soongModuleTarget = `soong_module( + soongModuleTargetTemplate = `soong_module( name = "%s", soong_module_name = "%s", soong_module_type = "%s", @@ -31,10 +31,13 @@ load("//build/bazel/queryview_rules:soong_module.bzl", "soong_module") soong_module_deps = %s, %s)` - bazelTarget = `%s( + ruleTargetTemplate = `%s( name = "%s", %s)` + unnamedRuleTargetTemplate = `%s( +%s)` + // A simple provider to mark and differentiate Soong module rule shims from // regular Bazel rules. Every Soong module rule shim returns a // SoongModuleInfo provider, and can only depend on rules returning diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go index ca8185e57..ee162b263 100644 --- a/bp2build/build_conversion.go +++ b/bp2build/build_conversion.go @@ -64,7 +64,16 @@ func (t BazelTarget) Label() string { // BazelTargets is a typedef for a slice of BazelTarget objects. type BazelTargets []BazelTarget -// sort a list of BazelTargets in-place by name +func (targets BazelTargets) packageRule() *BazelTarget { + for _, target := range targets { + if target.ruleClass == "package" { + return &target + } + } + return nil +} + +// sort a list of BazelTargets in-place, by name, and by generated/handcrafted types. func (targets BazelTargets) sort() { sort.Slice(targets, func(i, j int) bool { return targets[i].name < targets[j].name @@ -77,7 +86,9 @@ func (targets BazelTargets) sort() { func (targets BazelTargets) String() string { var res string for i, target := range targets { - res += target.content + if target.ruleClass != "package" { + res += target.content + } if i != len(targets)-1 { res += "\n\n" } @@ -391,18 +402,19 @@ func generateBazelTarget(ctx bpToBuildContext, m bp2buildModule) (BazelTarget, e // Return the Bazel target with rule class and attributes, ready to be // code-generated. attributes := propsToAttributes(props.Attrs) + var content string targetName := m.TargetName() + if targetName != "" { + content = fmt.Sprintf(ruleTargetTemplate, ruleClass, targetName, attributes) + } else { + content = fmt.Sprintf(unnamedRuleTargetTemplate, ruleClass, attributes) + } return BazelTarget{ name: targetName, packageName: m.TargetPackage(), ruleClass: ruleClass, bzlLoadLocation: bzlLoadLocation, - content: fmt.Sprintf( - bazelTarget, - ruleClass, - targetName, - attributes, - ), + content: content, }, nil } @@ -436,7 +448,7 @@ func generateSoongModuleTarget(ctx bpToBuildContext, m blueprint.Module) (BazelT return BazelTarget{ name: targetName, content: fmt.Sprintf( - soongModuleTarget, + soongModuleTargetTemplate, targetName, ctx.ModuleName(m), canonicalizeModuleType(ctx.ModuleType(m)), diff --git a/bp2build/conversion.go b/bp2build/conversion.go index 731b17e3a..b6190c695 100644 --- a/bp2build/conversion.go +++ b/bp2build/conversion.go @@ -96,10 +96,14 @@ func createBuildFiles(buildToTargets map[string]BazelTargets, mode CodegenMode) # This file was automatically generated by bp2build for the Bazel migration project. # Feel free to edit or test it, but do *not* check it into your version control system. ` - - // Hardcode the default visibility. - content += "package(default_visibility = [\"//visibility:public\"])\n" content += targets.LoadStatements() + content += "\n\n" + // Get package rule from the handcrafted BUILD file, otherwise emit the default one. + prText := "package(default_visibility = [\"//visibility:public\"])\n" + if pr := targets.packageRule(); pr != nil { + prText = pr.content + } + content += prText } else if mode == QueryView { content = soongModuleLoad } @@ -160,7 +164,7 @@ func shouldSkipStructField(field reflect.StructField) bool { // internal to Soong only, and these fields do not have PkgPath. return true } - // fields with tag `blueprint:"mutated"` are exported to enable modification in mutators, etc + // fields with tag `blueprint:"mutated"` are exported to enable modification in mutators, etc. // but cannot be set in a .bp file if proptools.HasTag(field, "blueprint", "mutated") { return true diff --git a/bp2build/license_conversion_test.go b/bp2build/license_conversion_test.go new file mode 100644 index 000000000..ea6b27a17 --- /dev/null +++ b/bp2build/license_conversion_test.go @@ -0,0 +1,81 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package bp2build + +import ( + "android/soong/android" + "testing" +) + +func registerLicenseModuleTypes(_ android.RegistrationContext) {} + +func TestLicenseBp2Build(t *testing.T) { + tests := []struct { + description string + module string + expected ExpectedRuleTarget + }{ + { + description: "license kind and text notice", + module: ` +license { + name: "my_license", + license_kinds: [ "SPDX-license-identifier-Apache-2.0"], + license_text: [ "NOTICE"], +}`, + expected: ExpectedRuleTarget{ + "android_license", + "my_license", + AttrNameToString{ + "license_kinds": `["SPDX-license-identifier-Apache-2.0"]`, + "license_text": `"NOTICE"`, + }, + android.HostAndDeviceDefault, + }, + }, + { + description: "visibility, package_name, copyright_notice", + module: ` +license { + name: "my_license", + package_name: "my_package", + visibility: [":__subpackages__"], + copyright_notice: "Copyright © 2022", +}`, + expected: ExpectedRuleTarget{ + "android_license", + "my_license", + AttrNameToString{ + "copyright_notice": `"Copyright © 2022"`, + "package_name": `"my_package"`, + "visibility": `[":__subpackages__"]`, + }, + android.HostAndDeviceDefault, + }, + }, + } + + for _, test := range tests { + RunBp2BuildTestCase(t, + registerLicenseModuleTypes, + Bp2buildTestCase{ + Description: test.description, + ModuleTypeUnderTest: "license", + ModuleTypeUnderTestFactory: android.LicenseFactory, + Blueprint: test.module, + ExpectedBazelTargets: []string{test.expected.String()}, + }) + } +} diff --git a/bp2build/license_kind_conversion_test.go b/bp2build/license_kind_conversion_test.go new file mode 100644 index 000000000..eda116c5a --- /dev/null +++ b/bp2build/license_kind_conversion_test.go @@ -0,0 +1,69 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package bp2build + +import ( + "android/soong/android" + "testing" +) + +func registerLicenseKindModuleTypes(_ android.RegistrationContext) {} + +func TestLicenseKindBp2Build(t *testing.T) { + tests := []struct { + description string + module string + expected ExpectedRuleTarget + }{ + { + description: "license_kind", + module: ` +license_kind { + name: "my_license", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/0BSD", + visibility: ["//visibility:public"], +}`, + expected: ExpectedRuleTarget{ + "license_kind", + "my_license", + AttrNameToString{ + "conditions": `[ + "by_exception_only", + "not_allowed", + ]`, + "url": `"https://spdx.org/licenses/0BSD"`, + "visibility": `["//visibility:public"]`, + }, + android.HostAndDeviceDefault, + }, + }, + } + + for _, test := range tests { + RunBp2BuildTestCase(t, + registerLicenseKindModuleTypes, + Bp2buildTestCase{ + Description: test.description, + ModuleTypeUnderTest: "license_kind", + ModuleTypeUnderTestFactory: android.LicenseKindFactory, + Blueprint: test.module, + ExpectedBazelTargets: []string{test.expected.String()}, + }) + } +} diff --git a/bp2build/package_conversion_test.go b/bp2build/package_conversion_test.go new file mode 100644 index 000000000..3704b2d7b --- /dev/null +++ b/bp2build/package_conversion_test.go @@ -0,0 +1,85 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package bp2build + +import ( + "android/soong/android" + "android/soong/genrule" + "testing" +) + +func registerDependentModules(ctx android.RegistrationContext) { + ctx.RegisterModuleType("license", android.LicenseFactory) + ctx.RegisterModuleType("genrule", genrule.GenRuleFactory) +} + +func TestPackage(t *testing.T) { + tests := []struct { + description string + modules string + expected []ExpectedRuleTarget + }{ + { + description: "with default applicable licenses", + 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_applicable_licenses": `[":my_license"]`, + "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, + }, + }, + }, + } + for _, test := range tests { + expected := make([]string, 0, len(test.expected)) + for _, e := range test.expected { + expected = append(expected, e.String()) + } + RunBp2BuildTestCase(t, registerDependentModules, + Bp2buildTestCase{ + Description: test.description, + ModuleTypeUnderTest: "package", + ModuleTypeUnderTestFactory: android.PackageFactory, + Blueprint: test.modules, + ExpectedBazelTargets: expected, + }) + } +} diff --git a/bp2build/testing.go b/bp2build/testing.go index ac1268cb5..edc5c4a99 100644 --- a/bp2build/testing.go +++ b/bp2build/testing.go @@ -141,7 +141,7 @@ func RunBp2BuildTestCase(t *testing.T, registerModuleTypes func(ctx android.Regi android.FailIfErrored(t, errs) } if actualCount, expectedCount := len(bazelTargets), len(tc.ExpectedBazelTargets); actualCount != expectedCount { - t.Errorf("%s: Expected %d bazel target (%s), got `%d`` (%s)", + t.Errorf("%s: Expected %d bazel target (%s), got %d (%s)", tc.Description, expectedCount, tc.ExpectedBazelTargets, actualCount, bazelTargets) } else { for i, target := range bazelTargets { @@ -429,7 +429,9 @@ func makeBazelTargetHostOrDevice(typ, name string, attrs AttrNameToString, hod a } attrStrings := make([]string, 0, len(attrs)+1) - attrStrings = append(attrStrings, fmt.Sprintf(` name = "%s",`, name)) + if name != "" { + attrStrings = append(attrStrings, fmt.Sprintf(` name = "%s",`, name)) + } for _, k := range android.SortedStringKeys(attrs) { attrStrings = append(attrStrings, fmt.Sprintf(" %s = %s,", k, attrs[k])) } @@ -450,3 +452,14 @@ func MakeBazelTargetNoRestrictions(typ, name string, attrs AttrNameToString) str func MakeBazelTarget(typ, name string, attrs AttrNameToString) string { return makeBazelTargetHostOrDevice(typ, name, attrs, android.DeviceSupported) } + +type ExpectedRuleTarget struct { + Rule string + Name string + Attrs AttrNameToString + Hod android.HostOrDeviceSupported +} + +func (ebr ExpectedRuleTarget) String() string { + return makeBazelTargetHostOrDevice(ebr.Rule, ebr.Name, ebr.Attrs, ebr.Hod) +} diff --git a/tests/lib.sh b/tests/lib.sh index 7248adeb3..4b4d9085c 100644 --- a/tests/lib.sh +++ b/tests/lib.sh @@ -123,6 +123,7 @@ function create_mock_bazel { symlink_directory prebuilts/jdk symlink_directory external/bazel-skylib symlink_directory external/bazelbuild-rules_android + symlink_directory external/bazelbuild-rules_license symlink_directory external/bazelbuild-kotlin-rules symlink_file WORKSPACE |