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

Commit 001b2342 authored by Paul Duffin's avatar Paul Duffin
Browse files

Add platform_compat_config to sdk

Bug: 182402754
Test: m nothing
Change-Id: Ife3f4f64fc116d62eb7c3cc10c50e00f19d1d81c
parent 04b4a19f
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -15,12 +15,23 @@
package java

import (
	"path/filepath"

	"android/soong/android"
	"github.com/google/blueprint"

	"fmt"
)

func init() {
	registerPlatformCompatConfigBuildComponents(android.InitRegistrationContext)

	android.RegisterSdkMemberType(&compatConfigMemberType{
		SdkMemberTypeBase: android.SdkMemberTypeBase{
			PropertyName: "compat_configs",
			SupportsSdk:  true,
		},
	})
}

func registerPlatformCompatConfigBuildComponents(ctx android.RegistrationContext) {
@@ -42,6 +53,7 @@ type platformCompatConfigProperties struct {

type platformCompatConfig struct {
	android.ModuleBase
	android.SdkBase

	properties     platformCompatConfigProperties
	installDirPath android.InstallPath
@@ -113,10 +125,54 @@ func (p *platformCompatConfig) AndroidMkEntries() []android.AndroidMkEntries {
func PlatformCompatConfigFactory() android.Module {
	module := &platformCompatConfig{}
	module.AddProperties(&module.properties)
	android.InitSdkAwareModule(module)
	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
	return module
}

type compatConfigMemberType struct {
	android.SdkMemberTypeBase
}

func (b *compatConfigMemberType) AddDependencies(mctx android.BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) {
	mctx.AddVariationDependencies(nil, dependencyTag, names...)
}

func (b *compatConfigMemberType) IsInstance(module android.Module) bool {
	_, ok := module.(*platformCompatConfig)
	return ok
}

func (b *compatConfigMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
	return ctx.SnapshotBuilder().AddPrebuiltModule(member, "prebuilt_platform_compat_config")
}

func (b *compatConfigMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
	return &compatConfigSdkMemberProperties{}
}

type compatConfigSdkMemberProperties struct {
	android.SdkMemberPropertiesBase

	Metadata android.Path
}

func (b *compatConfigSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
	module := variant.(*platformCompatConfig)
	b.Metadata = module.metadataFile
}

func (b *compatConfigSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
	builder := ctx.SnapshotBuilder()
	if b.Metadata != nil {
		snapshotRelativePath := filepath.Join("compat_configs", ctx.Name(), b.Metadata.Base())
		builder.CopyToSnapshot(b.Metadata, snapshotRelativePath)
		propertySet.AddProperty("metadata", snapshotRelativePath)
	}
}

var _ android.SdkMemberType = (*compatConfigMemberType)(nil)

// A prebuilt version of the platform compat config module.
type prebuiltCompatConfigModule struct {
	android.ModuleBase
+1 −10
Original line number Diff line number Diff line
@@ -36,18 +36,9 @@ func TestPlatformCompatConfig(t *testing.T) {
		`),
	).RunTest(t)

	checkMergedCompatConfigInputs(t, result, "myconfig",
	CheckMergedCompatConfigInputs(t, result, "myconfig",
		"out/soong/.intermediates/myconfig1/myconfig1_meta.xml",
		"out/soong/.intermediates/myconfig2/myconfig2_meta.xml",
		"out/soong/.intermediates/myconfig3/myconfig3_meta.xml",
	)
}

// Check that the merged file create by platform_compat_config_singleton has the correct inputs.
func checkMergedCompatConfigInputs(t *testing.T, result *android.TestResult, message string, expectedPaths ...string) {
	sourceGlobalCompatConfig := result.SingletonForTests("platform_compat_config_singleton")
	allOutputs := sourceGlobalCompatConfig.AllOutputs()
	android.AssertIntEquals(t, message+": output len", 1, len(allOutputs))
	output := sourceGlobalCompatConfig.Output(allOutputs[0])
	android.AssertPathsRelativeToTopEquals(t, message+": inputs", expectedPaths, output.Implicits)
}
+9 −0
Original line number Diff line number Diff line
@@ -319,3 +319,12 @@ func CheckHiddenAPIRuleInputs(t *testing.T, expected string, hiddenAPIRule andro
		t.Errorf("Expected hiddenapi rule inputs:\n%s\nactual inputs:\n%s", expected, actual)
	}
}

// Check that the merged file create by platform_compat_config_singleton has the correct inputs.
func CheckMergedCompatConfigInputs(t *testing.T, result *android.TestResult, message string, expectedPaths ...string) {
	sourceGlobalCompatConfig := result.SingletonForTests("platform_compat_config_singleton")
	allOutputs := sourceGlobalCompatConfig.AllOutputs()
	android.AssertIntEquals(t, message+": output len", 1, len(allOutputs))
	output := sourceGlobalCompatConfig.Output(allOutputs[0])
	android.AssertPathsRelativeToTopEquals(t, message+": inputs", expectedPaths, output.Implicits)
}
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ bootstrap_go_package {
        "boot_image_sdk_test.go",
        "bp_test.go",
        "cc_sdk_test.go",
        "compat_config_sdk_test.go",
        "exports_test.go",
        "java_sdk_test.go",
        "sdk_test.go",
+70 −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 sdk

import (
	"testing"

	"android/soong/android"
	"android/soong/java"
)

func TestSnapshotWithCompatConfig(t *testing.T) {
	result := android.GroupFixturePreparers(
		prepareForSdkTestWithJava,
		java.PrepareForTestWithPlatformCompatConfig,
	).RunTestWithBp(t, `
		sdk {
			name: "mysdk",
			compat_configs: ["myconfig"],
		}

		platform_compat_config {
			name: "myconfig",
		}
	`)

	CheckSnapshot(t, result, "mysdk", "",
		checkVersionedAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.

prebuilt_platform_compat_config {
    name: "mysdk_myconfig@current",
    sdk_member_name: "myconfig",
    visibility: ["//visibility:public"],
    metadata: "compat_configs/myconfig/myconfig_meta.xml",
}

sdk_snapshot {
    name: "mysdk@current",
    visibility: ["//visibility:public"],
    compat_configs: ["mysdk_myconfig@current"],
}
`),
		checkUnversionedAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.

prebuilt_platform_compat_config {
    name: "myconfig",
    prefer: false,
    visibility: ["//visibility:public"],
    metadata: "compat_configs/myconfig/myconfig_meta.xml",
}
`),
		checkAllCopyRules(`
.intermediates/myconfig/android_common/myconfig_meta.xml -> compat_configs/myconfig/myconfig_meta.xml
`),
	)
}