Add partial bp2build support for APEX targets (second try).
Test: Added unit test
Change-Id: Icbf0475251aac5d1f13bd35a18f90b6c70f3ae29
diff --git a/android/mutator.go b/android/mutator.go
index 365bf29..819dd0f 100644
--- a/android/mutator.go
+++ b/android/mutator.go
@@ -19,6 +19,7 @@
"fmt"
"reflect"
"strings"
+ "sync"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -229,6 +230,9 @@
var bp2buildDepsMutators = []RegisterMutatorFunc{}
var bp2buildMutators = map[string]RegisterMutatorFunc{}
+// See http://b/192523357
+var bp2buildLock sync.Mutex
+
// RegisterBp2BuildMutator registers specially crafted mutators for
// converting Blueprint/Android modules into special modules that can
// be code-generated into Bazel BUILD targets.
@@ -238,6 +242,9 @@
f := func(ctx RegisterMutatorsContext) {
ctx.TopDown(moduleType, m)
}
+ // Use a lock to avoid a concurrent map write if RegisterBp2BuildMutator is called in parallel
+ bp2buildLock.Lock()
+ defer bp2buildLock.Unlock()
bp2buildMutators[moduleType] = f
}
diff --git a/apex/Android.bp b/apex/Android.bp
index 6269757..b9b5428 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -9,6 +9,7 @@
"blueprint",
"soong",
"soong-android",
+ "soong-bazel",
"soong-bpf",
"soong-cc",
"soong-filesystem",
diff --git a/apex/apex.go b/apex/apex.go
index baaf874..11df288 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -27,6 +27,7 @@
"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 @@
ctx.PreArchMutators(registerPreArchMutators)
ctx.PreDepsMutators(RegisterPreDepsMutators)
ctx.PostDepsMutators(RegisterPostDepsMutators)
+
+ android.RegisterBp2BuildMutator("apex", ApexBundleBp2Build)
}
func registerPreArchMutators(ctx android.RegisterMutatorsContext) {
@@ -327,6 +330,7 @@
android.DefaultableModuleBase
android.OverridableModuleBase
android.SdkBase
+ android.BazelModuleBase
// Properties
properties apexBundleProperties
@@ -3178,3 +3182,63 @@
},
}
}
+
+// 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 0e6030e..dded14b 100644
--- a/bp2build/Android.bp
+++ b/bp2build/Android.bp
@@ -19,6 +19,7 @@
],
deps: [
"soong-android",
+ "soong-apex",
"soong-bazel",
"soong-cc",
"soong-cc-config",
@@ -27,6 +28,7 @@
"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 0000000..fbf6fa2
--- /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",
+)`}})
+}