From 22b606b5f07988dd36d45cd829febf64df3f8860 Mon Sep 17 00:00:00 2001 From: Rupert Shuttleworth Date: Thu, 10 Jun 2021 03:11:45 -0400 Subject: [PATCH] Add partial bp2build support for APEX targets. Test: Added unit test Change-Id: I93e2a25fa43eec1ffb8fb30c346a9b523195a0fd --- apex/Android.bp | 1 + apex/apex.go | 64 ++++++++++++++++++++++++++++++++ bp2build/Android.bp | 2 + bp2build/apex_conversion_test.go | 48 ++++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 bp2build/apex_conversion_test.go diff --git a/apex/Android.bp b/apex/Android.bp index 6269757db..b9b54286b 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -9,6 +9,7 @@ bootstrap_go_package { "blueprint", "soong", "soong-android", + "soong-bazel", "soong-bpf", "soong-cc", "soong-filesystem", diff --git a/apex/apex.go b/apex/apex.go index baaf87475..11df288a3 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -27,6 +27,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/bazel" "android/soong/bpf" "android/soong/cc" prebuilt_etc "android/soong/etc" @@ -53,6 +54,8 @@ func registerApexBuildComponents(ctx android.RegistrationContext) { ctx.PreArchMutators(registerPreArchMutators) ctx.PreDepsMutators(RegisterPreDepsMutators) ctx.PostDepsMutators(RegisterPostDepsMutators) + + android.RegisterBp2BuildMutator("apex", ApexBundleBp2Build) } func registerPreArchMutators(ctx android.RegisterMutatorsContext) { @@ -327,6 +330,7 @@ type apexBundle struct { android.DefaultableModuleBase android.OverridableModuleBase android.SdkBase + android.BazelModuleBase // Properties properties apexBundleProperties @@ -3178,3 +3182,63 @@ func rModulesPackages() map[string][]string { }, } } + +// For Bazel / bp2build + +type bazelApexBundleAttributes struct { + Manifest bazel.LabelAttribute +} + +type bazelApexBundle struct { + android.BazelTargetModuleBase + bazelApexBundleAttributes +} + +func BazelApexBundleFactory() android.Module { + module := &bazelApexBundle{} + module.AddProperties(&module.bazelApexBundleAttributes) + android.InitBazelTargetModule(module) + return module +} + +func ApexBundleBp2Build(ctx android.TopDownMutatorContext) { + module, ok := ctx.Module().(*apexBundle) + if !ok { + // Not an APEX bundle + return + } + if !module.ConvertWithBp2build(ctx) { + return + } + if ctx.ModuleType() != "apex" { + return + } + + apexBundleBp2BuildInternal(ctx, module) +} + +func apexBundleBp2BuildInternal(ctx android.TopDownMutatorContext, module *apexBundle) { + var manifestLabelAttribute bazel.LabelAttribute + + manifestStringPtr := module.properties.Manifest + if module.properties.Manifest != nil { + manifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *manifestStringPtr)) + } + + attrs := &bazelApexBundleAttributes{ + Manifest: manifestLabelAttribute, + } + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "apex", + Bzl_load_location: "//build/bazel/rules:apex.bzl", + } + + ctx.CreateBazelTargetModule(BazelApexBundleFactory, module.Name(), props, attrs) +} + +func (m *bazelApexBundle) Name() string { + return m.BaseModuleName() +} + +func (m *bazelApexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {} diff --git a/bp2build/Android.bp b/bp2build/Android.bp index 0e6030e5b..dded14ba1 100644 --- a/bp2build/Android.bp +++ b/bp2build/Android.bp @@ -19,6 +19,7 @@ bootstrap_go_package { ], deps: [ "soong-android", + "soong-apex", "soong-bazel", "soong-cc", "soong-cc-config", @@ -27,6 +28,7 @@ bootstrap_go_package { "soong-sh", ], testSrcs: [ + "apex_conversion_test.go", "build_conversion_test.go", "bzl_conversion_test.go", "cc_library_conversion_test.go", diff --git a/bp2build/apex_conversion_test.go b/bp2build/apex_conversion_test.go new file mode 100644 index 000000000..fbf6fa289 --- /dev/null +++ b/bp2build/apex_conversion_test.go @@ -0,0 +1,48 @@ +// Copyright 2021 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/apex" + "testing" +) + +func runApexTestCase(t *testing.T, tc bp2buildTestCase) { + t.Helper() + runBp2BuildTestCase(t, registerApexModuleTypes, tc) +} + +func registerApexModuleTypes(ctx android.RegistrationContext) { +} + +func TestApexBundleSimple(t *testing.T) { + runApexTestCase(t, bp2buildTestCase{ + description: "apex - simple example", + moduleTypeUnderTest: "apex", + moduleTypeUnderTestFactory: apex.BundleFactory, + moduleTypeUnderTestBp2BuildMutator: apex.ApexBundleBp2Build, + filesystem: map[string]string{}, + blueprint: ` +apex { + name: "apogee", + manifest: "manifest.json", +} +`, + expectedBazelTargets: []string{`apex( + name = "apogee", + manifest = "manifest.json", +)`}}) +}