diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go index 3c43a8e55..03e82c2a8 100644 --- a/java/platform_compat_config.go +++ b/java/platform_compat_config.go @@ -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 diff --git a/java/platform_compat_config_test.go b/java/platform_compat_config_test.go index 1ff6ac304..80d991c49 100644 --- a/java/platform_compat_config_test.go +++ b/java/platform_compat_config_test.go @@ -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) -} diff --git a/java/testing.go b/java/testing.go index 4b8b84924..26d7c9325 100644 --- a/java/testing.go +++ b/java/testing.go @@ -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) +} diff --git a/sdk/Android.bp b/sdk/Android.bp index 6e49c6d5e..7b034e6de 100644 --- a/sdk/Android.bp +++ b/sdk/Android.bp @@ -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", diff --git a/sdk/compat_config_sdk_test.go b/sdk/compat_config_sdk_test.go new file mode 100644 index 000000000..dffc02ade --- /dev/null +++ b/sdk/compat_config_sdk_test.go @@ -0,0 +1,70 @@ +// 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 +`), + ) +}