1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage rust 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "strings" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workervar _ android.ImageInterface = (*Module)(nil) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workervar _ cc.ImageMutatableModule = (*Module)(nil) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) VendorAvailable() bool { 29*333d2b36SAndroid Build Coastguard Worker return Bool(mod.VendorProperties.Vendor_available) 30*333d2b36SAndroid Build Coastguard Worker} 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) OdmAvailable() bool { 33*333d2b36SAndroid Build Coastguard Worker return Bool(mod.VendorProperties.Odm_available) 34*333d2b36SAndroid Build Coastguard Worker} 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ProductAvailable() bool { 37*333d2b36SAndroid Build Coastguard Worker return Bool(mod.VendorProperties.Product_available) 38*333d2b36SAndroid Build Coastguard Worker} 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RamdiskAvailable() bool { 41*333d2b36SAndroid Build Coastguard Worker return Bool(mod.Properties.Ramdisk_available) 42*333d2b36SAndroid Build Coastguard Worker} 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) VendorRamdiskAvailable() bool { 45*333d2b36SAndroid Build Coastguard Worker return Bool(mod.Properties.Vendor_ramdisk_available) 46*333d2b36SAndroid Build Coastguard Worker} 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) AndroidModuleBase() *android.ModuleBase { 49*333d2b36SAndroid Build Coastguard Worker return &mod.ModuleBase 50*333d2b36SAndroid Build Coastguard Worker} 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RecoveryAvailable() bool { 53*333d2b36SAndroid Build Coastguard Worker return Bool(mod.Properties.Recovery_available) 54*333d2b36SAndroid Build Coastguard Worker} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ExtraVariants() []string { 57*333d2b36SAndroid Build Coastguard Worker return mod.Properties.ExtraVariants 58*333d2b36SAndroid Build Coastguard Worker} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) AppendExtraVariant(extraVariant string) { 61*333d2b36SAndroid Build Coastguard Worker mod.Properties.ExtraVariants = append(mod.Properties.ExtraVariants, extraVariant) 62*333d2b36SAndroid Build Coastguard Worker} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetRamdiskVariantNeeded(b bool) { 65*333d2b36SAndroid Build Coastguard Worker mod.Properties.RamdiskVariantNeeded = b 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetVendorRamdiskVariantNeeded(b bool) { 69*333d2b36SAndroid Build Coastguard Worker mod.Properties.VendorRamdiskVariantNeeded = b 70*333d2b36SAndroid Build Coastguard Worker} 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetRecoveryVariantNeeded(b bool) { 73*333d2b36SAndroid Build Coastguard Worker mod.Properties.RecoveryVariantNeeded = b 74*333d2b36SAndroid Build Coastguard Worker} 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetCoreVariantNeeded(b bool) { 77*333d2b36SAndroid Build Coastguard Worker mod.Properties.CoreVariantNeeded = b 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetProductVariantNeeded(b bool) { 81*333d2b36SAndroid Build Coastguard Worker mod.Properties.ProductVariantNeeded = b 82*333d2b36SAndroid Build Coastguard Worker} 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetVendorVariantNeeded(b bool) { 85*333d2b36SAndroid Build Coastguard Worker mod.Properties.VendorVariantNeeded = b 86*333d2b36SAndroid Build Coastguard Worker} 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SnapshotVersion(mctx android.ImageInterfaceContext) string { 89*333d2b36SAndroid Build Coastguard Worker if snapshot, ok := mod.compiler.(cc.SnapshotInterface); ok { 90*333d2b36SAndroid Build Coastguard Worker return snapshot.Version() 91*333d2b36SAndroid Build Coastguard Worker } else { 92*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf("version is unknown for snapshot prebuilt") 93*333d2b36SAndroid Build Coastguard Worker return "" 94*333d2b36SAndroid Build Coastguard Worker } 95*333d2b36SAndroid Build Coastguard Worker} 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool { 98*333d2b36SAndroid Build Coastguard Worker return mod.Properties.VendorVariantNeeded 99*333d2b36SAndroid Build Coastguard Worker} 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool { 102*333d2b36SAndroid Build Coastguard Worker return mod.Properties.ProductVariantNeeded 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 106*333d2b36SAndroid Build Coastguard Worker return mod.Properties.VendorRamdiskVariantNeeded 107*333d2b36SAndroid Build Coastguard Worker} 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool { 110*333d2b36SAndroid Build Coastguard Worker return mod.Properties.CoreVariantNeeded 111*333d2b36SAndroid Build Coastguard Worker} 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RamdiskVariantNeeded(android.ImageInterfaceContext) bool { 114*333d2b36SAndroid Build Coastguard Worker return mod.Properties.RamdiskVariantNeeded 115*333d2b36SAndroid Build Coastguard Worker} 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 118*333d2b36SAndroid Build Coastguard Worker return false 119*333d2b36SAndroid Build Coastguard Worker} 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RecoveryVariantNeeded(android.ImageInterfaceContext) bool { 122*333d2b36SAndroid Build Coastguard Worker return mod.Properties.RecoveryVariantNeeded 123*333d2b36SAndroid Build Coastguard Worker} 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ExtraImageVariations(android.ImageInterfaceContext) []string { 126*333d2b36SAndroid Build Coastguard Worker return mod.Properties.ExtraVariants 127*333d2b36SAndroid Build Coastguard Worker} 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsSnapshotPrebuilt() bool { 130*333d2b36SAndroid Build Coastguard Worker if p, ok := mod.compiler.(cc.SnapshotInterface); ok { 131*333d2b36SAndroid Build Coastguard Worker return p.IsSnapshotPrebuilt() 132*333d2b36SAndroid Build Coastguard Worker } 133*333d2b36SAndroid Build Coastguard Worker return false 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInVendor() bool { 137*333d2b36SAndroid Build Coastguard Worker // Additionally check if this module is inVendor() that means it is a "vendor" variant of a 138*333d2b36SAndroid Build Coastguard Worker // module. As well as SoC specific modules, vendor variants must be installed to /vendor 139*333d2b36SAndroid Build Coastguard Worker // unless they have "odm_available: true". 140*333d2b36SAndroid Build Coastguard Worker return mod.InVendor() && !mod.VendorVariantToOdm() 141*333d2b36SAndroid Build Coastguard Worker} 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInOdm() bool { 144*333d2b36SAndroid Build Coastguard Worker // Some vendor variants want to be installed to /odm by setting "odm_available: true". 145*333d2b36SAndroid Build Coastguard Worker return mod.InVendor() && mod.VendorVariantToOdm() 146*333d2b36SAndroid Build Coastguard Worker} 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker// Returns true when this module creates a vendor variant and wants to install the vendor variant 149*333d2b36SAndroid Build Coastguard Worker// to the odm partition. 150*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorVariantToOdm() bool { 151*333d2b36SAndroid Build Coastguard Worker return Bool(c.VendorProperties.Odm_available) 152*333d2b36SAndroid Build Coastguard Worker} 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContext) ProductSpecific() bool { 155*333d2b36SAndroid Build Coastguard Worker return ctx.ModuleContext.ProductSpecific() || ctx.RustModule().productSpecificModuleContext() 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) productSpecificModuleContext() bool { 159*333d2b36SAndroid Build Coastguard Worker // Additionally check if this module is inProduct() that means it is a "product" variant of a 160*333d2b36SAndroid Build Coastguard Worker // module. As well as product specific modules, product variants must be installed to /product. 161*333d2b36SAndroid Build Coastguard Worker return c.InProduct() 162*333d2b36SAndroid Build Coastguard Worker} 163*333d2b36SAndroid Build Coastguard Worker 164*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InRecovery() bool { 165*333d2b36SAndroid Build Coastguard Worker return mod.ModuleBase.InRecovery() || mod.ModuleBase.InstallInRecovery() 166*333d2b36SAndroid Build Coastguard Worker} 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InRamdisk() bool { 169*333d2b36SAndroid Build Coastguard Worker return mod.ModuleBase.InRamdisk() || mod.ModuleBase.InstallInRamdisk() 170*333d2b36SAndroid Build Coastguard Worker} 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InVendorRamdisk() bool { 173*333d2b36SAndroid Build Coastguard Worker return mod.ModuleBase.InVendorRamdisk() || mod.ModuleBase.InstallInVendorRamdisk() 174*333d2b36SAndroid Build Coastguard Worker} 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) OnlyInRamdisk() bool { 177*333d2b36SAndroid Build Coastguard Worker return mod.ModuleBase.InstallInRamdisk() 178*333d2b36SAndroid Build Coastguard Worker} 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) OnlyInRecovery() bool { 181*333d2b36SAndroid Build Coastguard Worker return mod.ModuleBase.InstallInRecovery() 182*333d2b36SAndroid Build Coastguard Worker} 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) OnlyInVendorRamdisk() bool { 185*333d2b36SAndroid Build Coastguard Worker return mod.ModuleBase.InstallInVendorRamdisk() 186*333d2b36SAndroid Build Coastguard Worker} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and vendor variants. 189*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasVendorVariant() bool { 190*333d2b36SAndroid Build Coastguard Worker return Bool(mod.VendorProperties.Vendor_available) || Bool(mod.VendorProperties.Odm_available) 191*333d2b36SAndroid Build Coastguard Worker} 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker// Always returns false because rust modules do not support product variant. 194*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasProductVariant() bool { 195*333d2b36SAndroid Build Coastguard Worker return Bool(mod.VendorProperties.Product_available) 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasNonSystemVariants() bool { 199*333d2b36SAndroid Build Coastguard Worker return mod.HasVendorVariant() || mod.HasProductVariant() 200*333d2b36SAndroid Build Coastguard Worker} 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InProduct() bool { 203*333d2b36SAndroid Build Coastguard Worker return mod.Properties.ImageVariation == android.ProductVariation 204*333d2b36SAndroid Build Coastguard Worker} 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "vendor" variant. Usually these modules are installed in /vendor 207*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InVendor() bool { 208*333d2b36SAndroid Build Coastguard Worker return mod.Properties.ImageVariation == android.VendorVariation 209*333d2b36SAndroid Build Coastguard Worker} 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "vendor" or "product" variant. 212*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InVendorOrProduct() bool { 213*333d2b36SAndroid Build Coastguard Worker return mod.InVendor() || mod.InProduct() 214*333d2b36SAndroid Build Coastguard Worker} 215*333d2b36SAndroid Build Coastguard Worker 216*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetImageVariation(ctx android.ImageInterfaceContext, variant string) { 217*333d2b36SAndroid Build Coastguard Worker if variant == android.VendorRamdiskVariation { 218*333d2b36SAndroid Build Coastguard Worker mod.MakeAsPlatform() 219*333d2b36SAndroid Build Coastguard Worker } else if variant == android.RecoveryVariation { 220*333d2b36SAndroid Build Coastguard Worker mod.MakeAsPlatform() 221*333d2b36SAndroid Build Coastguard Worker } else if strings.HasPrefix(variant, android.VendorVariation) { 222*333d2b36SAndroid Build Coastguard Worker mod.Properties.ImageVariation = android.VendorVariation 223*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(variant, cc.VendorVariationPrefix) { 224*333d2b36SAndroid Build Coastguard Worker mod.Properties.VndkVersion = strings.TrimPrefix(variant, cc.VendorVariationPrefix) 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker } else if strings.HasPrefix(variant, android.ProductVariation) { 227*333d2b36SAndroid Build Coastguard Worker mod.Properties.ImageVariation = android.ProductVariation 228*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(variant, cc.ProductVariationPrefix) { 229*333d2b36SAndroid Build Coastguard Worker mod.Properties.VndkVersion = strings.TrimPrefix(variant, cc.ProductVariationPrefix) 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker } 232*333d2b36SAndroid Build Coastguard Worker} 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ImageMutatorBegin(mctx android.ImageInterfaceContext) { 235*333d2b36SAndroid Build Coastguard Worker if Bool(mod.VendorProperties.Double_loadable) { 236*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("double_loadable", 237*333d2b36SAndroid Build Coastguard Worker "Rust modules do not yet support double loading") 238*333d2b36SAndroid Build Coastguard Worker } 239*333d2b36SAndroid Build Coastguard Worker if Bool(mod.Properties.Vendor_ramdisk_available) { 240*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(libraryInterface); !ok || (ok && lib.buildShared()) { 241*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("vendor_ramdisk_available", "cannot be set for rust_ffi or rust_ffi_shared modules.") 242*333d2b36SAndroid Build Coastguard Worker } 243*333d2b36SAndroid Build Coastguard Worker } 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker cc.MutateImage(mctx, mod) 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Worker if !mod.Properties.CoreVariantNeeded || mod.HasNonSystemVariants() { 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.compiler.(*prebuiltLibraryDecorator); ok { 250*333d2b36SAndroid Build Coastguard Worker // Rust does not support prebuilt libraries on non-System images. 251*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf("Rust prebuilt modules not supported for non-system images.") 252*333d2b36SAndroid Build Coastguard Worker } 253*333d2b36SAndroid Build Coastguard Worker } 254*333d2b36SAndroid Build Coastguard Worker} 255