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