From 460ee9429edf27dbac2d308ecc18354c8df9ab73 Mon Sep 17 00:00:00 2001 From: Matthew Maurer Date: Thu, 11 Feb 2021 12:31:46 -0800 Subject: [PATCH] Support Rust in Recovery Bug: 178565008 Bug: 165791368 Test: Build and link a Rust library into a recovery binary Change-Id: I1c76e6204019443c567082730a4cf680f4a2a74a --- cc/androidmk.go | 2 +- cc/cc.go | 4 ++-- cc/snapshot_prebuilt.go | 2 +- rust/image.go | 13 ++++++------- rust/rust.go | 8 +++++++- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/cc/androidmk.go b/cc/androidmk.go index bda10067b..df3776c4f 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -29,7 +29,7 @@ var ( VendorSuffix = ".vendor" ramdiskSuffix = ".ramdisk" VendorRamdiskSuffix = ".vendor_ramdisk" - recoverySuffix = ".recovery" + RecoverySuffix = ".recovery" sdkSuffix = ".sdk" ) diff --git a/cc/cc.go b/cc/cc.go index f65af3024..0d2ef4ecd 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1672,7 +1672,7 @@ func (c *Module) setSubnameProperty(actx android.ModuleContext) { } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() { c.Properties.SubName += VendorRamdiskSuffix } else if c.InRecovery() && !c.OnlyInRecovery() { - c.Properties.SubName += recoverySuffix + c.Properties.SubName += RecoverySuffix } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) { c.Properties.SubName += sdkSuffix if c.SplitPerApiLevel() { @@ -3033,7 +3033,7 @@ func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableI } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() { return libName + VendorRamdiskSuffix } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() { - return libName + recoverySuffix + return libName + RecoverySuffix } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled { return libName + nativeBridgeSuffix } else { diff --git a/cc/snapshot_prebuilt.go b/cc/snapshot_prebuilt.go index 9672c0fff..9570664c7 100644 --- a/cc/snapshot_prebuilt.go +++ b/cc/snapshot_prebuilt.go @@ -61,7 +61,7 @@ func (recoverySnapshotImage) imageVariantName(cfg android.DeviceConfig) string { } func (recoverySnapshotImage) moduleNameSuffix() string { - return recoverySuffix + return RecoverySuffix } // Override existing vendor and recovery snapshot for cc module specific extra functions diff --git a/rust/image.go b/rust/image.go index 3b54f12c7..6a8337692 100644 --- a/rust/image.go +++ b/rust/image.go @@ -50,7 +50,7 @@ func (mod *Module) AndroidModuleBase() *android.ModuleBase { } func (mod *Module) RecoveryAvailable() bool { - return false + return Bool(mod.Properties.Recovery_available) } func (mod *Module) ExtraVariants() []string { @@ -72,9 +72,7 @@ func (mod *Module) SetVendorRamdiskVariantNeeded(b bool) { } func (mod *Module) SetRecoveryVariantNeeded(b bool) { - if b { - panic("Setting recovery variant needed for Rust module is unsupported: " + mod.BaseModuleName()) - } + mod.Properties.RecoveryVariantNeeded = b } func (mod *Module) SetCoreVariantNeeded(b bool) { @@ -107,7 +105,7 @@ func (mod *Module) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool } func (mod *Module) RecoveryVariantNeeded(android.BaseModuleContext) bool { - return mod.InRecovery() + return mod.Properties.RecoveryVariantNeeded } func (mod *Module) ExtraImageVariations(android.BaseModuleContext) []string { @@ -144,8 +142,7 @@ func (ctx *moduleContext) ProductSpecific() bool { } func (mod *Module) InRecovery() bool { - // TODO(b/165791368) - return false + return mod.ModuleBase.InRecovery() || mod.ModuleBase.InstallInRecovery() } func (mod *Module) InVendorRamdisk() bool { @@ -193,6 +190,8 @@ func (mod *Module) SetImageVariation(ctx android.BaseModuleContext, variant stri m := module.(*Module) if variant == android.VendorRamdiskVariation { m.MakeAsPlatform() + } else if variant == android.RecoveryVariation { + m.MakeAsPlatform() } else if strings.HasPrefix(variant, cc.VendorVariationPrefix) { m.Properties.ImageVariationPrefix = cc.VendorVariationPrefix m.Properties.VndkVersion = strings.TrimPrefix(variant, cc.VendorVariationPrefix) diff --git a/rust/rust.go b/rust/rust.go index 4ceeef1d1..79a5febf0 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -84,6 +84,7 @@ type BaseProperties struct { // Set by imageMutator CoreVariantNeeded bool `blueprint:"mutated"` VendorRamdiskVariantNeeded bool `blueprint:"mutated"` + RecoveryVariantNeeded bool `blueprint:"mutated"` ExtraVariants []string `blueprint:"mutated"` // Allows this module to use non-APEX version of libraries. Useful @@ -98,7 +99,7 @@ type BaseProperties struct { // On device without a dedicated recovery partition, the module is only // available after switching root into // /first_stage_ramdisk. To expose the module before switching root, install - // the recovery variant instead (TODO(b/165791368) recovery not yet supported) + // the recovery variant instead Vendor_ramdisk_available *bool // Normally Soong uses the directory structure to decide which modules @@ -115,6 +116,9 @@ type BaseProperties struct { // framework module from the recovery snapshot. Exclude_from_recovery_snapshot *bool + // Make this module available when building for recovery + Recovery_available *bool + // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX). Min_sdk_version *string @@ -807,6 +811,8 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { mod.Properties.SubName += cc.VendorSuffix } else if mod.InVendorRamdisk() && !mod.OnlyInVendorRamdisk() { mod.Properties.SubName += cc.VendorRamdiskSuffix + } else if mod.InRecovery() && !mod.OnlyInRecovery() { + mod.Properties.SubName += cc.RecoverySuffix } if !toolchain.Supported() {