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 Workerpackage cc 15*333d2b36SAndroid Build Coastguard Worker 16*333d2b36SAndroid Build Coastguard Worker// This file contains image variant related things, including image mutator functions, utility 17*333d2b36SAndroid Build Coastguard Worker// functions to determine where a module is installed, etc. 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport ( 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workervar _ android.ImageInterface = (*Module)(nil) 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workertype ImageVariantType string 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerconst ( 32*333d2b36SAndroid Build Coastguard Worker coreImageVariant ImageVariantType = "core" 33*333d2b36SAndroid Build Coastguard Worker vendorImageVariant ImageVariantType = "vendor" 34*333d2b36SAndroid Build Coastguard Worker productImageVariant ImageVariantType = "product" 35*333d2b36SAndroid Build Coastguard Worker ramdiskImageVariant ImageVariantType = "ramdisk" 36*333d2b36SAndroid Build Coastguard Worker vendorRamdiskImageVariant ImageVariantType = "vendor_ramdisk" 37*333d2b36SAndroid Build Coastguard Worker recoveryImageVariant ImageVariantType = "recovery" 38*333d2b36SAndroid Build Coastguard Worker hostImageVariant ImageVariantType = "host" 39*333d2b36SAndroid Build Coastguard Worker) 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerconst ( 42*333d2b36SAndroid Build Coastguard Worker // VendorVariationPrefix is the variant prefix used for /vendor code that compiles 43*333d2b36SAndroid Build Coastguard Worker // against the VNDK. 44*333d2b36SAndroid Build Coastguard Worker VendorVariationPrefix = "vendor." 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker // ProductVariationPrefix is the variant prefix used for /product code that compiles 47*333d2b36SAndroid Build Coastguard Worker // against the VNDK. 48*333d2b36SAndroid Build Coastguard Worker ProductVariationPrefix = "product." 49*333d2b36SAndroid Build Coastguard Worker) 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inProduct() bool { 52*333d2b36SAndroid Build Coastguard Worker return ctx.mod.InProduct() 53*333d2b36SAndroid Build Coastguard Worker} 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inVendor() bool { 56*333d2b36SAndroid Build Coastguard Worker return ctx.mod.InVendor() 57*333d2b36SAndroid Build Coastguard Worker} 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inRamdisk() bool { 60*333d2b36SAndroid Build Coastguard Worker return ctx.mod.InRamdisk() 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inVendorRamdisk() bool { 64*333d2b36SAndroid Build Coastguard Worker return ctx.mod.InVendorRamdisk() 65*333d2b36SAndroid Build Coastguard Worker} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inRecovery() bool { 68*333d2b36SAndroid Build Coastguard Worker return ctx.mod.InRecovery() 69*333d2b36SAndroid Build Coastguard Worker} 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInProduct() bool { 72*333d2b36SAndroid Build Coastguard Worker // Additionally check if this module is inProduct() that means it is a "product" variant of a 73*333d2b36SAndroid Build Coastguard Worker // module. As well as product specific modules, product variants must be installed to /product. 74*333d2b36SAndroid Build Coastguard Worker return c.InProduct() 75*333d2b36SAndroid Build Coastguard Worker} 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInVendor() bool { 78*333d2b36SAndroid Build Coastguard Worker // Additionally check if this module is inVendor() that means it is a "vendor" variant of a 79*333d2b36SAndroid Build Coastguard Worker // module. As well as SoC specific modules, vendor variants must be installed to /vendor 80*333d2b36SAndroid Build Coastguard Worker // unless they have "odm_available: true". 81*333d2b36SAndroid Build Coastguard Worker return c.HasVendorVariant() && c.InVendor() && !c.VendorVariantToOdm() 82*333d2b36SAndroid Build Coastguard Worker} 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInOdm() bool { 85*333d2b36SAndroid Build Coastguard Worker // Some vendor variants want to be installed to /odm by setting "odm_available: true". 86*333d2b36SAndroid Build Coastguard Worker return c.InVendor() && c.VendorVariantToOdm() 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and vendor variants. 90*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasVendorVariant() bool { 91*333d2b36SAndroid Build Coastguard Worker return Bool(c.VendorProperties.Vendor_available) || Bool(c.VendorProperties.Odm_available) 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker// Returns true when this module creates a vendor variant and wants to install the vendor variant 95*333d2b36SAndroid Build Coastguard Worker// to the odm partition. 96*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorVariantToOdm() bool { 97*333d2b36SAndroid Build Coastguard Worker return Bool(c.VendorProperties.Odm_available) 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and product variants. 101*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasProductVariant() bool { 102*333d2b36SAndroid Build Coastguard Worker return Bool(c.VendorProperties.Product_available) 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and either product or vendor variants. 106*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasNonSystemVariants() bool { 107*333d2b36SAndroid Build Coastguard Worker return c.HasVendorVariant() || c.HasProductVariant() 108*333d2b36SAndroid Build Coastguard Worker} 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "product" variant. Usually these modules are installed in /product 111*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InProduct() bool { 112*333d2b36SAndroid Build Coastguard Worker return c.Properties.ImageVariation == android.ProductVariation 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "vendor" variant. Usually these modules are installed in /vendor 116*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InVendor() bool { 117*333d2b36SAndroid Build Coastguard Worker return c.Properties.ImageVariation == android.VendorVariation 118*333d2b36SAndroid Build Coastguard Worker} 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "vendor" or "product" variant. This replaces previous UseVndk usages 121*333d2b36SAndroid Build Coastguard Worker// which were misused to check if the module variant is vendor or product. 122*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InVendorOrProduct() bool { 123*333d2b36SAndroid Build Coastguard Worker return c.InVendor() || c.InProduct() 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InRamdisk() bool { 127*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.InRamdisk() || c.ModuleBase.InstallInRamdisk() 128*333d2b36SAndroid Build Coastguard Worker} 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InVendorRamdisk() bool { 131*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.InVendorRamdisk() || c.ModuleBase.InstallInVendorRamdisk() 132*333d2b36SAndroid Build Coastguard Worker} 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InRecovery() bool { 135*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.InRecovery() || c.ModuleBase.InstallInRecovery() 136*333d2b36SAndroid Build Coastguard Worker} 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OnlyInRamdisk() bool { 139*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.InstallInRamdisk() 140*333d2b36SAndroid Build Coastguard Worker} 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OnlyInVendorRamdisk() bool { 143*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.InstallInVendorRamdisk() 144*333d2b36SAndroid Build Coastguard Worker} 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OnlyInRecovery() bool { 147*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.InstallInRecovery() 148*333d2b36SAndroid Build Coastguard Worker} 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker// ImageMutatableModule provides a common image mutation interface for LinkableInterface modules. 151*333d2b36SAndroid Build Coastguard Workertype ImageMutatableModule interface { 152*333d2b36SAndroid Build Coastguard Worker android.Module 153*333d2b36SAndroid Build Coastguard Worker LinkableInterface 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker // AndroidModuleBase returns the android.ModuleBase for this module 156*333d2b36SAndroid Build Coastguard Worker AndroidModuleBase() *android.ModuleBase 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker // VendorAvailable returns true if this module is available on the vendor image. 159*333d2b36SAndroid Build Coastguard Worker VendorAvailable() bool 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Worker // OdmAvailable returns true if this module is available on the odm image. 162*333d2b36SAndroid Build Coastguard Worker OdmAvailable() bool 163*333d2b36SAndroid Build Coastguard Worker 164*333d2b36SAndroid Build Coastguard Worker // ProductAvailable returns true if this module is available on the product image. 165*333d2b36SAndroid Build Coastguard Worker ProductAvailable() bool 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker // RamdiskAvailable returns true if this module is available on the ramdisk image. 168*333d2b36SAndroid Build Coastguard Worker RamdiskAvailable() bool 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker // RecoveryAvailable returns true if this module is available on the recovery image. 171*333d2b36SAndroid Build Coastguard Worker RecoveryAvailable() bool 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker // VendorRamdiskAvailable returns true if this module is available on the vendor ramdisk image. 174*333d2b36SAndroid Build Coastguard Worker VendorRamdiskAvailable() bool 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker // IsSnapshotPrebuilt returns true if this module is a snapshot prebuilt. 177*333d2b36SAndroid Build Coastguard Worker IsSnapshotPrebuilt() bool 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker // SnapshotVersion returns the snapshot version for this module. 180*333d2b36SAndroid Build Coastguard Worker SnapshotVersion(mctx android.ImageInterfaceContext) string 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker // ExtraVariants returns the list of extra variants this module requires. 183*333d2b36SAndroid Build Coastguard Worker ExtraVariants() []string 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker // AppendExtraVariant returns an extra variant to the list of extra variants this module requires. 186*333d2b36SAndroid Build Coastguard Worker AppendExtraVariant(extraVariant string) 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker // SetRamdiskVariantNeeded sets whether the Ramdisk Variant is needed. 189*333d2b36SAndroid Build Coastguard Worker SetRamdiskVariantNeeded(b bool) 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker // SetVendorRamdiskVariantNeeded sets whether the Vendor Ramdisk Variant is needed. 192*333d2b36SAndroid Build Coastguard Worker SetVendorRamdiskVariantNeeded(b bool) 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Worker // SetRecoveryVariantNeeded sets whether the Recovery Variant is needed. 195*333d2b36SAndroid Build Coastguard Worker SetRecoveryVariantNeeded(b bool) 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Worker // SetCoreVariantNeeded sets whether the Core Variant is needed. 198*333d2b36SAndroid Build Coastguard Worker SetCoreVariantNeeded(b bool) 199*333d2b36SAndroid Build Coastguard Worker 200*333d2b36SAndroid Build Coastguard Worker // SetProductVariantNeeded sets whether the Product Variant is needed. 201*333d2b36SAndroid Build Coastguard Worker SetProductVariantNeeded(b bool) 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Worker // SetVendorVariantNeeded sets whether the Vendor Variant is needed. 204*333d2b36SAndroid Build Coastguard Worker SetVendorVariantNeeded(b bool) 205*333d2b36SAndroid Build Coastguard Worker} 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Workervar _ ImageMutatableModule = (*Module)(nil) 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) ImageMutatorBegin(mctx android.ImageInterfaceContext) { 210*333d2b36SAndroid Build Coastguard Worker MutateImage(mctx, m) 211*333d2b36SAndroid Build Coastguard Worker} 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) VendorAvailable() bool { 214*333d2b36SAndroid Build Coastguard Worker return Bool(m.VendorProperties.Vendor_available) 215*333d2b36SAndroid Build Coastguard Worker} 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) OdmAvailable() bool { 218*333d2b36SAndroid Build Coastguard Worker return Bool(m.VendorProperties.Odm_available) 219*333d2b36SAndroid Build Coastguard Worker} 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) ProductAvailable() bool { 222*333d2b36SAndroid Build Coastguard Worker return Bool(m.VendorProperties.Product_available) 223*333d2b36SAndroid Build Coastguard Worker} 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) RamdiskAvailable() bool { 226*333d2b36SAndroid Build Coastguard Worker return Bool(m.Properties.Ramdisk_available) 227*333d2b36SAndroid Build Coastguard Worker} 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) VendorRamdiskAvailable() bool { 230*333d2b36SAndroid Build Coastguard Worker return Bool(m.Properties.Vendor_ramdisk_available) 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) AndroidModuleBase() *android.ModuleBase { 234*333d2b36SAndroid Build Coastguard Worker return &m.ModuleBase 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) RecoveryAvailable() bool { 238*333d2b36SAndroid Build Coastguard Worker return Bool(m.Properties.Recovery_available) 239*333d2b36SAndroid Build Coastguard Worker} 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) ExtraVariants() []string { 242*333d2b36SAndroid Build Coastguard Worker return m.Properties.ExtraVersionedImageVariations 243*333d2b36SAndroid Build Coastguard Worker} 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) AppendExtraVariant(extraVariant string) { 246*333d2b36SAndroid Build Coastguard Worker m.Properties.ExtraVersionedImageVariations = append(m.Properties.ExtraVersionedImageVariations, extraVariant) 247*333d2b36SAndroid Build Coastguard Worker} 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetRamdiskVariantNeeded(b bool) { 250*333d2b36SAndroid Build Coastguard Worker m.Properties.RamdiskVariantNeeded = b 251*333d2b36SAndroid Build Coastguard Worker} 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetVendorRamdiskVariantNeeded(b bool) { 254*333d2b36SAndroid Build Coastguard Worker m.Properties.VendorRamdiskVariantNeeded = b 255*333d2b36SAndroid Build Coastguard Worker} 256*333d2b36SAndroid Build Coastguard Worker 257*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetRecoveryVariantNeeded(b bool) { 258*333d2b36SAndroid Build Coastguard Worker m.Properties.RecoveryVariantNeeded = b 259*333d2b36SAndroid Build Coastguard Worker} 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetCoreVariantNeeded(b bool) { 262*333d2b36SAndroid Build Coastguard Worker m.Properties.CoreVariantNeeded = b 263*333d2b36SAndroid Build Coastguard Worker} 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetProductVariantNeeded(b bool) { 266*333d2b36SAndroid Build Coastguard Worker m.Properties.ProductVariantNeeded = b 267*333d2b36SAndroid Build Coastguard Worker} 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetVendorVariantNeeded(b bool) { 270*333d2b36SAndroid Build Coastguard Worker m.Properties.VendorVariantNeeded = b 271*333d2b36SAndroid Build Coastguard Worker} 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SnapshotVersion(mctx android.ImageInterfaceContext) string { 274*333d2b36SAndroid Build Coastguard Worker if snapshot, ok := m.linker.(SnapshotInterface); ok { 275*333d2b36SAndroid Build Coastguard Worker return snapshot.Version() 276*333d2b36SAndroid Build Coastguard Worker } else { 277*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf("version is unknown for snapshot prebuilt") 278*333d2b36SAndroid Build Coastguard Worker // Should we be panicking here instead? 279*333d2b36SAndroid Build Coastguard Worker return "" 280*333d2b36SAndroid Build Coastguard Worker } 281*333d2b36SAndroid Build Coastguard Worker} 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) KernelHeadersDecorator() bool { 284*333d2b36SAndroid Build Coastguard Worker if _, ok := m.linker.(*kernelHeadersDecorator); ok { 285*333d2b36SAndroid Build Coastguard Worker return true 286*333d2b36SAndroid Build Coastguard Worker } 287*333d2b36SAndroid Build Coastguard Worker return false 288*333d2b36SAndroid Build Coastguard Worker} 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker// MutateImage handles common image mutations for ImageMutatableModule interfaces. 291*333d2b36SAndroid Build Coastguard Workerfunc MutateImage(mctx android.ImageInterfaceContext, m ImageMutatableModule) { 292*333d2b36SAndroid Build Coastguard Worker // Validation check 293*333d2b36SAndroid Build Coastguard Worker vendorSpecific := mctx.SocSpecific() || mctx.DeviceSpecific() 294*333d2b36SAndroid Build Coastguard Worker productSpecific := mctx.ProductSpecific() 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Worker if m.VendorAvailable() { 297*333d2b36SAndroid Build Coastguard Worker if vendorSpecific { 298*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("vendor_available", 299*333d2b36SAndroid Build Coastguard Worker "doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific: true`") 300*333d2b36SAndroid Build Coastguard Worker } 301*333d2b36SAndroid Build Coastguard Worker if m.OdmAvailable() { 302*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("vendor_available", 303*333d2b36SAndroid Build Coastguard Worker "doesn't make sense at the same time as `odm_available: true`") 304*333d2b36SAndroid Build Coastguard Worker } 305*333d2b36SAndroid Build Coastguard Worker } 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker if m.OdmAvailable() { 308*333d2b36SAndroid Build Coastguard Worker if vendorSpecific { 309*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("odm_available", 310*333d2b36SAndroid Build Coastguard Worker "doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific: true`") 311*333d2b36SAndroid Build Coastguard Worker } 312*333d2b36SAndroid Build Coastguard Worker } 313*333d2b36SAndroid Build Coastguard Worker 314*333d2b36SAndroid Build Coastguard Worker if m.ProductAvailable() { 315*333d2b36SAndroid Build Coastguard Worker if productSpecific { 316*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("product_available", 317*333d2b36SAndroid Build Coastguard Worker "doesn't make sense at the same time as `product_specific: true`") 318*333d2b36SAndroid Build Coastguard Worker } 319*333d2b36SAndroid Build Coastguard Worker if vendorSpecific { 320*333d2b36SAndroid Build Coastguard Worker mctx.PropertyErrorf("product_available", 321*333d2b36SAndroid Build Coastguard Worker "cannot provide product variant from a vendor module. Please use `product_specific: true` with `vendor_available: true`") 322*333d2b36SAndroid Build Coastguard Worker } 323*333d2b36SAndroid Build Coastguard Worker } 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker var vendorVariantNeeded bool = false 326*333d2b36SAndroid Build Coastguard Worker var productVariantNeeded bool = false 327*333d2b36SAndroid Build Coastguard Worker var coreVariantNeeded bool = false 328*333d2b36SAndroid Build Coastguard Worker var ramdiskVariantNeeded bool = false 329*333d2b36SAndroid Build Coastguard Worker var vendorRamdiskVariantNeeded bool = false 330*333d2b36SAndroid Build Coastguard Worker var recoveryVariantNeeded bool = false 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker if m.NeedsLlndkVariants() { 333*333d2b36SAndroid Build Coastguard Worker // This is an LLNDK library. The implementation of the library will be on /system, 334*333d2b36SAndroid Build Coastguard Worker // and vendor and product variants will be created with LLNDK stubs. 335*333d2b36SAndroid Build Coastguard Worker // The LLNDK libraries need vendor variants even if there is no VNDK. 336*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = true 337*333d2b36SAndroid Build Coastguard Worker vendorVariantNeeded = true 338*333d2b36SAndroid Build Coastguard Worker productVariantNeeded = true 339*333d2b36SAndroid Build Coastguard Worker 340*333d2b36SAndroid Build Coastguard Worker } else if m.NeedsVendorPublicLibraryVariants() { 341*333d2b36SAndroid Build Coastguard Worker // A vendor public library has the implementation on /vendor, with stub variants 342*333d2b36SAndroid Build Coastguard Worker // for system and product. 343*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = true 344*333d2b36SAndroid Build Coastguard Worker vendorVariantNeeded = true 345*333d2b36SAndroid Build Coastguard Worker productVariantNeeded = true 346*333d2b36SAndroid Build Coastguard Worker } else if m.IsSnapshotPrebuilt() { 347*333d2b36SAndroid Build Coastguard Worker // Make vendor variants only for the versions in BOARD_VNDK_VERSION and 348*333d2b36SAndroid Build Coastguard Worker // PRODUCT_EXTRA_VNDK_VERSIONS. 349*333d2b36SAndroid Build Coastguard Worker if m.InstallInRecovery() { 350*333d2b36SAndroid Build Coastguard Worker recoveryVariantNeeded = true 351*333d2b36SAndroid Build Coastguard Worker } else { 352*333d2b36SAndroid Build Coastguard Worker m.AppendExtraVariant(VendorVariationPrefix + m.SnapshotVersion(mctx)) 353*333d2b36SAndroid Build Coastguard Worker } 354*333d2b36SAndroid Build Coastguard Worker } else if m.HasNonSystemVariants() { 355*333d2b36SAndroid Build Coastguard Worker // This will be available to /system unless it is product_specific 356*333d2b36SAndroid Build Coastguard Worker // which will be handled later. 357*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = true 358*333d2b36SAndroid Build Coastguard Worker 359*333d2b36SAndroid Build Coastguard Worker // We assume that modules under proprietary paths are compatible for 360*333d2b36SAndroid Build Coastguard Worker // BOARD_VNDK_VERSION. The other modules are regarded as AOSP, or 361*333d2b36SAndroid Build Coastguard Worker // PLATFORM_VNDK_VERSION. 362*333d2b36SAndroid Build Coastguard Worker if m.HasVendorVariant() { 363*333d2b36SAndroid Build Coastguard Worker vendorVariantNeeded = true 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker // product_available modules are available to /product. 367*333d2b36SAndroid Build Coastguard Worker if m.HasProductVariant() { 368*333d2b36SAndroid Build Coastguard Worker productVariantNeeded = true 369*333d2b36SAndroid Build Coastguard Worker } 370*333d2b36SAndroid Build Coastguard Worker } else if vendorSpecific { 371*333d2b36SAndroid Build Coastguard Worker // This will be available in /vendor (or /odm) only 372*333d2b36SAndroid Build Coastguard Worker vendorVariantNeeded = true 373*333d2b36SAndroid Build Coastguard Worker } else { 374*333d2b36SAndroid Build Coastguard Worker // This is either in /system (or similar: /data), or is a 375*333d2b36SAndroid Build Coastguard Worker // module built with the NDK. Modules built with the NDK 376*333d2b36SAndroid Build Coastguard Worker // will be restricted using the existing link type checks. 377*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = true 378*333d2b36SAndroid Build Coastguard Worker } 379*333d2b36SAndroid Build Coastguard Worker 380*333d2b36SAndroid Build Coastguard Worker if coreVariantNeeded && productSpecific { 381*333d2b36SAndroid Build Coastguard Worker // The module has "product_specific: true" that does not create core variant. 382*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = false 383*333d2b36SAndroid Build Coastguard Worker productVariantNeeded = true 384*333d2b36SAndroid Build Coastguard Worker } 385*333d2b36SAndroid Build Coastguard Worker 386*333d2b36SAndroid Build Coastguard Worker if m.RamdiskAvailable() { 387*333d2b36SAndroid Build Coastguard Worker ramdiskVariantNeeded = true 388*333d2b36SAndroid Build Coastguard Worker } 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker if m.AndroidModuleBase().InstallInRamdisk() { 391*333d2b36SAndroid Build Coastguard Worker ramdiskVariantNeeded = true 392*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = false 393*333d2b36SAndroid Build Coastguard Worker } 394*333d2b36SAndroid Build Coastguard Worker 395*333d2b36SAndroid Build Coastguard Worker if m.VendorRamdiskAvailable() { 396*333d2b36SAndroid Build Coastguard Worker vendorRamdiskVariantNeeded = true 397*333d2b36SAndroid Build Coastguard Worker } 398*333d2b36SAndroid Build Coastguard Worker 399*333d2b36SAndroid Build Coastguard Worker if m.AndroidModuleBase().InstallInVendorRamdisk() { 400*333d2b36SAndroid Build Coastguard Worker vendorRamdiskVariantNeeded = true 401*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = false 402*333d2b36SAndroid Build Coastguard Worker } 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Worker if m.RecoveryAvailable() { 405*333d2b36SAndroid Build Coastguard Worker recoveryVariantNeeded = true 406*333d2b36SAndroid Build Coastguard Worker } 407*333d2b36SAndroid Build Coastguard Worker 408*333d2b36SAndroid Build Coastguard Worker if m.AndroidModuleBase().InstallInRecovery() { 409*333d2b36SAndroid Build Coastguard Worker recoveryVariantNeeded = true 410*333d2b36SAndroid Build Coastguard Worker coreVariantNeeded = false 411*333d2b36SAndroid Build Coastguard Worker } 412*333d2b36SAndroid Build Coastguard Worker 413*333d2b36SAndroid Build Coastguard Worker m.SetRamdiskVariantNeeded(ramdiskVariantNeeded) 414*333d2b36SAndroid Build Coastguard Worker m.SetVendorRamdiskVariantNeeded(vendorRamdiskVariantNeeded) 415*333d2b36SAndroid Build Coastguard Worker m.SetRecoveryVariantNeeded(recoveryVariantNeeded) 416*333d2b36SAndroid Build Coastguard Worker m.SetCoreVariantNeeded(coreVariantNeeded) 417*333d2b36SAndroid Build Coastguard Worker m.SetProductVariantNeeded(productVariantNeeded) 418*333d2b36SAndroid Build Coastguard Worker m.SetVendorVariantNeeded(vendorVariantNeeded) 419*333d2b36SAndroid Build Coastguard Worker 420*333d2b36SAndroid Build Coastguard Worker // Disable the module if no variants are needed. 421*333d2b36SAndroid Build Coastguard Worker if !ramdiskVariantNeeded && 422*333d2b36SAndroid Build Coastguard Worker !recoveryVariantNeeded && 423*333d2b36SAndroid Build Coastguard Worker !coreVariantNeeded && 424*333d2b36SAndroid Build Coastguard Worker !productVariantNeeded && 425*333d2b36SAndroid Build Coastguard Worker !vendorVariantNeeded && 426*333d2b36SAndroid Build Coastguard Worker len(m.ExtraVariants()) == 0 { 427*333d2b36SAndroid Build Coastguard Worker m.Disable() 428*333d2b36SAndroid Build Coastguard Worker } 429*333d2b36SAndroid Build Coastguard Worker} 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool { 432*333d2b36SAndroid Build Coastguard Worker return c.Properties.VendorVariantNeeded 433*333d2b36SAndroid Build Coastguard Worker} 434*333d2b36SAndroid Build Coastguard Worker 435*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool { 436*333d2b36SAndroid Build Coastguard Worker return c.Properties.ProductVariantNeeded 437*333d2b36SAndroid Build Coastguard Worker} 438*333d2b36SAndroid Build Coastguard Worker 439*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool { 440*333d2b36SAndroid Build Coastguard Worker return c.Properties.CoreVariantNeeded 441*333d2b36SAndroid Build Coastguard Worker} 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 444*333d2b36SAndroid Build Coastguard Worker return c.Properties.RamdiskVariantNeeded 445*333d2b36SAndroid Build Coastguard Worker} 446*333d2b36SAndroid Build Coastguard Worker 447*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 448*333d2b36SAndroid Build Coastguard Worker return c.Properties.VendorRamdiskVariantNeeded 449*333d2b36SAndroid Build Coastguard Worker} 450*333d2b36SAndroid Build Coastguard Worker 451*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 452*333d2b36SAndroid Build Coastguard Worker return false 453*333d2b36SAndroid Build Coastguard Worker} 454*333d2b36SAndroid Build Coastguard Worker 455*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RecoveryVariantNeeded(ctx android.ImageInterfaceContext) bool { 456*333d2b36SAndroid Build Coastguard Worker return c.Properties.RecoveryVariantNeeded 457*333d2b36SAndroid Build Coastguard Worker} 458*333d2b36SAndroid Build Coastguard Worker 459*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ExtraImageVariations(ctx android.ImageInterfaceContext) []string { 460*333d2b36SAndroid Build Coastguard Worker return c.Properties.ExtraVersionedImageVariations 461*333d2b36SAndroid Build Coastguard Worker} 462*333d2b36SAndroid Build Coastguard Worker 463*333d2b36SAndroid Build Coastguard Workerfunc squashVendorSrcs(m *Module) { 464*333d2b36SAndroid Build Coastguard Worker if lib, ok := m.compiler.(*libraryDecorator); ok { 465*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Vendor.Srcs) 466*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs) 467*333d2b36SAndroid Build Coastguard Worker 468*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources, 469*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...) 470*333d2b36SAndroid Build Coastguard Worker 471*333d2b36SAndroid Build Coastguard Worker if lib.Properties.Target.Vendor.No_stubs { 472*333d2b36SAndroid Build Coastguard Worker proptools.Clear(&lib.Properties.Stubs) 473*333d2b36SAndroid Build Coastguard Worker } 474*333d2b36SAndroid Build Coastguard Worker } 475*333d2b36SAndroid Build Coastguard Worker} 476*333d2b36SAndroid Build Coastguard Worker 477*333d2b36SAndroid Build Coastguard Workerfunc squashProductSrcs(m *Module) { 478*333d2b36SAndroid Build Coastguard Worker if lib, ok := m.compiler.(*libraryDecorator); ok { 479*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Product.Srcs) 480*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Product.Exclude_srcs) 481*333d2b36SAndroid Build Coastguard Worker 482*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources, 483*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Target.Product.Exclude_generated_sources...) 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker if lib.Properties.Target.Product.No_stubs { 486*333d2b36SAndroid Build Coastguard Worker proptools.Clear(&lib.Properties.Stubs) 487*333d2b36SAndroid Build Coastguard Worker } 488*333d2b36SAndroid Build Coastguard Worker } 489*333d2b36SAndroid Build Coastguard Worker} 490*333d2b36SAndroid Build Coastguard Worker 491*333d2b36SAndroid Build Coastguard Workerfunc squashRecoverySrcs(m *Module) { 492*333d2b36SAndroid Build Coastguard Worker if lib, ok := m.compiler.(*libraryDecorator); ok { 493*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Recovery.Srcs) 494*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs) 495*333d2b36SAndroid Build Coastguard Worker 496*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources, 497*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...) 498*333d2b36SAndroid Build Coastguard Worker } 499*333d2b36SAndroid Build Coastguard Worker} 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Workerfunc squashVendorRamdiskSrcs(m *Module) { 502*333d2b36SAndroid Build Coastguard Worker if lib, ok := m.compiler.(*libraryDecorator); ok { 503*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Vendor_ramdisk.Exclude_srcs) 504*333d2b36SAndroid Build Coastguard Worker } 505*333d2b36SAndroid Build Coastguard Worker} 506*333d2b36SAndroid Build Coastguard Worker 507*333d2b36SAndroid Build Coastguard Workerfunc squashRamdiskSrcs(m *Module) { 508*333d2b36SAndroid Build Coastguard Worker if lib, ok := m.compiler.(*libraryDecorator); ok { 509*333d2b36SAndroid Build Coastguard Worker lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Ramdisk.Exclude_srcs) 510*333d2b36SAndroid Build Coastguard Worker } 511*333d2b36SAndroid Build Coastguard Worker} 512*333d2b36SAndroid Build Coastguard Worker 513*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetImageVariation(ctx android.ImageInterfaceContext, variant string) { 514*333d2b36SAndroid Build Coastguard Worker if variant == android.RamdiskVariation { 515*333d2b36SAndroid Build Coastguard Worker c.MakeAsPlatform() 516*333d2b36SAndroid Build Coastguard Worker squashRamdiskSrcs(c) 517*333d2b36SAndroid Build Coastguard Worker } else if variant == android.VendorRamdiskVariation { 518*333d2b36SAndroid Build Coastguard Worker c.MakeAsPlatform() 519*333d2b36SAndroid Build Coastguard Worker squashVendorRamdiskSrcs(c) 520*333d2b36SAndroid Build Coastguard Worker } else if variant == android.RecoveryVariation { 521*333d2b36SAndroid Build Coastguard Worker c.MakeAsPlatform() 522*333d2b36SAndroid Build Coastguard Worker squashRecoverySrcs(c) 523*333d2b36SAndroid Build Coastguard Worker } else if strings.HasPrefix(variant, android.VendorVariation) { 524*333d2b36SAndroid Build Coastguard Worker c.Properties.ImageVariation = android.VendorVariation 525*333d2b36SAndroid Build Coastguard Worker 526*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(variant, VendorVariationPrefix) { 527*333d2b36SAndroid Build Coastguard Worker c.Properties.VndkVersion = strings.TrimPrefix(variant, VendorVariationPrefix) 528*333d2b36SAndroid Build Coastguard Worker } 529*333d2b36SAndroid Build Coastguard Worker squashVendorSrcs(c) 530*333d2b36SAndroid Build Coastguard Worker } else if strings.HasPrefix(variant, android.ProductVariation) { 531*333d2b36SAndroid Build Coastguard Worker c.Properties.ImageVariation = android.ProductVariation 532*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(variant, ProductVariationPrefix) { 533*333d2b36SAndroid Build Coastguard Worker c.Properties.VndkVersion = strings.TrimPrefix(variant, ProductVariationPrefix) 534*333d2b36SAndroid Build Coastguard Worker } 535*333d2b36SAndroid Build Coastguard Worker squashProductSrcs(c) 536*333d2b36SAndroid Build Coastguard Worker } 537*333d2b36SAndroid Build Coastguard Worker 538*333d2b36SAndroid Build Coastguard Worker if c.NeedsVendorPublicLibraryVariants() && 539*333d2b36SAndroid Build Coastguard Worker (variant == android.CoreVariation || strings.HasPrefix(variant, ProductVariationPrefix)) { 540*333d2b36SAndroid Build Coastguard Worker c.VendorProperties.IsVendorPublicLibrary = true 541*333d2b36SAndroid Build Coastguard Worker } 542*333d2b36SAndroid Build Coastguard Worker} 543