1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 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 "fmt" 19*333d2b36SAndroid Build Coastguard Worker "strconv" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/bloaty" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 25*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 26*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 29*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 30*333d2b36SAndroid Build Coastguard Worker cc_config "android/soong/cc/config" 31*333d2b36SAndroid Build Coastguard Worker "android/soong/fuzz" 32*333d2b36SAndroid Build Coastguard Worker "android/soong/rust/config" 33*333d2b36SAndroid Build Coastguard Worker) 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workervar pctx = android.NewPackageContext("android/soong/rust") 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerfunc init() { 38*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_defaults", defaultsFactory) 39*333d2b36SAndroid Build Coastguard Worker android.PreDepsMutators(registerPreDepsMutators) 40*333d2b36SAndroid Build Coastguard Worker android.PostDepsMutators(registerPostDepsMutators) 41*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/android") 42*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/rust/config") 43*333d2b36SAndroid Build Coastguard Worker pctx.ImportAs("cc_config", "android/soong/cc/config") 44*333d2b36SAndroid Build Coastguard Worker android.InitRegistrationContext.RegisterParallelSingletonType("kythe_rust_extract", kytheExtractRustFactory) 45*333d2b36SAndroid Build Coastguard Worker} 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Workerfunc registerPreDepsMutators(ctx android.RegisterMutatorsContext) { 48*333d2b36SAndroid Build Coastguard Worker ctx.Transition("rust_libraries", &libraryTransitionMutator{}) 49*333d2b36SAndroid Build Coastguard Worker ctx.Transition("rust_stdlinkage", &libstdTransitionMutator{}) 50*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("rust_begin", BeginMutator) 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workerfunc registerPostDepsMutators(ctx android.RegisterMutatorsContext) { 54*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("rust_sanitizers", rustSanitizerRuntimeMutator) 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workertype Flags struct { 58*333d2b36SAndroid Build Coastguard Worker GlobalRustFlags []string // Flags that apply globally to rust 59*333d2b36SAndroid Build Coastguard Worker GlobalLinkFlags []string // Flags that apply globally to linker 60*333d2b36SAndroid Build Coastguard Worker RustFlags []string // Flags that apply to rust 61*333d2b36SAndroid Build Coastguard Worker LinkFlags []string // Flags that apply to linker 62*333d2b36SAndroid Build Coastguard Worker ClippyFlags []string // Flags that apply to clippy-driver, during the linting 63*333d2b36SAndroid Build Coastguard Worker RustdocFlags []string // Flags that apply to rustdoc 64*333d2b36SAndroid Build Coastguard Worker Toolchain config.Toolchain 65*333d2b36SAndroid Build Coastguard Worker Coverage bool 66*333d2b36SAndroid Build Coastguard Worker Clippy bool 67*333d2b36SAndroid Build Coastguard Worker EmitXrefs bool // If true, emit rules to aid cross-referencing 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workertype BaseProperties struct { 71*333d2b36SAndroid Build Coastguard Worker AndroidMkRlibs []string `blueprint:"mutated"` 72*333d2b36SAndroid Build Coastguard Worker AndroidMkDylibs []string `blueprint:"mutated"` 73*333d2b36SAndroid Build Coastguard Worker AndroidMkProcMacroLibs []string `blueprint:"mutated"` 74*333d2b36SAndroid Build Coastguard Worker AndroidMkStaticLibs []string `blueprint:"mutated"` 75*333d2b36SAndroid Build Coastguard Worker AndroidMkHeaderLibs []string `blueprint:"mutated"` 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker ImageVariation string `blueprint:"mutated"` 78*333d2b36SAndroid Build Coastguard Worker VndkVersion string `blueprint:"mutated"` 79*333d2b36SAndroid Build Coastguard Worker SubName string `blueprint:"mutated"` 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker // SubName is used by CC for tracking image variants / SDK versions. RustSubName is used for Rust-specific 82*333d2b36SAndroid Build Coastguard Worker // subnaming which shouldn't be visible to CC modules (such as the rlib stdlinkage subname). This should be 83*333d2b36SAndroid Build Coastguard Worker // appended before SubName. 84*333d2b36SAndroid Build Coastguard Worker RustSubName string `blueprint:"mutated"` 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker // Set by imageMutator 87*333d2b36SAndroid Build Coastguard Worker ProductVariantNeeded bool `blueprint:"mutated"` 88*333d2b36SAndroid Build Coastguard Worker VendorVariantNeeded bool `blueprint:"mutated"` 89*333d2b36SAndroid Build Coastguard Worker CoreVariantNeeded bool `blueprint:"mutated"` 90*333d2b36SAndroid Build Coastguard Worker VendorRamdiskVariantNeeded bool `blueprint:"mutated"` 91*333d2b36SAndroid Build Coastguard Worker RamdiskVariantNeeded bool `blueprint:"mutated"` 92*333d2b36SAndroid Build Coastguard Worker RecoveryVariantNeeded bool `blueprint:"mutated"` 93*333d2b36SAndroid Build Coastguard Worker ExtraVariants []string `blueprint:"mutated"` 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker // Allows this module to use non-APEX version of libraries. Useful 96*333d2b36SAndroid Build Coastguard Worker // for building binaries that are started before APEXes are activated. 97*333d2b36SAndroid Build Coastguard Worker Bootstrap *bool 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker // Used by vendor snapshot to record dependencies from snapshot modules. 100*333d2b36SAndroid Build Coastguard Worker SnapshotSharedLibs []string `blueprint:"mutated"` 101*333d2b36SAndroid Build Coastguard Worker SnapshotStaticLibs []string `blueprint:"mutated"` 102*333d2b36SAndroid Build Coastguard Worker SnapshotRlibs []string `blueprint:"mutated"` 103*333d2b36SAndroid Build Coastguard Worker SnapshotDylibs []string `blueprint:"mutated"` 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for ramdisk. 106*333d2b36SAndroid Build Coastguard Worker // On device without a dedicated recovery partition, the module is only 107*333d2b36SAndroid Build Coastguard Worker // available after switching root into 108*333d2b36SAndroid Build Coastguard Worker // /first_stage_ramdisk. To expose the module before switching root, install 109*333d2b36SAndroid Build Coastguard Worker // the recovery variant instead. 110*333d2b36SAndroid Build Coastguard Worker Ramdisk_available *bool 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for vendor ramdisk. 113*333d2b36SAndroid Build Coastguard Worker // On device without a dedicated recovery partition, the module is only 114*333d2b36SAndroid Build Coastguard Worker // available after switching root into 115*333d2b36SAndroid Build Coastguard Worker // /first_stage_ramdisk. To expose the module before switching root, install 116*333d2b36SAndroid Build Coastguard Worker // the recovery variant instead 117*333d2b36SAndroid Build Coastguard Worker Vendor_ramdisk_available *bool 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker // Normally Soong uses the directory structure to decide which modules 120*333d2b36SAndroid Build Coastguard Worker // should be included (framework) or excluded (non-framework) from the 121*333d2b36SAndroid Build Coastguard Worker // different snapshots (vendor, recovery, etc.), but this property 122*333d2b36SAndroid Build Coastguard Worker // allows a partner to exclude a module normally thought of as a 123*333d2b36SAndroid Build Coastguard Worker // framework module from the vendor snapshot. 124*333d2b36SAndroid Build Coastguard Worker Exclude_from_vendor_snapshot *bool 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker // Normally Soong uses the directory structure to decide which modules 127*333d2b36SAndroid Build Coastguard Worker // should be included (framework) or excluded (non-framework) from the 128*333d2b36SAndroid Build Coastguard Worker // different snapshots (vendor, recovery, etc.), but this property 129*333d2b36SAndroid Build Coastguard Worker // allows a partner to exclude a module normally thought of as a 130*333d2b36SAndroid Build Coastguard Worker // framework module from the recovery snapshot. 131*333d2b36SAndroid Build Coastguard Worker Exclude_from_recovery_snapshot *bool 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for recovery 134*333d2b36SAndroid Build Coastguard Worker Recovery_available *bool 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX). 137*333d2b36SAndroid Build Coastguard Worker Min_sdk_version *string 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker HideFromMake bool `blueprint:"mutated"` 140*333d2b36SAndroid Build Coastguard Worker PreventInstall bool `blueprint:"mutated"` 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Worker Installable *bool 143*333d2b36SAndroid Build Coastguard Worker} 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Workertype Module struct { 146*333d2b36SAndroid Build Coastguard Worker fuzz.FuzzModule 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker VendorProperties cc.VendorProperties 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker Properties BaseProperties 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker hod android.HostOrDeviceSupported 153*333d2b36SAndroid Build Coastguard Worker multilib android.Multilib 154*333d2b36SAndroid Build Coastguard Worker testModule bool 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker makeLinkType string 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker afdo *afdo 159*333d2b36SAndroid Build Coastguard Worker compiler compiler 160*333d2b36SAndroid Build Coastguard Worker coverage *coverage 161*333d2b36SAndroid Build Coastguard Worker clippy *clippy 162*333d2b36SAndroid Build Coastguard Worker sanitize *sanitize 163*333d2b36SAndroid Build Coastguard Worker cachedToolchain config.Toolchain 164*333d2b36SAndroid Build Coastguard Worker sourceProvider SourceProvider 165*333d2b36SAndroid Build Coastguard Worker subAndroidMkOnce map[SubAndroidMkProvider]bool 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker exportedLinkDirs []string 168*333d2b36SAndroid Build Coastguard Worker 169*333d2b36SAndroid Build Coastguard Worker // Output file to be installed, may be stripped or unstripped. 170*333d2b36SAndroid Build Coastguard Worker outputFile android.OptionalPath 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker // Cross-reference input file 173*333d2b36SAndroid Build Coastguard Worker kytheFiles android.Paths 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker docTimestampFile android.OptionalPath 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker // For apex variants, this is set as apex.min_sdk_version 180*333d2b36SAndroid Build Coastguard Worker apexSdkVersion android.ApiLevel 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker transitiveAndroidMkSharedLibs depset.DepSet[string] 183*333d2b36SAndroid Build Coastguard Worker} 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Header() bool { 186*333d2b36SAndroid Build Coastguard Worker //TODO: If Rust libraries provide header variants, this needs to be updated. 187*333d2b36SAndroid Build Coastguard Worker return false 188*333d2b36SAndroid Build Coastguard Worker} 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetPreventInstall() { 191*333d2b36SAndroid Build Coastguard Worker mod.Properties.PreventInstall = true 192*333d2b36SAndroid Build Coastguard Worker} 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetHideFromMake() { 195*333d2b36SAndroid Build Coastguard Worker mod.Properties.HideFromMake = true 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HiddenFromMake() bool { 199*333d2b36SAndroid Build Coastguard Worker return mod.Properties.HideFromMake 200*333d2b36SAndroid Build Coastguard Worker} 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SanitizePropDefined() bool { 203*333d2b36SAndroid Build Coastguard Worker // Because compiler is not set for some Rust modules where sanitize might be set, check that compiler is also not 204*333d2b36SAndroid Build Coastguard Worker // nil since we need compiler to actually sanitize. 205*333d2b36SAndroid Build Coastguard Worker return mod.sanitize != nil && mod.compiler != nil 206*333d2b36SAndroid Build Coastguard Worker} 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsPrebuilt() bool { 209*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.compiler.(*prebuiltLibraryDecorator); ok { 210*333d2b36SAndroid Build Coastguard Worker return true 211*333d2b36SAndroid Build Coastguard Worker } 212*333d2b36SAndroid Build Coastguard Worker return false 213*333d2b36SAndroid Build Coastguard Worker} 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SelectedStl() string { 216*333d2b36SAndroid Build Coastguard Worker return "" 217*333d2b36SAndroid Build Coastguard Worker} 218*333d2b36SAndroid Build Coastguard Worker 219*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) NonCcVariants() bool { 220*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 221*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 222*333d2b36SAndroid Build Coastguard Worker return library.buildRlib() || library.buildDylib() 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("NonCcVariants called on non-library module: %q", mod.BaseModuleName())) 226*333d2b36SAndroid Build Coastguard Worker} 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Static() bool { 229*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 230*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 231*333d2b36SAndroid Build Coastguard Worker return library.static() 232*333d2b36SAndroid Build Coastguard Worker } 233*333d2b36SAndroid Build Coastguard Worker } 234*333d2b36SAndroid Build Coastguard Worker return false 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Shared() bool { 238*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 239*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 240*333d2b36SAndroid Build Coastguard Worker return library.shared() 241*333d2b36SAndroid Build Coastguard Worker } 242*333d2b36SAndroid Build Coastguard Worker } 243*333d2b36SAndroid Build Coastguard Worker return false 244*333d2b36SAndroid Build Coastguard Worker} 245*333d2b36SAndroid Build Coastguard Worker 246*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Dylib() bool { 247*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 248*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 249*333d2b36SAndroid Build Coastguard Worker return library.dylib() 250*333d2b36SAndroid Build Coastguard Worker } 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker return false 253*333d2b36SAndroid Build Coastguard Worker} 254*333d2b36SAndroid Build Coastguard Worker 255*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Source() bool { 256*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 257*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok && mod.sourceProvider != nil { 258*333d2b36SAndroid Build Coastguard Worker return library.source() 259*333d2b36SAndroid Build Coastguard Worker } 260*333d2b36SAndroid Build Coastguard Worker } 261*333d2b36SAndroid Build Coastguard Worker return false 262*333d2b36SAndroid Build Coastguard Worker} 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RlibStd() bool { 265*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 266*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok && library.rlib() { 267*333d2b36SAndroid Build Coastguard Worker return library.rlibStd() 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker } 270*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("RlibStd() called on non-rlib module: %q", mod.BaseModuleName())) 271*333d2b36SAndroid Build Coastguard Worker} 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Rlib() bool { 274*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 275*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 276*333d2b36SAndroid Build Coastguard Worker return library.rlib() 277*333d2b36SAndroid Build Coastguard Worker } 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker return false 280*333d2b36SAndroid Build Coastguard Worker} 281*333d2b36SAndroid Build Coastguard Worker 282*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Binary() bool { 283*333d2b36SAndroid Build Coastguard Worker if binary, ok := mod.compiler.(binaryInterface); ok { 284*333d2b36SAndroid Build Coastguard Worker return binary.binary() 285*333d2b36SAndroid Build Coastguard Worker } 286*333d2b36SAndroid Build Coastguard Worker return false 287*333d2b36SAndroid Build Coastguard Worker} 288*333d2b36SAndroid Build Coastguard Worker 289*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) StaticExecutable() bool { 290*333d2b36SAndroid Build Coastguard Worker if !mod.Binary() { 291*333d2b36SAndroid Build Coastguard Worker return false 292*333d2b36SAndroid Build Coastguard Worker } 293*333d2b36SAndroid Build Coastguard Worker return mod.StaticallyLinked() 294*333d2b36SAndroid Build Coastguard Worker} 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ApexExclude() bool { 297*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 298*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 299*333d2b36SAndroid Build Coastguard Worker return library.apexExclude() 300*333d2b36SAndroid Build Coastguard Worker } 301*333d2b36SAndroid Build Coastguard Worker } 302*333d2b36SAndroid Build Coastguard Worker return false 303*333d2b36SAndroid Build Coastguard Worker} 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Object() bool { 306*333d2b36SAndroid Build Coastguard Worker // Rust has no modules which produce only object files. 307*333d2b36SAndroid Build Coastguard Worker return false 308*333d2b36SAndroid Build Coastguard Worker} 309*333d2b36SAndroid Build Coastguard Worker 310*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Toc() android.OptionalPath { 311*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 312*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(libraryInterface); ok { 313*333d2b36SAndroid Build Coastguard Worker return lib.toc() 314*333d2b36SAndroid Build Coastguard Worker } 315*333d2b36SAndroid Build Coastguard Worker } 316*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Toc() called on non-library module: %q", mod.BaseModuleName())) 317*333d2b36SAndroid Build Coastguard Worker} 318*333d2b36SAndroid Build Coastguard Worker 319*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) UseSdk() bool { 320*333d2b36SAndroid Build Coastguard Worker return false 321*333d2b36SAndroid Build Coastguard Worker} 322*333d2b36SAndroid Build Coastguard Worker 323*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RelativeInstallPath() string { 324*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 325*333d2b36SAndroid Build Coastguard Worker return mod.compiler.relativeInstallPath() 326*333d2b36SAndroid Build Coastguard Worker } 327*333d2b36SAndroid Build Coastguard Worker return "" 328*333d2b36SAndroid Build Coastguard Worker} 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) UseVndk() bool { 331*333d2b36SAndroid Build Coastguard Worker return mod.Properties.VndkVersion != "" 332*333d2b36SAndroid Build Coastguard Worker} 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Bootstrap() bool { 335*333d2b36SAndroid Build Coastguard Worker return Bool(mod.Properties.Bootstrap) 336*333d2b36SAndroid Build Coastguard Worker} 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SubName() string { 339*333d2b36SAndroid Build Coastguard Worker return mod.Properties.SubName 340*333d2b36SAndroid Build Coastguard Worker} 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsVndkPrebuiltLibrary() bool { 343*333d2b36SAndroid Build Coastguard Worker // Rust modules do not provide VNDK prebuilts 344*333d2b36SAndroid Build Coastguard Worker return false 345*333d2b36SAndroid Build Coastguard Worker} 346*333d2b36SAndroid Build Coastguard Worker 347*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsVendorPublicLibrary() bool { 348*333d2b36SAndroid Build Coastguard Worker return mod.VendorProperties.IsVendorPublicLibrary 349*333d2b36SAndroid Build Coastguard Worker} 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SdkAndPlatformVariantVisibleToMake() bool { 352*333d2b36SAndroid Build Coastguard Worker // Rust modules to not provide Sdk variants 353*333d2b36SAndroid Build Coastguard Worker return false 354*333d2b36SAndroid Build Coastguard Worker} 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsVndkPrivate() bool { 357*333d2b36SAndroid Build Coastguard Worker return false 358*333d2b36SAndroid Build Coastguard Worker} 359*333d2b36SAndroid Build Coastguard Worker 360*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsLlndk() bool { 361*333d2b36SAndroid Build Coastguard Worker return false 362*333d2b36SAndroid Build Coastguard Worker} 363*333d2b36SAndroid Build Coastguard Worker 364*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) KernelHeadersDecorator() bool { 365*333d2b36SAndroid Build Coastguard Worker return false 366*333d2b36SAndroid Build Coastguard Worker} 367*333d2b36SAndroid Build Coastguard Worker 368*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsLlndkVariants() bool { 369*333d2b36SAndroid Build Coastguard Worker return false 370*333d2b36SAndroid Build Coastguard Worker} 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsVendorPublicLibraryVariants() bool { 373*333d2b36SAndroid Build Coastguard Worker return false 374*333d2b36SAndroid Build Coastguard Worker} 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasLlndkStubs() bool { 377*333d2b36SAndroid Build Coastguard Worker return false 378*333d2b36SAndroid Build Coastguard Worker} 379*333d2b36SAndroid Build Coastguard Worker 380*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) StubsVersion() string { 381*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", mod.BaseModuleName())) 382*333d2b36SAndroid Build Coastguard Worker} 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SdkVersion() string { 385*333d2b36SAndroid Build Coastguard Worker return "" 386*333d2b36SAndroid Build Coastguard Worker} 387*333d2b36SAndroid Build Coastguard Worker 388*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) AlwaysSdk() bool { 389*333d2b36SAndroid Build Coastguard Worker return false 390*333d2b36SAndroid Build Coastguard Worker} 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsSdkVariant() bool { 393*333d2b36SAndroid Build Coastguard Worker return false 394*333d2b36SAndroid Build Coastguard Worker} 395*333d2b36SAndroid Build Coastguard Worker 396*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SplitPerApiLevel() bool { 397*333d2b36SAndroid Build Coastguard Worker return false 398*333d2b36SAndroid Build Coastguard Worker} 399*333d2b36SAndroid Build Coastguard Worker 400*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) XrefRustFiles() android.Paths { 401*333d2b36SAndroid Build Coastguard Worker return mod.kytheFiles 402*333d2b36SAndroid Build Coastguard Worker} 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Workertype Deps struct { 405*333d2b36SAndroid Build Coastguard Worker Dylibs []string 406*333d2b36SAndroid Build Coastguard Worker Rlibs []string 407*333d2b36SAndroid Build Coastguard Worker Rustlibs []string 408*333d2b36SAndroid Build Coastguard Worker Stdlibs []string 409*333d2b36SAndroid Build Coastguard Worker ProcMacros []string 410*333d2b36SAndroid Build Coastguard Worker SharedLibs []string 411*333d2b36SAndroid Build Coastguard Worker StaticLibs []string 412*333d2b36SAndroid Build Coastguard Worker WholeStaticLibs []string 413*333d2b36SAndroid Build Coastguard Worker HeaderLibs []string 414*333d2b36SAndroid Build Coastguard Worker 415*333d2b36SAndroid Build Coastguard Worker // Used for data dependencies adjacent to tests 416*333d2b36SAndroid Build Coastguard Worker DataLibs []string 417*333d2b36SAndroid Build Coastguard Worker DataBins []string 418*333d2b36SAndroid Build Coastguard Worker 419*333d2b36SAndroid Build Coastguard Worker CrtBegin, CrtEnd []string 420*333d2b36SAndroid Build Coastguard Worker} 421*333d2b36SAndroid Build Coastguard Worker 422*333d2b36SAndroid Build Coastguard Workertype PathDeps struct { 423*333d2b36SAndroid Build Coastguard Worker DyLibs RustLibraries 424*333d2b36SAndroid Build Coastguard Worker RLibs RustLibraries 425*333d2b36SAndroid Build Coastguard Worker SharedLibs android.Paths 426*333d2b36SAndroid Build Coastguard Worker SharedLibDeps android.Paths 427*333d2b36SAndroid Build Coastguard Worker StaticLibs android.Paths 428*333d2b36SAndroid Build Coastguard Worker ProcMacros RustLibraries 429*333d2b36SAndroid Build Coastguard Worker AfdoProfiles android.Paths 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker // depFlags and depLinkFlags are rustc and linker (clang) flags. 432*333d2b36SAndroid Build Coastguard Worker depFlags []string 433*333d2b36SAndroid Build Coastguard Worker depLinkFlags []string 434*333d2b36SAndroid Build Coastguard Worker 435*333d2b36SAndroid Build Coastguard Worker // linkDirs are link paths passed via -L to rustc. linkObjects are objects passed directly to the linker 436*333d2b36SAndroid Build Coastguard Worker // Both of these are exported and propagate to dependencies. 437*333d2b36SAndroid Build Coastguard Worker linkDirs []string 438*333d2b36SAndroid Build Coastguard Worker linkObjects []string 439*333d2b36SAndroid Build Coastguard Worker 440*333d2b36SAndroid Build Coastguard Worker // exportedLinkDirs are exported linkDirs for direct rlib dependencies to 441*333d2b36SAndroid Build Coastguard Worker // cc_library_static dependants of rlibs. 442*333d2b36SAndroid Build Coastguard Worker // Track them separately from linkDirs so superfluous -L flags don't get emitted. 443*333d2b36SAndroid Build Coastguard Worker exportedLinkDirs []string 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker // Used by bindgen modules which call clang 446*333d2b36SAndroid Build Coastguard Worker depClangFlags []string 447*333d2b36SAndroid Build Coastguard Worker depIncludePaths android.Paths 448*333d2b36SAndroid Build Coastguard Worker depGeneratedHeaders android.Paths 449*333d2b36SAndroid Build Coastguard Worker depSystemIncludePaths android.Paths 450*333d2b36SAndroid Build Coastguard Worker 451*333d2b36SAndroid Build Coastguard Worker CrtBegin android.Paths 452*333d2b36SAndroid Build Coastguard Worker CrtEnd android.Paths 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Worker // Paths to generated source files 455*333d2b36SAndroid Build Coastguard Worker SrcDeps android.Paths 456*333d2b36SAndroid Build Coastguard Worker srcProviderFiles android.Paths 457*333d2b36SAndroid Build Coastguard Worker 458*333d2b36SAndroid Build Coastguard Worker directImplementationDeps android.Paths 459*333d2b36SAndroid Build Coastguard Worker transitiveImplementationDeps []depset.DepSet[android.Path] 460*333d2b36SAndroid Build Coastguard Worker} 461*333d2b36SAndroid Build Coastguard Worker 462*333d2b36SAndroid Build Coastguard Workertype RustLibraries []RustLibrary 463*333d2b36SAndroid Build Coastguard Worker 464*333d2b36SAndroid Build Coastguard Workertype RustLibrary struct { 465*333d2b36SAndroid Build Coastguard Worker Path android.Path 466*333d2b36SAndroid Build Coastguard Worker CrateName string 467*333d2b36SAndroid Build Coastguard Worker} 468*333d2b36SAndroid Build Coastguard Worker 469*333d2b36SAndroid Build Coastguard Workertype exportedFlagsProducer interface { 470*333d2b36SAndroid Build Coastguard Worker exportLinkDirs(...string) 471*333d2b36SAndroid Build Coastguard Worker exportLinkObjects(...string) 472*333d2b36SAndroid Build Coastguard Worker} 473*333d2b36SAndroid Build Coastguard Worker 474*333d2b36SAndroid Build Coastguard Workertype xref interface { 475*333d2b36SAndroid Build Coastguard Worker XrefRustFiles() android.Paths 476*333d2b36SAndroid Build Coastguard Worker} 477*333d2b36SAndroid Build Coastguard Worker 478*333d2b36SAndroid Build Coastguard Workertype flagExporter struct { 479*333d2b36SAndroid Build Coastguard Worker linkDirs []string 480*333d2b36SAndroid Build Coastguard Worker ccLinkDirs []string 481*333d2b36SAndroid Build Coastguard Worker linkObjects []string 482*333d2b36SAndroid Build Coastguard Worker} 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Workerfunc (flagExporter *flagExporter) exportLinkDirs(dirs ...string) { 485*333d2b36SAndroid Build Coastguard Worker flagExporter.linkDirs = android.FirstUniqueStrings(append(flagExporter.linkDirs, dirs...)) 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Workerfunc (flagExporter *flagExporter) exportLinkObjects(flags ...string) { 489*333d2b36SAndroid Build Coastguard Worker flagExporter.linkObjects = android.FirstUniqueStrings(append(flagExporter.linkObjects, flags...)) 490*333d2b36SAndroid Build Coastguard Worker} 491*333d2b36SAndroid Build Coastguard Worker 492*333d2b36SAndroid Build Coastguard Workerfunc (flagExporter *flagExporter) setProvider(ctx ModuleContext) { 493*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, FlagExporterInfoProvider, FlagExporterInfo{ 494*333d2b36SAndroid Build Coastguard Worker LinkDirs: flagExporter.linkDirs, 495*333d2b36SAndroid Build Coastguard Worker LinkObjects: flagExporter.linkObjects, 496*333d2b36SAndroid Build Coastguard Worker }) 497*333d2b36SAndroid Build Coastguard Worker} 498*333d2b36SAndroid Build Coastguard Worker 499*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*flagExporter)(nil) 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Workerfunc NewFlagExporter() *flagExporter { 502*333d2b36SAndroid Build Coastguard Worker return &flagExporter{} 503*333d2b36SAndroid Build Coastguard Worker} 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Workertype FlagExporterInfo struct { 506*333d2b36SAndroid Build Coastguard Worker Flags []string 507*333d2b36SAndroid Build Coastguard Worker LinkDirs []string // TODO: this should be android.Paths 508*333d2b36SAndroid Build Coastguard Worker LinkObjects []string // TODO: this should be android.Paths 509*333d2b36SAndroid Build Coastguard Worker} 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Workervar FlagExporterInfoProvider = blueprint.NewProvider[FlagExporterInfo]() 512*333d2b36SAndroid Build Coastguard Worker 513*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) isCoverageVariant() bool { 514*333d2b36SAndroid Build Coastguard Worker return mod.coverage.Properties.IsCoverageVariant 515*333d2b36SAndroid Build Coastguard Worker} 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Workervar _ cc.Coverage = (*Module)(nil) 518*333d2b36SAndroid Build Coastguard Worker 519*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsNativeCoverageNeeded(ctx cc.IsNativeCoverageNeededContext) bool { 520*333d2b36SAndroid Build Coastguard Worker return mod.coverage != nil && mod.coverage.Properties.NeedCoverageVariant 521*333d2b36SAndroid Build Coastguard Worker} 522*333d2b36SAndroid Build Coastguard Worker 523*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) VndkVersion() string { 524*333d2b36SAndroid Build Coastguard Worker return mod.Properties.VndkVersion 525*333d2b36SAndroid Build Coastguard Worker} 526*333d2b36SAndroid Build Coastguard Worker 527*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ExportedCrateLinkDirs() []string { 528*333d2b36SAndroid Build Coastguard Worker return mod.exportedLinkDirs 529*333d2b36SAndroid Build Coastguard Worker} 530*333d2b36SAndroid Build Coastguard Worker 531*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) PreventInstall() bool { 532*333d2b36SAndroid Build Coastguard Worker return mod.Properties.PreventInstall 533*333d2b36SAndroid Build Coastguard Worker} 534*333d2b36SAndroid Build Coastguard Worker 535*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) MarkAsCoverageVariant(coverage bool) { 536*333d2b36SAndroid Build Coastguard Worker mod.coverage.Properties.IsCoverageVariant = coverage 537*333d2b36SAndroid Build Coastguard Worker} 538*333d2b36SAndroid Build Coastguard Worker 539*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) EnableCoverageIfNeeded() { 540*333d2b36SAndroid Build Coastguard Worker mod.coverage.Properties.CoverageEnabled = mod.coverage.Properties.NeedCoverageBuild 541*333d2b36SAndroid Build Coastguard Worker} 542*333d2b36SAndroid Build Coastguard Worker 543*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() android.Module { 544*333d2b36SAndroid Build Coastguard Worker return DefaultsFactory() 545*333d2b36SAndroid Build Coastguard Worker} 546*333d2b36SAndroid Build Coastguard Worker 547*333d2b36SAndroid Build Coastguard Workertype Defaults struct { 548*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 549*333d2b36SAndroid Build Coastguard Worker android.DefaultsModuleBase 550*333d2b36SAndroid Build Coastguard Worker} 551*333d2b36SAndroid Build Coastguard Worker 552*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory(props ...interface{}) android.Module { 553*333d2b36SAndroid Build Coastguard Worker module := &Defaults{} 554*333d2b36SAndroid Build Coastguard Worker 555*333d2b36SAndroid Build Coastguard Worker module.AddProperties(props...) 556*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 557*333d2b36SAndroid Build Coastguard Worker &BaseProperties{}, 558*333d2b36SAndroid Build Coastguard Worker &cc.AfdoProperties{}, 559*333d2b36SAndroid Build Coastguard Worker &cc.VendorProperties{}, 560*333d2b36SAndroid Build Coastguard Worker &BenchmarkProperties{}, 561*333d2b36SAndroid Build Coastguard Worker &BindgenProperties{}, 562*333d2b36SAndroid Build Coastguard Worker &BaseCompilerProperties{}, 563*333d2b36SAndroid Build Coastguard Worker &BinaryCompilerProperties{}, 564*333d2b36SAndroid Build Coastguard Worker &LibraryCompilerProperties{}, 565*333d2b36SAndroid Build Coastguard Worker &ProcMacroCompilerProperties{}, 566*333d2b36SAndroid Build Coastguard Worker &PrebuiltProperties{}, 567*333d2b36SAndroid Build Coastguard Worker &SourceProviderProperties{}, 568*333d2b36SAndroid Build Coastguard Worker &TestProperties{}, 569*333d2b36SAndroid Build Coastguard Worker &cc.CoverageProperties{}, 570*333d2b36SAndroid Build Coastguard Worker &cc.RustBindgenClangProperties{}, 571*333d2b36SAndroid Build Coastguard Worker &ClippyProperties{}, 572*333d2b36SAndroid Build Coastguard Worker &SanitizeProperties{}, 573*333d2b36SAndroid Build Coastguard Worker &fuzz.FuzzProperties{}, 574*333d2b36SAndroid Build Coastguard Worker ) 575*333d2b36SAndroid Build Coastguard Worker 576*333d2b36SAndroid Build Coastguard Worker android.InitDefaultsModule(module) 577*333d2b36SAndroid Build Coastguard Worker return module 578*333d2b36SAndroid Build Coastguard Worker} 579*333d2b36SAndroid Build Coastguard Worker 580*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CrateName() string { 581*333d2b36SAndroid Build Coastguard Worker return mod.compiler.crateName() 582*333d2b36SAndroid Build Coastguard Worker} 583*333d2b36SAndroid Build Coastguard Worker 584*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CcLibrary() bool { 585*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 586*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.compiler.(libraryInterface); ok { 587*333d2b36SAndroid Build Coastguard Worker return true 588*333d2b36SAndroid Build Coastguard Worker } 589*333d2b36SAndroid Build Coastguard Worker } 590*333d2b36SAndroid Build Coastguard Worker return false 591*333d2b36SAndroid Build Coastguard Worker} 592*333d2b36SAndroid Build Coastguard Worker 593*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CcLibraryInterface() bool { 594*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 595*333d2b36SAndroid Build Coastguard Worker // use build{Static,Shared}() instead of {static,shared}() here because this might be called before 596*333d2b36SAndroid Build Coastguard Worker // VariantIs{Static,Shared} is set. 597*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic()) { 598*333d2b36SAndroid Build Coastguard Worker return true 599*333d2b36SAndroid Build Coastguard Worker } 600*333d2b36SAndroid Build Coastguard Worker } 601*333d2b36SAndroid Build Coastguard Worker return false 602*333d2b36SAndroid Build Coastguard Worker} 603*333d2b36SAndroid Build Coastguard Worker 604*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RustLibraryInterface() bool { 605*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 606*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.compiler.(libraryInterface); ok { 607*333d2b36SAndroid Build Coastguard Worker return true 608*333d2b36SAndroid Build Coastguard Worker } 609*333d2b36SAndroid Build Coastguard Worker } 610*333d2b36SAndroid Build Coastguard Worker return false 611*333d2b36SAndroid Build Coastguard Worker} 612*333d2b36SAndroid Build Coastguard Worker 613*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsFuzzModule() bool { 614*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.compiler.(*fuzzDecorator); ok { 615*333d2b36SAndroid Build Coastguard Worker return true 616*333d2b36SAndroid Build Coastguard Worker } 617*333d2b36SAndroid Build Coastguard Worker return false 618*333d2b36SAndroid Build Coastguard Worker} 619*333d2b36SAndroid Build Coastguard Worker 620*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) FuzzModuleStruct() fuzz.FuzzModule { 621*333d2b36SAndroid Build Coastguard Worker return mod.FuzzModule 622*333d2b36SAndroid Build Coastguard Worker} 623*333d2b36SAndroid Build Coastguard Worker 624*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule { 625*333d2b36SAndroid Build Coastguard Worker if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok { 626*333d2b36SAndroid Build Coastguard Worker return fuzzer.fuzzPackagedModule 627*333d2b36SAndroid Build Coastguard Worker } 628*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", mod.BaseModuleName())) 629*333d2b36SAndroid Build Coastguard Worker} 630*333d2b36SAndroid Build Coastguard Worker 631*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) FuzzSharedLibraries() android.RuleBuilderInstalls { 632*333d2b36SAndroid Build Coastguard Worker if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok { 633*333d2b36SAndroid Build Coastguard Worker return fuzzer.sharedLibraries 634*333d2b36SAndroid Build Coastguard Worker } 635*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", mod.BaseModuleName())) 636*333d2b36SAndroid Build Coastguard Worker} 637*333d2b36SAndroid Build Coastguard Worker 638*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) UnstrippedOutputFile() android.Path { 639*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 640*333d2b36SAndroid Build Coastguard Worker return mod.compiler.unstrippedOutputFilePath() 641*333d2b36SAndroid Build Coastguard Worker } 642*333d2b36SAndroid Build Coastguard Worker return nil 643*333d2b36SAndroid Build Coastguard Worker} 644*333d2b36SAndroid Build Coastguard Worker 645*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetStatic() { 646*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 647*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 648*333d2b36SAndroid Build Coastguard Worker library.setStatic() 649*333d2b36SAndroid Build Coastguard Worker return 650*333d2b36SAndroid Build Coastguard Worker } 651*333d2b36SAndroid Build Coastguard Worker } 652*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("SetStatic called on non-library module: %q", mod.BaseModuleName())) 653*333d2b36SAndroid Build Coastguard Worker} 654*333d2b36SAndroid Build Coastguard Worker 655*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetShared() { 656*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 657*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 658*333d2b36SAndroid Build Coastguard Worker library.setShared() 659*333d2b36SAndroid Build Coastguard Worker return 660*333d2b36SAndroid Build Coastguard Worker } 661*333d2b36SAndroid Build Coastguard Worker } 662*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("SetShared called on non-library module: %q", mod.BaseModuleName())) 663*333d2b36SAndroid Build Coastguard Worker} 664*333d2b36SAndroid Build Coastguard Worker 665*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) BuildStaticVariant() bool { 666*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 667*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 668*333d2b36SAndroid Build Coastguard Worker return library.buildStatic() 669*333d2b36SAndroid Build Coastguard Worker } 670*333d2b36SAndroid Build Coastguard Worker } 671*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", mod.BaseModuleName())) 672*333d2b36SAndroid Build Coastguard Worker} 673*333d2b36SAndroid Build Coastguard Worker 674*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) BuildRlibVariant() bool { 675*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 676*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 677*333d2b36SAndroid Build Coastguard Worker return library.buildRlib() 678*333d2b36SAndroid Build Coastguard Worker } 679*333d2b36SAndroid Build Coastguard Worker } 680*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("BuildRlibVariant called on non-library module: %q", mod.BaseModuleName())) 681*333d2b36SAndroid Build Coastguard Worker} 682*333d2b36SAndroid Build Coastguard Worker 683*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsRustFFI() bool { 684*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 685*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 686*333d2b36SAndroid Build Coastguard Worker return library.isFFILibrary() 687*333d2b36SAndroid Build Coastguard Worker } 688*333d2b36SAndroid Build Coastguard Worker } 689*333d2b36SAndroid Build Coastguard Worker return false 690*333d2b36SAndroid Build Coastguard Worker} 691*333d2b36SAndroid Build Coastguard Worker 692*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) BuildSharedVariant() bool { 693*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 694*333d2b36SAndroid Build Coastguard Worker if library, ok := mod.compiler.(libraryInterface); ok { 695*333d2b36SAndroid Build Coastguard Worker return library.buildShared() 696*333d2b36SAndroid Build Coastguard Worker } 697*333d2b36SAndroid Build Coastguard Worker } 698*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", mod.BaseModuleName())) 699*333d2b36SAndroid Build Coastguard Worker} 700*333d2b36SAndroid Build Coastguard Worker 701*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Module() android.Module { 702*333d2b36SAndroid Build Coastguard Worker return mod 703*333d2b36SAndroid Build Coastguard Worker} 704*333d2b36SAndroid Build Coastguard Worker 705*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) OutputFile() android.OptionalPath { 706*333d2b36SAndroid Build Coastguard Worker return mod.outputFile 707*333d2b36SAndroid Build Coastguard Worker} 708*333d2b36SAndroid Build Coastguard Worker 709*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CoverageFiles() android.Paths { 710*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 711*333d2b36SAndroid Build Coastguard Worker return android.Paths{} 712*333d2b36SAndroid Build Coastguard Worker } 713*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("CoverageFiles called on non-library module: %q", mod.BaseModuleName())) 714*333d2b36SAndroid Build Coastguard Worker} 715*333d2b36SAndroid Build Coastguard Worker 716*333d2b36SAndroid Build Coastguard Worker// Rust does not produce gcno files, and therefore does not produce a coverage archive. 717*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CoverageOutputFile() android.OptionalPath { 718*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 719*333d2b36SAndroid Build Coastguard Worker} 720*333d2b36SAndroid Build Coastguard Worker 721*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsNdk(config android.Config) bool { 722*333d2b36SAndroid Build Coastguard Worker return false 723*333d2b36SAndroid Build Coastguard Worker} 724*333d2b36SAndroid Build Coastguard Worker 725*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasStubsVariants() bool { 726*333d2b36SAndroid Build Coastguard Worker return false 727*333d2b36SAndroid Build Coastguard Worker} 728*333d2b36SAndroid Build Coastguard Worker 729*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsStubs() bool { 730*333d2b36SAndroid Build Coastguard Worker return false 731*333d2b36SAndroid Build Coastguard Worker} 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) installable(apexInfo android.ApexInfo) bool { 734*333d2b36SAndroid Build Coastguard Worker if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) { 735*333d2b36SAndroid Build Coastguard Worker return false 736*333d2b36SAndroid Build Coastguard Worker } 737*333d2b36SAndroid Build Coastguard Worker 738*333d2b36SAndroid Build Coastguard Worker // The apex variant is not installable because it is included in the APEX and won't appear 739*333d2b36SAndroid Build Coastguard Worker // in the system partition as a standalone file. 740*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 741*333d2b36SAndroid Build Coastguard Worker return false 742*333d2b36SAndroid Build Coastguard Worker } 743*333d2b36SAndroid Build Coastguard Worker 744*333d2b36SAndroid Build Coastguard Worker return mod.OutputFile().Valid() && !mod.Properties.PreventInstall 745*333d2b36SAndroid Build Coastguard Worker} 746*333d2b36SAndroid Build Coastguard Worker 747*333d2b36SAndroid Build Coastguard Workerfunc (ctx moduleContext) apexVariationName() string { 748*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 749*333d2b36SAndroid Build Coastguard Worker return apexInfo.ApexVariationName 750*333d2b36SAndroid Build Coastguard Worker} 751*333d2b36SAndroid Build Coastguard Worker 752*333d2b36SAndroid Build Coastguard Workervar _ cc.LinkableInterface = (*Module)(nil) 753*333d2b36SAndroid Build Coastguard Worker 754*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Init() android.Module { 755*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(&mod.Properties) 756*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(&mod.VendorProperties) 757*333d2b36SAndroid Build Coastguard Worker 758*333d2b36SAndroid Build Coastguard Worker if mod.afdo != nil { 759*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(mod.afdo.props()...) 760*333d2b36SAndroid Build Coastguard Worker } 761*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 762*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(mod.compiler.compilerProps()...) 763*333d2b36SAndroid Build Coastguard Worker } 764*333d2b36SAndroid Build Coastguard Worker if mod.coverage != nil { 765*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(mod.coverage.props()...) 766*333d2b36SAndroid Build Coastguard Worker } 767*333d2b36SAndroid Build Coastguard Worker if mod.clippy != nil { 768*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(mod.clippy.props()...) 769*333d2b36SAndroid Build Coastguard Worker } 770*333d2b36SAndroid Build Coastguard Worker if mod.sourceProvider != nil { 771*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(mod.sourceProvider.SourceProviderProps()...) 772*333d2b36SAndroid Build Coastguard Worker } 773*333d2b36SAndroid Build Coastguard Worker if mod.sanitize != nil { 774*333d2b36SAndroid Build Coastguard Worker mod.AddProperties(mod.sanitize.props()...) 775*333d2b36SAndroid Build Coastguard Worker } 776*333d2b36SAndroid Build Coastguard Worker 777*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(mod, mod.hod, mod.multilib) 778*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(mod) 779*333d2b36SAndroid Build Coastguard Worker 780*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(mod) 781*333d2b36SAndroid Build Coastguard Worker return mod 782*333d2b36SAndroid Build Coastguard Worker} 783*333d2b36SAndroid Build Coastguard Worker 784*333d2b36SAndroid Build Coastguard Workerfunc newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 785*333d2b36SAndroid Build Coastguard Worker return &Module{ 786*333d2b36SAndroid Build Coastguard Worker hod: hod, 787*333d2b36SAndroid Build Coastguard Worker multilib: multilib, 788*333d2b36SAndroid Build Coastguard Worker } 789*333d2b36SAndroid Build Coastguard Worker} 790*333d2b36SAndroid Build Coastguard Workerfunc newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 791*333d2b36SAndroid Build Coastguard Worker module := newBaseModule(hod, multilib) 792*333d2b36SAndroid Build Coastguard Worker module.afdo = &afdo{} 793*333d2b36SAndroid Build Coastguard Worker module.coverage = &coverage{} 794*333d2b36SAndroid Build Coastguard Worker module.clippy = &clippy{} 795*333d2b36SAndroid Build Coastguard Worker module.sanitize = &sanitize{} 796*333d2b36SAndroid Build Coastguard Worker return module 797*333d2b36SAndroid Build Coastguard Worker} 798*333d2b36SAndroid Build Coastguard Worker 799*333d2b36SAndroid Build Coastguard Workertype ModuleContext interface { 800*333d2b36SAndroid Build Coastguard Worker android.ModuleContext 801*333d2b36SAndroid Build Coastguard Worker ModuleContextIntf 802*333d2b36SAndroid Build Coastguard Worker} 803*333d2b36SAndroid Build Coastguard Worker 804*333d2b36SAndroid Build Coastguard Workertype BaseModuleContext interface { 805*333d2b36SAndroid Build Coastguard Worker android.BaseModuleContext 806*333d2b36SAndroid Build Coastguard Worker ModuleContextIntf 807*333d2b36SAndroid Build Coastguard Worker} 808*333d2b36SAndroid Build Coastguard Worker 809*333d2b36SAndroid Build Coastguard Workertype DepsContext interface { 810*333d2b36SAndroid Build Coastguard Worker android.BottomUpMutatorContext 811*333d2b36SAndroid Build Coastguard Worker ModuleContextIntf 812*333d2b36SAndroid Build Coastguard Worker} 813*333d2b36SAndroid Build Coastguard Worker 814*333d2b36SAndroid Build Coastguard Workertype ModuleContextIntf interface { 815*333d2b36SAndroid Build Coastguard Worker RustModule() *Module 816*333d2b36SAndroid Build Coastguard Worker toolchain() config.Toolchain 817*333d2b36SAndroid Build Coastguard Worker} 818*333d2b36SAndroid Build Coastguard Worker 819*333d2b36SAndroid Build Coastguard Workertype depsContext struct { 820*333d2b36SAndroid Build Coastguard Worker android.BottomUpMutatorContext 821*333d2b36SAndroid Build Coastguard Worker} 822*333d2b36SAndroid Build Coastguard Worker 823*333d2b36SAndroid Build Coastguard Workertype moduleContext struct { 824*333d2b36SAndroid Build Coastguard Worker android.ModuleContext 825*333d2b36SAndroid Build Coastguard Worker} 826*333d2b36SAndroid Build Coastguard Worker 827*333d2b36SAndroid Build Coastguard Workertype baseModuleContext struct { 828*333d2b36SAndroid Build Coastguard Worker android.BaseModuleContext 829*333d2b36SAndroid Build Coastguard Worker} 830*333d2b36SAndroid Build Coastguard Worker 831*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContext) RustModule() *Module { 832*333d2b36SAndroid Build Coastguard Worker return ctx.Module().(*Module) 833*333d2b36SAndroid Build Coastguard Worker} 834*333d2b36SAndroid Build Coastguard Worker 835*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContext) toolchain() config.Toolchain { 836*333d2b36SAndroid Build Coastguard Worker return ctx.RustModule().toolchain(ctx) 837*333d2b36SAndroid Build Coastguard Worker} 838*333d2b36SAndroid Build Coastguard Worker 839*333d2b36SAndroid Build Coastguard Workerfunc (ctx *depsContext) RustModule() *Module { 840*333d2b36SAndroid Build Coastguard Worker return ctx.Module().(*Module) 841*333d2b36SAndroid Build Coastguard Worker} 842*333d2b36SAndroid Build Coastguard Worker 843*333d2b36SAndroid Build Coastguard Workerfunc (ctx *depsContext) toolchain() config.Toolchain { 844*333d2b36SAndroid Build Coastguard Worker return ctx.RustModule().toolchain(ctx) 845*333d2b36SAndroid Build Coastguard Worker} 846*333d2b36SAndroid Build Coastguard Worker 847*333d2b36SAndroid Build Coastguard Workerfunc (ctx *baseModuleContext) RustModule() *Module { 848*333d2b36SAndroid Build Coastguard Worker return ctx.Module().(*Module) 849*333d2b36SAndroid Build Coastguard Worker} 850*333d2b36SAndroid Build Coastguard Worker 851*333d2b36SAndroid Build Coastguard Workerfunc (ctx *baseModuleContext) toolchain() config.Toolchain { 852*333d2b36SAndroid Build Coastguard Worker return ctx.RustModule().toolchain(ctx) 853*333d2b36SAndroid Build Coastguard Worker} 854*333d2b36SAndroid Build Coastguard Worker 855*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) nativeCoverage() bool { 856*333d2b36SAndroid Build Coastguard Worker // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage 857*333d2b36SAndroid Build Coastguard Worker if mod.Target().NativeBridge == android.NativeBridgeEnabled { 858*333d2b36SAndroid Build Coastguard Worker return false 859*333d2b36SAndroid Build Coastguard Worker } 860*333d2b36SAndroid Build Coastguard Worker return mod.compiler != nil && mod.compiler.nativeCoverage() 861*333d2b36SAndroid Build Coastguard Worker} 862*333d2b36SAndroid Build Coastguard Worker 863*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) EverInstallable() bool { 864*333d2b36SAndroid Build Coastguard Worker return mod.compiler != nil && 865*333d2b36SAndroid Build Coastguard Worker // Check to see whether the module is actually ever installable. 866*333d2b36SAndroid Build Coastguard Worker mod.compiler.everInstallable() 867*333d2b36SAndroid Build Coastguard Worker} 868*333d2b36SAndroid Build Coastguard Worker 869*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Installable() *bool { 870*333d2b36SAndroid Build Coastguard Worker return mod.Properties.Installable 871*333d2b36SAndroid Build Coastguard Worker} 872*333d2b36SAndroid Build Coastguard Worker 873*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ProcMacro() bool { 874*333d2b36SAndroid Build Coastguard Worker if pm, ok := mod.compiler.(procMacroInterface); ok { 875*333d2b36SAndroid Build Coastguard Worker return pm.ProcMacro() 876*333d2b36SAndroid Build Coastguard Worker } 877*333d2b36SAndroid Build Coastguard Worker return false 878*333d2b36SAndroid Build Coastguard Worker} 879*333d2b36SAndroid Build Coastguard Worker 880*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain { 881*333d2b36SAndroid Build Coastguard Worker if mod.cachedToolchain == nil { 882*333d2b36SAndroid Build Coastguard Worker mod.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch()) 883*333d2b36SAndroid Build Coastguard Worker } 884*333d2b36SAndroid Build Coastguard Worker return mod.cachedToolchain 885*333d2b36SAndroid Build Coastguard Worker} 886*333d2b36SAndroid Build Coastguard Worker 887*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ccToolchain(ctx android.BaseModuleContext) cc_config.Toolchain { 888*333d2b36SAndroid Build Coastguard Worker return cc_config.FindToolchain(ctx.Os(), ctx.Arch()) 889*333d2b36SAndroid Build Coastguard Worker} 890*333d2b36SAndroid Build Coastguard Worker 891*333d2b36SAndroid Build Coastguard Workerfunc (d *Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) { 892*333d2b36SAndroid Build Coastguard Worker} 893*333d2b36SAndroid Build Coastguard Worker 894*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { 895*333d2b36SAndroid Build Coastguard Worker ctx := &moduleContext{ 896*333d2b36SAndroid Build Coastguard Worker ModuleContext: actx, 897*333d2b36SAndroid Build Coastguard Worker } 898*333d2b36SAndroid Build Coastguard Worker 899*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) 900*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 901*333d2b36SAndroid Build Coastguard Worker mod.hideApexVariantFromMake = true 902*333d2b36SAndroid Build Coastguard Worker } 903*333d2b36SAndroid Build Coastguard Worker 904*333d2b36SAndroid Build Coastguard Worker toolchain := mod.toolchain(ctx) 905*333d2b36SAndroid Build Coastguard Worker mod.makeLinkType = cc.GetMakeLinkType(actx, mod) 906*333d2b36SAndroid Build Coastguard Worker 907*333d2b36SAndroid Build Coastguard Worker mod.Properties.SubName = cc.GetSubnameProperty(actx, mod) 908*333d2b36SAndroid Build Coastguard Worker 909*333d2b36SAndroid Build Coastguard Worker if !toolchain.Supported() { 910*333d2b36SAndroid Build Coastguard Worker // This toolchain's unsupported, there's nothing to do for this mod. 911*333d2b36SAndroid Build Coastguard Worker return 912*333d2b36SAndroid Build Coastguard Worker } 913*333d2b36SAndroid Build Coastguard Worker 914*333d2b36SAndroid Build Coastguard Worker deps := mod.depsToPaths(ctx) 915*333d2b36SAndroid Build Coastguard Worker // Export linkDirs for CC rust generatedlibs 916*333d2b36SAndroid Build Coastguard Worker mod.exportedLinkDirs = append(mod.exportedLinkDirs, deps.exportedLinkDirs...) 917*333d2b36SAndroid Build Coastguard Worker mod.exportedLinkDirs = append(mod.exportedLinkDirs, deps.linkDirs...) 918*333d2b36SAndroid Build Coastguard Worker 919*333d2b36SAndroid Build Coastguard Worker flags := Flags{ 920*333d2b36SAndroid Build Coastguard Worker Toolchain: toolchain, 921*333d2b36SAndroid Build Coastguard Worker } 922*333d2b36SAndroid Build Coastguard Worker 923*333d2b36SAndroid Build Coastguard Worker // Calculate rustc flags 924*333d2b36SAndroid Build Coastguard Worker if mod.afdo != nil { 925*333d2b36SAndroid Build Coastguard Worker flags, deps = mod.afdo.flags(actx, flags, deps) 926*333d2b36SAndroid Build Coastguard Worker } 927*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 928*333d2b36SAndroid Build Coastguard Worker flags = mod.compiler.compilerFlags(ctx, flags) 929*333d2b36SAndroid Build Coastguard Worker flags = mod.compiler.cfgFlags(ctx, flags) 930*333d2b36SAndroid Build Coastguard Worker flags = mod.compiler.featureFlags(ctx, mod, flags) 931*333d2b36SAndroid Build Coastguard Worker } 932*333d2b36SAndroid Build Coastguard Worker if mod.coverage != nil { 933*333d2b36SAndroid Build Coastguard Worker flags, deps = mod.coverage.flags(ctx, flags, deps) 934*333d2b36SAndroid Build Coastguard Worker } 935*333d2b36SAndroid Build Coastguard Worker if mod.clippy != nil { 936*333d2b36SAndroid Build Coastguard Worker flags, deps = mod.clippy.flags(ctx, flags, deps) 937*333d2b36SAndroid Build Coastguard Worker } 938*333d2b36SAndroid Build Coastguard Worker if mod.sanitize != nil { 939*333d2b36SAndroid Build Coastguard Worker flags, deps = mod.sanitize.flags(ctx, flags, deps) 940*333d2b36SAndroid Build Coastguard Worker } 941*333d2b36SAndroid Build Coastguard Worker 942*333d2b36SAndroid Build Coastguard Worker // SourceProvider needs to call GenerateSource() before compiler calls 943*333d2b36SAndroid Build Coastguard Worker // compile() so it can provide the source. A SourceProvider has 944*333d2b36SAndroid Build Coastguard Worker // multiple variants (e.g. source, rlib, dylib). Only the "source" 945*333d2b36SAndroid Build Coastguard Worker // variant is responsible for effectively generating the source. The 946*333d2b36SAndroid Build Coastguard Worker // remaining variants relies on the "source" variant output. 947*333d2b36SAndroid Build Coastguard Worker if mod.sourceProvider != nil { 948*333d2b36SAndroid Build Coastguard Worker if mod.compiler.(libraryInterface).source() { 949*333d2b36SAndroid Build Coastguard Worker mod.sourceProvider.GenerateSource(ctx, deps) 950*333d2b36SAndroid Build Coastguard Worker mod.sourceProvider.setSubName(ctx.ModuleSubDir()) 951*333d2b36SAndroid Build Coastguard Worker } else { 952*333d2b36SAndroid Build Coastguard Worker sourceMod := actx.GetDirectDepWithTag(mod.Name(), sourceDepTag) 953*333d2b36SAndroid Build Coastguard Worker sourceLib := sourceMod.(*Module).compiler.(*libraryDecorator) 954*333d2b36SAndroid Build Coastguard Worker mod.sourceProvider.setOutputFiles(sourceLib.sourceProvider.Srcs()) 955*333d2b36SAndroid Build Coastguard Worker } 956*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(mod.sourceProvider.Srcs()...) 957*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: mod.sourceProvider.Srcs().Strings()}) 958*333d2b36SAndroid Build Coastguard Worker } 959*333d2b36SAndroid Build Coastguard Worker 960*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil && !mod.compiler.Disabled() { 961*333d2b36SAndroid Build Coastguard Worker mod.compiler.initialize(ctx) 962*333d2b36SAndroid Build Coastguard Worker buildOutput := mod.compiler.compile(ctx, flags, deps) 963*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 964*333d2b36SAndroid Build Coastguard Worker return 965*333d2b36SAndroid Build Coastguard Worker } 966*333d2b36SAndroid Build Coastguard Worker mod.outputFile = android.OptionalPathForPath(buildOutput.outputFile) 967*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(buildOutput.outputFile) 968*333d2b36SAndroid Build Coastguard Worker if buildOutput.kytheFile != nil { 969*333d2b36SAndroid Build Coastguard Worker mod.kytheFiles = append(mod.kytheFiles, buildOutput.kytheFile) 970*333d2b36SAndroid Build Coastguard Worker } 971*333d2b36SAndroid Build Coastguard Worker bloaty.MeasureSizeForPaths(ctx, mod.compiler.strippedOutputFilePath(), android.OptionalPathForPath(mod.compiler.unstrippedOutputFilePath())) 972*333d2b36SAndroid Build Coastguard Worker 973*333d2b36SAndroid Build Coastguard Worker mod.docTimestampFile = mod.compiler.rustdoc(ctx, flags, deps) 974*333d2b36SAndroid Build Coastguard Worker 975*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) 976*333d2b36SAndroid Build Coastguard Worker if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) && !mod.ProcMacro() { 977*333d2b36SAndroid Build Coastguard Worker // If the module has been specifically configure to not be installed then 978*333d2b36SAndroid Build Coastguard Worker // hide from make as otherwise it will break when running inside make as the 979*333d2b36SAndroid Build Coastguard Worker // output path to install will not be specified. Not all uninstallable 980*333d2b36SAndroid Build Coastguard Worker // modules can be hidden from make as some are needed for resolving make 981*333d2b36SAndroid Build Coastguard Worker // side dependencies. In particular, proc-macros need to be captured in the 982*333d2b36SAndroid Build Coastguard Worker // host snapshot. 983*333d2b36SAndroid Build Coastguard Worker mod.HideFromMake() 984*333d2b36SAndroid Build Coastguard Worker mod.SkipInstall() 985*333d2b36SAndroid Build Coastguard Worker } else if !mod.installable(apexInfo) { 986*333d2b36SAndroid Build Coastguard Worker mod.SkipInstall() 987*333d2b36SAndroid Build Coastguard Worker } 988*333d2b36SAndroid Build Coastguard Worker 989*333d2b36SAndroid Build Coastguard Worker // Still call install though, the installs will be stored as PackageSpecs to allow 990*333d2b36SAndroid Build Coastguard Worker // using the outputs in a genrule. 991*333d2b36SAndroid Build Coastguard Worker if mod.OutputFile().Valid() { 992*333d2b36SAndroid Build Coastguard Worker mod.compiler.install(ctx) 993*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 994*333d2b36SAndroid Build Coastguard Worker return 995*333d2b36SAndroid Build Coastguard Worker } 996*333d2b36SAndroid Build Coastguard Worker // Export your own directory as a linkDir 997*333d2b36SAndroid Build Coastguard Worker mod.exportedLinkDirs = append(mod.exportedLinkDirs, linkPathFromFilePath(mod.OutputFile().Path())) 998*333d2b36SAndroid Build Coastguard Worker 999*333d2b36SAndroid Build Coastguard Worker } 1000*333d2b36SAndroid Build Coastguard Worker 1001*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cc.ImplementationDepInfoProvider, &cc.ImplementationDepInfo{ 1002*333d2b36SAndroid Build Coastguard Worker ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps), 1003*333d2b36SAndroid Build Coastguard Worker }) 1004*333d2b36SAndroid Build Coastguard Worker 1005*333d2b36SAndroid Build Coastguard Worker ctx.Phony("rust", ctx.RustModule().OutputFile().Path()) 1006*333d2b36SAndroid Build Coastguard Worker } 1007*333d2b36SAndroid Build Coastguard Worker 1008*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cc.LinkableInfoKey, cc.LinkableInfo{ 1009*333d2b36SAndroid Build Coastguard Worker StaticExecutable: mod.StaticExecutable(), 1010*333d2b36SAndroid Build Coastguard Worker }) 1011*333d2b36SAndroid Build Coastguard Worker 1012*333d2b36SAndroid Build Coastguard Worker mod.setOutputFiles(ctx) 1013*333d2b36SAndroid Build Coastguard Worker 1014*333d2b36SAndroid Build Coastguard Worker buildComplianceMetadataInfo(ctx, mod, deps) 1015*333d2b36SAndroid Build Coastguard Worker} 1016*333d2b36SAndroid Build Coastguard Worker 1017*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) setOutputFiles(ctx ModuleContext) { 1018*333d2b36SAndroid Build Coastguard Worker if mod.sourceProvider != nil && (mod.compiler == nil || mod.compiler.Disabled()) { 1019*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(mod.sourceProvider.Srcs(), "") 1020*333d2b36SAndroid Build Coastguard Worker } else if mod.OutputFile().Valid() { 1021*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{mod.OutputFile().Path()}, "") 1022*333d2b36SAndroid Build Coastguard Worker } else { 1023*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{}, "") 1024*333d2b36SAndroid Build Coastguard Worker } 1025*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 1026*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.PathsIfNonNil(mod.compiler.unstrippedOutputFilePath()), "unstripped") 1027*333d2b36SAndroid Build Coastguard Worker } 1028*333d2b36SAndroid Build Coastguard Worker} 1029*333d2b36SAndroid Build Coastguard Worker 1030*333d2b36SAndroid Build Coastguard Workerfunc buildComplianceMetadataInfo(ctx *moduleContext, mod *Module, deps PathDeps) { 1031*333d2b36SAndroid Build Coastguard Worker // Dump metadata that can not be done in android/compliance-metadata.go 1032*333d2b36SAndroid Build Coastguard Worker metadataInfo := ctx.ComplianceMetadataInfo() 1033*333d2b36SAndroid Build Coastguard Worker metadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(mod.Static())) 1034*333d2b36SAndroid Build Coastguard Worker metadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, mod.outputFile.String()) 1035*333d2b36SAndroid Build Coastguard Worker 1036*333d2b36SAndroid Build Coastguard Worker // Static libs 1037*333d2b36SAndroid Build Coastguard Worker staticDeps := ctx.GetDirectDepsWithTag(rlibDepTag) 1038*333d2b36SAndroid Build Coastguard Worker staticDepNames := make([]string, 0, len(staticDeps)) 1039*333d2b36SAndroid Build Coastguard Worker for _, dep := range staticDeps { 1040*333d2b36SAndroid Build Coastguard Worker staticDepNames = append(staticDepNames, dep.Name()) 1041*333d2b36SAndroid Build Coastguard Worker } 1042*333d2b36SAndroid Build Coastguard Worker ccStaticDeps := ctx.GetDirectDepsWithTag(cc.StaticDepTag(false)) 1043*333d2b36SAndroid Build Coastguard Worker for _, dep := range ccStaticDeps { 1044*333d2b36SAndroid Build Coastguard Worker staticDepNames = append(staticDepNames, dep.Name()) 1045*333d2b36SAndroid Build Coastguard Worker } 1046*333d2b36SAndroid Build Coastguard Worker 1047*333d2b36SAndroid Build Coastguard Worker staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.RLibs)) 1048*333d2b36SAndroid Build Coastguard Worker // C static libraries 1049*333d2b36SAndroid Build Coastguard Worker for _, dep := range deps.StaticLibs { 1050*333d2b36SAndroid Build Coastguard Worker staticDepPaths = append(staticDepPaths, dep.String()) 1051*333d2b36SAndroid Build Coastguard Worker } 1052*333d2b36SAndroid Build Coastguard Worker // Rust static libraries 1053*333d2b36SAndroid Build Coastguard Worker for _, dep := range deps.RLibs { 1054*333d2b36SAndroid Build Coastguard Worker staticDepPaths = append(staticDepPaths, dep.Path.String()) 1055*333d2b36SAndroid Build Coastguard Worker } 1056*333d2b36SAndroid Build Coastguard Worker metadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames)) 1057*333d2b36SAndroid Build Coastguard Worker metadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths)) 1058*333d2b36SAndroid Build Coastguard Worker 1059*333d2b36SAndroid Build Coastguard Worker // C Whole static libs 1060*333d2b36SAndroid Build Coastguard Worker ccWholeStaticDeps := ctx.GetDirectDepsWithTag(cc.StaticDepTag(true)) 1061*333d2b36SAndroid Build Coastguard Worker wholeStaticDepNames := make([]string, 0, len(ccWholeStaticDeps)) 1062*333d2b36SAndroid Build Coastguard Worker for _, dep := range ccStaticDeps { 1063*333d2b36SAndroid Build Coastguard Worker wholeStaticDepNames = append(wholeStaticDepNames, dep.Name()) 1064*333d2b36SAndroid Build Coastguard Worker } 1065*333d2b36SAndroid Build Coastguard Worker metadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames)) 1066*333d2b36SAndroid Build Coastguard Worker} 1067*333d2b36SAndroid Build Coastguard Worker 1068*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) deps(ctx DepsContext) Deps { 1069*333d2b36SAndroid Build Coastguard Worker deps := Deps{} 1070*333d2b36SAndroid Build Coastguard Worker 1071*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 1072*333d2b36SAndroid Build Coastguard Worker deps = mod.compiler.compilerDeps(ctx, deps) 1073*333d2b36SAndroid Build Coastguard Worker } 1074*333d2b36SAndroid Build Coastguard Worker if mod.sourceProvider != nil { 1075*333d2b36SAndroid Build Coastguard Worker deps = mod.sourceProvider.SourceProviderDeps(ctx, deps) 1076*333d2b36SAndroid Build Coastguard Worker } 1077*333d2b36SAndroid Build Coastguard Worker 1078*333d2b36SAndroid Build Coastguard Worker if mod.coverage != nil { 1079*333d2b36SAndroid Build Coastguard Worker deps = mod.coverage.deps(ctx, deps) 1080*333d2b36SAndroid Build Coastguard Worker } 1081*333d2b36SAndroid Build Coastguard Worker 1082*333d2b36SAndroid Build Coastguard Worker if mod.sanitize != nil { 1083*333d2b36SAndroid Build Coastguard Worker deps = mod.sanitize.deps(ctx, deps) 1084*333d2b36SAndroid Build Coastguard Worker } 1085*333d2b36SAndroid Build Coastguard Worker 1086*333d2b36SAndroid Build Coastguard Worker deps.Rlibs = android.LastUniqueStrings(deps.Rlibs) 1087*333d2b36SAndroid Build Coastguard Worker deps.Dylibs = android.LastUniqueStrings(deps.Dylibs) 1088*333d2b36SAndroid Build Coastguard Worker deps.Rustlibs = android.LastUniqueStrings(deps.Rustlibs) 1089*333d2b36SAndroid Build Coastguard Worker deps.ProcMacros = android.LastUniqueStrings(deps.ProcMacros) 1090*333d2b36SAndroid Build Coastguard Worker deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs) 1091*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs) 1092*333d2b36SAndroid Build Coastguard Worker deps.Stdlibs = android.LastUniqueStrings(deps.Stdlibs) 1093*333d2b36SAndroid Build Coastguard Worker deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs) 1094*333d2b36SAndroid Build Coastguard Worker return deps 1095*333d2b36SAndroid Build Coastguard Worker 1096*333d2b36SAndroid Build Coastguard Worker} 1097*333d2b36SAndroid Build Coastguard Worker 1098*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct { 1099*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 1100*333d2b36SAndroid Build Coastguard Worker name string 1101*333d2b36SAndroid Build Coastguard Worker library bool 1102*333d2b36SAndroid Build Coastguard Worker procMacro bool 1103*333d2b36SAndroid Build Coastguard Worker dynamic bool 1104*333d2b36SAndroid Build Coastguard Worker} 1105*333d2b36SAndroid Build Coastguard Worker 1106*333d2b36SAndroid Build Coastguard Worker// InstallDepNeeded returns true for rlibs, dylibs, and proc macros so that they or their transitive 1107*333d2b36SAndroid Build Coastguard Worker// dependencies (especially C/C++ shared libs) are installed as dependencies of a rust binary. 1108*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) InstallDepNeeded() bool { 1109*333d2b36SAndroid Build Coastguard Worker return d.library || d.procMacro 1110*333d2b36SAndroid Build Coastguard Worker} 1111*333d2b36SAndroid Build Coastguard Worker 1112*333d2b36SAndroid Build Coastguard Workervar _ android.InstallNeededDependencyTag = dependencyTag{} 1113*333d2b36SAndroid Build Coastguard Worker 1114*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation { 1115*333d2b36SAndroid Build Coastguard Worker if d.library && d.dynamic { 1116*333d2b36SAndroid Build Coastguard Worker return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency} 1117*333d2b36SAndroid Build Coastguard Worker } 1118*333d2b36SAndroid Build Coastguard Worker return nil 1119*333d2b36SAndroid Build Coastguard Worker} 1120*333d2b36SAndroid Build Coastguard Worker 1121*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) PropagateAconfigValidation() bool { 1122*333d2b36SAndroid Build Coastguard Worker return d == rlibDepTag || d == sourceDepTag 1123*333d2b36SAndroid Build Coastguard Worker} 1124*333d2b36SAndroid Build Coastguard Worker 1125*333d2b36SAndroid Build Coastguard Workervar _ android.PropagateAconfigValidationDependencyTag = dependencyTag{} 1126*333d2b36SAndroid Build Coastguard Worker 1127*333d2b36SAndroid Build Coastguard Workervar _ android.LicenseAnnotationsDependencyTag = dependencyTag{} 1128*333d2b36SAndroid Build Coastguard Worker 1129*333d2b36SAndroid Build Coastguard Workervar ( 1130*333d2b36SAndroid Build Coastguard Worker customBindgenDepTag = dependencyTag{name: "customBindgenTag"} 1131*333d2b36SAndroid Build Coastguard Worker rlibDepTag = dependencyTag{name: "rlibTag", library: true} 1132*333d2b36SAndroid Build Coastguard Worker dylibDepTag = dependencyTag{name: "dylib", library: true, dynamic: true} 1133*333d2b36SAndroid Build Coastguard Worker procMacroDepTag = dependencyTag{name: "procMacro", procMacro: true} 1134*333d2b36SAndroid Build Coastguard Worker sourceDepTag = dependencyTag{name: "source"} 1135*333d2b36SAndroid Build Coastguard Worker dataLibDepTag = dependencyTag{name: "data lib"} 1136*333d2b36SAndroid Build Coastguard Worker dataBinDepTag = dependencyTag{name: "data bin"} 1137*333d2b36SAndroid Build Coastguard Worker) 1138*333d2b36SAndroid Build Coastguard Worker 1139*333d2b36SAndroid Build Coastguard Workerfunc IsDylibDepTag(depTag blueprint.DependencyTag) bool { 1140*333d2b36SAndroid Build Coastguard Worker tag, ok := depTag.(dependencyTag) 1141*333d2b36SAndroid Build Coastguard Worker return ok && tag == dylibDepTag 1142*333d2b36SAndroid Build Coastguard Worker} 1143*333d2b36SAndroid Build Coastguard Worker 1144*333d2b36SAndroid Build Coastguard Workerfunc IsRlibDepTag(depTag blueprint.DependencyTag) bool { 1145*333d2b36SAndroid Build Coastguard Worker tag, ok := depTag.(dependencyTag) 1146*333d2b36SAndroid Build Coastguard Worker return ok && tag == rlibDepTag 1147*333d2b36SAndroid Build Coastguard Worker} 1148*333d2b36SAndroid Build Coastguard Worker 1149*333d2b36SAndroid Build Coastguard Workertype autoDep struct { 1150*333d2b36SAndroid Build Coastguard Worker variation string 1151*333d2b36SAndroid Build Coastguard Worker depTag dependencyTag 1152*333d2b36SAndroid Build Coastguard Worker} 1153*333d2b36SAndroid Build Coastguard Worker 1154*333d2b36SAndroid Build Coastguard Workervar ( 1155*333d2b36SAndroid Build Coastguard Worker sourceVariation = "source" 1156*333d2b36SAndroid Build Coastguard Worker rlibVariation = "rlib" 1157*333d2b36SAndroid Build Coastguard Worker dylibVariation = "dylib" 1158*333d2b36SAndroid Build Coastguard Worker rlibAutoDep = autoDep{variation: rlibVariation, depTag: rlibDepTag} 1159*333d2b36SAndroid Build Coastguard Worker dylibAutoDep = autoDep{variation: dylibVariation, depTag: dylibDepTag} 1160*333d2b36SAndroid Build Coastguard Worker) 1161*333d2b36SAndroid Build Coastguard Worker 1162*333d2b36SAndroid Build Coastguard Workertype autoDeppable interface { 1163*333d2b36SAndroid Build Coastguard Worker autoDep(ctx android.BottomUpMutatorContext) autoDep 1164*333d2b36SAndroid Build Coastguard Worker} 1165*333d2b36SAndroid Build Coastguard Worker 1166*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) begin(ctx BaseModuleContext) { 1167*333d2b36SAndroid Build Coastguard Worker if mod.coverage != nil { 1168*333d2b36SAndroid Build Coastguard Worker mod.coverage.begin(ctx) 1169*333d2b36SAndroid Build Coastguard Worker } 1170*333d2b36SAndroid Build Coastguard Worker if mod.sanitize != nil { 1171*333d2b36SAndroid Build Coastguard Worker mod.sanitize.begin(ctx) 1172*333d2b36SAndroid Build Coastguard Worker } 1173*333d2b36SAndroid Build Coastguard Worker} 1174*333d2b36SAndroid Build Coastguard Worker 1175*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Prebuilt() *android.Prebuilt { 1176*333d2b36SAndroid Build Coastguard Worker if p, ok := mod.compiler.(rustPrebuilt); ok { 1177*333d2b36SAndroid Build Coastguard Worker return p.prebuilt() 1178*333d2b36SAndroid Build Coastguard Worker } 1179*333d2b36SAndroid Build Coastguard Worker return nil 1180*333d2b36SAndroid Build Coastguard Worker} 1181*333d2b36SAndroid Build Coastguard Worker 1182*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Symlinks() []string { 1183*333d2b36SAndroid Build Coastguard Worker // TODO update this to return the list of symlinks when Rust supports defining symlinks 1184*333d2b36SAndroid Build Coastguard Worker return nil 1185*333d2b36SAndroid Build Coastguard Worker} 1186*333d2b36SAndroid Build Coastguard Worker 1187*333d2b36SAndroid Build Coastguard Workerfunc rustMakeLibName(ctx android.ModuleContext, c cc.LinkableInterface, dep cc.LinkableInterface, depName string) string { 1188*333d2b36SAndroid Build Coastguard Worker if rustDep, ok := dep.(*Module); ok { 1189*333d2b36SAndroid Build Coastguard Worker // Use base module name for snapshots when exporting to Makefile. 1190*333d2b36SAndroid Build Coastguard Worker if snapshotPrebuilt, ok := rustDep.compiler.(cc.SnapshotInterface); ok { 1191*333d2b36SAndroid Build Coastguard Worker baseName := rustDep.BaseModuleName() 1192*333d2b36SAndroid Build Coastguard Worker return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + rustDep.AndroidMkSuffix() 1193*333d2b36SAndroid Build Coastguard Worker } 1194*333d2b36SAndroid Build Coastguard Worker } 1195*333d2b36SAndroid Build Coastguard Worker return cc.MakeLibName(ctx, c, dep, depName) 1196*333d2b36SAndroid Build Coastguard Worker} 1197*333d2b36SAndroid Build Coastguard Worker 1198*333d2b36SAndroid Build Coastguard Workerfunc collectIncludedProtos(mod *Module, dep *Module) { 1199*333d2b36SAndroid Build Coastguard Worker if protoMod, ok := mod.sourceProvider.(*protobufDecorator); ok { 1200*333d2b36SAndroid Build Coastguard Worker if _, ok := dep.sourceProvider.(*protobufDecorator); ok { 1201*333d2b36SAndroid Build Coastguard Worker protoMod.additionalCrates = append(protoMod.additionalCrates, dep.CrateName()) 1202*333d2b36SAndroid Build Coastguard Worker } 1203*333d2b36SAndroid Build Coastguard Worker } 1204*333d2b36SAndroid Build Coastguard Worker} 1205*333d2b36SAndroid Build Coastguard Worker 1206*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { 1207*333d2b36SAndroid Build Coastguard Worker var depPaths PathDeps 1208*333d2b36SAndroid Build Coastguard Worker 1209*333d2b36SAndroid Build Coastguard Worker directRlibDeps := []*Module{} 1210*333d2b36SAndroid Build Coastguard Worker directDylibDeps := []*Module{} 1211*333d2b36SAndroid Build Coastguard Worker directProcMacroDeps := []*Module{} 1212*333d2b36SAndroid Build Coastguard Worker directSharedLibDeps := []cc.SharedLibraryInfo{} 1213*333d2b36SAndroid Build Coastguard Worker directStaticLibDeps := [](cc.LinkableInterface){} 1214*333d2b36SAndroid Build Coastguard Worker directSrcProvidersDeps := []*Module{} 1215*333d2b36SAndroid Build Coastguard Worker directSrcDeps := [](android.SourceFileProducer){} 1216*333d2b36SAndroid Build Coastguard Worker 1217*333d2b36SAndroid Build Coastguard Worker // For the dependency from platform to apex, use the latest stubs 1218*333d2b36SAndroid Build Coastguard Worker mod.apexSdkVersion = android.FutureApiLevel 1219*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 1220*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 1221*333d2b36SAndroid Build Coastguard Worker mod.apexSdkVersion = apexInfo.MinSdkVersion 1222*333d2b36SAndroid Build Coastguard Worker } 1223*333d2b36SAndroid Build Coastguard Worker 1224*333d2b36SAndroid Build Coastguard Worker if android.InList("hwaddress", ctx.Config().SanitizeDevice()) { 1225*333d2b36SAndroid Build Coastguard Worker // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000) 1226*333d2b36SAndroid Build Coastguard Worker // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)). 1227*333d2b36SAndroid Build Coastguard Worker // (b/144430859) 1228*333d2b36SAndroid Build Coastguard Worker mod.apexSdkVersion = android.FutureApiLevel 1229*333d2b36SAndroid Build Coastguard Worker } 1230*333d2b36SAndroid Build Coastguard Worker 1231*333d2b36SAndroid Build Coastguard Worker skipModuleList := map[string]bool{} 1232*333d2b36SAndroid Build Coastguard Worker 1233*333d2b36SAndroid Build Coastguard Worker var transitiveAndroidMkSharedLibs []depset.DepSet[string] 1234*333d2b36SAndroid Build Coastguard Worker var directAndroidMkSharedLibs []string 1235*333d2b36SAndroid Build Coastguard Worker 1236*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(dep android.Module) { 1237*333d2b36SAndroid Build Coastguard Worker depName := ctx.OtherModuleName(dep) 1238*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 1239*333d2b36SAndroid Build Coastguard Worker if _, exists := skipModuleList[depName]; exists { 1240*333d2b36SAndroid Build Coastguard Worker return 1241*333d2b36SAndroid Build Coastguard Worker } 1242*333d2b36SAndroid Build Coastguard Worker 1243*333d2b36SAndroid Build Coastguard Worker if depTag == android.DarwinUniversalVariantTag { 1244*333d2b36SAndroid Build Coastguard Worker return 1245*333d2b36SAndroid Build Coastguard Worker } 1246*333d2b36SAndroid Build Coastguard Worker 1247*333d2b36SAndroid Build Coastguard Worker if rustDep, ok := dep.(*Module); ok && !rustDep.Static() && !rustDep.Shared() { 1248*333d2b36SAndroid Build Coastguard Worker //Handle Rust Modules 1249*333d2b36SAndroid Build Coastguard Worker makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName) 1250*333d2b36SAndroid Build Coastguard Worker 1251*333d2b36SAndroid Build Coastguard Worker switch { 1252*333d2b36SAndroid Build Coastguard Worker case depTag == dylibDepTag: 1253*333d2b36SAndroid Build Coastguard Worker dylib, ok := rustDep.compiler.(libraryInterface) 1254*333d2b36SAndroid Build Coastguard Worker if !ok || !dylib.dylib() { 1255*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("mod %q not an dylib library", depName) 1256*333d2b36SAndroid Build Coastguard Worker return 1257*333d2b36SAndroid Build Coastguard Worker } 1258*333d2b36SAndroid Build Coastguard Worker directDylibDeps = append(directDylibDeps, rustDep) 1259*333d2b36SAndroid Build Coastguard Worker mod.Properties.AndroidMkDylibs = append(mod.Properties.AndroidMkDylibs, makeLibName) 1260*333d2b36SAndroid Build Coastguard Worker mod.Properties.SnapshotDylibs = append(mod.Properties.SnapshotDylibs, cc.BaseLibName(depName)) 1261*333d2b36SAndroid Build Coastguard Worker 1262*333d2b36SAndroid Build Coastguard Worker depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, "")) 1263*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok { 1264*333d2b36SAndroid Build Coastguard Worker depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) 1265*333d2b36SAndroid Build Coastguard Worker } 1266*333d2b36SAndroid Build Coastguard Worker 1267*333d2b36SAndroid Build Coastguard Worker case depTag == rlibDepTag: 1268*333d2b36SAndroid Build Coastguard Worker rlib, ok := rustDep.compiler.(libraryInterface) 1269*333d2b36SAndroid Build Coastguard Worker if !ok || !rlib.rlib() { 1270*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("mod %q not an rlib library", makeLibName) 1271*333d2b36SAndroid Build Coastguard Worker return 1272*333d2b36SAndroid Build Coastguard Worker } 1273*333d2b36SAndroid Build Coastguard Worker directRlibDeps = append(directRlibDeps, rustDep) 1274*333d2b36SAndroid Build Coastguard Worker mod.Properties.AndroidMkRlibs = append(mod.Properties.AndroidMkRlibs, makeLibName) 1275*333d2b36SAndroid Build Coastguard Worker mod.Properties.SnapshotRlibs = append(mod.Properties.SnapshotRlibs, cc.BaseLibName(depName)) 1276*333d2b36SAndroid Build Coastguard Worker 1277*333d2b36SAndroid Build Coastguard Worker // rust_ffi rlibs may export include dirs, so collect those here. 1278*333d2b36SAndroid Build Coastguard Worker exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) 1279*333d2b36SAndroid Build Coastguard Worker depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) 1280*333d2b36SAndroid Build Coastguard Worker depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(rustDep.OutputFile().Path())) 1281*333d2b36SAndroid Build Coastguard Worker 1282*333d2b36SAndroid Build Coastguard Worker // rlibs are not installed, so don't add the output file to directImplementationDeps 1283*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok { 1284*333d2b36SAndroid Build Coastguard Worker depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) 1285*333d2b36SAndroid Build Coastguard Worker } 1286*333d2b36SAndroid Build Coastguard Worker 1287*333d2b36SAndroid Build Coastguard Worker case depTag == procMacroDepTag: 1288*333d2b36SAndroid Build Coastguard Worker directProcMacroDeps = append(directProcMacroDeps, rustDep) 1289*333d2b36SAndroid Build Coastguard Worker mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName) 1290*333d2b36SAndroid Build Coastguard Worker // proc_macro link dirs need to be exported, so collect those here. 1291*333d2b36SAndroid Build Coastguard Worker depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(rustDep.OutputFile().Path())) 1292*333d2b36SAndroid Build Coastguard Worker 1293*333d2b36SAndroid Build Coastguard Worker case depTag == sourceDepTag: 1294*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.sourceProvider.(*protobufDecorator); ok { 1295*333d2b36SAndroid Build Coastguard Worker collectIncludedProtos(mod, rustDep) 1296*333d2b36SAndroid Build Coastguard Worker } 1297*333d2b36SAndroid Build Coastguard Worker case cc.IsStaticDepTag(depTag): 1298*333d2b36SAndroid Build Coastguard Worker // Rust FFI rlibs should not be declared in a Rust modules 1299*333d2b36SAndroid Build Coastguard Worker // "static_libs" list as we can't handle them properly at the 1300*333d2b36SAndroid Build Coastguard Worker // moment (for example, they only produce an rlib-std variant). 1301*333d2b36SAndroid Build Coastguard Worker // Instead, a normal rust_library variant should be used. 1302*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("static_libs", 1303*333d2b36SAndroid Build Coastguard Worker "found '%s' in static_libs; use a rust_library module in rustlibs instead of a rust_ffi module in static_libs", 1304*333d2b36SAndroid Build Coastguard Worker depName) 1305*333d2b36SAndroid Build Coastguard Worker 1306*333d2b36SAndroid Build Coastguard Worker } 1307*333d2b36SAndroid Build Coastguard Worker 1308*333d2b36SAndroid Build Coastguard Worker transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustDep.transitiveAndroidMkSharedLibs) 1309*333d2b36SAndroid Build Coastguard Worker 1310*333d2b36SAndroid Build Coastguard Worker if android.IsSourceDepTagWithOutputTag(depTag, "") { 1311*333d2b36SAndroid Build Coastguard Worker // Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct 1312*333d2b36SAndroid Build Coastguard Worker // OS/Arch variant is used. 1313*333d2b36SAndroid Build Coastguard Worker var helper string 1314*333d2b36SAndroid Build Coastguard Worker if ctx.Host() { 1315*333d2b36SAndroid Build Coastguard Worker helper = "missing 'host_supported'?" 1316*333d2b36SAndroid Build Coastguard Worker } else { 1317*333d2b36SAndroid Build Coastguard Worker helper = "device module defined?" 1318*333d2b36SAndroid Build Coastguard Worker } 1319*333d2b36SAndroid Build Coastguard Worker 1320*333d2b36SAndroid Build Coastguard Worker if dep.Target().Os != ctx.Os() { 1321*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("OS mismatch on dependency %q (%s)", dep.Name(), helper) 1322*333d2b36SAndroid Build Coastguard Worker return 1323*333d2b36SAndroid Build Coastguard Worker } else if dep.Target().Arch.ArchType != ctx.Arch().ArchType { 1324*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Arch mismatch on dependency %q (%s)", dep.Name(), helper) 1325*333d2b36SAndroid Build Coastguard Worker return 1326*333d2b36SAndroid Build Coastguard Worker } 1327*333d2b36SAndroid Build Coastguard Worker directSrcProvidersDeps = append(directSrcProvidersDeps, rustDep) 1328*333d2b36SAndroid Build Coastguard Worker } 1329*333d2b36SAndroid Build Coastguard Worker 1330*333d2b36SAndroid Build Coastguard Worker exportedInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) 1331*333d2b36SAndroid Build Coastguard Worker //Append the dependencies exportedDirs, except for proc-macros which target a different arch/OS 1332*333d2b36SAndroid Build Coastguard Worker if depTag != procMacroDepTag { 1333*333d2b36SAndroid Build Coastguard Worker depPaths.depFlags = append(depPaths.depFlags, exportedInfo.Flags...) 1334*333d2b36SAndroid Build Coastguard Worker depPaths.linkObjects = append(depPaths.linkObjects, exportedInfo.LinkObjects...) 1335*333d2b36SAndroid Build Coastguard Worker depPaths.linkDirs = append(depPaths.linkDirs, exportedInfo.LinkDirs...) 1336*333d2b36SAndroid Build Coastguard Worker } 1337*333d2b36SAndroid Build Coastguard Worker 1338*333d2b36SAndroid Build Coastguard Worker if depTag == dylibDepTag || depTag == rlibDepTag || depTag == procMacroDepTag { 1339*333d2b36SAndroid Build Coastguard Worker linkFile := rustDep.UnstrippedOutputFile() 1340*333d2b36SAndroid Build Coastguard Worker linkDir := linkPathFromFilePath(linkFile) 1341*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(exportedFlagsProducer); ok { 1342*333d2b36SAndroid Build Coastguard Worker lib.exportLinkDirs(linkDir) 1343*333d2b36SAndroid Build Coastguard Worker } 1344*333d2b36SAndroid Build Coastguard Worker } 1345*333d2b36SAndroid Build Coastguard Worker 1346*333d2b36SAndroid Build Coastguard Worker if depTag == sourceDepTag { 1347*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.sourceProvider.(*protobufDecorator); ok && mod.Source() { 1348*333d2b36SAndroid Build Coastguard Worker if _, ok := rustDep.sourceProvider.(*protobufDecorator); ok { 1349*333d2b36SAndroid Build Coastguard Worker exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) 1350*333d2b36SAndroid Build Coastguard Worker depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) 1351*333d2b36SAndroid Build Coastguard Worker } 1352*333d2b36SAndroid Build Coastguard Worker } 1353*333d2b36SAndroid Build Coastguard Worker } 1354*333d2b36SAndroid Build Coastguard Worker } else if ccDep, ok := dep.(cc.LinkableInterface); ok { 1355*333d2b36SAndroid Build Coastguard Worker //Handle C dependencies 1356*333d2b36SAndroid Build Coastguard Worker makeLibName := cc.MakeLibName(ctx, mod, ccDep, depName) 1357*333d2b36SAndroid Build Coastguard Worker if _, ok := ccDep.(*Module); !ok { 1358*333d2b36SAndroid Build Coastguard Worker if ccDep.Module().Target().Os != ctx.Os() { 1359*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) 1360*333d2b36SAndroid Build Coastguard Worker return 1361*333d2b36SAndroid Build Coastguard Worker } 1362*333d2b36SAndroid Build Coastguard Worker if ccDep.Module().Target().Arch.ArchType != ctx.Arch().ArchType { 1363*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName) 1364*333d2b36SAndroid Build Coastguard Worker return 1365*333d2b36SAndroid Build Coastguard Worker } 1366*333d2b36SAndroid Build Coastguard Worker } 1367*333d2b36SAndroid Build Coastguard Worker linkObject := ccDep.OutputFile() 1368*333d2b36SAndroid Build Coastguard Worker if !linkObject.Valid() { 1369*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AllowMissingDependencies() { 1370*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName()) 1371*333d2b36SAndroid Build Coastguard Worker } else { 1372*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{depName}) 1373*333d2b36SAndroid Build Coastguard Worker } 1374*333d2b36SAndroid Build Coastguard Worker return 1375*333d2b36SAndroid Build Coastguard Worker } 1376*333d2b36SAndroid Build Coastguard Worker 1377*333d2b36SAndroid Build Coastguard Worker linkPath := linkPathFromFilePath(linkObject.Path()) 1378*333d2b36SAndroid Build Coastguard Worker 1379*333d2b36SAndroid Build Coastguard Worker exportDep := false 1380*333d2b36SAndroid Build Coastguard Worker switch { 1381*333d2b36SAndroid Build Coastguard Worker case cc.IsStaticDepTag(depTag): 1382*333d2b36SAndroid Build Coastguard Worker if cc.IsWholeStaticLib(depTag) { 1383*333d2b36SAndroid Build Coastguard Worker // rustc will bundle static libraries when they're passed with "-lstatic=<lib>". This will fail 1384*333d2b36SAndroid Build Coastguard Worker // if the library is not prefixed by "lib". 1385*333d2b36SAndroid Build Coastguard Worker if mod.Binary() { 1386*333d2b36SAndroid Build Coastguard Worker // Binaries may sometimes need to link whole static libraries that don't start with 'lib'. 1387*333d2b36SAndroid Build Coastguard Worker // Since binaries don't need to 'rebundle' these like libraries and only use these for the 1388*333d2b36SAndroid Build Coastguard Worker // final linkage, pass the args directly to the linker to handle these cases. 1389*333d2b36SAndroid Build Coastguard Worker depPaths.depLinkFlags = append(depPaths.depLinkFlags, []string{"-Wl,--whole-archive", linkObject.Path().String(), "-Wl,--no-whole-archive"}...) 1390*333d2b36SAndroid Build Coastguard Worker } else if libName, ok := libNameFromFilePath(linkObject.Path()); ok { 1391*333d2b36SAndroid Build Coastguard Worker depPaths.depFlags = append(depPaths.depFlags, "-lstatic="+libName) 1392*333d2b36SAndroid Build Coastguard Worker } else { 1393*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("'%q' cannot be listed as a whole_static_library in Rust modules unless the output is prefixed by 'lib'", depName, ctx.ModuleName()) 1394*333d2b36SAndroid Build Coastguard Worker } 1395*333d2b36SAndroid Build Coastguard Worker } 1396*333d2b36SAndroid Build Coastguard Worker 1397*333d2b36SAndroid Build Coastguard Worker // Add this to linkObjects to pass the library directly to the linker as well. This propagates 1398*333d2b36SAndroid Build Coastguard Worker // to dependencies to avoid having to redeclare static libraries for dependents of the dylib variant. 1399*333d2b36SAndroid Build Coastguard Worker depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String()) 1400*333d2b36SAndroid Build Coastguard Worker depPaths.linkDirs = append(depPaths.linkDirs, linkPath) 1401*333d2b36SAndroid Build Coastguard Worker 1402*333d2b36SAndroid Build Coastguard Worker exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) 1403*333d2b36SAndroid Build Coastguard Worker depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) 1404*333d2b36SAndroid Build Coastguard Worker depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...) 1405*333d2b36SAndroid Build Coastguard Worker depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...) 1406*333d2b36SAndroid Build Coastguard Worker depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...) 1407*333d2b36SAndroid Build Coastguard Worker directStaticLibDeps = append(directStaticLibDeps, ccDep) 1408*333d2b36SAndroid Build Coastguard Worker 1409*333d2b36SAndroid Build Coastguard Worker // Record baseLibName for snapshots. 1410*333d2b36SAndroid Build Coastguard Worker mod.Properties.SnapshotStaticLibs = append(mod.Properties.SnapshotStaticLibs, cc.BaseLibName(depName)) 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Worker mod.Properties.AndroidMkStaticLibs = append(mod.Properties.AndroidMkStaticLibs, makeLibName) 1413*333d2b36SAndroid Build Coastguard Worker case cc.IsSharedDepTag(depTag): 1414*333d2b36SAndroid Build Coastguard Worker // For the shared lib dependencies, we may link to the stub variant 1415*333d2b36SAndroid Build Coastguard Worker // of the dependency depending on the context (e.g. if this 1416*333d2b36SAndroid Build Coastguard Worker // dependency crosses the APEX boundaries). 1417*333d2b36SAndroid Build Coastguard Worker sharedLibraryInfo, exportedInfo := cc.ChooseStubOrImpl(ctx, dep) 1418*333d2b36SAndroid Build Coastguard Worker 1419*333d2b36SAndroid Build Coastguard Worker if !sharedLibraryInfo.IsStubs { 1420*333d2b36SAndroid Build Coastguard Worker depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, "")) 1421*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok { 1422*333d2b36SAndroid Build Coastguard Worker depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) 1423*333d2b36SAndroid Build Coastguard Worker } 1424*333d2b36SAndroid Build Coastguard Worker } 1425*333d2b36SAndroid Build Coastguard Worker 1426*333d2b36SAndroid Build Coastguard Worker // Re-get linkObject as ChooseStubOrImpl actually tells us which 1427*333d2b36SAndroid Build Coastguard Worker // object (either from stub or non-stub) to use. 1428*333d2b36SAndroid Build Coastguard Worker linkObject = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary) 1429*333d2b36SAndroid Build Coastguard Worker if !linkObject.Valid() { 1430*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AllowMissingDependencies() { 1431*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName()) 1432*333d2b36SAndroid Build Coastguard Worker } else { 1433*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{depName}) 1434*333d2b36SAndroid Build Coastguard Worker } 1435*333d2b36SAndroid Build Coastguard Worker return 1436*333d2b36SAndroid Build Coastguard Worker } 1437*333d2b36SAndroid Build Coastguard Worker linkPath = linkPathFromFilePath(linkObject.Path()) 1438*333d2b36SAndroid Build Coastguard Worker 1439*333d2b36SAndroid Build Coastguard Worker depPaths.linkDirs = append(depPaths.linkDirs, linkPath) 1440*333d2b36SAndroid Build Coastguard Worker depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String()) 1441*333d2b36SAndroid Build Coastguard Worker depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) 1442*333d2b36SAndroid Build Coastguard Worker depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...) 1443*333d2b36SAndroid Build Coastguard Worker depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...) 1444*333d2b36SAndroid Build Coastguard Worker depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...) 1445*333d2b36SAndroid Build Coastguard Worker directSharedLibDeps = append(directSharedLibDeps, sharedLibraryInfo) 1446*333d2b36SAndroid Build Coastguard Worker 1447*333d2b36SAndroid Build Coastguard Worker // Record baseLibName for snapshots. 1448*333d2b36SAndroid Build Coastguard Worker mod.Properties.SnapshotSharedLibs = append(mod.Properties.SnapshotSharedLibs, cc.BaseLibName(depName)) 1449*333d2b36SAndroid Build Coastguard Worker 1450*333d2b36SAndroid Build Coastguard Worker directAndroidMkSharedLibs = append(directAndroidMkSharedLibs, makeLibName) 1451*333d2b36SAndroid Build Coastguard Worker exportDep = true 1452*333d2b36SAndroid Build Coastguard Worker case cc.IsHeaderDepTag(depTag): 1453*333d2b36SAndroid Build Coastguard Worker exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) 1454*333d2b36SAndroid Build Coastguard Worker depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) 1455*333d2b36SAndroid Build Coastguard Worker depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...) 1456*333d2b36SAndroid Build Coastguard Worker depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...) 1457*333d2b36SAndroid Build Coastguard Worker mod.Properties.AndroidMkHeaderLibs = append(mod.Properties.AndroidMkHeaderLibs, makeLibName) 1458*333d2b36SAndroid Build Coastguard Worker case depTag == cc.CrtBeginDepTag: 1459*333d2b36SAndroid Build Coastguard Worker depPaths.CrtBegin = append(depPaths.CrtBegin, linkObject.Path()) 1460*333d2b36SAndroid Build Coastguard Worker case depTag == cc.CrtEndDepTag: 1461*333d2b36SAndroid Build Coastguard Worker depPaths.CrtEnd = append(depPaths.CrtEnd, linkObject.Path()) 1462*333d2b36SAndroid Build Coastguard Worker } 1463*333d2b36SAndroid Build Coastguard Worker 1464*333d2b36SAndroid Build Coastguard Worker // Make sure these dependencies are propagated 1465*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(exportedFlagsProducer); ok && exportDep { 1466*333d2b36SAndroid Build Coastguard Worker lib.exportLinkDirs(linkPath) 1467*333d2b36SAndroid Build Coastguard Worker lib.exportLinkObjects(linkObject.String()) 1468*333d2b36SAndroid Build Coastguard Worker } 1469*333d2b36SAndroid Build Coastguard Worker } else { 1470*333d2b36SAndroid Build Coastguard Worker switch { 1471*333d2b36SAndroid Build Coastguard Worker case depTag == cc.CrtBeginDepTag: 1472*333d2b36SAndroid Build Coastguard Worker depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, "")) 1473*333d2b36SAndroid Build Coastguard Worker case depTag == cc.CrtEndDepTag: 1474*333d2b36SAndroid Build Coastguard Worker depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, "")) 1475*333d2b36SAndroid Build Coastguard Worker } 1476*333d2b36SAndroid Build Coastguard Worker } 1477*333d2b36SAndroid Build Coastguard Worker 1478*333d2b36SAndroid Build Coastguard Worker if srcDep, ok := dep.(android.SourceFileProducer); ok { 1479*333d2b36SAndroid Build Coastguard Worker if android.IsSourceDepTagWithOutputTag(depTag, "") { 1480*333d2b36SAndroid Build Coastguard Worker // These are usually genrules which don't have per-target variants. 1481*333d2b36SAndroid Build Coastguard Worker directSrcDeps = append(directSrcDeps, srcDep) 1482*333d2b36SAndroid Build Coastguard Worker } 1483*333d2b36SAndroid Build Coastguard Worker } 1484*333d2b36SAndroid Build Coastguard Worker }) 1485*333d2b36SAndroid Build Coastguard Worker 1486*333d2b36SAndroid Build Coastguard Worker mod.transitiveAndroidMkSharedLibs = depset.New[string](depset.PREORDER, directAndroidMkSharedLibs, transitiveAndroidMkSharedLibs) 1487*333d2b36SAndroid Build Coastguard Worker 1488*333d2b36SAndroid Build Coastguard Worker var rlibDepFiles RustLibraries 1489*333d2b36SAndroid Build Coastguard Worker aliases := mod.compiler.Aliases() 1490*333d2b36SAndroid Build Coastguard Worker for _, dep := range directRlibDeps { 1491*333d2b36SAndroid Build Coastguard Worker crateName := dep.CrateName() 1492*333d2b36SAndroid Build Coastguard Worker if alias, aliased := aliases[crateName]; aliased { 1493*333d2b36SAndroid Build Coastguard Worker crateName = alias 1494*333d2b36SAndroid Build Coastguard Worker } 1495*333d2b36SAndroid Build Coastguard Worker rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName}) 1496*333d2b36SAndroid Build Coastguard Worker } 1497*333d2b36SAndroid Build Coastguard Worker var dylibDepFiles RustLibraries 1498*333d2b36SAndroid Build Coastguard Worker for _, dep := range directDylibDeps { 1499*333d2b36SAndroid Build Coastguard Worker crateName := dep.CrateName() 1500*333d2b36SAndroid Build Coastguard Worker if alias, aliased := aliases[crateName]; aliased { 1501*333d2b36SAndroid Build Coastguard Worker crateName = alias 1502*333d2b36SAndroid Build Coastguard Worker } 1503*333d2b36SAndroid Build Coastguard Worker dylibDepFiles = append(dylibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName}) 1504*333d2b36SAndroid Build Coastguard Worker } 1505*333d2b36SAndroid Build Coastguard Worker var procMacroDepFiles RustLibraries 1506*333d2b36SAndroid Build Coastguard Worker for _, dep := range directProcMacroDeps { 1507*333d2b36SAndroid Build Coastguard Worker crateName := dep.CrateName() 1508*333d2b36SAndroid Build Coastguard Worker if alias, aliased := aliases[crateName]; aliased { 1509*333d2b36SAndroid Build Coastguard Worker crateName = alias 1510*333d2b36SAndroid Build Coastguard Worker } 1511*333d2b36SAndroid Build Coastguard Worker procMacroDepFiles = append(procMacroDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName}) 1512*333d2b36SAndroid Build Coastguard Worker } 1513*333d2b36SAndroid Build Coastguard Worker 1514*333d2b36SAndroid Build Coastguard Worker var staticLibDepFiles android.Paths 1515*333d2b36SAndroid Build Coastguard Worker for _, dep := range directStaticLibDeps { 1516*333d2b36SAndroid Build Coastguard Worker staticLibDepFiles = append(staticLibDepFiles, dep.OutputFile().Path()) 1517*333d2b36SAndroid Build Coastguard Worker } 1518*333d2b36SAndroid Build Coastguard Worker 1519*333d2b36SAndroid Build Coastguard Worker var sharedLibFiles android.Paths 1520*333d2b36SAndroid Build Coastguard Worker var sharedLibDepFiles android.Paths 1521*333d2b36SAndroid Build Coastguard Worker for _, dep := range directSharedLibDeps { 1522*333d2b36SAndroid Build Coastguard Worker sharedLibFiles = append(sharedLibFiles, dep.SharedLibrary) 1523*333d2b36SAndroid Build Coastguard Worker if dep.TableOfContents.Valid() { 1524*333d2b36SAndroid Build Coastguard Worker sharedLibDepFiles = append(sharedLibDepFiles, dep.TableOfContents.Path()) 1525*333d2b36SAndroid Build Coastguard Worker } else { 1526*333d2b36SAndroid Build Coastguard Worker sharedLibDepFiles = append(sharedLibDepFiles, dep.SharedLibrary) 1527*333d2b36SAndroid Build Coastguard Worker } 1528*333d2b36SAndroid Build Coastguard Worker } 1529*333d2b36SAndroid Build Coastguard Worker 1530*333d2b36SAndroid Build Coastguard Worker var srcProviderDepFiles android.Paths 1531*333d2b36SAndroid Build Coastguard Worker for _, dep := range directSrcProvidersDeps { 1532*333d2b36SAndroid Build Coastguard Worker srcs := android.OutputFilesForModule(ctx, dep, "") 1533*333d2b36SAndroid Build Coastguard Worker srcProviderDepFiles = append(srcProviderDepFiles, srcs...) 1534*333d2b36SAndroid Build Coastguard Worker } 1535*333d2b36SAndroid Build Coastguard Worker for _, dep := range directSrcDeps { 1536*333d2b36SAndroid Build Coastguard Worker srcs := dep.Srcs() 1537*333d2b36SAndroid Build Coastguard Worker srcProviderDepFiles = append(srcProviderDepFiles, srcs...) 1538*333d2b36SAndroid Build Coastguard Worker } 1539*333d2b36SAndroid Build Coastguard Worker 1540*333d2b36SAndroid Build Coastguard Worker depPaths.RLibs = append(depPaths.RLibs, rlibDepFiles...) 1541*333d2b36SAndroid Build Coastguard Worker depPaths.DyLibs = append(depPaths.DyLibs, dylibDepFiles...) 1542*333d2b36SAndroid Build Coastguard Worker depPaths.SharedLibs = append(depPaths.SharedLibs, sharedLibFiles...) 1543*333d2b36SAndroid Build Coastguard Worker depPaths.SharedLibDeps = append(depPaths.SharedLibDeps, sharedLibDepFiles...) 1544*333d2b36SAndroid Build Coastguard Worker depPaths.StaticLibs = append(depPaths.StaticLibs, staticLibDepFiles...) 1545*333d2b36SAndroid Build Coastguard Worker depPaths.ProcMacros = append(depPaths.ProcMacros, procMacroDepFiles...) 1546*333d2b36SAndroid Build Coastguard Worker depPaths.SrcDeps = append(depPaths.SrcDeps, srcProviderDepFiles...) 1547*333d2b36SAndroid Build Coastguard Worker 1548*333d2b36SAndroid Build Coastguard Worker // Dedup exported flags from dependencies 1549*333d2b36SAndroid Build Coastguard Worker depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs) 1550*333d2b36SAndroid Build Coastguard Worker depPaths.linkObjects = android.FirstUniqueStrings(depPaths.linkObjects) 1551*333d2b36SAndroid Build Coastguard Worker depPaths.depFlags = android.FirstUniqueStrings(depPaths.depFlags) 1552*333d2b36SAndroid Build Coastguard Worker depPaths.depClangFlags = android.FirstUniqueStrings(depPaths.depClangFlags) 1553*333d2b36SAndroid Build Coastguard Worker depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths) 1554*333d2b36SAndroid Build Coastguard Worker depPaths.depSystemIncludePaths = android.FirstUniquePaths(depPaths.depSystemIncludePaths) 1555*333d2b36SAndroid Build Coastguard Worker 1556*333d2b36SAndroid Build Coastguard Worker return depPaths 1557*333d2b36SAndroid Build Coastguard Worker} 1558*333d2b36SAndroid Build Coastguard Worker 1559*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInData() bool { 1560*333d2b36SAndroid Build Coastguard Worker if mod.compiler == nil { 1561*333d2b36SAndroid Build Coastguard Worker return false 1562*333d2b36SAndroid Build Coastguard Worker } 1563*333d2b36SAndroid Build Coastguard Worker return mod.compiler.inData() 1564*333d2b36SAndroid Build Coastguard Worker} 1565*333d2b36SAndroid Build Coastguard Worker 1566*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInRamdisk() bool { 1567*333d2b36SAndroid Build Coastguard Worker return mod.InRamdisk() 1568*333d2b36SAndroid Build Coastguard Worker} 1569*333d2b36SAndroid Build Coastguard Worker 1570*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInVendorRamdisk() bool { 1571*333d2b36SAndroid Build Coastguard Worker return mod.InVendorRamdisk() 1572*333d2b36SAndroid Build Coastguard Worker} 1573*333d2b36SAndroid Build Coastguard Worker 1574*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInRecovery() bool { 1575*333d2b36SAndroid Build Coastguard Worker return mod.InRecovery() 1576*333d2b36SAndroid Build Coastguard Worker} 1577*333d2b36SAndroid Build Coastguard Worker 1578*333d2b36SAndroid Build Coastguard Workerfunc linkPathFromFilePath(filepath android.Path) string { 1579*333d2b36SAndroid Build Coastguard Worker return strings.Split(filepath.String(), filepath.Base())[0] 1580*333d2b36SAndroid Build Coastguard Worker} 1581*333d2b36SAndroid Build Coastguard Worker 1582*333d2b36SAndroid Build Coastguard Worker// usePublicApi returns true if the rust variant should link against NDK (publicapi) 1583*333d2b36SAndroid Build Coastguard Workerfunc (r *Module) usePublicApi() bool { 1584*333d2b36SAndroid Build Coastguard Worker return r.Device() && r.UseSdk() 1585*333d2b36SAndroid Build Coastguard Worker} 1586*333d2b36SAndroid Build Coastguard Worker 1587*333d2b36SAndroid Build Coastguard Worker// useVendorApi returns true if the rust variant should link against LLNDK (vendorapi) 1588*333d2b36SAndroid Build Coastguard Workerfunc (r *Module) useVendorApi() bool { 1589*333d2b36SAndroid Build Coastguard Worker return r.Device() && (r.InVendor() || r.InProduct()) 1590*333d2b36SAndroid Build Coastguard Worker} 1591*333d2b36SAndroid Build Coastguard Worker 1592*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { 1593*333d2b36SAndroid Build Coastguard Worker ctx := &depsContext{ 1594*333d2b36SAndroid Build Coastguard Worker BottomUpMutatorContext: actx, 1595*333d2b36SAndroid Build Coastguard Worker } 1596*333d2b36SAndroid Build Coastguard Worker 1597*333d2b36SAndroid Build Coastguard Worker deps := mod.deps(ctx) 1598*333d2b36SAndroid Build Coastguard Worker var commonDepVariations []blueprint.Variation 1599*333d2b36SAndroid Build Coastguard Worker 1600*333d2b36SAndroid Build Coastguard Worker if ctx.Os() == android.Android { 1601*333d2b36SAndroid Build Coastguard Worker deps.SharedLibs, _ = cc.FilterNdkLibs(mod, ctx.Config(), deps.SharedLibs) 1602*333d2b36SAndroid Build Coastguard Worker } 1603*333d2b36SAndroid Build Coastguard Worker 1604*333d2b36SAndroid Build Coastguard Worker stdLinkage := "dylib-std" 1605*333d2b36SAndroid Build Coastguard Worker if mod.compiler.stdLinkage(ctx) == RlibLinkage { 1606*333d2b36SAndroid Build Coastguard Worker stdLinkage = "rlib-std" 1607*333d2b36SAndroid Build Coastguard Worker } 1608*333d2b36SAndroid Build Coastguard Worker 1609*333d2b36SAndroid Build Coastguard Worker rlibDepVariations := commonDepVariations 1610*333d2b36SAndroid Build Coastguard Worker 1611*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(libraryInterface); !ok || !lib.sysroot() { 1612*333d2b36SAndroid Build Coastguard Worker rlibDepVariations = append(rlibDepVariations, 1613*333d2b36SAndroid Build Coastguard Worker blueprint.Variation{Mutator: "rust_stdlinkage", Variation: stdLinkage}) 1614*333d2b36SAndroid Build Coastguard Worker } 1615*333d2b36SAndroid Build Coastguard Worker 1616*333d2b36SAndroid Build Coastguard Worker // rlibs 1617*333d2b36SAndroid Build Coastguard Worker rlibDepVariations = append(rlibDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: rlibVariation}) 1618*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.Rlibs { 1619*333d2b36SAndroid Build Coastguard Worker depTag := rlibDepTag 1620*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(rlibDepVariations, depTag, lib) 1621*333d2b36SAndroid Build Coastguard Worker } 1622*333d2b36SAndroid Build Coastguard Worker 1623*333d2b36SAndroid Build Coastguard Worker // dylibs 1624*333d2b36SAndroid Build Coastguard Worker dylibDepVariations := append(commonDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: dylibVariation}) 1625*333d2b36SAndroid Build Coastguard Worker 1626*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.Dylibs { 1627*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(dylibDepVariations, dylibDepTag, lib) 1628*333d2b36SAndroid Build Coastguard Worker } 1629*333d2b36SAndroid Build Coastguard Worker 1630*333d2b36SAndroid Build Coastguard Worker // rustlibs 1631*333d2b36SAndroid Build Coastguard Worker if deps.Rustlibs != nil { 1632*333d2b36SAndroid Build Coastguard Worker if !mod.compiler.Disabled() { 1633*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.Rustlibs { 1634*333d2b36SAndroid Build Coastguard Worker autoDep := mod.compiler.(autoDeppable).autoDep(ctx) 1635*333d2b36SAndroid Build Coastguard Worker if autoDep.depTag == rlibDepTag { 1636*333d2b36SAndroid Build Coastguard Worker // Handle the rlib deptag case 1637*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(rlibDepVariations, rlibDepTag, lib) 1638*333d2b36SAndroid Build Coastguard Worker 1639*333d2b36SAndroid Build Coastguard Worker } else { 1640*333d2b36SAndroid Build Coastguard Worker // autoDep.depTag is a dylib depTag. Not all rustlibs may be available as a dylib however. 1641*333d2b36SAndroid Build Coastguard Worker // Check for the existence of the dylib deptag variant. Select it if available, 1642*333d2b36SAndroid Build Coastguard Worker // otherwise select the rlib variant. 1643*333d2b36SAndroid Build Coastguard Worker autoDepVariations := append(commonDepVariations, 1644*333d2b36SAndroid Build Coastguard Worker blueprint.Variation{Mutator: "rust_libraries", Variation: autoDep.variation}) 1645*333d2b36SAndroid Build Coastguard Worker if actx.OtherModuleDependencyVariantExists(autoDepVariations, lib) { 1646*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(autoDepVariations, autoDep.depTag, lib) 1647*333d2b36SAndroid Build Coastguard Worker 1648*333d2b36SAndroid Build Coastguard Worker } else { 1649*333d2b36SAndroid Build Coastguard Worker // If there's no dylib dependency available, try to add the rlib dependency instead. 1650*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(rlibDepVariations, rlibDepTag, lib) 1651*333d2b36SAndroid Build Coastguard Worker 1652*333d2b36SAndroid Build Coastguard Worker } 1653*333d2b36SAndroid Build Coastguard Worker } 1654*333d2b36SAndroid Build Coastguard Worker } 1655*333d2b36SAndroid Build Coastguard Worker } else if _, ok := mod.sourceProvider.(*protobufDecorator); ok { 1656*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.Rustlibs { 1657*333d2b36SAndroid Build Coastguard Worker srcProviderVariations := append(commonDepVariations, 1658*333d2b36SAndroid Build Coastguard Worker blueprint.Variation{Mutator: "rust_libraries", Variation: sourceVariation}) 1659*333d2b36SAndroid Build Coastguard Worker 1660*333d2b36SAndroid Build Coastguard Worker // Only add rustlib dependencies if they're source providers themselves. 1661*333d2b36SAndroid Build Coastguard Worker // This is used to track which crate names need to be added to the source generated 1662*333d2b36SAndroid Build Coastguard Worker // in the rust_protobuf mod.rs. 1663*333d2b36SAndroid Build Coastguard Worker if actx.OtherModuleDependencyVariantExists(srcProviderVariations, lib) { 1664*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(srcProviderVariations, sourceDepTag, lib) 1665*333d2b36SAndroid Build Coastguard Worker } 1666*333d2b36SAndroid Build Coastguard Worker } 1667*333d2b36SAndroid Build Coastguard Worker } 1668*333d2b36SAndroid Build Coastguard Worker } 1669*333d2b36SAndroid Build Coastguard Worker 1670*333d2b36SAndroid Build Coastguard Worker // stdlibs 1671*333d2b36SAndroid Build Coastguard Worker if deps.Stdlibs != nil { 1672*333d2b36SAndroid Build Coastguard Worker if mod.compiler.stdLinkage(ctx) == RlibLinkage { 1673*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.Stdlibs { 1674*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(append(commonDepVariations, []blueprint.Variation{{Mutator: "rust_libraries", Variation: "rlib"}}...), 1675*333d2b36SAndroid Build Coastguard Worker rlibDepTag, lib) 1676*333d2b36SAndroid Build Coastguard Worker } 1677*333d2b36SAndroid Build Coastguard Worker } else { 1678*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.Stdlibs { 1679*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(dylibDepVariations, dylibDepTag, lib) 1680*333d2b36SAndroid Build Coastguard Worker 1681*333d2b36SAndroid Build Coastguard Worker } 1682*333d2b36SAndroid Build Coastguard Worker } 1683*333d2b36SAndroid Build Coastguard Worker } 1684*333d2b36SAndroid Build Coastguard Worker 1685*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.SharedLibs { 1686*333d2b36SAndroid Build Coastguard Worker depTag := cc.SharedDepTag() 1687*333d2b36SAndroid Build Coastguard Worker name, version := cc.StubsLibNameAndVersion(lib) 1688*333d2b36SAndroid Build Coastguard Worker 1689*333d2b36SAndroid Build Coastguard Worker variations := []blueprint.Variation{ 1690*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 1691*333d2b36SAndroid Build Coastguard Worker } 1692*333d2b36SAndroid Build Coastguard Worker cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, name, version, false) 1693*333d2b36SAndroid Build Coastguard Worker } 1694*333d2b36SAndroid Build Coastguard Worker 1695*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.WholeStaticLibs { 1696*333d2b36SAndroid Build Coastguard Worker depTag := cc.StaticDepTag(true) 1697*333d2b36SAndroid Build Coastguard Worker 1698*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 1699*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 1700*333d2b36SAndroid Build Coastguard Worker }, depTag, lib) 1701*333d2b36SAndroid Build Coastguard Worker } 1702*333d2b36SAndroid Build Coastguard Worker 1703*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.StaticLibs { 1704*333d2b36SAndroid Build Coastguard Worker depTag := cc.StaticDepTag(false) 1705*333d2b36SAndroid Build Coastguard Worker 1706*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 1707*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 1708*333d2b36SAndroid Build Coastguard Worker }, depTag, lib) 1709*333d2b36SAndroid Build Coastguard Worker } 1710*333d2b36SAndroid Build Coastguard Worker 1711*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(nil, cc.HeaderDepTag(), deps.HeaderLibs...) 1712*333d2b36SAndroid Build Coastguard Worker 1713*333d2b36SAndroid Build Coastguard Worker crtVariations := cc.GetCrtVariations(ctx, mod) 1714*333d2b36SAndroid Build Coastguard Worker for _, crt := range deps.CrtBegin { 1715*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(crtVariations, cc.CrtBeginDepTag, crt) 1716*333d2b36SAndroid Build Coastguard Worker } 1717*333d2b36SAndroid Build Coastguard Worker for _, crt := range deps.CrtEnd { 1718*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(crtVariations, cc.CrtEndDepTag, crt) 1719*333d2b36SAndroid Build Coastguard Worker } 1720*333d2b36SAndroid Build Coastguard Worker 1721*333d2b36SAndroid Build Coastguard Worker if mod.sourceProvider != nil { 1722*333d2b36SAndroid Build Coastguard Worker if bindgen, ok := mod.sourceProvider.(*bindgenDecorator); ok && 1723*333d2b36SAndroid Build Coastguard Worker bindgen.Properties.Custom_bindgen != "" { 1724*333d2b36SAndroid Build Coastguard Worker actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), customBindgenDepTag, 1725*333d2b36SAndroid Build Coastguard Worker bindgen.Properties.Custom_bindgen) 1726*333d2b36SAndroid Build Coastguard Worker } 1727*333d2b36SAndroid Build Coastguard Worker } 1728*333d2b36SAndroid Build Coastguard Worker 1729*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 1730*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 1731*333d2b36SAndroid Build Coastguard Worker }, dataLibDepTag, deps.DataLibs...) 1732*333d2b36SAndroid Build Coastguard Worker 1733*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...) 1734*333d2b36SAndroid Build Coastguard Worker 1735*333d2b36SAndroid Build Coastguard Worker // proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy. 1736*333d2b36SAndroid Build Coastguard Worker actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...) 1737*333d2b36SAndroid Build Coastguard Worker 1738*333d2b36SAndroid Build Coastguard Worker mod.afdo.addDep(ctx, actx) 1739*333d2b36SAndroid Build Coastguard Worker} 1740*333d2b36SAndroid Build Coastguard Worker 1741*333d2b36SAndroid Build Coastguard Workerfunc BeginMutator(ctx android.BottomUpMutatorContext) { 1742*333d2b36SAndroid Build Coastguard Worker if mod, ok := ctx.Module().(*Module); ok && mod.Enabled(ctx) { 1743*333d2b36SAndroid Build Coastguard Worker mod.beginMutator(ctx) 1744*333d2b36SAndroid Build Coastguard Worker } 1745*333d2b36SAndroid Build Coastguard Worker} 1746*333d2b36SAndroid Build Coastguard Worker 1747*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) beginMutator(actx android.BottomUpMutatorContext) { 1748*333d2b36SAndroid Build Coastguard Worker ctx := &baseModuleContext{ 1749*333d2b36SAndroid Build Coastguard Worker BaseModuleContext: actx, 1750*333d2b36SAndroid Build Coastguard Worker } 1751*333d2b36SAndroid Build Coastguard Worker 1752*333d2b36SAndroid Build Coastguard Worker mod.begin(ctx) 1753*333d2b36SAndroid Build Coastguard Worker} 1754*333d2b36SAndroid Build Coastguard Worker 1755*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Name() string { 1756*333d2b36SAndroid Build Coastguard Worker name := mod.ModuleBase.Name() 1757*333d2b36SAndroid Build Coastguard Worker if p, ok := mod.compiler.(interface { 1758*333d2b36SAndroid Build Coastguard Worker Name(string) string 1759*333d2b36SAndroid Build Coastguard Worker }); ok { 1760*333d2b36SAndroid Build Coastguard Worker name = p.Name(name) 1761*333d2b36SAndroid Build Coastguard Worker } 1762*333d2b36SAndroid Build Coastguard Worker return name 1763*333d2b36SAndroid Build Coastguard Worker} 1764*333d2b36SAndroid Build Coastguard Worker 1765*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) disableClippy() { 1766*333d2b36SAndroid Build Coastguard Worker if mod.clippy != nil { 1767*333d2b36SAndroid Build Coastguard Worker mod.clippy.Properties.Clippy_lints = proptools.StringPtr("none") 1768*333d2b36SAndroid Build Coastguard Worker } 1769*333d2b36SAndroid Build Coastguard Worker} 1770*333d2b36SAndroid Build Coastguard Worker 1771*333d2b36SAndroid Build Coastguard Workervar _ android.HostToolProvider = (*Module)(nil) 1772*333d2b36SAndroid Build Coastguard Worker 1773*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HostToolPath() android.OptionalPath { 1774*333d2b36SAndroid Build Coastguard Worker if !mod.Host() { 1775*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 1776*333d2b36SAndroid Build Coastguard Worker } 1777*333d2b36SAndroid Build Coastguard Worker if binary, ok := mod.compiler.(*binaryDecorator); ok { 1778*333d2b36SAndroid Build Coastguard Worker return android.OptionalPathForPath(binary.baseCompiler.path) 1779*333d2b36SAndroid Build Coastguard Worker } else if pm, ok := mod.compiler.(*procMacroDecorator); ok { 1780*333d2b36SAndroid Build Coastguard Worker // Even though proc-macros aren't strictly "tools", since they target the compiler 1781*333d2b36SAndroid Build Coastguard Worker // and act as compiler plugins, we treat them similarly. 1782*333d2b36SAndroid Build Coastguard Worker return android.OptionalPathForPath(pm.baseCompiler.path) 1783*333d2b36SAndroid Build Coastguard Worker } 1784*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 1785*333d2b36SAndroid Build Coastguard Worker} 1786*333d2b36SAndroid Build Coastguard Worker 1787*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Module)(nil) 1788*333d2b36SAndroid Build Coastguard Worker 1789*333d2b36SAndroid Build Coastguard Worker// If a module is marked for exclusion from apexes, don't provide apex variants. 1790*333d2b36SAndroid Build Coastguard Worker// TODO(b/362509506): remove this once stubs are properly supported by rust_ffi targets. 1791*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) CanHaveApexVariants() bool { 1792*333d2b36SAndroid Build Coastguard Worker if m.ApexExclude() { 1793*333d2b36SAndroid Build Coastguard Worker return false 1794*333d2b36SAndroid Build Coastguard Worker } else { 1795*333d2b36SAndroid Build Coastguard Worker return m.ApexModuleBase.CanHaveApexVariants() 1796*333d2b36SAndroid Build Coastguard Worker } 1797*333d2b36SAndroid Build Coastguard Worker} 1798*333d2b36SAndroid Build Coastguard Worker 1799*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) MinSdkVersion() string { 1800*333d2b36SAndroid Build Coastguard Worker return String(mod.Properties.Min_sdk_version) 1801*333d2b36SAndroid Build Coastguard Worker} 1802*333d2b36SAndroid Build Coastguard Worker 1803*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 1804*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { 1805*333d2b36SAndroid Build Coastguard Worker minSdkVersion := mod.MinSdkVersion() 1806*333d2b36SAndroid Build Coastguard Worker if minSdkVersion == "apex_inherit" { 1807*333d2b36SAndroid Build Coastguard Worker return nil 1808*333d2b36SAndroid Build Coastguard Worker } 1809*333d2b36SAndroid Build Coastguard Worker if minSdkVersion == "" { 1810*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("min_sdk_version is not specificed") 1811*333d2b36SAndroid Build Coastguard Worker } 1812*333d2b36SAndroid Build Coastguard Worker 1813*333d2b36SAndroid Build Coastguard Worker // Not using nativeApiLevelFromUser because the context here is not 1814*333d2b36SAndroid Build Coastguard Worker // necessarily a native context. 1815*333d2b36SAndroid Build Coastguard Worker ver, err := android.ApiLevelFromUser(ctx, minSdkVersion) 1816*333d2b36SAndroid Build Coastguard Worker if err != nil { 1817*333d2b36SAndroid Build Coastguard Worker return err 1818*333d2b36SAndroid Build Coastguard Worker } 1819*333d2b36SAndroid Build Coastguard Worker 1820*333d2b36SAndroid Build Coastguard Worker if ver.GreaterThan(sdkVersion) { 1821*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("newer SDK(%v)", ver) 1822*333d2b36SAndroid Build Coastguard Worker } 1823*333d2b36SAndroid Build Coastguard Worker return nil 1824*333d2b36SAndroid Build Coastguard Worker} 1825*333d2b36SAndroid Build Coastguard Worker 1826*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 1827*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 1828*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 1829*333d2b36SAndroid Build Coastguard Worker 1830*333d2b36SAndroid Build Coastguard Worker if ccm, ok := dep.(*cc.Module); ok { 1831*333d2b36SAndroid Build Coastguard Worker if ccm.HasStubsVariants() { 1832*333d2b36SAndroid Build Coastguard Worker if cc.IsSharedDepTag(depTag) { 1833*333d2b36SAndroid Build Coastguard Worker // dynamic dep to a stubs lib crosses APEX boundary 1834*333d2b36SAndroid Build Coastguard Worker return false 1835*333d2b36SAndroid Build Coastguard Worker } 1836*333d2b36SAndroid Build Coastguard Worker if cc.IsRuntimeDepTag(depTag) { 1837*333d2b36SAndroid Build Coastguard Worker // runtime dep to a stubs lib also crosses APEX boundary 1838*333d2b36SAndroid Build Coastguard Worker return false 1839*333d2b36SAndroid Build Coastguard Worker } 1840*333d2b36SAndroid Build Coastguard Worker 1841*333d2b36SAndroid Build Coastguard Worker if cc.IsHeaderDepTag(depTag) { 1842*333d2b36SAndroid Build Coastguard Worker return false 1843*333d2b36SAndroid Build Coastguard Worker } 1844*333d2b36SAndroid Build Coastguard Worker } 1845*333d2b36SAndroid Build Coastguard Worker if mod.Static() && cc.IsSharedDepTag(depTag) { 1846*333d2b36SAndroid Build Coastguard Worker // shared_lib dependency from a static lib is considered as crossing 1847*333d2b36SAndroid Build Coastguard Worker // the APEX boundary because the dependency doesn't actually is 1848*333d2b36SAndroid Build Coastguard Worker // linked; the dependency is used only during the compilation phase. 1849*333d2b36SAndroid Build Coastguard Worker return false 1850*333d2b36SAndroid Build Coastguard Worker } 1851*333d2b36SAndroid Build Coastguard Worker } 1852*333d2b36SAndroid Build Coastguard Worker 1853*333d2b36SAndroid Build Coastguard Worker if depTag == procMacroDepTag || depTag == customBindgenDepTag { 1854*333d2b36SAndroid Build Coastguard Worker return false 1855*333d2b36SAndroid Build Coastguard Worker } 1856*333d2b36SAndroid Build Coastguard Worker 1857*333d2b36SAndroid Build Coastguard Worker if rustDep, ok := dep.(*Module); ok && rustDep.ApexExclude() { 1858*333d2b36SAndroid Build Coastguard Worker return false 1859*333d2b36SAndroid Build Coastguard Worker } 1860*333d2b36SAndroid Build Coastguard Worker 1861*333d2b36SAndroid Build Coastguard Worker return true 1862*333d2b36SAndroid Build Coastguard Worker} 1863*333d2b36SAndroid Build Coastguard Worker 1864*333d2b36SAndroid Build Coastguard Worker// Overrides ApexModule.IsInstallabeToApex() 1865*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsInstallableToApex() bool { 1866*333d2b36SAndroid Build Coastguard Worker if mod.compiler != nil { 1867*333d2b36SAndroid Build Coastguard Worker if lib, ok := mod.compiler.(libraryInterface); ok && (lib.shared() || lib.dylib()) { 1868*333d2b36SAndroid Build Coastguard Worker return true 1869*333d2b36SAndroid Build Coastguard Worker } 1870*333d2b36SAndroid Build Coastguard Worker if _, ok := mod.compiler.(*binaryDecorator); ok { 1871*333d2b36SAndroid Build Coastguard Worker return true 1872*333d2b36SAndroid Build Coastguard Worker } 1873*333d2b36SAndroid Build Coastguard Worker } 1874*333d2b36SAndroid Build Coastguard Worker return false 1875*333d2b36SAndroid Build Coastguard Worker} 1876*333d2b36SAndroid Build Coastguard Worker 1877*333d2b36SAndroid Build Coastguard Worker// If a library file has a "lib" prefix, extract the library name without the prefix. 1878*333d2b36SAndroid Build Coastguard Workerfunc libNameFromFilePath(filepath android.Path) (string, bool) { 1879*333d2b36SAndroid Build Coastguard Worker libName := strings.TrimSuffix(filepath.Base(), filepath.Ext()) 1880*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(libName, "lib") { 1881*333d2b36SAndroid Build Coastguard Worker libName = libName[3:] 1882*333d2b36SAndroid Build Coastguard Worker return libName, true 1883*333d2b36SAndroid Build Coastguard Worker } 1884*333d2b36SAndroid Build Coastguard Worker return "", false 1885*333d2b36SAndroid Build Coastguard Worker} 1886*333d2b36SAndroid Build Coastguard Worker 1887*333d2b36SAndroid Build Coastguard Workerfunc kytheExtractRustFactory() android.Singleton { 1888*333d2b36SAndroid Build Coastguard Worker return &kytheExtractRustSingleton{} 1889*333d2b36SAndroid Build Coastguard Worker} 1890*333d2b36SAndroid Build Coastguard Worker 1891*333d2b36SAndroid Build Coastguard Workertype kytheExtractRustSingleton struct { 1892*333d2b36SAndroid Build Coastguard Worker} 1893*333d2b36SAndroid Build Coastguard Worker 1894*333d2b36SAndroid Build Coastguard Workerfunc (k kytheExtractRustSingleton) GenerateBuildActions(ctx android.SingletonContext) { 1895*333d2b36SAndroid Build Coastguard Worker var xrefTargets android.Paths 1896*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(module android.Module) { 1897*333d2b36SAndroid Build Coastguard Worker if rustModule, ok := module.(xref); ok { 1898*333d2b36SAndroid Build Coastguard Worker xrefTargets = append(xrefTargets, rustModule.XrefRustFiles()...) 1899*333d2b36SAndroid Build Coastguard Worker } 1900*333d2b36SAndroid Build Coastguard Worker }) 1901*333d2b36SAndroid Build Coastguard Worker if len(xrefTargets) > 0 { 1902*333d2b36SAndroid Build Coastguard Worker ctx.Phony("xref_rust", xrefTargets...) 1903*333d2b36SAndroid Build Coastguard Worker } 1904*333d2b36SAndroid Build Coastguard Worker} 1905*333d2b36SAndroid Build Coastguard Worker 1906*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Partition() string { 1907*333d2b36SAndroid Build Coastguard Worker return "" 1908*333d2b36SAndroid Build Coastguard Worker} 1909*333d2b36SAndroid Build Coastguard Worker 1910*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool 1911*333d2b36SAndroid Build Coastguard Workervar BoolDefault = proptools.BoolDefault 1912*333d2b36SAndroid Build Coastguard Workervar String = proptools.String 1913*333d2b36SAndroid Build Coastguard Workervar StringPtr = proptools.StringPtr 1914