Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37b29c92 authored by Rupert Shuttleworth's avatar Rupert Shuttleworth Committed by Automerger Merge Worker
Browse files

Add partial bp2build support for APEX targets (second try). am: a9d76dd4

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1755109

Change-Id: Iad07897a10e7ea8067b5c892188596b44efc2cba
parents 5caf0040 a9d76dd4
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import (
	"fmt"
	"reflect"
	"strings"
	"sync"

	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"
@@ -229,6 +230,9 @@ var bp2buildPreArchMutators = []RegisterMutatorFunc{}
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 @@ func RegisterBp2BuildMutator(moduleType string, m func(TopDownMutatorContext)) {
	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
}

+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ bootstrap_go_package {
        "blueprint",
        "soong",
        "soong-android",
        "soong-bazel",
        "soong-bpf",
        "soong-cc",
        "soong-filesystem",
+64 −0
Original line number Diff line number Diff line
@@ -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) {}
+2 −0
Original line number Diff line number Diff line
@@ -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",
+48 −0
Original line number Diff line number Diff line
// 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",
)`}})
}