From 6369622f8d59adb9e26031e459cbe538651d62a9 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Mon, 6 Sep 2021 10:28:34 +0100 Subject: [PATCH] Add recovery image sdk trait to cc_library_headers Allows an sdk to require that a cc_library_headers module provides a recovery image variant for the prebuilt. Previously, "recovery_available: true" would be set in the generated prebuilt snapshot for any sdk member that specified "recovery_available: true" in the source module. This change will only add that setting to the snapshot if the recovery image variant trait was explicitly requested for a member. Bug: 195754365 Test: m nothing Change-Id: I7d79ccdec843127f7852d82b4b163021e30a79a7 --- cc/Android.bp | 1 + cc/image_sdk_traits.go | 33 ++++++++++++++++++++++++ cc/library_headers.go | 1 + cc/library_sdk_member.go | 12 ++++++++- sdk/cc_sdk_test.go | 54 ++++++++++++++++++++++++++++++++++++++-- 5 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 cc/image_sdk_traits.go diff --git a/cc/Android.bp b/cc/Android.bp index 190d55ec6..07aa7cbbe 100644 --- a/cc/Android.bp +++ b/cc/Android.bp @@ -60,6 +60,7 @@ bootstrap_go_package { "binary.go", "binary_sdk_member.go", "fuzz.go", + "image_sdk_traits.go", "library.go", "library_headers.go", "library_sdk_member.go", diff --git a/cc/image_sdk_traits.go b/cc/image_sdk_traits.go new file mode 100644 index 000000000..371bb24e8 --- /dev/null +++ b/cc/image_sdk_traits.go @@ -0,0 +1,33 @@ +// 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 cc + +import "android/soong/android" + +// This file contains support for the image variant sdk traits. + +func init() { + android.RegisterSdkMemberTrait(recoveryImageRequiredSdkTrait) +} + +type imageSdkTraitStruct struct { + android.SdkMemberTraitBase +} + +var recoveryImageRequiredSdkTrait android.SdkMemberTrait = &imageSdkTraitStruct{ + SdkMemberTraitBase: android.SdkMemberTraitBase{ + PropertyName: "recovery_image_required", + }, +} diff --git a/cc/library_headers.go b/cc/library_headers.go index f88b801ef..4022392bb 100644 --- a/cc/library_headers.go +++ b/cc/library_headers.go @@ -35,6 +35,7 @@ var headersLibrarySdkMemberType = &librarySdkMemberType{ HostOsDependent: true, Traits: []android.SdkMemberTrait{ nativeBridgeSdkTrait, + recoveryImageRequiredSdkTrait, }, }, prebuiltModuleType: "cc_prebuilt_library_headers", diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go index 73187bd62..a28ccd062 100644 --- a/cc/library_sdk_member.go +++ b/cc/library_sdk_member.go @@ -133,6 +133,16 @@ func (mt *librarySdkMemberType) AddDependencies(ctx android.SdkDependencyContext imageVariations: []blueprint.Variation{{Mutator: "image", Variation: android.CoreVariation}}, targets: targets, }) + + // If required add additional dependencies on the image:recovery variants. + if ctx.RequiresTrait(lib, recoveryImageRequiredSdkTrait) { + memberDependencies = append(memberDependencies, memberDependency{ + imageVariations: []blueprint.Variation{{Mutator: "image", Variation: android.RecoveryVariation}}, + // Only add a dependency on the first target as that is the only one which will have an + // image:recovery variant. + targets: targets[:1], + }) + } } // For each dependency in the list add dependencies on the targets with the correct variations. @@ -189,7 +199,7 @@ func (mt *librarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, pbm.AddProperty("native_bridge_supported", true) } - if proptools.Bool(ccModule.Properties.Recovery_available) { + if ctx.RequiresTrait(recoveryImageRequiredSdkTrait) { pbm.AddProperty("recovery_available", true) } diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index da90c6dfc..7afdac4a0 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -15,6 +15,7 @@ package sdk import ( + "fmt" "testing" "android/soong/android" @@ -1771,7 +1772,6 @@ cc_prebuilt_library { prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], - recovery_available: true, vendor_available: true, stl: "none", compile_multilib: "both", @@ -1806,7 +1806,6 @@ cc_prebuilt_library { visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], installable: false, - recovery_available: true, vendor_available: true, stl: "none", compile_multilib: "both", @@ -2081,6 +2080,57 @@ func TestSnapshotWithCcHeadersLibrary_DetectsNativeBridgeSpecificProperties(t *t `) } +func TestSnapshotWithCcHeadersLibraryAndImageVariants(t *testing.T) { + testImageVariant := func(t *testing.T, property, trait string) { + result := android.GroupFixturePreparers( + cc.PrepareForTestWithCcDefaultModules, + PrepareForTestWithSdkBuildComponents, + ccTestFs.AddToFixture(), + ).RunTestWithBp(t, fmt.Sprintf(` + sdk { + name: "mysdk", + native_header_libs: ["mynativeheaders"], + traits: { + %s: ["mynativeheaders"], + }, + } + + cc_library_headers { + name: "mynativeheaders", + export_include_dirs: ["myinclude"], + stl: "none", + system_shared_libs: [], + %s: true, + } + `, trait, property)) + + CheckSnapshot(t, result, "mysdk", "", + checkUnversionedAndroidBpContents(fmt.Sprintf(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_headers { + name: "mynativeheaders", + prefer: false, + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + %s: true, + stl: "none", + compile_multilib: "both", + system_shared_libs: [], + export_include_dirs: ["include/myinclude"], +} +`, property)), + checkAllCopyRules(` +myinclude/Test.h -> include/myinclude/Test.h +`), + ) + } + + t.Run("recovery", func(t *testing.T) { + testImageVariant(t, "recovery_available", "recovery_image_required") + }) +} + func TestHostSnapshotWithCcHeadersLibrary(t *testing.T) { result := testSdkWithCc(t, ` sdk {