1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 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 cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker// This file contains the module types for compiling C/C++ for Android, and converts the properties 18*333d2b36SAndroid Build Coastguard Worker// into the flags and filenames necessary to pass to the compiler. The final creation of the rules 19*333d2b36SAndroid Build Coastguard Worker// is handled in builder.go 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Workerimport ( 22*333d2b36SAndroid Build Coastguard Worker "errors" 23*333d2b36SAndroid Build Coastguard Worker "fmt" 24*333d2b36SAndroid Build Coastguard Worker "io" 25*333d2b36SAndroid Build Coastguard Worker "slices" 26*333d2b36SAndroid Build Coastguard Worker "strconv" 27*333d2b36SAndroid Build Coastguard Worker "strings" 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 30*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 31*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker "android/soong/aidl_library" 34*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 35*333d2b36SAndroid Build Coastguard Worker "android/soong/cc/config" 36*333d2b36SAndroid Build Coastguard Worker "android/soong/fuzz" 37*333d2b36SAndroid Build Coastguard Worker "android/soong/genrule" 38*333d2b36SAndroid Build Coastguard Worker) 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workertype CcMakeVarsInfo struct { 41*333d2b36SAndroid Build Coastguard Worker WarningsAllowed string 42*333d2b36SAndroid Build Coastguard Worker UsingWnoError string 43*333d2b36SAndroid Build Coastguard Worker MissingProfile string 44*333d2b36SAndroid Build Coastguard Worker} 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workervar CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]() 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workertype CcObjectInfo struct { 49*333d2b36SAndroid Build Coastguard Worker objFiles android.Paths 50*333d2b36SAndroid Build Coastguard Worker tidyFiles android.Paths 51*333d2b36SAndroid Build Coastguard Worker kytheFiles android.Paths 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workervar CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]() 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker// Common info about the cc module. 57*333d2b36SAndroid Build Coastguard Workertype CcInfo struct { 58*333d2b36SAndroid Build Coastguard Worker HasStubsVariants bool 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workervar CcInfoProvider = blueprint.NewProvider[CcInfo]() 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workertype LinkableInfo struct { 64*333d2b36SAndroid Build Coastguard Worker // StaticExecutable returns true if this is a binary module with "static_executable: true". 65*333d2b36SAndroid Build Coastguard Worker StaticExecutable bool 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workervar LinkableInfoKey = blueprint.NewProvider[LinkableInfo]() 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workerfunc init() { 71*333d2b36SAndroid Build Coastguard Worker RegisterCCBuildComponents(android.InitRegistrationContext) 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/android") 74*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/cc/config") 75*333d2b36SAndroid Build Coastguard Worker} 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Workerfunc RegisterCCBuildComponents(ctx android.RegistrationContext) { 78*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_defaults", defaultsFactory) 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { 81*333d2b36SAndroid Build Coastguard Worker ctx.Transition("sdk", &sdkTransitionMutator{}) 82*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("llndk", llndkMutator) 83*333d2b36SAndroid Build Coastguard Worker ctx.Transition("link", &linkageTransitionMutator{}) 84*333d2b36SAndroid Build Coastguard Worker ctx.Transition("version", &versionTransitionMutator{}) 85*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("begin", BeginMutator) 86*333d2b36SAndroid Build Coastguard Worker }) 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { 89*333d2b36SAndroid Build Coastguard Worker for _, san := range Sanitizers { 90*333d2b36SAndroid Build Coastguard Worker san.registerMutators(ctx) 91*333d2b36SAndroid Build Coastguard Worker } 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator) 94*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator) 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker ctx.Transition("fuzz", &fuzzTransitionMutator{}) 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker ctx.Transition("coverage", &coverageTransitionMutator{}) 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker ctx.Transition("afdo", &afdoTransitionMutator{}) 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker ctx.Transition("orderfile", &orderfileTransitionMutator{}) 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker ctx.Transition("lto", <oTransitionMutator{}) 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("check_linktype", checkLinkTypeMutator) 107*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries) 108*333d2b36SAndroid Build Coastguard Worker }) 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) { 111*333d2b36SAndroid Build Coastguard Worker // sabi mutator needs to be run after apex mutator finishes. 112*333d2b36SAndroid Build Coastguard Worker ctx.Transition("sabi", &sabiTransitionMutator{}) 113*333d2b36SAndroid Build Coastguard Worker }) 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory) 116*333d2b36SAndroid Build Coastguard Worker} 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Worker// Deps is a struct containing module names of dependencies, separated by the kind of dependency. 119*333d2b36SAndroid Build Coastguard Worker// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency 120*333d2b36SAndroid Build Coastguard Worker// edges to these modules. 121*333d2b36SAndroid Build Coastguard Worker// This object is constructed in DepsMutator, by calling to various module delegates to set 122*333d2b36SAndroid Build Coastguard Worker// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific 123*333d2b36SAndroid Build Coastguard Worker// dependencies. 124*333d2b36SAndroid Build Coastguard Worker// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()` 125*333d2b36SAndroid Build Coastguard Worker// (or its sibling methods) to set real dependencies on the given modules. 126*333d2b36SAndroid Build Coastguard Workertype Deps struct { 127*333d2b36SAndroid Build Coastguard Worker SharedLibs, LateSharedLibs []string 128*333d2b36SAndroid Build Coastguard Worker StaticLibs, LateStaticLibs, WholeStaticLibs []string 129*333d2b36SAndroid Build Coastguard Worker HeaderLibs []string 130*333d2b36SAndroid Build Coastguard Worker RuntimeLibs []string 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to 133*333d2b36SAndroid Build Coastguard Worker // prevent automatically exporting symbols. 134*333d2b36SAndroid Build Coastguard Worker UnexportedStaticLibs []string 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker // Used for data dependencies adjacent to tests 137*333d2b36SAndroid Build Coastguard Worker DataLibs []string 138*333d2b36SAndroid Build Coastguard Worker DataBins []string 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py. 141*333d2b36SAndroid Build Coastguard Worker SystemSharedLibs []string 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker // Used by DepMutator to pass aidl_library modules to aidl compiler 144*333d2b36SAndroid Build Coastguard Worker AidlLibs []string 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker // If true, statically link the unwinder into native libraries/binaries. 147*333d2b36SAndroid Build Coastguard Worker StaticUnwinderIfLegacy bool 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker ObjFiles []string 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Worker GeneratedSources []string 154*333d2b36SAndroid Build Coastguard Worker GeneratedHeaders []string 155*333d2b36SAndroid Build Coastguard Worker DeviceFirstGeneratedHeaders []string 156*333d2b36SAndroid Build Coastguard Worker GeneratedDeps []string 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker ReexportGeneratedHeaders []string 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Worker CrtBegin, CrtEnd []string 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker // Used for host bionic 163*333d2b36SAndroid Build Coastguard Worker DynamicLinker string 164*333d2b36SAndroid Build Coastguard Worker 165*333d2b36SAndroid Build Coastguard Worker // List of libs that need to be excluded for APEX variant 166*333d2b36SAndroid Build Coastguard Worker ExcludeLibsForApex []string 167*333d2b36SAndroid Build Coastguard Worker // List of libs that need to be excluded for non-APEX variant 168*333d2b36SAndroid Build Coastguard Worker ExcludeLibsForNonApex []string 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker // LLNDK headers for the ABI checker to check LLNDK implementation library. 171*333d2b36SAndroid Build Coastguard Worker // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant. 172*333d2b36SAndroid Build Coastguard Worker // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split(). 173*333d2b36SAndroid Build Coastguard Worker // Instead, the LLNDK implementation depends on the LLNDK header libs. 174*333d2b36SAndroid Build Coastguard Worker LlndkHeaderLibs []string 175*333d2b36SAndroid Build Coastguard Worker} 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker// A struct which to collect flags for rlib dependencies 178*333d2b36SAndroid Build Coastguard Workertype RustRlibDep struct { 179*333d2b36SAndroid Build Coastguard Worker LibPath android.Path // path to the rlib 180*333d2b36SAndroid Build Coastguard Worker LinkDirs []string // flags required for dependency (e.g. -L flags) 181*333d2b36SAndroid Build Coastguard Worker CrateName string // crateNames associated with rlibDeps 182*333d2b36SAndroid Build Coastguard Worker} 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Workerfunc EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool { 185*333d2b36SAndroid Build Coastguard Worker return a.LibPath == b.LibPath 186*333d2b36SAndroid Build Coastguard Worker} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker// PathDeps is a struct containing file paths to dependencies of a module. 189*333d2b36SAndroid Build Coastguard Worker// It's constructed in depsToPath() by traversing the direct dependencies of the current module. 190*333d2b36SAndroid Build Coastguard Worker// It's used to construct flags for various build statements (such as for compiling and linking). 191*333d2b36SAndroid Build Coastguard Worker// It is then passed to module decorator functions responsible for registering build statements 192*333d2b36SAndroid Build Coastguard Worker// (such as `module.compiler.compile()`).` 193*333d2b36SAndroid Build Coastguard Workertype PathDeps struct { 194*333d2b36SAndroid Build Coastguard Worker // Paths to .so files 195*333d2b36SAndroid Build Coastguard Worker SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths 196*333d2b36SAndroid Build Coastguard Worker // Paths to the dependencies to use for .so files (.so.toc files) 197*333d2b36SAndroid Build Coastguard Worker SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths 198*333d2b36SAndroid Build Coastguard Worker // Paths to .a files 199*333d2b36SAndroid Build Coastguard Worker StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths 200*333d2b36SAndroid Build Coastguard Worker // Paths and crateNames for RustStaticLib dependencies 201*333d2b36SAndroid Build Coastguard Worker RustRlibDeps []RustRlibDep 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Worker // Transitive static library dependencies of static libraries for use in ordering. 204*333d2b36SAndroid Build Coastguard Worker TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path] 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker // Paths to .o files 207*333d2b36SAndroid Build Coastguard Worker Objs Objects 208*333d2b36SAndroid Build Coastguard Worker // Paths to .o files in dependencies that provide them. Note that these lists 209*333d2b36SAndroid Build Coastguard Worker // aren't complete since prebuilt modules don't provide the .o files. 210*333d2b36SAndroid Build Coastguard Worker StaticLibObjs Objects 211*333d2b36SAndroid Build Coastguard Worker WholeStaticLibObjs Objects 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain 214*333d2b36SAndroid Build Coastguard Worker // the libs from all whole_static_lib dependencies. 215*333d2b36SAndroid Build Coastguard Worker WholeStaticLibsFromPrebuilts android.Paths 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Worker // Paths to generated source files 218*333d2b36SAndroid Build Coastguard Worker GeneratedSources android.Paths 219*333d2b36SAndroid Build Coastguard Worker GeneratedDeps android.Paths 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Worker Flags []string 222*333d2b36SAndroid Build Coastguard Worker LdFlags []string 223*333d2b36SAndroid Build Coastguard Worker IncludeDirs android.Paths 224*333d2b36SAndroid Build Coastguard Worker SystemIncludeDirs android.Paths 225*333d2b36SAndroid Build Coastguard Worker ReexportedDirs android.Paths 226*333d2b36SAndroid Build Coastguard Worker ReexportedSystemDirs android.Paths 227*333d2b36SAndroid Build Coastguard Worker ReexportedFlags []string 228*333d2b36SAndroid Build Coastguard Worker ReexportedGeneratedHeaders android.Paths 229*333d2b36SAndroid Build Coastguard Worker ReexportedDeps android.Paths 230*333d2b36SAndroid Build Coastguard Worker ReexportedRustRlibDeps []RustRlibDep 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Worker // Paths to crt*.o files 233*333d2b36SAndroid Build Coastguard Worker CrtBegin, CrtEnd android.Paths 234*333d2b36SAndroid Build Coastguard Worker 235*333d2b36SAndroid Build Coastguard Worker // Path to the dynamic linker binary 236*333d2b36SAndroid Build Coastguard Worker DynamicLinker android.OptionalPath 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker // For Darwin builds, the path to the second architecture's output that should 239*333d2b36SAndroid Build Coastguard Worker // be combined with this architectures's output into a FAT MachO file. 240*333d2b36SAndroid Build Coastguard Worker DarwinSecondArchOutput android.OptionalPath 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker // Paths to direct srcs and transitive include dirs from direct aidl_library deps 243*333d2b36SAndroid Build Coastguard Worker AidlLibraryInfos []aidl_library.AidlLibraryInfo 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker // LLNDK headers for the ABI checker to check LLNDK implementation library. 246*333d2b36SAndroid Build Coastguard Worker LlndkIncludeDirs android.Paths 247*333d2b36SAndroid Build Coastguard Worker LlndkSystemIncludeDirs android.Paths 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker directImplementationDeps android.Paths 250*333d2b36SAndroid Build Coastguard Worker transitiveImplementationDeps []depset.DepSet[android.Path] 251*333d2b36SAndroid Build Coastguard Worker} 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module 254*333d2b36SAndroid Build Coastguard Worker// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the 255*333d2b36SAndroid Build Coastguard Worker// command line so they can be overridden by the local module flags). 256*333d2b36SAndroid Build Coastguard Workertype LocalOrGlobalFlags struct { 257*333d2b36SAndroid Build Coastguard Worker CommonFlags []string // Flags that apply to C, C++, and assembly source files 258*333d2b36SAndroid Build Coastguard Worker AsFlags []string // Flags that apply to assembly source files 259*333d2b36SAndroid Build Coastguard Worker YasmFlags []string // Flags that apply to yasm assembly source files 260*333d2b36SAndroid Build Coastguard Worker CFlags []string // Flags that apply to C and C++ source files 261*333d2b36SAndroid Build Coastguard Worker ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools 262*333d2b36SAndroid Build Coastguard Worker ConlyFlags []string // Flags that apply to C source files 263*333d2b36SAndroid Build Coastguard Worker CppFlags []string // Flags that apply to C++ source files 264*333d2b36SAndroid Build Coastguard Worker ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools 265*333d2b36SAndroid Build Coastguard Worker LdFlags []string // Flags that apply to linker command lines 266*333d2b36SAndroid Build Coastguard Worker} 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Worker// Flags contains various types of command line flags (and settings) for use in building build 269*333d2b36SAndroid Build Coastguard Worker// statements related to C++. 270*333d2b36SAndroid Build Coastguard Workertype Flags struct { 271*333d2b36SAndroid Build Coastguard Worker // Local flags (which individual modules are responsible for). These may override global flags. 272*333d2b36SAndroid Build Coastguard Worker Local LocalOrGlobalFlags 273*333d2b36SAndroid Build Coastguard Worker // Global flags (which build system or toolchain is responsible for). 274*333d2b36SAndroid Build Coastguard Worker Global LocalOrGlobalFlags 275*333d2b36SAndroid Build Coastguard Worker NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker aidlFlags []string // Flags that apply to aidl source files 278*333d2b36SAndroid Build Coastguard Worker rsFlags []string // Flags that apply to renderscript source files 279*333d2b36SAndroid Build Coastguard Worker libFlags []string // Flags to add libraries early to the link order 280*333d2b36SAndroid Build Coastguard Worker extraLibFlags []string // Flags to add libraries late in the link order after LdFlags 281*333d2b36SAndroid Build Coastguard Worker TidyFlags []string // Flags that apply to clang-tidy 282*333d2b36SAndroid Build Coastguard Worker SAbiFlags []string // Flags that apply to header-abi-dumper 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker // Global include flags that apply to C, C++, and assembly source files 285*333d2b36SAndroid Build Coastguard Worker // These must be after any module include flags, which will be in CommonFlags. 286*333d2b36SAndroid Build Coastguard Worker SystemIncludeFlags []string 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker Toolchain config.Toolchain 289*333d2b36SAndroid Build Coastguard Worker Tidy bool // True if ninja .tidy rules should be generated. 290*333d2b36SAndroid Build Coastguard Worker NeedTidyFiles bool // True if module link should depend on .tidy files 291*333d2b36SAndroid Build Coastguard Worker GcovCoverage bool // True if coverage files should be generated. 292*333d2b36SAndroid Build Coastguard Worker SAbiDump bool // True if header abi dumps should be generated. 293*333d2b36SAndroid Build Coastguard Worker EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe 294*333d2b36SAndroid Build Coastguard Worker ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line. 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Worker // The instruction set required for clang ("arm" or "thumb"). 297*333d2b36SAndroid Build Coastguard Worker RequiredInstructionSet string 298*333d2b36SAndroid Build Coastguard Worker // The target-device system path to the dynamic linker. 299*333d2b36SAndroid Build Coastguard Worker DynamicLinker string 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker CFlagsDeps android.Paths // Files depended on by compiler flags 302*333d2b36SAndroid Build Coastguard Worker LdFlagsDeps android.Paths // Files depended on by linker flags 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker // True if .s files should be processed with the c preprocessor. 305*333d2b36SAndroid Build Coastguard Worker AssemblerWithCpp bool 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker proto android.ProtoFlags 308*333d2b36SAndroid Build Coastguard Worker protoC bool // Whether to use C instead of C++ 309*333d2b36SAndroid Build Coastguard Worker protoOptionsFile bool // Whether to look for a .options file next to the .proto 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker Yacc *YaccProperties 312*333d2b36SAndroid Build Coastguard Worker Lex *LexProperties 313*333d2b36SAndroid Build Coastguard Worker} 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker// Properties used to compile all C or C++ modules 316*333d2b36SAndroid Build Coastguard Workertype BaseProperties struct { 317*333d2b36SAndroid Build Coastguard Worker // Deprecated. true is the default, false is invalid. 318*333d2b36SAndroid Build Coastguard Worker Clang *bool `android:"arch_variant"` 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Worker // Aggresively trade performance for smaller binary size. 321*333d2b36SAndroid Build Coastguard Worker // This should only be used for on-device binaries that are rarely executed and not 322*333d2b36SAndroid Build Coastguard Worker // performance critical. 323*333d2b36SAndroid Build Coastguard Worker Optimize_for_size *bool `android:"arch_variant"` 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker // The API level that this module is built against. The APIs of this API level will be 326*333d2b36SAndroid Build Coastguard Worker // visible at build time, but use of any APIs newer than min_sdk_version will render the 327*333d2b36SAndroid Build Coastguard Worker // module unloadable on older devices. In the future it will be possible to weakly-link new 328*333d2b36SAndroid Build Coastguard Worker // APIs, making the behavior match Java: such modules will load on older devices, but 329*333d2b36SAndroid Build Coastguard Worker // calling new APIs on devices that do not support them will result in a crash. 330*333d2b36SAndroid Build Coastguard Worker // 331*333d2b36SAndroid Build Coastguard Worker // This property has the same behavior as sdk_version does for Java modules. For those 332*333d2b36SAndroid Build Coastguard Worker // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion 333*333d2b36SAndroid Build Coastguard Worker // does for Java code. 334*333d2b36SAndroid Build Coastguard Worker // 335*333d2b36SAndroid Build Coastguard Worker // In addition, setting this property causes two variants to be built, one for the platform 336*333d2b36SAndroid Build Coastguard Worker // and one for apps. 337*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 338*333d2b36SAndroid Build Coastguard Worker 339*333d2b36SAndroid Build Coastguard Worker // Minimum OS API level supported by this C or C++ module. This property becomes the value 340*333d2b36SAndroid Build Coastguard Worker // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK, 341*333d2b36SAndroid Build Coastguard Worker // this property is also used to ensure that the min_sdk_version of the containing module is 342*333d2b36SAndroid Build Coastguard Worker // not older (i.e. less) than this module's min_sdk_version. When not set, this property 343*333d2b36SAndroid Build Coastguard Worker // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks 344*333d2b36SAndroid Build Coastguard Worker // min_sdk_version of the containing APEX. When the module 345*333d2b36SAndroid Build Coastguard Worker // is not built for an APEX, "apex_inherit" defaults to sdk_version. 346*333d2b36SAndroid Build Coastguard Worker Min_sdk_version *string 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker // If true, always create an sdk variant and don't create a platform variant. 349*333d2b36SAndroid Build Coastguard Worker Sdk_variant_only *bool 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker AndroidMkSharedLibs []string `blueprint:"mutated"` 352*333d2b36SAndroid Build Coastguard Worker AndroidMkStaticLibs []string `blueprint:"mutated"` 353*333d2b36SAndroid Build Coastguard Worker AndroidMkRlibs []string `blueprint:"mutated"` 354*333d2b36SAndroid Build Coastguard Worker AndroidMkRuntimeLibs []string `blueprint:"mutated"` 355*333d2b36SAndroid Build Coastguard Worker AndroidMkWholeStaticLibs []string `blueprint:"mutated"` 356*333d2b36SAndroid Build Coastguard Worker AndroidMkHeaderLibs []string `blueprint:"mutated"` 357*333d2b36SAndroid Build Coastguard Worker HideFromMake bool `blueprint:"mutated"` 358*333d2b36SAndroid Build Coastguard Worker PreventInstall bool `blueprint:"mutated"` 359*333d2b36SAndroid Build Coastguard Worker 360*333d2b36SAndroid Build Coastguard Worker // Set by DepsMutator. 361*333d2b36SAndroid Build Coastguard Worker AndroidMkSystemSharedLibs []string `blueprint:"mutated"` 362*333d2b36SAndroid Build Coastguard Worker 363*333d2b36SAndroid Build Coastguard Worker // The name of the image this module is built for 364*333d2b36SAndroid Build Coastguard Worker ImageVariation string `blueprint:"mutated"` 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker // The VNDK version this module is built against. If empty, the module is not 367*333d2b36SAndroid Build Coastguard Worker // build against the VNDK. 368*333d2b36SAndroid Build Coastguard Worker VndkVersion string `blueprint:"mutated"` 369*333d2b36SAndroid Build Coastguard Worker 370*333d2b36SAndroid Build Coastguard Worker // Suffix for the name of Android.mk entries generated by this module 371*333d2b36SAndroid Build Coastguard Worker SubName string `blueprint:"mutated"` 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags 374*333d2b36SAndroid Build Coastguard Worker // file 375*333d2b36SAndroid Build Coastguard Worker Logtags []string `android:"path"` 376*333d2b36SAndroid Build Coastguard Worker 377*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for ramdisk. 378*333d2b36SAndroid Build Coastguard Worker // On device without a dedicated recovery partition, the module is only 379*333d2b36SAndroid Build Coastguard Worker // available after switching root into 380*333d2b36SAndroid Build Coastguard Worker // /first_stage_ramdisk. To expose the module before switching root, install 381*333d2b36SAndroid Build Coastguard Worker // the recovery variant instead. 382*333d2b36SAndroid Build Coastguard Worker Ramdisk_available *bool 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for vendor ramdisk. 385*333d2b36SAndroid Build Coastguard Worker // On device without a dedicated recovery partition, the module is only 386*333d2b36SAndroid Build Coastguard Worker // available after switching root into 387*333d2b36SAndroid Build Coastguard Worker // /first_stage_ramdisk. To expose the module before switching root, install 388*333d2b36SAndroid Build Coastguard Worker // the recovery variant instead. 389*333d2b36SAndroid Build Coastguard Worker Vendor_ramdisk_available *bool 390*333d2b36SAndroid Build Coastguard Worker 391*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for recovery 392*333d2b36SAndroid Build Coastguard Worker Recovery_available *bool 393*333d2b36SAndroid Build Coastguard Worker 394*333d2b36SAndroid Build Coastguard Worker // Used by imageMutator, set by ImageMutatorBegin() 395*333d2b36SAndroid Build Coastguard Worker VendorVariantNeeded bool `blueprint:"mutated"` 396*333d2b36SAndroid Build Coastguard Worker ProductVariantNeeded bool `blueprint:"mutated"` 397*333d2b36SAndroid Build Coastguard Worker CoreVariantNeeded bool `blueprint:"mutated"` 398*333d2b36SAndroid Build Coastguard Worker RamdiskVariantNeeded bool `blueprint:"mutated"` 399*333d2b36SAndroid Build Coastguard Worker VendorRamdiskVariantNeeded bool `blueprint:"mutated"` 400*333d2b36SAndroid Build Coastguard Worker RecoveryVariantNeeded bool `blueprint:"mutated"` 401*333d2b36SAndroid Build Coastguard Worker 402*333d2b36SAndroid Build Coastguard Worker // A list of variations for the "image" mutator of the form 403*333d2b36SAndroid Build Coastguard Worker //<image name> '.' <version char>, for example, 'vendor.S' 404*333d2b36SAndroid Build Coastguard Worker ExtraVersionedImageVariations []string `blueprint:"mutated"` 405*333d2b36SAndroid Build Coastguard Worker 406*333d2b36SAndroid Build Coastguard Worker // Allows this module to use non-APEX version of libraries. Useful 407*333d2b36SAndroid Build Coastguard Worker // for building binaries that are started before APEXes are activated. 408*333d2b36SAndroid Build Coastguard Worker Bootstrap *bool 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Worker // Allows this module to be included in CMake release snapshots to be built outside of Android 411*333d2b36SAndroid Build Coastguard Worker // build system and source tree. 412*333d2b36SAndroid Build Coastguard Worker Cmake_snapshot_supported *bool 413*333d2b36SAndroid Build Coastguard Worker 414*333d2b36SAndroid Build Coastguard Worker Installable *bool `android:"arch_variant"` 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Worker // Set by factories of module types that can only be referenced from variants compiled against 417*333d2b36SAndroid Build Coastguard Worker // the SDK. 418*333d2b36SAndroid Build Coastguard Worker AlwaysSdk bool `blueprint:"mutated"` 419*333d2b36SAndroid Build Coastguard Worker 420*333d2b36SAndroid Build Coastguard Worker // Variant is an SDK variant created by sdkMutator 421*333d2b36SAndroid Build Coastguard Worker IsSdkVariant bool `blueprint:"mutated"` 422*333d2b36SAndroid Build Coastguard Worker // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK 423*333d2b36SAndroid Build Coastguard Worker // variant to have a ".sdk" suffix. 424*333d2b36SAndroid Build Coastguard Worker SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"` 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker Target struct { 427*333d2b36SAndroid Build Coastguard Worker Platform struct { 428*333d2b36SAndroid Build Coastguard Worker // List of modules required by the core variant. 429*333d2b36SAndroid Build Coastguard Worker Required []string `android:"arch_variant"` 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker // List of modules not required by the core variant. 432*333d2b36SAndroid Build Coastguard Worker Exclude_required []string `android:"arch_variant"` 433*333d2b36SAndroid Build Coastguard Worker } `android:"arch_variant"` 434*333d2b36SAndroid Build Coastguard Worker 435*333d2b36SAndroid Build Coastguard Worker Recovery struct { 436*333d2b36SAndroid Build Coastguard Worker // List of modules required by the recovery variant. 437*333d2b36SAndroid Build Coastguard Worker Required []string `android:"arch_variant"` 438*333d2b36SAndroid Build Coastguard Worker 439*333d2b36SAndroid Build Coastguard Worker // List of modules not required by the recovery variant. 440*333d2b36SAndroid Build Coastguard Worker Exclude_required []string `android:"arch_variant"` 441*333d2b36SAndroid Build Coastguard Worker } `android:"arch_variant"` 442*333d2b36SAndroid Build Coastguard Worker } `android:"arch_variant"` 443*333d2b36SAndroid Build Coastguard Worker} 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Workertype VendorProperties struct { 446*333d2b36SAndroid Build Coastguard Worker // whether this module should be allowed to be directly depended by other 447*333d2b36SAndroid Build Coastguard Worker // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`. 448*333d2b36SAndroid Build Coastguard Worker // If set to true, two variants will be built separately, one like 449*333d2b36SAndroid Build Coastguard Worker // normal, and the other limited to the set of libraries and headers 450*333d2b36SAndroid Build Coastguard Worker // that are exposed to /vendor modules. 451*333d2b36SAndroid Build Coastguard Worker // 452*333d2b36SAndroid Build Coastguard Worker // The vendor variant may be used with a different (newer) /system, 453*333d2b36SAndroid Build Coastguard Worker // so it shouldn't have any unversioned runtime dependencies, or 454*333d2b36SAndroid Build Coastguard Worker // make assumptions about the system that may not be true in the 455*333d2b36SAndroid Build Coastguard Worker // future. 456*333d2b36SAndroid Build Coastguard Worker // 457*333d2b36SAndroid Build Coastguard Worker // If set to false, this module becomes inaccessible from /vendor modules. 458*333d2b36SAndroid Build Coastguard Worker // 459*333d2b36SAndroid Build Coastguard Worker // The modules with vndk: {enabled: true} must define 'vendor_available' 460*333d2b36SAndroid Build Coastguard Worker // to 'true'. 461*333d2b36SAndroid Build Coastguard Worker // 462*333d2b36SAndroid Build Coastguard Worker // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk 463*333d2b36SAndroid Build Coastguard Worker Vendor_available *bool 464*333d2b36SAndroid Build Coastguard Worker 465*333d2b36SAndroid Build Coastguard Worker // This is the same as the "vendor_available" except that the install path 466*333d2b36SAndroid Build Coastguard Worker // of the vendor variant is /odm or /vendor/odm. 467*333d2b36SAndroid Build Coastguard Worker // By replacing "vendor_available: true" with "odm_available: true", the 468*333d2b36SAndroid Build Coastguard Worker // module will install its vendor variant to the /odm partition or /vendor/odm. 469*333d2b36SAndroid Build Coastguard Worker // As the modules with "odm_available: true" still create the vendor variants, 470*333d2b36SAndroid Build Coastguard Worker // they can link to the other vendor modules as the vendor_available modules do. 471*333d2b36SAndroid Build Coastguard Worker // Also, the vendor modules can link to odm_available modules. 472*333d2b36SAndroid Build Coastguard Worker // 473*333d2b36SAndroid Build Coastguard Worker // It may not be used for VNDK modules. 474*333d2b36SAndroid Build Coastguard Worker Odm_available *bool 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Worker // whether this module should be allowed to be directly depended by other 477*333d2b36SAndroid Build Coastguard Worker // modules with `product_specific: true` or `product_available: true`. 478*333d2b36SAndroid Build Coastguard Worker // If set to true, an additional product variant will be built separately 479*333d2b36SAndroid Build Coastguard Worker // that is limited to the set of libraries and headers that are exposed to 480*333d2b36SAndroid Build Coastguard Worker // /product modules. 481*333d2b36SAndroid Build Coastguard Worker // 482*333d2b36SAndroid Build Coastguard Worker // The product variant may be used with a different (newer) /system, 483*333d2b36SAndroid Build Coastguard Worker // so it shouldn't have any unversioned runtime dependencies, or 484*333d2b36SAndroid Build Coastguard Worker // make assumptions about the system that may not be true in the 485*333d2b36SAndroid Build Coastguard Worker // future. 486*333d2b36SAndroid Build Coastguard Worker // 487*333d2b36SAndroid Build Coastguard Worker // If set to false, this module becomes inaccessible from /product modules. 488*333d2b36SAndroid Build Coastguard Worker // 489*333d2b36SAndroid Build Coastguard Worker // Different from the 'vendor_available' property, the modules with 490*333d2b36SAndroid Build Coastguard Worker // vndk: {enabled: true} don't have to define 'product_available'. The VNDK 491*333d2b36SAndroid Build Coastguard Worker // library without 'product_available' may not be depended on by any other 492*333d2b36SAndroid Build Coastguard Worker // modules that has product variants including the product available VNDKs. 493*333d2b36SAndroid Build Coastguard Worker // 494*333d2b36SAndroid Build Coastguard Worker // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk 495*333d2b36SAndroid Build Coastguard Worker // and PRODUCT_PRODUCT_VNDK_VERSION isn't set. 496*333d2b36SAndroid Build Coastguard Worker Product_available *bool 497*333d2b36SAndroid Build Coastguard Worker 498*333d2b36SAndroid Build Coastguard Worker // whether this module is capable of being loaded with other instance 499*333d2b36SAndroid Build Coastguard Worker // (possibly an older version) of the same module in the same process. 500*333d2b36SAndroid Build Coastguard Worker // Currently, a shared library that is a member of VNDK (vndk: {enabled: true}) 501*333d2b36SAndroid Build Coastguard Worker // can be double loaded in a vendor process if the library is also a 502*333d2b36SAndroid Build Coastguard Worker // (direct and indirect) dependency of an LLNDK library. Such libraries must be 503*333d2b36SAndroid Build Coastguard Worker // explicitly marked as `double_loadable: true` by the owner, or the dependency 504*333d2b36SAndroid Build Coastguard Worker // from the LLNDK lib should be cut if the lib is not designed to be double loaded. 505*333d2b36SAndroid Build Coastguard Worker Double_loadable *bool 506*333d2b36SAndroid Build Coastguard Worker 507*333d2b36SAndroid Build Coastguard Worker // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs. 508*333d2b36SAndroid Build Coastguard Worker IsLLNDK bool `blueprint:"mutated"` 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Worker // IsVendorPublicLibrary is set for the core and product variants of a library that has 511*333d2b36SAndroid Build Coastguard Worker // vendor_public_library stubs. 512*333d2b36SAndroid Build Coastguard Worker IsVendorPublicLibrary bool `blueprint:"mutated"` 513*333d2b36SAndroid Build Coastguard Worker} 514*333d2b36SAndroid Build Coastguard Worker 515*333d2b36SAndroid Build Coastguard Worker// ModuleContextIntf is an interface (on a module context helper) consisting of functions related 516*333d2b36SAndroid Build Coastguard Worker// to understanding details about the type of the current module. 517*333d2b36SAndroid Build Coastguard Worker// For example, one might call these functions to determine whether the current module is a static 518*333d2b36SAndroid Build Coastguard Worker// library and/or is installed in vendor directories. 519*333d2b36SAndroid Build Coastguard Workertype ModuleContextIntf interface { 520*333d2b36SAndroid Build Coastguard Worker static() bool 521*333d2b36SAndroid Build Coastguard Worker staticBinary() bool 522*333d2b36SAndroid Build Coastguard Worker testBinary() bool 523*333d2b36SAndroid Build Coastguard Worker testLibrary() bool 524*333d2b36SAndroid Build Coastguard Worker header() bool 525*333d2b36SAndroid Build Coastguard Worker binary() bool 526*333d2b36SAndroid Build Coastguard Worker object() bool 527*333d2b36SAndroid Build Coastguard Worker toolchain() config.Toolchain 528*333d2b36SAndroid Build Coastguard Worker canUseSdk() bool 529*333d2b36SAndroid Build Coastguard Worker useSdk() bool 530*333d2b36SAndroid Build Coastguard Worker sdkVersion() string 531*333d2b36SAndroid Build Coastguard Worker minSdkVersion() string 532*333d2b36SAndroid Build Coastguard Worker isSdkVariant() bool 533*333d2b36SAndroid Build Coastguard Worker useVndk() bool 534*333d2b36SAndroid Build Coastguard Worker isNdk(config android.Config) bool 535*333d2b36SAndroid Build Coastguard Worker IsLlndk() bool 536*333d2b36SAndroid Build Coastguard Worker isImplementationForLLNDKPublic() bool 537*333d2b36SAndroid Build Coastguard Worker IsVendorPublicLibrary() bool 538*333d2b36SAndroid Build Coastguard Worker inProduct() bool 539*333d2b36SAndroid Build Coastguard Worker inVendor() bool 540*333d2b36SAndroid Build Coastguard Worker inRamdisk() bool 541*333d2b36SAndroid Build Coastguard Worker inVendorRamdisk() bool 542*333d2b36SAndroid Build Coastguard Worker inRecovery() bool 543*333d2b36SAndroid Build Coastguard Worker InVendorOrProduct() bool 544*333d2b36SAndroid Build Coastguard Worker selectedStl() string 545*333d2b36SAndroid Build Coastguard Worker baseModuleName() string 546*333d2b36SAndroid Build Coastguard Worker isAfdoCompile(ctx ModuleContext) bool 547*333d2b36SAndroid Build Coastguard Worker isOrderfileCompile() bool 548*333d2b36SAndroid Build Coastguard Worker isCfi() bool 549*333d2b36SAndroid Build Coastguard Worker isFuzzer() bool 550*333d2b36SAndroid Build Coastguard Worker isNDKStubLibrary() bool 551*333d2b36SAndroid Build Coastguard Worker useClangLld(actx ModuleContext) bool 552*333d2b36SAndroid Build Coastguard Worker isForPlatform() bool 553*333d2b36SAndroid Build Coastguard Worker apexVariationName() string 554*333d2b36SAndroid Build Coastguard Worker apexSdkVersion() android.ApiLevel 555*333d2b36SAndroid Build Coastguard Worker bootstrap() bool 556*333d2b36SAndroid Build Coastguard Worker nativeCoverage() bool 557*333d2b36SAndroid Build Coastguard Worker isPreventInstall() bool 558*333d2b36SAndroid Build Coastguard Worker isCfiAssemblySupportEnabled() bool 559*333d2b36SAndroid Build Coastguard Worker getSharedFlags() *SharedFlags 560*333d2b36SAndroid Build Coastguard Worker notInPlatform() bool 561*333d2b36SAndroid Build Coastguard Worker optimizeForSize() bool 562*333d2b36SAndroid Build Coastguard Worker getOrCreateMakeVarsInfo() *CcMakeVarsInfo 563*333d2b36SAndroid Build Coastguard Worker} 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Workertype SharedFlags struct { 566*333d2b36SAndroid Build Coastguard Worker numSharedFlags int 567*333d2b36SAndroid Build Coastguard Worker flagsMap map[string]string 568*333d2b36SAndroid Build Coastguard Worker} 569*333d2b36SAndroid Build Coastguard Worker 570*333d2b36SAndroid Build Coastguard Workertype ModuleContext interface { 571*333d2b36SAndroid Build Coastguard Worker android.ModuleContext 572*333d2b36SAndroid Build Coastguard Worker ModuleContextIntf 573*333d2b36SAndroid Build Coastguard Worker} 574*333d2b36SAndroid Build Coastguard Worker 575*333d2b36SAndroid Build Coastguard Workertype BaseModuleContext interface { 576*333d2b36SAndroid Build Coastguard Worker android.BaseModuleContext 577*333d2b36SAndroid Build Coastguard Worker ModuleContextIntf 578*333d2b36SAndroid Build Coastguard Worker} 579*333d2b36SAndroid Build Coastguard Worker 580*333d2b36SAndroid Build Coastguard Workertype DepsContext interface { 581*333d2b36SAndroid Build Coastguard Worker android.BottomUpMutatorContext 582*333d2b36SAndroid Build Coastguard Worker ModuleContextIntf 583*333d2b36SAndroid Build Coastguard Worker} 584*333d2b36SAndroid Build Coastguard Worker 585*333d2b36SAndroid Build Coastguard Worker// feature represents additional (optional) steps to building cc-related modules, such as invocation 586*333d2b36SAndroid Build Coastguard Worker// of clang-tidy. 587*333d2b36SAndroid Build Coastguard Workertype feature interface { 588*333d2b36SAndroid Build Coastguard Worker flags(ctx ModuleContext, flags Flags) Flags 589*333d2b36SAndroid Build Coastguard Worker props() []interface{} 590*333d2b36SAndroid Build Coastguard Worker} 591*333d2b36SAndroid Build Coastguard Worker 592*333d2b36SAndroid Build Coastguard Worker// Information returned from Generator about the source code it's generating 593*333d2b36SAndroid Build Coastguard Workertype GeneratedSource struct { 594*333d2b36SAndroid Build Coastguard Worker IncludeDirs android.Paths 595*333d2b36SAndroid Build Coastguard Worker Sources android.Paths 596*333d2b36SAndroid Build Coastguard Worker Headers android.Paths 597*333d2b36SAndroid Build Coastguard Worker ReexportedDirs android.Paths 598*333d2b36SAndroid Build Coastguard Worker} 599*333d2b36SAndroid Build Coastguard Worker 600*333d2b36SAndroid Build Coastguard Worker// generator allows injection of generated code 601*333d2b36SAndroid Build Coastguard Workertype Generator interface { 602*333d2b36SAndroid Build Coastguard Worker GeneratorProps() []interface{} 603*333d2b36SAndroid Build Coastguard Worker GeneratorInit(ctx BaseModuleContext) 604*333d2b36SAndroid Build Coastguard Worker GeneratorDeps(ctx DepsContext, deps Deps) Deps 605*333d2b36SAndroid Build Coastguard Worker GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags 606*333d2b36SAndroid Build Coastguard Worker GeneratorSources(ctx ModuleContext) GeneratedSource 607*333d2b36SAndroid Build Coastguard Worker GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps) 608*333d2b36SAndroid Build Coastguard Worker} 609*333d2b36SAndroid Build Coastguard Worker 610*333d2b36SAndroid Build Coastguard Worker// compiler is the interface for a compiler helper object. Different module decorators may implement 611*333d2b36SAndroid Build Coastguard Worker// this helper differently. 612*333d2b36SAndroid Build Coastguard Workertype compiler interface { 613*333d2b36SAndroid Build Coastguard Worker compilerInit(ctx BaseModuleContext) 614*333d2b36SAndroid Build Coastguard Worker compilerDeps(ctx DepsContext, deps Deps) Deps 615*333d2b36SAndroid Build Coastguard Worker compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags 616*333d2b36SAndroid Build Coastguard Worker compilerProps() []interface{} 617*333d2b36SAndroid Build Coastguard Worker baseCompilerProps() BaseCompilerProperties 618*333d2b36SAndroid Build Coastguard Worker 619*333d2b36SAndroid Build Coastguard Worker appendCflags([]string) 620*333d2b36SAndroid Build Coastguard Worker appendAsflags([]string) 621*333d2b36SAndroid Build Coastguard Worker compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects 622*333d2b36SAndroid Build Coastguard Worker} 623*333d2b36SAndroid Build Coastguard Worker 624*333d2b36SAndroid Build Coastguard Worker// linker is the interface for a linker decorator object. Individual module types can provide 625*333d2b36SAndroid Build Coastguard Worker// their own implementation for this decorator, and thus specify custom logic regarding build 626*333d2b36SAndroid Build Coastguard Worker// statements pertaining to linking. 627*333d2b36SAndroid Build Coastguard Workertype linker interface { 628*333d2b36SAndroid Build Coastguard Worker linkerInit(ctx BaseModuleContext) 629*333d2b36SAndroid Build Coastguard Worker linkerDeps(ctx DepsContext, deps Deps) Deps 630*333d2b36SAndroid Build Coastguard Worker linkerFlags(ctx ModuleContext, flags Flags) Flags 631*333d2b36SAndroid Build Coastguard Worker linkerProps() []interface{} 632*333d2b36SAndroid Build Coastguard Worker baseLinkerProps() BaseLinkerProperties 633*333d2b36SAndroid Build Coastguard Worker useClangLld(actx ModuleContext) bool 634*333d2b36SAndroid Build Coastguard Worker 635*333d2b36SAndroid Build Coastguard Worker link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path 636*333d2b36SAndroid Build Coastguard Worker appendLdflags([]string) 637*333d2b36SAndroid Build Coastguard Worker unstrippedOutputFilePath() android.Path 638*333d2b36SAndroid Build Coastguard Worker strippedAllOutputFilePath() android.Path 639*333d2b36SAndroid Build Coastguard Worker 640*333d2b36SAndroid Build Coastguard Worker nativeCoverage() bool 641*333d2b36SAndroid Build Coastguard Worker coverageOutputFilePath() android.OptionalPath 642*333d2b36SAndroid Build Coastguard Worker 643*333d2b36SAndroid Build Coastguard Worker // Get the deps that have been explicitly specified in the properties. 644*333d2b36SAndroid Build Coastguard Worker linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps 645*333d2b36SAndroid Build Coastguard Worker 646*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON) 647*333d2b36SAndroid Build Coastguard Worker} 648*333d2b36SAndroid Build Coastguard Worker 649*333d2b36SAndroid Build Coastguard Worker// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker. 650*333d2b36SAndroid Build Coastguard Workertype specifiedDeps struct { 651*333d2b36SAndroid Build Coastguard Worker sharedLibs []string 652*333d2b36SAndroid Build Coastguard Worker // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually 653*333d2b36SAndroid Build Coastguard Worker // libc, libm, etc.) 654*333d2b36SAndroid Build Coastguard Worker systemSharedLibs []string 655*333d2b36SAndroid Build Coastguard Worker} 656*333d2b36SAndroid Build Coastguard Worker 657*333d2b36SAndroid Build Coastguard Worker// installer is the interface for an installer helper object. This helper is responsible for 658*333d2b36SAndroid Build Coastguard Worker// copying build outputs to the appropriate locations so that they may be installed on device. 659*333d2b36SAndroid Build Coastguard Workertype installer interface { 660*333d2b36SAndroid Build Coastguard Worker installerProps() []interface{} 661*333d2b36SAndroid Build Coastguard Worker install(ctx ModuleContext, path android.Path) 662*333d2b36SAndroid Build Coastguard Worker everInstallable() bool 663*333d2b36SAndroid Build Coastguard Worker inData() bool 664*333d2b36SAndroid Build Coastguard Worker inSanitizerDir() bool 665*333d2b36SAndroid Build Coastguard Worker hostToolPath() android.OptionalPath 666*333d2b36SAndroid Build Coastguard Worker relativeInstallPath() string 667*333d2b36SAndroid Build Coastguard Worker makeUninstallable(mod *Module) 668*333d2b36SAndroid Build Coastguard Worker installInRoot() bool 669*333d2b36SAndroid Build Coastguard Worker} 670*333d2b36SAndroid Build Coastguard Worker 671*333d2b36SAndroid Build Coastguard Workertype overridable interface { 672*333d2b36SAndroid Build Coastguard Worker overriddenModules() []string 673*333d2b36SAndroid Build Coastguard Worker} 674*333d2b36SAndroid Build Coastguard Worker 675*333d2b36SAndroid Build Coastguard Workertype libraryDependencyKind int 676*333d2b36SAndroid Build Coastguard Worker 677*333d2b36SAndroid Build Coastguard Workerconst ( 678*333d2b36SAndroid Build Coastguard Worker headerLibraryDependency = iota 679*333d2b36SAndroid Build Coastguard Worker sharedLibraryDependency 680*333d2b36SAndroid Build Coastguard Worker staticLibraryDependency 681*333d2b36SAndroid Build Coastguard Worker rlibLibraryDependency 682*333d2b36SAndroid Build Coastguard Worker) 683*333d2b36SAndroid Build Coastguard Worker 684*333d2b36SAndroid Build Coastguard Workerfunc (k libraryDependencyKind) String() string { 685*333d2b36SAndroid Build Coastguard Worker switch k { 686*333d2b36SAndroid Build Coastguard Worker case headerLibraryDependency: 687*333d2b36SAndroid Build Coastguard Worker return "headerLibraryDependency" 688*333d2b36SAndroid Build Coastguard Worker case sharedLibraryDependency: 689*333d2b36SAndroid Build Coastguard Worker return "sharedLibraryDependency" 690*333d2b36SAndroid Build Coastguard Worker case staticLibraryDependency: 691*333d2b36SAndroid Build Coastguard Worker return "staticLibraryDependency" 692*333d2b36SAndroid Build Coastguard Worker case rlibLibraryDependency: 693*333d2b36SAndroid Build Coastguard Worker return "rlibLibraryDependency" 694*333d2b36SAndroid Build Coastguard Worker default: 695*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("unknown libraryDependencyKind %d", k)) 696*333d2b36SAndroid Build Coastguard Worker } 697*333d2b36SAndroid Build Coastguard Worker} 698*333d2b36SAndroid Build Coastguard Worker 699*333d2b36SAndroid Build Coastguard Workertype libraryDependencyOrder int 700*333d2b36SAndroid Build Coastguard Worker 701*333d2b36SAndroid Build Coastguard Workerconst ( 702*333d2b36SAndroid Build Coastguard Worker earlyLibraryDependency = -1 703*333d2b36SAndroid Build Coastguard Worker normalLibraryDependency = 0 704*333d2b36SAndroid Build Coastguard Worker lateLibraryDependency = 1 705*333d2b36SAndroid Build Coastguard Worker) 706*333d2b36SAndroid Build Coastguard Worker 707*333d2b36SAndroid Build Coastguard Workerfunc (o libraryDependencyOrder) String() string { 708*333d2b36SAndroid Build Coastguard Worker switch o { 709*333d2b36SAndroid Build Coastguard Worker case earlyLibraryDependency: 710*333d2b36SAndroid Build Coastguard Worker return "earlyLibraryDependency" 711*333d2b36SAndroid Build Coastguard Worker case normalLibraryDependency: 712*333d2b36SAndroid Build Coastguard Worker return "normalLibraryDependency" 713*333d2b36SAndroid Build Coastguard Worker case lateLibraryDependency: 714*333d2b36SAndroid Build Coastguard Worker return "lateLibraryDependency" 715*333d2b36SAndroid Build Coastguard Worker default: 716*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("unknown libraryDependencyOrder %d", o)) 717*333d2b36SAndroid Build Coastguard Worker } 718*333d2b36SAndroid Build Coastguard Worker} 719*333d2b36SAndroid Build Coastguard Worker 720*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency 721*333d2b36SAndroid Build Coastguard Worker// tags that have a set of predefined tag objects that are reused for each dependency, a 722*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag is designed to contain extra metadata and is constructed as needed. 723*333d2b36SAndroid Build Coastguard Worker// That means that comparing a libraryDependencyTag for equality will only be equal if all 724*333d2b36SAndroid Build Coastguard Worker// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and 725*333d2b36SAndroid Build Coastguard Worker// then check individual metadata fields instead. 726*333d2b36SAndroid Build Coastguard Workertype libraryDependencyTag struct { 727*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 728*333d2b36SAndroid Build Coastguard Worker 729*333d2b36SAndroid Build Coastguard Worker // These are exported so that fmt.Printf("%#v") can call their String methods. 730*333d2b36SAndroid Build Coastguard Worker Kind libraryDependencyKind 731*333d2b36SAndroid Build Coastguard Worker Order libraryDependencyOrder 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Worker wholeStatic bool 734*333d2b36SAndroid Build Coastguard Worker 735*333d2b36SAndroid Build Coastguard Worker reexportFlags bool 736*333d2b36SAndroid Build Coastguard Worker explicitlyVersioned bool 737*333d2b36SAndroid Build Coastguard Worker dataLib bool 738*333d2b36SAndroid Build Coastguard Worker ndk bool 739*333d2b36SAndroid Build Coastguard Worker 740*333d2b36SAndroid Build Coastguard Worker staticUnwinder bool 741*333d2b36SAndroid Build Coastguard Worker 742*333d2b36SAndroid Build Coastguard Worker makeSuffix string 743*333d2b36SAndroid Build Coastguard Worker 744*333d2b36SAndroid Build Coastguard Worker // Whether or not this dependency should skip the apex dependency check 745*333d2b36SAndroid Build Coastguard Worker skipApexAllowedDependenciesCheck bool 746*333d2b36SAndroid Build Coastguard Worker 747*333d2b36SAndroid Build Coastguard Worker // Whether or not this dependency has to be followed for the apex variants 748*333d2b36SAndroid Build Coastguard Worker excludeInApex bool 749*333d2b36SAndroid Build Coastguard Worker // Whether or not this dependency has to be followed for the non-apex variants 750*333d2b36SAndroid Build Coastguard Worker excludeInNonApex bool 751*333d2b36SAndroid Build Coastguard Worker 752*333d2b36SAndroid Build Coastguard Worker // If true, don't automatically export symbols from the static library into a shared library. 753*333d2b36SAndroid Build Coastguard Worker unexportedSymbols bool 754*333d2b36SAndroid Build Coastguard Worker} 755*333d2b36SAndroid Build Coastguard Worker 756*333d2b36SAndroid Build Coastguard Worker// header returns true if the libraryDependencyTag is tagging a header lib dependency. 757*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) header() bool { 758*333d2b36SAndroid Build Coastguard Worker return d.Kind == headerLibraryDependency 759*333d2b36SAndroid Build Coastguard Worker} 760*333d2b36SAndroid Build Coastguard Worker 761*333d2b36SAndroid Build Coastguard Worker// shared returns true if the libraryDependencyTag is tagging a shared lib dependency. 762*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) shared() bool { 763*333d2b36SAndroid Build Coastguard Worker return d.Kind == sharedLibraryDependency 764*333d2b36SAndroid Build Coastguard Worker} 765*333d2b36SAndroid Build Coastguard Worker 766*333d2b36SAndroid Build Coastguard Worker// shared returns true if the libraryDependencyTag is tagging a static lib dependency. 767*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) static() bool { 768*333d2b36SAndroid Build Coastguard Worker return d.Kind == staticLibraryDependency 769*333d2b36SAndroid Build Coastguard Worker} 770*333d2b36SAndroid Build Coastguard Worker 771*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation { 772*333d2b36SAndroid Build Coastguard Worker if d.shared() { 773*333d2b36SAndroid Build Coastguard Worker return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency} 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker return nil 776*333d2b36SAndroid Build Coastguard Worker} 777*333d2b36SAndroid Build Coastguard Worker 778*333d2b36SAndroid Build Coastguard Workervar _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{} 779*333d2b36SAndroid Build Coastguard Worker 780*333d2b36SAndroid Build Coastguard Worker// InstallDepNeeded returns true for shared libraries so that shared library dependencies of 781*333d2b36SAndroid Build Coastguard Worker// binaries or other shared libraries are installed as dependencies. 782*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) InstallDepNeeded() bool { 783*333d2b36SAndroid Build Coastguard Worker return d.shared() 784*333d2b36SAndroid Build Coastguard Worker} 785*333d2b36SAndroid Build Coastguard Worker 786*333d2b36SAndroid Build Coastguard Workervar _ android.InstallNeededDependencyTag = libraryDependencyTag{} 787*333d2b36SAndroid Build Coastguard Worker 788*333d2b36SAndroid Build Coastguard Workerfunc (d libraryDependencyTag) PropagateAconfigValidation() bool { 789*333d2b36SAndroid Build Coastguard Worker return d.static() 790*333d2b36SAndroid Build Coastguard Worker} 791*333d2b36SAndroid Build Coastguard Worker 792*333d2b36SAndroid Build Coastguard Workervar _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{} 793*333d2b36SAndroid Build Coastguard Worker 794*333d2b36SAndroid Build Coastguard Worker// dependencyTag is used for tagging miscellaneous dependency types that don't fit into 795*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag. Each tag object is created globally and reused for multiple 796*333d2b36SAndroid Build Coastguard Worker// dependencies (although since the object contains no references, assigning a tag to a 797*333d2b36SAndroid Build Coastguard Worker// variable and modifying it will not modify the original). Users can compare the tag 798*333d2b36SAndroid Build Coastguard Worker// returned by ctx.OtherModuleDependencyTag against the global original 799*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct { 800*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 801*333d2b36SAndroid Build Coastguard Worker name string 802*333d2b36SAndroid Build Coastguard Worker} 803*333d2b36SAndroid Build Coastguard Worker 804*333d2b36SAndroid Build Coastguard Worker// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into 805*333d2b36SAndroid Build Coastguard Worker// libraryDependencyTag, but where the dependency needs to be installed when the parent is 806*333d2b36SAndroid Build Coastguard Worker// installed. 807*333d2b36SAndroid Build Coastguard Workertype installDependencyTag struct { 808*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 809*333d2b36SAndroid Build Coastguard Worker android.InstallAlwaysNeededDependencyTag 810*333d2b36SAndroid Build Coastguard Worker name string 811*333d2b36SAndroid Build Coastguard Worker} 812*333d2b36SAndroid Build Coastguard Worker 813*333d2b36SAndroid Build Coastguard Workervar ( 814*333d2b36SAndroid Build Coastguard Worker genSourceDepTag = dependencyTag{name: "gen source"} 815*333d2b36SAndroid Build Coastguard Worker genHeaderDepTag = dependencyTag{name: "gen header"} 816*333d2b36SAndroid Build Coastguard Worker genHeaderExportDepTag = dependencyTag{name: "gen header export"} 817*333d2b36SAndroid Build Coastguard Worker objDepTag = dependencyTag{name: "obj"} 818*333d2b36SAndroid Build Coastguard Worker dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"} 819*333d2b36SAndroid Build Coastguard Worker reuseObjTag = dependencyTag{name: "reuse objects"} 820*333d2b36SAndroid Build Coastguard Worker staticVariantTag = dependencyTag{name: "static variant"} 821*333d2b36SAndroid Build Coastguard Worker vndkExtDepTag = dependencyTag{name: "vndk extends"} 822*333d2b36SAndroid Build Coastguard Worker dataLibDepTag = dependencyTag{name: "data lib"} 823*333d2b36SAndroid Build Coastguard Worker dataBinDepTag = dependencyTag{name: "data bin"} 824*333d2b36SAndroid Build Coastguard Worker runtimeDepTag = installDependencyTag{name: "runtime lib"} 825*333d2b36SAndroid Build Coastguard Worker stubImplDepTag = dependencyTag{name: "stub_impl"} 826*333d2b36SAndroid Build Coastguard Worker JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"} 827*333d2b36SAndroid Build Coastguard Worker FdoProfileTag = dependencyTag{name: "fdo_profile"} 828*333d2b36SAndroid Build Coastguard Worker aidlLibraryTag = dependencyTag{name: "aidl_library"} 829*333d2b36SAndroid Build Coastguard Worker llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"} 830*333d2b36SAndroid Build Coastguard Worker) 831*333d2b36SAndroid Build Coastguard Worker 832*333d2b36SAndroid Build Coastguard Workerfunc IsSharedDepTag(depTag blueprint.DependencyTag) bool { 833*333d2b36SAndroid Build Coastguard Worker ccLibDepTag, ok := depTag.(libraryDependencyTag) 834*333d2b36SAndroid Build Coastguard Worker return ok && ccLibDepTag.shared() 835*333d2b36SAndroid Build Coastguard Worker} 836*333d2b36SAndroid Build Coastguard Worker 837*333d2b36SAndroid Build Coastguard Workerfunc IsStaticDepTag(depTag blueprint.DependencyTag) bool { 838*333d2b36SAndroid Build Coastguard Worker ccLibDepTag, ok := depTag.(libraryDependencyTag) 839*333d2b36SAndroid Build Coastguard Worker return ok && ccLibDepTag.static() 840*333d2b36SAndroid Build Coastguard Worker} 841*333d2b36SAndroid Build Coastguard Worker 842*333d2b36SAndroid Build Coastguard Workerfunc IsHeaderDepTag(depTag blueprint.DependencyTag) bool { 843*333d2b36SAndroid Build Coastguard Worker ccLibDepTag, ok := depTag.(libraryDependencyTag) 844*333d2b36SAndroid Build Coastguard Worker return ok && ccLibDepTag.header() 845*333d2b36SAndroid Build Coastguard Worker} 846*333d2b36SAndroid Build Coastguard Worker 847*333d2b36SAndroid Build Coastguard Workerfunc IsRuntimeDepTag(depTag blueprint.DependencyTag) bool { 848*333d2b36SAndroid Build Coastguard Worker return depTag == runtimeDepTag 849*333d2b36SAndroid Build Coastguard Worker} 850*333d2b36SAndroid Build Coastguard Worker 851*333d2b36SAndroid Build Coastguard Worker// Module contains the properties and members used by all C/C++ module types, and implements 852*333d2b36SAndroid Build Coastguard Worker// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces 853*333d2b36SAndroid Build Coastguard Worker// to construct the output file. Behavior can be customized with a Customizer, or "decorator", 854*333d2b36SAndroid Build Coastguard Worker// interface. 855*333d2b36SAndroid Build Coastguard Worker// 856*333d2b36SAndroid Build Coastguard Worker// To define a C/C++ related module, construct a new Module object and point its delegates to 857*333d2b36SAndroid Build Coastguard Worker// type-specific structs. These delegates will be invoked to register module-specific build 858*333d2b36SAndroid Build Coastguard Worker// statements which may be unique to the module type. For example, module.compiler.compile() should 859*333d2b36SAndroid Build Coastguard Worker// be defined so as to register build statements which are responsible for compiling the module. 860*333d2b36SAndroid Build Coastguard Worker// 861*333d2b36SAndroid Build Coastguard Worker// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct 862*333d2b36SAndroid Build Coastguard Worker// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer` 863*333d2b36SAndroid Build Coastguard Worker// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and 864*333d2b36SAndroid Build Coastguard Worker// installer logic. 865*333d2b36SAndroid Build Coastguard Workertype Module struct { 866*333d2b36SAndroid Build Coastguard Worker fuzz.FuzzModule 867*333d2b36SAndroid Build Coastguard Worker 868*333d2b36SAndroid Build Coastguard Worker VendorProperties VendorProperties 869*333d2b36SAndroid Build Coastguard Worker Properties BaseProperties 870*333d2b36SAndroid Build Coastguard Worker sourceProperties android.SourceProperties 871*333d2b36SAndroid Build Coastguard Worker 872*333d2b36SAndroid Build Coastguard Worker // initialize before calling Init 873*333d2b36SAndroid Build Coastguard Worker hod android.HostOrDeviceSupported 874*333d2b36SAndroid Build Coastguard Worker multilib android.Multilib 875*333d2b36SAndroid Build Coastguard Worker testModule bool 876*333d2b36SAndroid Build Coastguard Worker incremental bool 877*333d2b36SAndroid Build Coastguard Worker 878*333d2b36SAndroid Build Coastguard Worker // Allowable SdkMemberTypes of this module type. 879*333d2b36SAndroid Build Coastguard Worker sdkMemberTypes []android.SdkMemberType 880*333d2b36SAndroid Build Coastguard Worker 881*333d2b36SAndroid Build Coastguard Worker // decorator delegates, initialize before calling Init 882*333d2b36SAndroid Build Coastguard Worker // these may contain module-specific implementations, and effectively allow for custom 883*333d2b36SAndroid Build Coastguard Worker // type-specific logic. These members may reference different objects or the same object. 884*333d2b36SAndroid Build Coastguard Worker // Functions of these decorators will be invoked to initialize and register type-specific 885*333d2b36SAndroid Build Coastguard Worker // build statements. 886*333d2b36SAndroid Build Coastguard Worker generators []Generator 887*333d2b36SAndroid Build Coastguard Worker compiler compiler 888*333d2b36SAndroid Build Coastguard Worker linker linker 889*333d2b36SAndroid Build Coastguard Worker installer installer 890*333d2b36SAndroid Build Coastguard Worker 891*333d2b36SAndroid Build Coastguard Worker features []feature 892*333d2b36SAndroid Build Coastguard Worker stl *stl 893*333d2b36SAndroid Build Coastguard Worker sanitize *sanitize 894*333d2b36SAndroid Build Coastguard Worker coverage *coverage 895*333d2b36SAndroid Build Coastguard Worker fuzzer *fuzzer 896*333d2b36SAndroid Build Coastguard Worker sabi *sabi 897*333d2b36SAndroid Build Coastguard Worker lto *lto 898*333d2b36SAndroid Build Coastguard Worker afdo *afdo 899*333d2b36SAndroid Build Coastguard Worker orderfile *orderfile 900*333d2b36SAndroid Build Coastguard Worker 901*333d2b36SAndroid Build Coastguard Worker library libraryInterface 902*333d2b36SAndroid Build Coastguard Worker 903*333d2b36SAndroid Build Coastguard Worker outputFile android.OptionalPath 904*333d2b36SAndroid Build Coastguard Worker 905*333d2b36SAndroid Build Coastguard Worker cachedToolchain config.Toolchain 906*333d2b36SAndroid Build Coastguard Worker 907*333d2b36SAndroid Build Coastguard Worker subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool 908*333d2b36SAndroid Build Coastguard Worker 909*333d2b36SAndroid Build Coastguard Worker // Flags used to compile this module 910*333d2b36SAndroid Build Coastguard Worker flags Flags 911*333d2b36SAndroid Build Coastguard Worker 912*333d2b36SAndroid Build Coastguard Worker // Shared flags among build rules of this module 913*333d2b36SAndroid Build Coastguard Worker sharedFlags SharedFlags 914*333d2b36SAndroid Build Coastguard Worker 915*333d2b36SAndroid Build Coastguard Worker // only non-nil when this is a shared library that reuses the objects of a static library 916*333d2b36SAndroid Build Coastguard Worker staticAnalogue *StaticLibraryInfo 917*333d2b36SAndroid Build Coastguard Worker 918*333d2b36SAndroid Build Coastguard Worker makeLinkType string 919*333d2b36SAndroid Build Coastguard Worker 920*333d2b36SAndroid Build Coastguard Worker // For apex variants, this is set as apex.min_sdk_version 921*333d2b36SAndroid Build Coastguard Worker apexSdkVersion android.ApiLevel 922*333d2b36SAndroid Build Coastguard Worker 923*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 924*333d2b36SAndroid Build Coastguard Worker 925*333d2b36SAndroid Build Coastguard Worker logtagsPaths android.Paths 926*333d2b36SAndroid Build Coastguard Worker 927*333d2b36SAndroid Build Coastguard Worker WholeRustStaticlib bool 928*333d2b36SAndroid Build Coastguard Worker 929*333d2b36SAndroid Build Coastguard Worker hasAidl bool 930*333d2b36SAndroid Build Coastguard Worker hasLex bool 931*333d2b36SAndroid Build Coastguard Worker hasProto bool 932*333d2b36SAndroid Build Coastguard Worker hasRenderscript bool 933*333d2b36SAndroid Build Coastguard Worker hasSysprop bool 934*333d2b36SAndroid Build Coastguard Worker hasWinMsg bool 935*333d2b36SAndroid Build Coastguard Worker hasYacc bool 936*333d2b36SAndroid Build Coastguard Worker 937*333d2b36SAndroid Build Coastguard Worker makeVarsInfo *CcMakeVarsInfo 938*333d2b36SAndroid Build Coastguard Worker} 939*333d2b36SAndroid Build Coastguard Worker 940*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IncrementalSupported() bool { 941*333d2b36SAndroid Build Coastguard Worker return c.incremental 942*333d2b36SAndroid Build Coastguard Worker} 943*333d2b36SAndroid Build Coastguard Worker 944*333d2b36SAndroid Build Coastguard Workervar _ blueprint.Incremental = (*Module)(nil) 945*333d2b36SAndroid Build Coastguard Worker 946*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AddJSONData(d *map[string]interface{}) { 947*333d2b36SAndroid Build Coastguard Worker c.AndroidModuleBase().AddJSONData(d) 948*333d2b36SAndroid Build Coastguard Worker (*d)["Cc"] = map[string]interface{}{ 949*333d2b36SAndroid Build Coastguard Worker "SdkVersion": c.SdkVersion(), 950*333d2b36SAndroid Build Coastguard Worker "MinSdkVersion": c.MinSdkVersion(), 951*333d2b36SAndroid Build Coastguard Worker "VndkVersion": c.VndkVersion(), 952*333d2b36SAndroid Build Coastguard Worker "ProductSpecific": c.ProductSpecific(), 953*333d2b36SAndroid Build Coastguard Worker "SocSpecific": c.SocSpecific(), 954*333d2b36SAndroid Build Coastguard Worker "DeviceSpecific": c.DeviceSpecific(), 955*333d2b36SAndroid Build Coastguard Worker "InProduct": c.InProduct(), 956*333d2b36SAndroid Build Coastguard Worker "InVendor": c.InVendor(), 957*333d2b36SAndroid Build Coastguard Worker "InRamdisk": c.InRamdisk(), 958*333d2b36SAndroid Build Coastguard Worker "InVendorRamdisk": c.InVendorRamdisk(), 959*333d2b36SAndroid Build Coastguard Worker "InRecovery": c.InRecovery(), 960*333d2b36SAndroid Build Coastguard Worker "VendorAvailable": c.VendorAvailable(), 961*333d2b36SAndroid Build Coastguard Worker "ProductAvailable": c.ProductAvailable(), 962*333d2b36SAndroid Build Coastguard Worker "RamdiskAvailable": c.RamdiskAvailable(), 963*333d2b36SAndroid Build Coastguard Worker "VendorRamdiskAvailable": c.VendorRamdiskAvailable(), 964*333d2b36SAndroid Build Coastguard Worker "RecoveryAvailable": c.RecoveryAvailable(), 965*333d2b36SAndroid Build Coastguard Worker "OdmAvailable": c.OdmAvailable(), 966*333d2b36SAndroid Build Coastguard Worker "InstallInData": c.InstallInData(), 967*333d2b36SAndroid Build Coastguard Worker "InstallInRamdisk": c.InstallInRamdisk(), 968*333d2b36SAndroid Build Coastguard Worker "InstallInSanitizerDir": c.InstallInSanitizerDir(), 969*333d2b36SAndroid Build Coastguard Worker "InstallInVendorRamdisk": c.InstallInVendorRamdisk(), 970*333d2b36SAndroid Build Coastguard Worker "InstallInRecovery": c.InstallInRecovery(), 971*333d2b36SAndroid Build Coastguard Worker "InstallInRoot": c.InstallInRoot(), 972*333d2b36SAndroid Build Coastguard Worker "IsLlndk": c.IsLlndk(), 973*333d2b36SAndroid Build Coastguard Worker "IsVendorPublicLibrary": c.IsVendorPublicLibrary(), 974*333d2b36SAndroid Build Coastguard Worker "ApexSdkVersion": c.apexSdkVersion, 975*333d2b36SAndroid Build Coastguard Worker "AidlSrcs": c.hasAidl, 976*333d2b36SAndroid Build Coastguard Worker "LexSrcs": c.hasLex, 977*333d2b36SAndroid Build Coastguard Worker "ProtoSrcs": c.hasProto, 978*333d2b36SAndroid Build Coastguard Worker "RenderscriptSrcs": c.hasRenderscript, 979*333d2b36SAndroid Build Coastguard Worker "SyspropSrcs": c.hasSysprop, 980*333d2b36SAndroid Build Coastguard Worker "WinMsgSrcs": c.hasWinMsg, 981*333d2b36SAndroid Build Coastguard Worker "YaccSrsc": c.hasYacc, 982*333d2b36SAndroid Build Coastguard Worker "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc), 983*333d2b36SAndroid Build Coastguard Worker "OptimizeForSize": c.OptimizeForSize(), 984*333d2b36SAndroid Build Coastguard Worker } 985*333d2b36SAndroid Build Coastguard Worker} 986*333d2b36SAndroid Build Coastguard Worker 987*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetPreventInstall() { 988*333d2b36SAndroid Build Coastguard Worker c.Properties.PreventInstall = true 989*333d2b36SAndroid Build Coastguard Worker} 990*333d2b36SAndroid Build Coastguard Worker 991*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetHideFromMake() { 992*333d2b36SAndroid Build Coastguard Worker c.Properties.HideFromMake = true 993*333d2b36SAndroid Build Coastguard Worker} 994*333d2b36SAndroid Build Coastguard Worker 995*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HiddenFromMake() bool { 996*333d2b36SAndroid Build Coastguard Worker return c.Properties.HideFromMake 997*333d2b36SAndroid Build Coastguard Worker} 998*333d2b36SAndroid Build Coastguard Worker 999*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string { 1000*333d2b36SAndroid Build Coastguard Worker required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx)) 1001*333d2b36SAndroid Build Coastguard Worker if c.ImageVariation().Variation == android.CoreVariation { 1002*333d2b36SAndroid Build Coastguard Worker required = append(required, c.Properties.Target.Platform.Required...) 1003*333d2b36SAndroid Build Coastguard Worker required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required) 1004*333d2b36SAndroid Build Coastguard Worker } else if c.InRecovery() { 1005*333d2b36SAndroid Build Coastguard Worker required = append(required, c.Properties.Target.Recovery.Required...) 1006*333d2b36SAndroid Build Coastguard Worker required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required) 1007*333d2b36SAndroid Build Coastguard Worker } 1008*333d2b36SAndroid Build Coastguard Worker return android.FirstUniqueStrings(required) 1009*333d2b36SAndroid Build Coastguard Worker} 1010*333d2b36SAndroid Build Coastguard Worker 1011*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Toc() android.OptionalPath { 1012*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1013*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1014*333d2b36SAndroid Build Coastguard Worker return library.toc() 1015*333d2b36SAndroid Build Coastguard Worker } 1016*333d2b36SAndroid Build Coastguard Worker } 1017*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName())) 1018*333d2b36SAndroid Build Coastguard Worker} 1019*333d2b36SAndroid Build Coastguard Worker 1020*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ApiLevel() string { 1021*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1022*333d2b36SAndroid Build Coastguard Worker if stub, ok := c.linker.(*stubDecorator); ok { 1023*333d2b36SAndroid Build Coastguard Worker return stub.apiLevel.String() 1024*333d2b36SAndroid Build Coastguard Worker } 1025*333d2b36SAndroid Build Coastguard Worker } 1026*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName())) 1027*333d2b36SAndroid Build Coastguard Worker} 1028*333d2b36SAndroid Build Coastguard Worker 1029*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Static() bool { 1030*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1031*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1032*333d2b36SAndroid Build Coastguard Worker return library.static() 1033*333d2b36SAndroid Build Coastguard Worker } 1034*333d2b36SAndroid Build Coastguard Worker } 1035*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName())) 1036*333d2b36SAndroid Build Coastguard Worker} 1037*333d2b36SAndroid Build Coastguard Worker 1038*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Shared() bool { 1039*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1040*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1041*333d2b36SAndroid Build Coastguard Worker return library.shared() 1042*333d2b36SAndroid Build Coastguard Worker } 1043*333d2b36SAndroid Build Coastguard Worker } 1044*333d2b36SAndroid Build Coastguard Worker 1045*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName())) 1046*333d2b36SAndroid Build Coastguard Worker} 1047*333d2b36SAndroid Build Coastguard Worker 1048*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SelectedStl() string { 1049*333d2b36SAndroid Build Coastguard Worker if c.stl != nil { 1050*333d2b36SAndroid Build Coastguard Worker return c.stl.Properties.SelectedStl 1051*333d2b36SAndroid Build Coastguard Worker } 1052*333d2b36SAndroid Build Coastguard Worker return "" 1053*333d2b36SAndroid Build Coastguard Worker} 1054*333d2b36SAndroid Build Coastguard Worker 1055*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) StubDecorator() bool { 1056*333d2b36SAndroid Build Coastguard Worker if _, ok := c.linker.(*stubDecorator); ok { 1057*333d2b36SAndroid Build Coastguard Worker return true 1058*333d2b36SAndroid Build Coastguard Worker } 1059*333d2b36SAndroid Build Coastguard Worker return false 1060*333d2b36SAndroid Build Coastguard Worker} 1061*333d2b36SAndroid Build Coastguard Worker 1062*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OptimizeForSize() bool { 1063*333d2b36SAndroid Build Coastguard Worker return Bool(c.Properties.Optimize_for_size) 1064*333d2b36SAndroid Build Coastguard Worker} 1065*333d2b36SAndroid Build Coastguard Worker 1066*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SdkVersion() string { 1067*333d2b36SAndroid Build Coastguard Worker return String(c.Properties.Sdk_version) 1068*333d2b36SAndroid Build Coastguard Worker} 1069*333d2b36SAndroid Build Coastguard Worker 1070*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) MinSdkVersion() string { 1071*333d2b36SAndroid Build Coastguard Worker return String(c.Properties.Min_sdk_version) 1072*333d2b36SAndroid Build Coastguard Worker} 1073*333d2b36SAndroid Build Coastguard Worker 1074*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCrt() bool { 1075*333d2b36SAndroid Build Coastguard Worker if linker, ok := c.linker.(*objectLinker); ok { 1076*333d2b36SAndroid Build Coastguard Worker return linker.isCrt() 1077*333d2b36SAndroid Build Coastguard Worker } 1078*333d2b36SAndroid Build Coastguard Worker return false 1079*333d2b36SAndroid Build Coastguard Worker} 1080*333d2b36SAndroid Build Coastguard Worker 1081*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SplitPerApiLevel() bool { 1082*333d2b36SAndroid Build Coastguard Worker return c.canUseSdk() && c.isCrt() 1083*333d2b36SAndroid Build Coastguard Worker} 1084*333d2b36SAndroid Build Coastguard Worker 1085*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AlwaysSdk() bool { 1086*333d2b36SAndroid Build Coastguard Worker return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only) 1087*333d2b36SAndroid Build Coastguard Worker} 1088*333d2b36SAndroid Build Coastguard Worker 1089*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CcLibrary() bool { 1090*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1091*333d2b36SAndroid Build Coastguard Worker if _, ok := c.linker.(*libraryDecorator); ok { 1092*333d2b36SAndroid Build Coastguard Worker return true 1093*333d2b36SAndroid Build Coastguard Worker } 1094*333d2b36SAndroid Build Coastguard Worker if _, ok := c.linker.(*prebuiltLibraryLinker); ok { 1095*333d2b36SAndroid Build Coastguard Worker return true 1096*333d2b36SAndroid Build Coastguard Worker } 1097*333d2b36SAndroid Build Coastguard Worker } 1098*333d2b36SAndroid Build Coastguard Worker return false 1099*333d2b36SAndroid Build Coastguard Worker} 1100*333d2b36SAndroid Build Coastguard Worker 1101*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CcLibraryInterface() bool { 1102*333d2b36SAndroid Build Coastguard Worker if _, ok := c.linker.(libraryInterface); ok { 1103*333d2b36SAndroid Build Coastguard Worker return true 1104*333d2b36SAndroid Build Coastguard Worker } 1105*333d2b36SAndroid Build Coastguard Worker return false 1106*333d2b36SAndroid Build Coastguard Worker} 1107*333d2b36SAndroid Build Coastguard Worker 1108*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RlibStd() bool { 1109*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName())) 1110*333d2b36SAndroid Build Coastguard Worker} 1111*333d2b36SAndroid Build Coastguard Worker 1112*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RustLibraryInterface() bool { 1113*333d2b36SAndroid Build Coastguard Worker return false 1114*333d2b36SAndroid Build Coastguard Worker} 1115*333d2b36SAndroid Build Coastguard Worker 1116*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CrateName() string { 1117*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName())) 1118*333d2b36SAndroid Build Coastguard Worker} 1119*333d2b36SAndroid Build Coastguard Worker 1120*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ExportedCrateLinkDirs() []string { 1121*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName())) 1122*333d2b36SAndroid Build Coastguard Worker} 1123*333d2b36SAndroid Build Coastguard Worker 1124*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsFuzzModule() bool { 1125*333d2b36SAndroid Build Coastguard Worker if _, ok := c.compiler.(*fuzzBinary); ok { 1126*333d2b36SAndroid Build Coastguard Worker return true 1127*333d2b36SAndroid Build Coastguard Worker } 1128*333d2b36SAndroid Build Coastguard Worker return false 1129*333d2b36SAndroid Build Coastguard Worker} 1130*333d2b36SAndroid Build Coastguard Worker 1131*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) FuzzModuleStruct() fuzz.FuzzModule { 1132*333d2b36SAndroid Build Coastguard Worker return c.FuzzModule 1133*333d2b36SAndroid Build Coastguard Worker} 1134*333d2b36SAndroid Build Coastguard Worker 1135*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule { 1136*333d2b36SAndroid Build Coastguard Worker if fuzzer, ok := c.compiler.(*fuzzBinary); ok { 1137*333d2b36SAndroid Build Coastguard Worker return fuzzer.fuzzPackagedModule 1138*333d2b36SAndroid Build Coastguard Worker } 1139*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName())) 1140*333d2b36SAndroid Build Coastguard Worker} 1141*333d2b36SAndroid Build Coastguard Worker 1142*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls { 1143*333d2b36SAndroid Build Coastguard Worker if fuzzer, ok := c.compiler.(*fuzzBinary); ok { 1144*333d2b36SAndroid Build Coastguard Worker return fuzzer.sharedLibraries 1145*333d2b36SAndroid Build Coastguard Worker } 1146*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName())) 1147*333d2b36SAndroid Build Coastguard Worker} 1148*333d2b36SAndroid Build Coastguard Worker 1149*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) NonCcVariants() bool { 1150*333d2b36SAndroid Build Coastguard Worker return false 1151*333d2b36SAndroid Build Coastguard Worker} 1152*333d2b36SAndroid Build Coastguard Worker 1153*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetStatic() { 1154*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1155*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1156*333d2b36SAndroid Build Coastguard Worker library.setStatic() 1157*333d2b36SAndroid Build Coastguard Worker return 1158*333d2b36SAndroid Build Coastguard Worker } 1159*333d2b36SAndroid Build Coastguard Worker } 1160*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName())) 1161*333d2b36SAndroid Build Coastguard Worker} 1162*333d2b36SAndroid Build Coastguard Worker 1163*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetShared() { 1164*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1165*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1166*333d2b36SAndroid Build Coastguard Worker library.setShared() 1167*333d2b36SAndroid Build Coastguard Worker return 1168*333d2b36SAndroid Build Coastguard Worker } 1169*333d2b36SAndroid Build Coastguard Worker } 1170*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName())) 1171*333d2b36SAndroid Build Coastguard Worker} 1172*333d2b36SAndroid Build Coastguard Worker 1173*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BuildStaticVariant() bool { 1174*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1175*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1176*333d2b36SAndroid Build Coastguard Worker return library.buildStatic() 1177*333d2b36SAndroid Build Coastguard Worker } 1178*333d2b36SAndroid Build Coastguard Worker } 1179*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName())) 1180*333d2b36SAndroid Build Coastguard Worker} 1181*333d2b36SAndroid Build Coastguard Worker 1182*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BuildSharedVariant() bool { 1183*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1184*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1185*333d2b36SAndroid Build Coastguard Worker return library.buildShared() 1186*333d2b36SAndroid Build Coastguard Worker } 1187*333d2b36SAndroid Build Coastguard Worker } 1188*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName())) 1189*333d2b36SAndroid Build Coastguard Worker} 1190*333d2b36SAndroid Build Coastguard Worker 1191*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BuildRlibVariant() bool { 1192*333d2b36SAndroid Build Coastguard Worker // cc modules can never build rlib variants 1193*333d2b36SAndroid Build Coastguard Worker return false 1194*333d2b36SAndroid Build Coastguard Worker} 1195*333d2b36SAndroid Build Coastguard Worker 1196*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsRustFFI() bool { 1197*333d2b36SAndroid Build Coastguard Worker // cc modules are not Rust modules 1198*333d2b36SAndroid Build Coastguard Worker return false 1199*333d2b36SAndroid Build Coastguard Worker} 1200*333d2b36SAndroid Build Coastguard Worker 1201*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Module() android.Module { 1202*333d2b36SAndroid Build Coastguard Worker return c 1203*333d2b36SAndroid Build Coastguard Worker} 1204*333d2b36SAndroid Build Coastguard Worker 1205*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OutputFile() android.OptionalPath { 1206*333d2b36SAndroid Build Coastguard Worker return c.outputFile 1207*333d2b36SAndroid Build Coastguard Worker} 1208*333d2b36SAndroid Build Coastguard Worker 1209*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CoverageFiles() android.Paths { 1210*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1211*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(libraryInterface); ok { 1212*333d2b36SAndroid Build Coastguard Worker return library.objs().coverageFiles 1213*333d2b36SAndroid Build Coastguard Worker } 1214*333d2b36SAndroid Build Coastguard Worker } 1215*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName())) 1216*333d2b36SAndroid Build Coastguard Worker} 1217*333d2b36SAndroid Build Coastguard Worker 1218*333d2b36SAndroid Build Coastguard Workervar _ LinkableInterface = (*Module)(nil) 1219*333d2b36SAndroid Build Coastguard Worker 1220*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) UnstrippedOutputFile() android.Path { 1221*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1222*333d2b36SAndroid Build Coastguard Worker return c.linker.unstrippedOutputFilePath() 1223*333d2b36SAndroid Build Coastguard Worker } 1224*333d2b36SAndroid Build Coastguard Worker return nil 1225*333d2b36SAndroid Build Coastguard Worker} 1226*333d2b36SAndroid Build Coastguard Worker 1227*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CoverageOutputFile() android.OptionalPath { 1228*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1229*333d2b36SAndroid Build Coastguard Worker return c.linker.coverageOutputFilePath() 1230*333d2b36SAndroid Build Coastguard Worker } 1231*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 1232*333d2b36SAndroid Build Coastguard Worker} 1233*333d2b36SAndroid Build Coastguard Worker 1234*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RelativeInstallPath() string { 1235*333d2b36SAndroid Build Coastguard Worker if c.installer != nil { 1236*333d2b36SAndroid Build Coastguard Worker return c.installer.relativeInstallPath() 1237*333d2b36SAndroid Build Coastguard Worker } 1238*333d2b36SAndroid Build Coastguard Worker return "" 1239*333d2b36SAndroid Build Coastguard Worker} 1240*333d2b36SAndroid Build Coastguard Worker 1241*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VndkVersion() string { 1242*333d2b36SAndroid Build Coastguard Worker return c.Properties.VndkVersion 1243*333d2b36SAndroid Build Coastguard Worker} 1244*333d2b36SAndroid Build Coastguard Worker 1245*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Init() android.Module { 1246*333d2b36SAndroid Build Coastguard Worker c.AddProperties(&c.Properties, &c.VendorProperties) 1247*333d2b36SAndroid Build Coastguard Worker for _, generator := range c.generators { 1248*333d2b36SAndroid Build Coastguard Worker c.AddProperties(generator.GeneratorProps()...) 1249*333d2b36SAndroid Build Coastguard Worker } 1250*333d2b36SAndroid Build Coastguard Worker if c.compiler != nil { 1251*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.compiler.compilerProps()...) 1252*333d2b36SAndroid Build Coastguard Worker } 1253*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1254*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.linker.linkerProps()...) 1255*333d2b36SAndroid Build Coastguard Worker } 1256*333d2b36SAndroid Build Coastguard Worker if c.installer != nil { 1257*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.installer.installerProps()...) 1258*333d2b36SAndroid Build Coastguard Worker } 1259*333d2b36SAndroid Build Coastguard Worker if c.stl != nil { 1260*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.stl.props()...) 1261*333d2b36SAndroid Build Coastguard Worker } 1262*333d2b36SAndroid Build Coastguard Worker if c.sanitize != nil { 1263*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.sanitize.props()...) 1264*333d2b36SAndroid Build Coastguard Worker } 1265*333d2b36SAndroid Build Coastguard Worker if c.coverage != nil { 1266*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.coverage.props()...) 1267*333d2b36SAndroid Build Coastguard Worker } 1268*333d2b36SAndroid Build Coastguard Worker if c.fuzzer != nil { 1269*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.fuzzer.props()...) 1270*333d2b36SAndroid Build Coastguard Worker } 1271*333d2b36SAndroid Build Coastguard Worker if c.sabi != nil { 1272*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.sabi.props()...) 1273*333d2b36SAndroid Build Coastguard Worker } 1274*333d2b36SAndroid Build Coastguard Worker if c.lto != nil { 1275*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.lto.props()...) 1276*333d2b36SAndroid Build Coastguard Worker } 1277*333d2b36SAndroid Build Coastguard Worker if c.afdo != nil { 1278*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.afdo.props()...) 1279*333d2b36SAndroid Build Coastguard Worker } 1280*333d2b36SAndroid Build Coastguard Worker if c.orderfile != nil { 1281*333d2b36SAndroid Build Coastguard Worker c.AddProperties(c.orderfile.props()...) 1282*333d2b36SAndroid Build Coastguard Worker } 1283*333d2b36SAndroid Build Coastguard Worker for _, feature := range c.features { 1284*333d2b36SAndroid Build Coastguard Worker c.AddProperties(feature.props()...) 1285*333d2b36SAndroid Build Coastguard Worker } 1286*333d2b36SAndroid Build Coastguard Worker // Allow test-only on libraries that are not cc_test_library 1287*333d2b36SAndroid Build Coastguard Worker if c.library != nil && !c.testLibrary() { 1288*333d2b36SAndroid Build Coastguard Worker c.AddProperties(&c.sourceProperties) 1289*333d2b36SAndroid Build Coastguard Worker } 1290*333d2b36SAndroid Build Coastguard Worker 1291*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(c, c.hod, c.multilib) 1292*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(c) 1293*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(c) 1294*333d2b36SAndroid Build Coastguard Worker 1295*333d2b36SAndroid Build Coastguard Worker return c 1296*333d2b36SAndroid Build Coastguard Worker} 1297*333d2b36SAndroid Build Coastguard Worker 1298*333d2b36SAndroid Build Coastguard Worker// UseVndk() returns true if this module is built against VNDK. 1299*333d2b36SAndroid Build Coastguard Worker// This means the vendor and product variants of a module. 1300*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) UseVndk() bool { 1301*333d2b36SAndroid Build Coastguard Worker return c.Properties.VndkVersion != "" 1302*333d2b36SAndroid Build Coastguard Worker} 1303*333d2b36SAndroid Build Coastguard Worker 1304*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) canUseSdk() bool { 1305*333d2b36SAndroid Build Coastguard Worker return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled && 1306*333d2b36SAndroid Build Coastguard Worker !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk() 1307*333d2b36SAndroid Build Coastguard Worker} 1308*333d2b36SAndroid Build Coastguard Worker 1309*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) UseSdk() bool { 1310*333d2b36SAndroid Build Coastguard Worker if c.canUseSdk() { 1311*333d2b36SAndroid Build Coastguard Worker return String(c.Properties.Sdk_version) != "" 1312*333d2b36SAndroid Build Coastguard Worker } 1313*333d2b36SAndroid Build Coastguard Worker return false 1314*333d2b36SAndroid Build Coastguard Worker} 1315*333d2b36SAndroid Build Coastguard Worker 1316*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCoverageVariant() bool { 1317*333d2b36SAndroid Build Coastguard Worker return c.coverage.Properties.IsCoverageVariant 1318*333d2b36SAndroid Build Coastguard Worker} 1319*333d2b36SAndroid Build Coastguard Worker 1320*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsNdk(config android.Config) bool { 1321*333d2b36SAndroid Build Coastguard Worker return inList(c.BaseModuleName(), *getNDKKnownLibs(config)) 1322*333d2b36SAndroid Build Coastguard Worker} 1323*333d2b36SAndroid Build Coastguard Worker 1324*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsLlndk() bool { 1325*333d2b36SAndroid Build Coastguard Worker return c.VendorProperties.IsLLNDK 1326*333d2b36SAndroid Build Coastguard Worker} 1327*333d2b36SAndroid Build Coastguard Worker 1328*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsLlndkVariants() bool { 1329*333d2b36SAndroid Build Coastguard Worker lib := moduleLibraryInterface(m) 1330*333d2b36SAndroid Build Coastguard Worker return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders()) 1331*333d2b36SAndroid Build Coastguard Worker} 1332*333d2b36SAndroid Build Coastguard Worker 1333*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsVendorPublicLibraryVariants() bool { 1334*333d2b36SAndroid Build Coastguard Worker lib := moduleLibraryInterface(m) 1335*333d2b36SAndroid Build Coastguard Worker return lib != nil && (lib.hasVendorPublicLibrary()) 1336*333d2b36SAndroid Build Coastguard Worker} 1337*333d2b36SAndroid Build Coastguard Worker 1338*333d2b36SAndroid Build Coastguard Worker// IsVendorPublicLibrary returns true for vendor public libraries. 1339*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsVendorPublicLibrary() bool { 1340*333d2b36SAndroid Build Coastguard Worker return c.VendorProperties.IsVendorPublicLibrary 1341*333d2b36SAndroid Build Coastguard Worker} 1342*333d2b36SAndroid Build Coastguard Worker 1343*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsVndkPrebuiltLibrary() bool { 1344*333d2b36SAndroid Build Coastguard Worker if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok { 1345*333d2b36SAndroid Build Coastguard Worker return true 1346*333d2b36SAndroid Build Coastguard Worker } 1347*333d2b36SAndroid Build Coastguard Worker return false 1348*333d2b36SAndroid Build Coastguard Worker} 1349*333d2b36SAndroid Build Coastguard Worker 1350*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SdkAndPlatformVariantVisibleToMake() bool { 1351*333d2b36SAndroid Build Coastguard Worker return c.Properties.SdkAndPlatformVariantVisibleToMake 1352*333d2b36SAndroid Build Coastguard Worker} 1353*333d2b36SAndroid Build Coastguard Worker 1354*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasLlndkStubs() bool { 1355*333d2b36SAndroid Build Coastguard Worker lib := moduleLibraryInterface(c) 1356*333d2b36SAndroid Build Coastguard Worker return lib != nil && lib.hasLLNDKStubs() 1357*333d2b36SAndroid Build Coastguard Worker} 1358*333d2b36SAndroid Build Coastguard Worker 1359*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) StubsVersion() string { 1360*333d2b36SAndroid Build Coastguard Worker if lib, ok := c.linker.(versionedInterface); ok { 1361*333d2b36SAndroid Build Coastguard Worker return lib.stubsVersion() 1362*333d2b36SAndroid Build Coastguard Worker } 1363*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName())) 1364*333d2b36SAndroid Build Coastguard Worker} 1365*333d2b36SAndroid Build Coastguard Worker 1366*333d2b36SAndroid Build Coastguard Worker// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs 1367*333d2b36SAndroid Build Coastguard Worker// and does not set llndk.vendor_available: false. 1368*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isImplementationForLLNDKPublic() bool { 1369*333d2b36SAndroid Build Coastguard Worker library, _ := c.library.(*libraryDecorator) 1370*333d2b36SAndroid Build Coastguard Worker return library != nil && library.hasLLNDKStubs() && 1371*333d2b36SAndroid Build Coastguard Worker !Bool(library.Properties.Llndk.Private) 1372*333d2b36SAndroid Build Coastguard Worker} 1373*333d2b36SAndroid Build Coastguard Worker 1374*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isAfdoCompile(ctx ModuleContext) bool { 1375*333d2b36SAndroid Build Coastguard Worker if afdo := c.afdo; afdo != nil { 1376*333d2b36SAndroid Build Coastguard Worker return afdo.isAfdoCompile(ctx) 1377*333d2b36SAndroid Build Coastguard Worker } 1378*333d2b36SAndroid Build Coastguard Worker return false 1379*333d2b36SAndroid Build Coastguard Worker} 1380*333d2b36SAndroid Build Coastguard Worker 1381*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isOrderfileCompile() bool { 1382*333d2b36SAndroid Build Coastguard Worker if orderfile := c.orderfile; orderfile != nil { 1383*333d2b36SAndroid Build Coastguard Worker return orderfile.Properties.OrderfileLoad 1384*333d2b36SAndroid Build Coastguard Worker } 1385*333d2b36SAndroid Build Coastguard Worker return false 1386*333d2b36SAndroid Build Coastguard Worker} 1387*333d2b36SAndroid Build Coastguard Worker 1388*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCfi() bool { 1389*333d2b36SAndroid Build Coastguard Worker return c.sanitize.isSanitizerEnabled(cfi) 1390*333d2b36SAndroid Build Coastguard Worker} 1391*333d2b36SAndroid Build Coastguard Worker 1392*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isFuzzer() bool { 1393*333d2b36SAndroid Build Coastguard Worker return c.sanitize.isSanitizerEnabled(Fuzzer) 1394*333d2b36SAndroid Build Coastguard Worker} 1395*333d2b36SAndroid Build Coastguard Worker 1396*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isNDKStubLibrary() bool { 1397*333d2b36SAndroid Build Coastguard Worker if _, ok := c.compiler.(*stubDecorator); ok { 1398*333d2b36SAndroid Build Coastguard Worker return true 1399*333d2b36SAndroid Build Coastguard Worker } 1400*333d2b36SAndroid Build Coastguard Worker return false 1401*333d2b36SAndroid Build Coastguard Worker} 1402*333d2b36SAndroid Build Coastguard Worker 1403*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SubName() string { 1404*333d2b36SAndroid Build Coastguard Worker return c.Properties.SubName 1405*333d2b36SAndroid Build Coastguard Worker} 1406*333d2b36SAndroid Build Coastguard Worker 1407*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsStubs() bool { 1408*333d2b36SAndroid Build Coastguard Worker if lib := c.library; lib != nil { 1409*333d2b36SAndroid Build Coastguard Worker return lib.buildStubs() 1410*333d2b36SAndroid Build Coastguard Worker } 1411*333d2b36SAndroid Build Coastguard Worker return false 1412*333d2b36SAndroid Build Coastguard Worker} 1413*333d2b36SAndroid Build Coastguard Worker 1414*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasStubsVariants() bool { 1415*333d2b36SAndroid Build Coastguard Worker if lib := c.library; lib != nil { 1416*333d2b36SAndroid Build Coastguard Worker return lib.hasStubsVariants() 1417*333d2b36SAndroid Build Coastguard Worker } 1418*333d2b36SAndroid Build Coastguard Worker return false 1419*333d2b36SAndroid Build Coastguard Worker} 1420*333d2b36SAndroid Build Coastguard Worker 1421*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsStubsImplementationRequired() bool { 1422*333d2b36SAndroid Build Coastguard Worker if lib := c.library; lib != nil { 1423*333d2b36SAndroid Build Coastguard Worker return lib.isStubsImplementationRequired() 1424*333d2b36SAndroid Build Coastguard Worker } 1425*333d2b36SAndroid Build Coastguard Worker return false 1426*333d2b36SAndroid Build Coastguard Worker} 1427*333d2b36SAndroid Build Coastguard Worker 1428*333d2b36SAndroid Build Coastguard Worker// If this is a stubs library, ImplementationModuleName returns the name of the module that contains 1429*333d2b36SAndroid Build Coastguard Worker// the implementation. If it is an implementation library it returns its own name. 1430*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string { 1431*333d2b36SAndroid Build Coastguard Worker name := ctx.OtherModuleName(c) 1432*333d2b36SAndroid Build Coastguard Worker if versioned, ok := c.linker.(versionedInterface); ok { 1433*333d2b36SAndroid Build Coastguard Worker name = versioned.implementationModuleName(name) 1434*333d2b36SAndroid Build Coastguard Worker } 1435*333d2b36SAndroid Build Coastguard Worker return name 1436*333d2b36SAndroid Build Coastguard Worker} 1437*333d2b36SAndroid Build Coastguard Worker 1438*333d2b36SAndroid Build Coastguard Worker// Similar to ImplementationModuleName, but uses the Make variant of the module 1439*333d2b36SAndroid Build Coastguard Worker// name as base name, for use in AndroidMk output. E.g. for a prebuilt module 1440*333d2b36SAndroid Build Coastguard Worker// where the Soong name is prebuilt_foo, this returns foo (which works in Make 1441*333d2b36SAndroid Build Coastguard Worker// under the premise that the prebuilt module overrides its source counterpart 1442*333d2b36SAndroid Build Coastguard Worker// if it is exposed to Make). 1443*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string { 1444*333d2b36SAndroid Build Coastguard Worker name := c.BaseModuleName() 1445*333d2b36SAndroid Build Coastguard Worker if versioned, ok := c.linker.(versionedInterface); ok { 1446*333d2b36SAndroid Build Coastguard Worker name = versioned.implementationModuleName(name) 1447*333d2b36SAndroid Build Coastguard Worker } 1448*333d2b36SAndroid Build Coastguard Worker return name 1449*333d2b36SAndroid Build Coastguard Worker} 1450*333d2b36SAndroid Build Coastguard Worker 1451*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Bootstrap() bool { 1452*333d2b36SAndroid Build Coastguard Worker return Bool(c.Properties.Bootstrap) 1453*333d2b36SAndroid Build Coastguard Worker} 1454*333d2b36SAndroid Build Coastguard Worker 1455*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) nativeCoverage() bool { 1456*333d2b36SAndroid Build Coastguard Worker // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage 1457*333d2b36SAndroid Build Coastguard Worker if c.Target().NativeBridge == android.NativeBridgeEnabled { 1458*333d2b36SAndroid Build Coastguard Worker return false 1459*333d2b36SAndroid Build Coastguard Worker } 1460*333d2b36SAndroid Build Coastguard Worker return c.linker != nil && c.linker.nativeCoverage() 1461*333d2b36SAndroid Build Coastguard Worker} 1462*333d2b36SAndroid Build Coastguard Worker 1463*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsSnapshotPrebuilt() bool { 1464*333d2b36SAndroid Build Coastguard Worker if p, ok := c.linker.(SnapshotInterface); ok { 1465*333d2b36SAndroid Build Coastguard Worker return p.IsSnapshotPrebuilt() 1466*333d2b36SAndroid Build Coastguard Worker } 1467*333d2b36SAndroid Build Coastguard Worker return false 1468*333d2b36SAndroid Build Coastguard Worker} 1469*333d2b36SAndroid Build Coastguard Worker 1470*333d2b36SAndroid Build Coastguard Workerfunc isBionic(name string) bool { 1471*333d2b36SAndroid Build Coastguard Worker switch name { 1472*333d2b36SAndroid Build Coastguard Worker case "libc", "libm", "libdl", "libdl_android", "linker": 1473*333d2b36SAndroid Build Coastguard Worker return true 1474*333d2b36SAndroid Build Coastguard Worker } 1475*333d2b36SAndroid Build Coastguard Worker return false 1476*333d2b36SAndroid Build Coastguard Worker} 1477*333d2b36SAndroid Build Coastguard Worker 1478*333d2b36SAndroid Build Coastguard Workerfunc InstallToBootstrap(name string, config android.Config) bool { 1479*333d2b36SAndroid Build Coastguard Worker if name == "libclang_rt.hwasan" || name == "libc_hwasan" { 1480*333d2b36SAndroid Build Coastguard Worker return true 1481*333d2b36SAndroid Build Coastguard Worker } 1482*333d2b36SAndroid Build Coastguard Worker return isBionic(name) 1483*333d2b36SAndroid Build Coastguard Worker} 1484*333d2b36SAndroid Build Coastguard Worker 1485*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) isCfiAssemblySupportEnabled() bool { 1486*333d2b36SAndroid Build Coastguard Worker return c.sanitize != nil && 1487*333d2b36SAndroid Build Coastguard Worker Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support) 1488*333d2b36SAndroid Build Coastguard Worker} 1489*333d2b36SAndroid Build Coastguard Worker 1490*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInRoot() bool { 1491*333d2b36SAndroid Build Coastguard Worker return c.installer != nil && c.installer.installInRoot() 1492*333d2b36SAndroid Build Coastguard Worker} 1493*333d2b36SAndroid Build Coastguard Worker 1494*333d2b36SAndroid Build Coastguard Workertype baseModuleContext struct { 1495*333d2b36SAndroid Build Coastguard Worker android.BaseModuleContext 1496*333d2b36SAndroid Build Coastguard Worker moduleContextImpl 1497*333d2b36SAndroid Build Coastguard Worker} 1498*333d2b36SAndroid Build Coastguard Worker 1499*333d2b36SAndroid Build Coastguard Workertype depsContext struct { 1500*333d2b36SAndroid Build Coastguard Worker android.BottomUpMutatorContext 1501*333d2b36SAndroid Build Coastguard Worker moduleContextImpl 1502*333d2b36SAndroid Build Coastguard Worker} 1503*333d2b36SAndroid Build Coastguard Worker 1504*333d2b36SAndroid Build Coastguard Workertype moduleContext struct { 1505*333d2b36SAndroid Build Coastguard Worker android.ModuleContext 1506*333d2b36SAndroid Build Coastguard Worker moduleContextImpl 1507*333d2b36SAndroid Build Coastguard Worker} 1508*333d2b36SAndroid Build Coastguard Worker 1509*333d2b36SAndroid Build Coastguard Workertype moduleContextImpl struct { 1510*333d2b36SAndroid Build Coastguard Worker mod *Module 1511*333d2b36SAndroid Build Coastguard Worker ctx BaseModuleContext 1512*333d2b36SAndroid Build Coastguard Worker} 1513*333d2b36SAndroid Build Coastguard Worker 1514*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) toolchain() config.Toolchain { 1515*333d2b36SAndroid Build Coastguard Worker return ctx.mod.toolchain(ctx.ctx) 1516*333d2b36SAndroid Build Coastguard Worker} 1517*333d2b36SAndroid Build Coastguard Worker 1518*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) static() bool { 1519*333d2b36SAndroid Build Coastguard Worker return ctx.mod.static() 1520*333d2b36SAndroid Build Coastguard Worker} 1521*333d2b36SAndroid Build Coastguard Worker 1522*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) staticBinary() bool { 1523*333d2b36SAndroid Build Coastguard Worker return ctx.mod.staticBinary() 1524*333d2b36SAndroid Build Coastguard Worker} 1525*333d2b36SAndroid Build Coastguard Worker 1526*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) testBinary() bool { 1527*333d2b36SAndroid Build Coastguard Worker return ctx.mod.testBinary() 1528*333d2b36SAndroid Build Coastguard Worker} 1529*333d2b36SAndroid Build Coastguard Worker 1530*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) testLibrary() bool { 1531*333d2b36SAndroid Build Coastguard Worker return ctx.mod.testLibrary() 1532*333d2b36SAndroid Build Coastguard Worker} 1533*333d2b36SAndroid Build Coastguard Worker 1534*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) header() bool { 1535*333d2b36SAndroid Build Coastguard Worker return ctx.mod.Header() 1536*333d2b36SAndroid Build Coastguard Worker} 1537*333d2b36SAndroid Build Coastguard Worker 1538*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) binary() bool { 1539*333d2b36SAndroid Build Coastguard Worker return ctx.mod.Binary() 1540*333d2b36SAndroid Build Coastguard Worker} 1541*333d2b36SAndroid Build Coastguard Worker 1542*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) object() bool { 1543*333d2b36SAndroid Build Coastguard Worker return ctx.mod.Object() 1544*333d2b36SAndroid Build Coastguard Worker} 1545*333d2b36SAndroid Build Coastguard Worker 1546*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) optimizeForSize() bool { 1547*333d2b36SAndroid Build Coastguard Worker return ctx.mod.OptimizeForSize() 1548*333d2b36SAndroid Build Coastguard Worker} 1549*333d2b36SAndroid Build Coastguard Worker 1550*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) canUseSdk() bool { 1551*333d2b36SAndroid Build Coastguard Worker return ctx.mod.canUseSdk() 1552*333d2b36SAndroid Build Coastguard Worker} 1553*333d2b36SAndroid Build Coastguard Worker 1554*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) useSdk() bool { 1555*333d2b36SAndroid Build Coastguard Worker return ctx.mod.UseSdk() 1556*333d2b36SAndroid Build Coastguard Worker} 1557*333d2b36SAndroid Build Coastguard Worker 1558*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) sdkVersion() string { 1559*333d2b36SAndroid Build Coastguard Worker if ctx.ctx.Device() { 1560*333d2b36SAndroid Build Coastguard Worker return String(ctx.mod.Properties.Sdk_version) 1561*333d2b36SAndroid Build Coastguard Worker } 1562*333d2b36SAndroid Build Coastguard Worker return "" 1563*333d2b36SAndroid Build Coastguard Worker} 1564*333d2b36SAndroid Build Coastguard Worker 1565*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) minSdkVersion() string { 1566*333d2b36SAndroid Build Coastguard Worker ver := ctx.mod.MinSdkVersion() 1567*333d2b36SAndroid Build Coastguard Worker if ver == "apex_inherit" && !ctx.isForPlatform() { 1568*333d2b36SAndroid Build Coastguard Worker ver = ctx.apexSdkVersion().String() 1569*333d2b36SAndroid Build Coastguard Worker } 1570*333d2b36SAndroid Build Coastguard Worker if ver == "apex_inherit" || ver == "" { 1571*333d2b36SAndroid Build Coastguard Worker ver = ctx.sdkVersion() 1572*333d2b36SAndroid Build Coastguard Worker } 1573*333d2b36SAndroid Build Coastguard Worker 1574*333d2b36SAndroid Build Coastguard Worker if ctx.ctx.Device() { 1575*333d2b36SAndroid Build Coastguard Worker // When building for vendor/product, use the latest _stable_ API as "current". 1576*333d2b36SAndroid Build Coastguard Worker // This is passed to clang/aidl compilers so that compiled/generated code works 1577*333d2b36SAndroid Build Coastguard Worker // with the system. 1578*333d2b36SAndroid Build Coastguard Worker if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") { 1579*333d2b36SAndroid Build Coastguard Worker ver = ctx.ctx.Config().PlatformSdkVersion().String() 1580*333d2b36SAndroid Build Coastguard Worker } 1581*333d2b36SAndroid Build Coastguard Worker } 1582*333d2b36SAndroid Build Coastguard Worker 1583*333d2b36SAndroid Build Coastguard Worker // For crt objects, the meaning of min_sdk_version is very different from other types of 1584*333d2b36SAndroid Build Coastguard Worker // module. For them, min_sdk_version defines the oldest version that the build system will 1585*333d2b36SAndroid Build Coastguard Worker // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of 1586*333d2b36SAndroid Build Coastguard Worker // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version 1587*333d2b36SAndroid Build Coastguard Worker // and min_sdk_version properties of the variants are set to the corresponding version 1588*333d2b36SAndroid Build Coastguard Worker // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left 1589*333d2b36SAndroid Build Coastguard Worker // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to 1590*333d2b36SAndroid Build Coastguard Worker // support such an old version. The version is set to the later version in case when the 1591*333d2b36SAndroid Build Coastguard Worker // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if 1592*333d2b36SAndroid Build Coastguard Worker // it's for an APEX. 1593*333d2b36SAndroid Build Coastguard Worker if ctx.mod.isCrt() && !ctx.isSdkVariant() { 1594*333d2b36SAndroid Build Coastguard Worker if ctx.isForPlatform() { 1595*333d2b36SAndroid Build Coastguard Worker ver = strconv.Itoa(android.FutureApiLevelInt) 1596*333d2b36SAndroid Build Coastguard Worker } else { // for apex 1597*333d2b36SAndroid Build Coastguard Worker ver = ctx.apexSdkVersion().String() 1598*333d2b36SAndroid Build Coastguard Worker if ver == "" { // in case when min_sdk_version was not set by the APEX 1599*333d2b36SAndroid Build Coastguard Worker ver = ctx.sdkVersion() 1600*333d2b36SAndroid Build Coastguard Worker } 1601*333d2b36SAndroid Build Coastguard Worker } 1602*333d2b36SAndroid Build Coastguard Worker } 1603*333d2b36SAndroid Build Coastguard Worker 1604*333d2b36SAndroid Build Coastguard Worker // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers 1605*333d2b36SAndroid Build Coastguard Worker sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion()) 1606*333d2b36SAndroid Build Coastguard Worker minSdkVersionInt, err2 := strconv.Atoi(ver) 1607*333d2b36SAndroid Build Coastguard Worker if err == nil && err2 == nil { 1608*333d2b36SAndroid Build Coastguard Worker if sdkVersionInt < minSdkVersionInt { 1609*333d2b36SAndroid Build Coastguard Worker return strconv.Itoa(sdkVersionInt) 1610*333d2b36SAndroid Build Coastguard Worker } 1611*333d2b36SAndroid Build Coastguard Worker } 1612*333d2b36SAndroid Build Coastguard Worker return ver 1613*333d2b36SAndroid Build Coastguard Worker} 1614*333d2b36SAndroid Build Coastguard Worker 1615*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isSdkVariant() bool { 1616*333d2b36SAndroid Build Coastguard Worker return ctx.mod.IsSdkVariant() 1617*333d2b36SAndroid Build Coastguard Worker} 1618*333d2b36SAndroid Build Coastguard Worker 1619*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) useVndk() bool { 1620*333d2b36SAndroid Build Coastguard Worker return ctx.mod.UseVndk() 1621*333d2b36SAndroid Build Coastguard Worker} 1622*333d2b36SAndroid Build Coastguard Worker 1623*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) InVendorOrProduct() bool { 1624*333d2b36SAndroid Build Coastguard Worker return ctx.mod.InVendorOrProduct() 1625*333d2b36SAndroid Build Coastguard Worker} 1626*333d2b36SAndroid Build Coastguard Worker 1627*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isNdk(config android.Config) bool { 1628*333d2b36SAndroid Build Coastguard Worker return ctx.mod.IsNdk(config) 1629*333d2b36SAndroid Build Coastguard Worker} 1630*333d2b36SAndroid Build Coastguard Worker 1631*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) IsLlndk() bool { 1632*333d2b36SAndroid Build Coastguard Worker return ctx.mod.IsLlndk() 1633*333d2b36SAndroid Build Coastguard Worker} 1634*333d2b36SAndroid Build Coastguard Worker 1635*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool { 1636*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isImplementationForLLNDKPublic() 1637*333d2b36SAndroid Build Coastguard Worker} 1638*333d2b36SAndroid Build Coastguard Worker 1639*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool { 1640*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isAfdoCompile(mctx) 1641*333d2b36SAndroid Build Coastguard Worker} 1642*333d2b36SAndroid Build Coastguard Worker 1643*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isOrderfileCompile() bool { 1644*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isOrderfileCompile() 1645*333d2b36SAndroid Build Coastguard Worker} 1646*333d2b36SAndroid Build Coastguard Worker 1647*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isCfi() bool { 1648*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isCfi() 1649*333d2b36SAndroid Build Coastguard Worker} 1650*333d2b36SAndroid Build Coastguard Worker 1651*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isFuzzer() bool { 1652*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isFuzzer() 1653*333d2b36SAndroid Build Coastguard Worker} 1654*333d2b36SAndroid Build Coastguard Worker 1655*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isNDKStubLibrary() bool { 1656*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isNDKStubLibrary() 1657*333d2b36SAndroid Build Coastguard Worker} 1658*333d2b36SAndroid Build Coastguard Worker 1659*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) IsVendorPublicLibrary() bool { 1660*333d2b36SAndroid Build Coastguard Worker return ctx.mod.IsVendorPublicLibrary() 1661*333d2b36SAndroid Build Coastguard Worker} 1662*333d2b36SAndroid Build Coastguard Worker 1663*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) selectedStl() string { 1664*333d2b36SAndroid Build Coastguard Worker if stl := ctx.mod.stl; stl != nil { 1665*333d2b36SAndroid Build Coastguard Worker return stl.Properties.SelectedStl 1666*333d2b36SAndroid Build Coastguard Worker } 1667*333d2b36SAndroid Build Coastguard Worker return "" 1668*333d2b36SAndroid Build Coastguard Worker} 1669*333d2b36SAndroid Build Coastguard Worker 1670*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool { 1671*333d2b36SAndroid Build Coastguard Worker return ctx.mod.linker.useClangLld(actx) 1672*333d2b36SAndroid Build Coastguard Worker} 1673*333d2b36SAndroid Build Coastguard Worker 1674*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) baseModuleName() string { 1675*333d2b36SAndroid Build Coastguard Worker return ctx.mod.BaseModuleName() 1676*333d2b36SAndroid Build Coastguard Worker} 1677*333d2b36SAndroid Build Coastguard Worker 1678*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isForPlatform() bool { 1679*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider) 1680*333d2b36SAndroid Build Coastguard Worker return apexInfo.IsForPlatform() 1681*333d2b36SAndroid Build Coastguard Worker} 1682*333d2b36SAndroid Build Coastguard Worker 1683*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) apexVariationName() string { 1684*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider) 1685*333d2b36SAndroid Build Coastguard Worker return apexInfo.ApexVariationName 1686*333d2b36SAndroid Build Coastguard Worker} 1687*333d2b36SAndroid Build Coastguard Worker 1688*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel { 1689*333d2b36SAndroid Build Coastguard Worker return ctx.mod.apexSdkVersion 1690*333d2b36SAndroid Build Coastguard Worker} 1691*333d2b36SAndroid Build Coastguard Worker 1692*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) bootstrap() bool { 1693*333d2b36SAndroid Build Coastguard Worker return ctx.mod.Bootstrap() 1694*333d2b36SAndroid Build Coastguard Worker} 1695*333d2b36SAndroid Build Coastguard Worker 1696*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) nativeCoverage() bool { 1697*333d2b36SAndroid Build Coastguard Worker return ctx.mod.nativeCoverage() 1698*333d2b36SAndroid Build Coastguard Worker} 1699*333d2b36SAndroid Build Coastguard Worker 1700*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isPreventInstall() bool { 1701*333d2b36SAndroid Build Coastguard Worker return ctx.mod.Properties.PreventInstall 1702*333d2b36SAndroid Build Coastguard Worker} 1703*333d2b36SAndroid Build Coastguard Worker 1704*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) getSharedFlags() *SharedFlags { 1705*333d2b36SAndroid Build Coastguard Worker shared := &ctx.mod.sharedFlags 1706*333d2b36SAndroid Build Coastguard Worker if shared.flagsMap == nil { 1707*333d2b36SAndroid Build Coastguard Worker shared.numSharedFlags = 0 1708*333d2b36SAndroid Build Coastguard Worker shared.flagsMap = make(map[string]string) 1709*333d2b36SAndroid Build Coastguard Worker } 1710*333d2b36SAndroid Build Coastguard Worker return shared 1711*333d2b36SAndroid Build Coastguard Worker} 1712*333d2b36SAndroid Build Coastguard Worker 1713*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool { 1714*333d2b36SAndroid Build Coastguard Worker return ctx.mod.isCfiAssemblySupportEnabled() 1715*333d2b36SAndroid Build Coastguard Worker} 1716*333d2b36SAndroid Build Coastguard Worker 1717*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) notInPlatform() bool { 1718*333d2b36SAndroid Build Coastguard Worker return ctx.mod.NotInPlatform() 1719*333d2b36SAndroid Build Coastguard Worker} 1720*333d2b36SAndroid Build Coastguard Worker 1721*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo { 1722*333d2b36SAndroid Build Coastguard Worker if ctx.mod.makeVarsInfo == nil { 1723*333d2b36SAndroid Build Coastguard Worker ctx.mod.makeVarsInfo = &CcMakeVarsInfo{} 1724*333d2b36SAndroid Build Coastguard Worker } 1725*333d2b36SAndroid Build Coastguard Worker return ctx.mod.makeVarsInfo 1726*333d2b36SAndroid Build Coastguard Worker} 1727*333d2b36SAndroid Build Coastguard Worker 1728*333d2b36SAndroid Build Coastguard Workerfunc newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 1729*333d2b36SAndroid Build Coastguard Worker return &Module{ 1730*333d2b36SAndroid Build Coastguard Worker hod: hod, 1731*333d2b36SAndroid Build Coastguard Worker multilib: multilib, 1732*333d2b36SAndroid Build Coastguard Worker } 1733*333d2b36SAndroid Build Coastguard Worker} 1734*333d2b36SAndroid Build Coastguard Worker 1735*333d2b36SAndroid Build Coastguard Workerfunc newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 1736*333d2b36SAndroid Build Coastguard Worker module := newBaseModule(hod, multilib) 1737*333d2b36SAndroid Build Coastguard Worker module.features = []feature{ 1738*333d2b36SAndroid Build Coastguard Worker &tidyFeature{}, 1739*333d2b36SAndroid Build Coastguard Worker } 1740*333d2b36SAndroid Build Coastguard Worker module.stl = &stl{} 1741*333d2b36SAndroid Build Coastguard Worker module.sanitize = &sanitize{} 1742*333d2b36SAndroid Build Coastguard Worker module.coverage = &coverage{} 1743*333d2b36SAndroid Build Coastguard Worker module.fuzzer = &fuzzer{} 1744*333d2b36SAndroid Build Coastguard Worker module.sabi = &sabi{} 1745*333d2b36SAndroid Build Coastguard Worker module.lto = <o{} 1746*333d2b36SAndroid Build Coastguard Worker module.afdo = &afdo{} 1747*333d2b36SAndroid Build Coastguard Worker module.orderfile = &orderfile{} 1748*333d2b36SAndroid Build Coastguard Worker return module 1749*333d2b36SAndroid Build Coastguard Worker} 1750*333d2b36SAndroid Build Coastguard Worker 1751*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Prebuilt() *android.Prebuilt { 1752*333d2b36SAndroid Build Coastguard Worker if p, ok := c.linker.(prebuiltLinkerInterface); ok { 1753*333d2b36SAndroid Build Coastguard Worker return p.prebuilt() 1754*333d2b36SAndroid Build Coastguard Worker } 1755*333d2b36SAndroid Build Coastguard Worker return nil 1756*333d2b36SAndroid Build Coastguard Worker} 1757*333d2b36SAndroid Build Coastguard Worker 1758*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsPrebuilt() bool { 1759*333d2b36SAndroid Build Coastguard Worker return c.Prebuilt() != nil 1760*333d2b36SAndroid Build Coastguard Worker} 1761*333d2b36SAndroid Build Coastguard Worker 1762*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Name() string { 1763*333d2b36SAndroid Build Coastguard Worker name := c.ModuleBase.Name() 1764*333d2b36SAndroid Build Coastguard Worker if p, ok := c.linker.(interface { 1765*333d2b36SAndroid Build Coastguard Worker Name(string) string 1766*333d2b36SAndroid Build Coastguard Worker }); ok { 1767*333d2b36SAndroid Build Coastguard Worker name = p.Name(name) 1768*333d2b36SAndroid Build Coastguard Worker } 1769*333d2b36SAndroid Build Coastguard Worker return name 1770*333d2b36SAndroid Build Coastguard Worker} 1771*333d2b36SAndroid Build Coastguard Worker 1772*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Symlinks() []string { 1773*333d2b36SAndroid Build Coastguard Worker if p, ok := c.installer.(interface { 1774*333d2b36SAndroid Build Coastguard Worker symlinkList() []string 1775*333d2b36SAndroid Build Coastguard Worker }); ok { 1776*333d2b36SAndroid Build Coastguard Worker return p.symlinkList() 1777*333d2b36SAndroid Build Coastguard Worker } 1778*333d2b36SAndroid Build Coastguard Worker return nil 1779*333d2b36SAndroid Build Coastguard Worker} 1780*333d2b36SAndroid Build Coastguard Worker 1781*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DataPaths() []android.DataPath { 1782*333d2b36SAndroid Build Coastguard Worker if p, ok := c.installer.(interface { 1783*333d2b36SAndroid Build Coastguard Worker dataPaths() []android.DataPath 1784*333d2b36SAndroid Build Coastguard Worker }); ok { 1785*333d2b36SAndroid Build Coastguard Worker return p.dataPaths() 1786*333d2b36SAndroid Build Coastguard Worker } 1787*333d2b36SAndroid Build Coastguard Worker return nil 1788*333d2b36SAndroid Build Coastguard Worker} 1789*333d2b36SAndroid Build Coastguard Worker 1790*333d2b36SAndroid Build Coastguard Workerfunc getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string { 1791*333d2b36SAndroid Build Coastguard Worker // Returns the name suffix for product and vendor variants. If the VNDK version is not 1792*333d2b36SAndroid Build Coastguard Worker // "current", it will append the VNDK version to the name suffix. 1793*333d2b36SAndroid Build Coastguard Worker var nameSuffix string 1794*333d2b36SAndroid Build Coastguard Worker if c.InProduct() { 1795*333d2b36SAndroid Build Coastguard Worker if c.ProductSpecific() { 1796*333d2b36SAndroid Build Coastguard Worker // If the module is product specific with 'product_specific: true', 1797*333d2b36SAndroid Build Coastguard Worker // do not add a name suffix because it is a base module. 1798*333d2b36SAndroid Build Coastguard Worker return "" 1799*333d2b36SAndroid Build Coastguard Worker } 1800*333d2b36SAndroid Build Coastguard Worker return ProductSuffix 1801*333d2b36SAndroid Build Coastguard Worker } else { 1802*333d2b36SAndroid Build Coastguard Worker nameSuffix = VendorSuffix 1803*333d2b36SAndroid Build Coastguard Worker } 1804*333d2b36SAndroid Build Coastguard Worker if c.VndkVersion() != "" { 1805*333d2b36SAndroid Build Coastguard Worker // add version suffix only if the module is using different vndk version than the 1806*333d2b36SAndroid Build Coastguard Worker // version in product or vendor partition. 1807*333d2b36SAndroid Build Coastguard Worker nameSuffix += "." + c.VndkVersion() 1808*333d2b36SAndroid Build Coastguard Worker } 1809*333d2b36SAndroid Build Coastguard Worker return nameSuffix 1810*333d2b36SAndroid Build Coastguard Worker} 1811*333d2b36SAndroid Build Coastguard Worker 1812*333d2b36SAndroid Build Coastguard Workerfunc GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string { 1813*333d2b36SAndroid Build Coastguard Worker var subName = "" 1814*333d2b36SAndroid Build Coastguard Worker 1815*333d2b36SAndroid Build Coastguard Worker if c.Target().NativeBridge == android.NativeBridgeEnabled { 1816*333d2b36SAndroid Build Coastguard Worker subName += NativeBridgeSuffix 1817*333d2b36SAndroid Build Coastguard Worker } 1818*333d2b36SAndroid Build Coastguard Worker 1819*333d2b36SAndroid Build Coastguard Worker llndk := c.IsLlndk() 1820*333d2b36SAndroid Build Coastguard Worker if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) { 1821*333d2b36SAndroid Build Coastguard Worker // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is 1822*333d2b36SAndroid Build Coastguard Worker // added for product variant only when we have vendor and product variants with core 1823*333d2b36SAndroid Build Coastguard Worker // variant. The suffix is not added for vendor-only or product-only module. 1824*333d2b36SAndroid Build Coastguard Worker subName += getNameSuffixWithVndkVersion(actx, c) 1825*333d2b36SAndroid Build Coastguard Worker } else if c.IsVendorPublicLibrary() { 1826*333d2b36SAndroid Build Coastguard Worker subName += vendorPublicLibrarySuffix 1827*333d2b36SAndroid Build Coastguard Worker } else if c.IsVndkPrebuiltLibrary() { 1828*333d2b36SAndroid Build Coastguard Worker // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with 1829*333d2b36SAndroid Build Coastguard Worker // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp. 1830*333d2b36SAndroid Build Coastguard Worker subName += VendorSuffix 1831*333d2b36SAndroid Build Coastguard Worker } else if c.InRamdisk() && !c.OnlyInRamdisk() { 1832*333d2b36SAndroid Build Coastguard Worker subName += RamdiskSuffix 1833*333d2b36SAndroid Build Coastguard Worker } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() { 1834*333d2b36SAndroid Build Coastguard Worker subName += VendorRamdiskSuffix 1835*333d2b36SAndroid Build Coastguard Worker } else if c.InRecovery() && !c.OnlyInRecovery() { 1836*333d2b36SAndroid Build Coastguard Worker subName += RecoverySuffix 1837*333d2b36SAndroid Build Coastguard Worker } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) { 1838*333d2b36SAndroid Build Coastguard Worker subName += sdkSuffix 1839*333d2b36SAndroid Build Coastguard Worker if c.SplitPerApiLevel() { 1840*333d2b36SAndroid Build Coastguard Worker subName += "." + c.SdkVersion() 1841*333d2b36SAndroid Build Coastguard Worker } 1842*333d2b36SAndroid Build Coastguard Worker } else if c.IsStubs() && c.IsSdkVariant() { 1843*333d2b36SAndroid Build Coastguard Worker // Public API surface (NDK) 1844*333d2b36SAndroid Build Coastguard Worker // Add a suffix to this stub variant to distinguish it from the module-lib stub variant. 1845*333d2b36SAndroid Build Coastguard Worker subName = sdkSuffix 1846*333d2b36SAndroid Build Coastguard Worker } 1847*333d2b36SAndroid Build Coastguard Worker 1848*333d2b36SAndroid Build Coastguard Worker return subName 1849*333d2b36SAndroid Build Coastguard Worker} 1850*333d2b36SAndroid Build Coastguard Worker 1851*333d2b36SAndroid Build Coastguard Workerfunc moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext { 1852*333d2b36SAndroid Build Coastguard Worker ctx := &moduleContext{ 1853*333d2b36SAndroid Build Coastguard Worker ModuleContext: actx, 1854*333d2b36SAndroid Build Coastguard Worker moduleContextImpl: moduleContextImpl{ 1855*333d2b36SAndroid Build Coastguard Worker mod: c, 1856*333d2b36SAndroid Build Coastguard Worker }, 1857*333d2b36SAndroid Build Coastguard Worker } 1858*333d2b36SAndroid Build Coastguard Worker ctx.ctx = ctx 1859*333d2b36SAndroid Build Coastguard Worker return ctx 1860*333d2b36SAndroid Build Coastguard Worker} 1861*333d2b36SAndroid Build Coastguard Worker 1862*333d2b36SAndroid Build Coastguard Worker// TODO (b/277651159): Remove this allowlist 1863*333d2b36SAndroid Build Coastguard Workervar ( 1864*333d2b36SAndroid Build Coastguard Worker skipStubLibraryMultipleApexViolation = map[string]bool{ 1865*333d2b36SAndroid Build Coastguard Worker "libclang_rt.asan": true, 1866*333d2b36SAndroid Build Coastguard Worker "libclang_rt.hwasan": true, 1867*333d2b36SAndroid Build Coastguard Worker // runtime apex 1868*333d2b36SAndroid Build Coastguard Worker "libc": true, 1869*333d2b36SAndroid Build Coastguard Worker "libc_hwasan": true, 1870*333d2b36SAndroid Build Coastguard Worker "libdl_android": true, 1871*333d2b36SAndroid Build Coastguard Worker "libm": true, 1872*333d2b36SAndroid Build Coastguard Worker "libdl": true, 1873*333d2b36SAndroid Build Coastguard Worker "libz": true, 1874*333d2b36SAndroid Build Coastguard Worker // art apex 1875*333d2b36SAndroid Build Coastguard Worker // TODO(b/234351700): Remove this when com.android.art.debug is gone. 1876*333d2b36SAndroid Build Coastguard Worker "libandroidio": true, 1877*333d2b36SAndroid Build Coastguard Worker "libdexfile": true, 1878*333d2b36SAndroid Build Coastguard Worker "libdexfiled": true, // com.android.art.debug only 1879*333d2b36SAndroid Build Coastguard Worker "libnativebridge": true, 1880*333d2b36SAndroid Build Coastguard Worker "libnativehelper": true, 1881*333d2b36SAndroid Build Coastguard Worker "libnativeloader": true, 1882*333d2b36SAndroid Build Coastguard Worker "libsigchain": true, 1883*333d2b36SAndroid Build Coastguard Worker } 1884*333d2b36SAndroid Build Coastguard Worker) 1885*333d2b36SAndroid Build Coastguard Worker 1886*333d2b36SAndroid Build Coastguard Worker// Returns true if a stub library could be installed in multiple apexes 1887*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool { 1888*333d2b36SAndroid Build Coastguard Worker // If this is not an apex variant, no check necessary 1889*333d2b36SAndroid Build Coastguard Worker if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() { 1890*333d2b36SAndroid Build Coastguard Worker return false 1891*333d2b36SAndroid Build Coastguard Worker } 1892*333d2b36SAndroid Build Coastguard Worker // If this is not a stub library, no check necessary 1893*333d2b36SAndroid Build Coastguard Worker if !c.HasStubsVariants() { 1894*333d2b36SAndroid Build Coastguard Worker return false 1895*333d2b36SAndroid Build Coastguard Worker } 1896*333d2b36SAndroid Build Coastguard Worker // Skip the allowlist 1897*333d2b36SAndroid Build Coastguard Worker // Use BaseModuleName so that this matches prebuilts. 1898*333d2b36SAndroid Build Coastguard Worker if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists { 1899*333d2b36SAndroid Build Coastguard Worker return false 1900*333d2b36SAndroid Build Coastguard Worker } 1901*333d2b36SAndroid Build Coastguard Worker 1902*333d2b36SAndroid Build Coastguard Worker _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes()) 1903*333d2b36SAndroid Build Coastguard Worker // Stub libraries should not have more than one apex_available 1904*333d2b36SAndroid Build Coastguard Worker if len(aaWithoutTestApexes) > 1 { 1905*333d2b36SAndroid Build Coastguard Worker return true 1906*333d2b36SAndroid Build Coastguard Worker } 1907*333d2b36SAndroid Build Coastguard Worker // Stub libraries should not use the wildcard 1908*333d2b36SAndroid Build Coastguard Worker if aaWithoutTestApexes[0] == android.AvailableToAnyApex { 1909*333d2b36SAndroid Build Coastguard Worker return true 1910*333d2b36SAndroid Build Coastguard Worker } 1911*333d2b36SAndroid Build Coastguard Worker // Default: no violation 1912*333d2b36SAndroid Build Coastguard Worker return false 1913*333d2b36SAndroid Build Coastguard Worker} 1914*333d2b36SAndroid Build Coastguard Worker 1915*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { 1916*333d2b36SAndroid Build Coastguard Worker ctx := moduleContextFromAndroidModuleContext(actx, c) 1917*333d2b36SAndroid Build Coastguard Worker 1918*333d2b36SAndroid Build Coastguard Worker c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags) 1919*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{ 1920*333d2b36SAndroid Build Coastguard Worker Logtags: c.logtagsPaths, 1921*333d2b36SAndroid Build Coastguard Worker }) 1922*333d2b36SAndroid Build Coastguard Worker 1923*333d2b36SAndroid Build Coastguard Worker // If Test_only is set on a module in bp file, respect the setting, otherwise 1924*333d2b36SAndroid Build Coastguard Worker // see if is a known test module type. 1925*333d2b36SAndroid Build Coastguard Worker testOnly := c.testModule || c.testLibrary() 1926*333d2b36SAndroid Build Coastguard Worker if c.sourceProperties.Test_only != nil { 1927*333d2b36SAndroid Build Coastguard Worker testOnly = Bool(c.sourceProperties.Test_only) 1928*333d2b36SAndroid Build Coastguard Worker } 1929*333d2b36SAndroid Build Coastguard Worker // Keep before any early returns. 1930*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ 1931*333d2b36SAndroid Build Coastguard Worker TestOnly: testOnly, 1932*333d2b36SAndroid Build Coastguard Worker TopLevelTarget: c.testModule, 1933*333d2b36SAndroid Build Coastguard Worker }) 1934*333d2b36SAndroid Build Coastguard Worker 1935*333d2b36SAndroid Build Coastguard Worker c.Properties.SubName = GetSubnameProperty(actx, c) 1936*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) 1937*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 1938*333d2b36SAndroid Build Coastguard Worker c.hideApexVariantFromMake = true 1939*333d2b36SAndroid Build Coastguard Worker } 1940*333d2b36SAndroid Build Coastguard Worker 1941*333d2b36SAndroid Build Coastguard Worker c.makeLinkType = GetMakeLinkType(actx, c) 1942*333d2b36SAndroid Build Coastguard Worker 1943*333d2b36SAndroid Build Coastguard Worker deps := c.depsToPaths(ctx) 1944*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1945*333d2b36SAndroid Build Coastguard Worker return 1946*333d2b36SAndroid Build Coastguard Worker } 1947*333d2b36SAndroid Build Coastguard Worker 1948*333d2b36SAndroid Build Coastguard Worker for _, generator := range c.generators { 1949*333d2b36SAndroid Build Coastguard Worker gen := generator.GeneratorSources(ctx) 1950*333d2b36SAndroid Build Coastguard Worker deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...) 1951*333d2b36SAndroid Build Coastguard Worker deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...) 1952*333d2b36SAndroid Build Coastguard Worker deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...) 1953*333d2b36SAndroid Build Coastguard Worker deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...) 1954*333d2b36SAndroid Build Coastguard Worker deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...) 1955*333d2b36SAndroid Build Coastguard Worker if len(deps.Objs.objFiles) == 0 { 1956*333d2b36SAndroid Build Coastguard Worker // If we are reusuing object files (which happens when we're a shared library and we're 1957*333d2b36SAndroid Build Coastguard Worker // reusing our static variant's object files), then skip adding the actual source files, 1958*333d2b36SAndroid Build Coastguard Worker // because we already have the object for it. 1959*333d2b36SAndroid Build Coastguard Worker deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...) 1960*333d2b36SAndroid Build Coastguard Worker } 1961*333d2b36SAndroid Build Coastguard Worker } 1962*333d2b36SAndroid Build Coastguard Worker 1963*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1964*333d2b36SAndroid Build Coastguard Worker return 1965*333d2b36SAndroid Build Coastguard Worker } 1966*333d2b36SAndroid Build Coastguard Worker 1967*333d2b36SAndroid Build Coastguard Worker if c.stubLibraryMultipleApexViolation(actx) { 1968*333d2b36SAndroid Build Coastguard Worker actx.PropertyErrorf("apex_available", 1969*333d2b36SAndroid Build Coastguard Worker "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable()) 1970*333d2b36SAndroid Build Coastguard Worker } 1971*333d2b36SAndroid Build Coastguard Worker if c.Properties.Clang != nil && *c.Properties.Clang == false { 1972*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("clang", "false (GCC) is no longer supported") 1973*333d2b36SAndroid Build Coastguard Worker } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() { 1974*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file") 1975*333d2b36SAndroid Build Coastguard Worker } 1976*333d2b36SAndroid Build Coastguard Worker 1977*333d2b36SAndroid Build Coastguard Worker flags := Flags{ 1978*333d2b36SAndroid Build Coastguard Worker Toolchain: c.toolchain(ctx), 1979*333d2b36SAndroid Build Coastguard Worker EmitXrefs: ctx.Config().EmitXrefRules(), 1980*333d2b36SAndroid Build Coastguard Worker } 1981*333d2b36SAndroid Build Coastguard Worker for _, generator := range c.generators { 1982*333d2b36SAndroid Build Coastguard Worker flags = generator.GeneratorFlags(ctx, flags, deps) 1983*333d2b36SAndroid Build Coastguard Worker } 1984*333d2b36SAndroid Build Coastguard Worker if c.compiler != nil { 1985*333d2b36SAndroid Build Coastguard Worker flags = c.compiler.compilerFlags(ctx, flags, deps) 1986*333d2b36SAndroid Build Coastguard Worker } 1987*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 1988*333d2b36SAndroid Build Coastguard Worker flags = c.linker.linkerFlags(ctx, flags) 1989*333d2b36SAndroid Build Coastguard Worker } 1990*333d2b36SAndroid Build Coastguard Worker if c.stl != nil { 1991*333d2b36SAndroid Build Coastguard Worker flags = c.stl.flags(ctx, flags) 1992*333d2b36SAndroid Build Coastguard Worker } 1993*333d2b36SAndroid Build Coastguard Worker if c.sanitize != nil { 1994*333d2b36SAndroid Build Coastguard Worker flags = c.sanitize.flags(ctx, flags) 1995*333d2b36SAndroid Build Coastguard Worker } 1996*333d2b36SAndroid Build Coastguard Worker if c.coverage != nil { 1997*333d2b36SAndroid Build Coastguard Worker flags, deps = c.coverage.flags(ctx, flags, deps) 1998*333d2b36SAndroid Build Coastguard Worker } 1999*333d2b36SAndroid Build Coastguard Worker if c.fuzzer != nil { 2000*333d2b36SAndroid Build Coastguard Worker flags = c.fuzzer.flags(ctx, flags) 2001*333d2b36SAndroid Build Coastguard Worker } 2002*333d2b36SAndroid Build Coastguard Worker if c.lto != nil { 2003*333d2b36SAndroid Build Coastguard Worker flags = c.lto.flags(ctx, flags) 2004*333d2b36SAndroid Build Coastguard Worker } 2005*333d2b36SAndroid Build Coastguard Worker if c.afdo != nil { 2006*333d2b36SAndroid Build Coastguard Worker flags = c.afdo.flags(ctx, flags) 2007*333d2b36SAndroid Build Coastguard Worker } 2008*333d2b36SAndroid Build Coastguard Worker if c.orderfile != nil { 2009*333d2b36SAndroid Build Coastguard Worker flags = c.orderfile.flags(ctx, flags) 2010*333d2b36SAndroid Build Coastguard Worker } 2011*333d2b36SAndroid Build Coastguard Worker for _, feature := range c.features { 2012*333d2b36SAndroid Build Coastguard Worker flags = feature.flags(ctx, flags) 2013*333d2b36SAndroid Build Coastguard Worker } 2014*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 2015*333d2b36SAndroid Build Coastguard Worker return 2016*333d2b36SAndroid Build Coastguard Worker } 2017*333d2b36SAndroid Build Coastguard Worker 2018*333d2b36SAndroid Build Coastguard Worker flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags) 2019*333d2b36SAndroid Build Coastguard Worker flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags) 2020*333d2b36SAndroid Build Coastguard Worker flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags) 2021*333d2b36SAndroid Build Coastguard Worker 2022*333d2b36SAndroid Build Coastguard Worker flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...) 2023*333d2b36SAndroid Build Coastguard Worker 2024*333d2b36SAndroid Build Coastguard Worker for _, dir := range deps.IncludeDirs { 2025*333d2b36SAndroid Build Coastguard Worker flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String()) 2026*333d2b36SAndroid Build Coastguard Worker } 2027*333d2b36SAndroid Build Coastguard Worker for _, dir := range deps.SystemIncludeDirs { 2028*333d2b36SAndroid Build Coastguard Worker flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String()) 2029*333d2b36SAndroid Build Coastguard Worker } 2030*333d2b36SAndroid Build Coastguard Worker 2031*333d2b36SAndroid Build Coastguard Worker flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...) 2032*333d2b36SAndroid Build Coastguard Worker 2033*333d2b36SAndroid Build Coastguard Worker c.flags = flags 2034*333d2b36SAndroid Build Coastguard Worker // We need access to all the flags seen by a source file. 2035*333d2b36SAndroid Build Coastguard Worker if c.sabi != nil { 2036*333d2b36SAndroid Build Coastguard Worker flags = c.sabi.flags(ctx, flags) 2037*333d2b36SAndroid Build Coastguard Worker } 2038*333d2b36SAndroid Build Coastguard Worker 2039*333d2b36SAndroid Build Coastguard Worker flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags) 2040*333d2b36SAndroid Build Coastguard Worker 2041*333d2b36SAndroid Build Coastguard Worker for _, generator := range c.generators { 2042*333d2b36SAndroid Build Coastguard Worker generator.GeneratorBuildActions(ctx, flags, deps) 2043*333d2b36SAndroid Build Coastguard Worker } 2044*333d2b36SAndroid Build Coastguard Worker 2045*333d2b36SAndroid Build Coastguard Worker var objs Objects 2046*333d2b36SAndroid Build Coastguard Worker if c.compiler != nil { 2047*333d2b36SAndroid Build Coastguard Worker objs = c.compiler.compile(ctx, flags, deps) 2048*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 2049*333d2b36SAndroid Build Coastguard Worker return 2050*333d2b36SAndroid Build Coastguard Worker } 2051*333d2b36SAndroid Build Coastguard Worker } 2052*333d2b36SAndroid Build Coastguard Worker 2053*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 2054*333d2b36SAndroid Build Coastguard Worker outputFile := c.linker.link(ctx, flags, deps, objs) 2055*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 2056*333d2b36SAndroid Build Coastguard Worker return 2057*333d2b36SAndroid Build Coastguard Worker } 2058*333d2b36SAndroid Build Coastguard Worker c.outputFile = android.OptionalPathForPath(outputFile) 2059*333d2b36SAndroid Build Coastguard Worker 2060*333d2b36SAndroid Build Coastguard Worker c.maybeUnhideFromMake() 2061*333d2b36SAndroid Build Coastguard Worker 2062*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{ 2063*333d2b36SAndroid Build Coastguard Worker ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps), 2064*333d2b36SAndroid Build Coastguard Worker }) 2065*333d2b36SAndroid Build Coastguard Worker } 2066*333d2b36SAndroid Build Coastguard Worker 2067*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()}) 2068*333d2b36SAndroid Build Coastguard Worker 2069*333d2b36SAndroid Build Coastguard Worker if Bool(c.Properties.Cmake_snapshot_supported) { 2070*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil)) 2071*333d2b36SAndroid Build Coastguard Worker } 2072*333d2b36SAndroid Build Coastguard Worker 2073*333d2b36SAndroid Build Coastguard Worker c.maybeInstall(ctx, apexInfo) 2074*333d2b36SAndroid Build Coastguard Worker 2075*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 2076*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON := ctx.ModuleInfoJSON() 2077*333d2b36SAndroid Build Coastguard Worker c.linker.moduleInfoJSON(ctx, moduleInfoJSON) 2078*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs 2079*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs 2080*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs 2081*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs 2082*333d2b36SAndroid Build Coastguard Worker 2083*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...) 2084*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...) 2085*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...) 2086*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...) 2087*333d2b36SAndroid Build Coastguard Worker 2088*333d2b36SAndroid Build Coastguard Worker if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 && 2089*333d2b36SAndroid Build Coastguard Worker (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") { 2090*333d2b36SAndroid Build Coastguard Worker if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) { 2091*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SubName += ".cfi" 2092*333d2b36SAndroid Build Coastguard Worker } 2093*333d2b36SAndroid Build Coastguard Worker if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) { 2094*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SubName += ".hwasan" 2095*333d2b36SAndroid Build Coastguard Worker } 2096*333d2b36SAndroid Build Coastguard Worker if Bool(c.sanitize.Properties.SanitizeMutated.Scs) { 2097*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SubName += ".scs" 2098*333d2b36SAndroid Build Coastguard Worker } 2099*333d2b36SAndroid Build Coastguard Worker } 2100*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SubName += c.Properties.SubName 2101*333d2b36SAndroid Build Coastguard Worker 2102*333d2b36SAndroid Build Coastguard Worker if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake { 2103*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.Uninstallable = true 2104*333d2b36SAndroid Build Coastguard Worker } 2105*333d2b36SAndroid Build Coastguard Worker } 2106*333d2b36SAndroid Build Coastguard Worker 2107*333d2b36SAndroid Build Coastguard Worker buildComplianceMetadataInfo(ctx, c, deps) 2108*333d2b36SAndroid Build Coastguard Worker 2109*333d2b36SAndroid Build Coastguard Worker if b, ok := c.compiler.(*baseCompiler); ok { 2110*333d2b36SAndroid Build Coastguard Worker c.hasAidl = b.hasSrcExt(ctx, ".aidl") 2111*333d2b36SAndroid Build Coastguard Worker c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll") 2112*333d2b36SAndroid Build Coastguard Worker c.hasProto = b.hasSrcExt(ctx, ".proto") 2113*333d2b36SAndroid Build Coastguard Worker c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs") 2114*333d2b36SAndroid Build Coastguard Worker c.hasSysprop = b.hasSrcExt(ctx, ".sysprop") 2115*333d2b36SAndroid Build Coastguard Worker c.hasWinMsg = b.hasSrcExt(ctx, ".mc") 2116*333d2b36SAndroid Build Coastguard Worker c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy") 2117*333d2b36SAndroid Build Coastguard Worker } 2118*333d2b36SAndroid Build Coastguard Worker 2119*333d2b36SAndroid Build Coastguard Worker ccObjectInfo := CcObjectInfo{ 2120*333d2b36SAndroid Build Coastguard Worker kytheFiles: objs.kytheFiles, 2121*333d2b36SAndroid Build Coastguard Worker } 2122*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) { 2123*333d2b36SAndroid Build Coastguard Worker ccObjectInfo.objFiles = objs.objFiles 2124*333d2b36SAndroid Build Coastguard Worker ccObjectInfo.tidyFiles = objs.tidyFiles 2125*333d2b36SAndroid Build Coastguard Worker } 2126*333d2b36SAndroid Build Coastguard Worker if len(ccObjectInfo.kytheFiles)+len(ccObjectInfo.objFiles)+len(ccObjectInfo.tidyFiles) > 0 { 2127*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo) 2128*333d2b36SAndroid Build Coastguard Worker } 2129*333d2b36SAndroid Build Coastguard Worker 2130*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, LinkableInfoKey, LinkableInfo{ 2131*333d2b36SAndroid Build Coastguard Worker StaticExecutable: c.StaticExecutable(), 2132*333d2b36SAndroid Build Coastguard Worker }) 2133*333d2b36SAndroid Build Coastguard Worker 2134*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, CcInfoProvider, CcInfo{ 2135*333d2b36SAndroid Build Coastguard Worker HasStubsVariants: c.HasStubsVariants(), 2136*333d2b36SAndroid Build Coastguard Worker }) 2137*333d2b36SAndroid Build Coastguard Worker 2138*333d2b36SAndroid Build Coastguard Worker c.setOutputFiles(ctx) 2139*333d2b36SAndroid Build Coastguard Worker 2140*333d2b36SAndroid Build Coastguard Worker if c.makeVarsInfo != nil { 2141*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo) 2142*333d2b36SAndroid Build Coastguard Worker } 2143*333d2b36SAndroid Build Coastguard Worker} 2144*333d2b36SAndroid Build Coastguard Worker 2145*333d2b36SAndroid Build Coastguard Workerfunc setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) { 2146*333d2b36SAndroid Build Coastguard Worker if len(files) > 0 { 2147*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(files, tag) 2148*333d2b36SAndroid Build Coastguard Worker } 2149*333d2b36SAndroid Build Coastguard Worker} 2150*333d2b36SAndroid Build Coastguard Worker 2151*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) setOutputFiles(ctx ModuleContext) { 2152*333d2b36SAndroid Build Coastguard Worker if c.outputFile.Valid() { 2153*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "") 2154*333d2b36SAndroid Build Coastguard Worker } else { 2155*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{}, "") 2156*333d2b36SAndroid Build Coastguard Worker } 2157*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 2158*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped") 2159*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all") 2160*333d2b36SAndroid Build Coastguard Worker } 2161*333d2b36SAndroid Build Coastguard Worker} 2162*333d2b36SAndroid Build Coastguard Worker 2163*333d2b36SAndroid Build Coastguard Workerfunc buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) { 2164*333d2b36SAndroid Build Coastguard Worker // Dump metadata that can not be done in android/compliance-metadata.go 2165*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo := ctx.ComplianceMetadataInfo() 2166*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static())) 2167*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String()) 2168*333d2b36SAndroid Build Coastguard Worker 2169*333d2b36SAndroid Build Coastguard Worker // Static deps 2170*333d2b36SAndroid Build Coastguard Worker staticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(false)) 2171*333d2b36SAndroid Build Coastguard Worker staticDepNames := make([]string, 0, len(staticDeps)) 2172*333d2b36SAndroid Build Coastguard Worker for _, dep := range staticDeps { 2173*333d2b36SAndroid Build Coastguard Worker staticDepNames = append(staticDepNames, dep.Name()) 2174*333d2b36SAndroid Build Coastguard Worker } 2175*333d2b36SAndroid Build Coastguard Worker 2176*333d2b36SAndroid Build Coastguard Worker staticDepPaths := make([]string, 0, len(deps.StaticLibs)) 2177*333d2b36SAndroid Build Coastguard Worker for _, dep := range deps.StaticLibs { 2178*333d2b36SAndroid Build Coastguard Worker staticDepPaths = append(staticDepPaths, dep.String()) 2179*333d2b36SAndroid Build Coastguard Worker } 2180*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames)) 2181*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths)) 2182*333d2b36SAndroid Build Coastguard Worker 2183*333d2b36SAndroid Build Coastguard Worker // Whole static deps 2184*333d2b36SAndroid Build Coastguard Worker wholeStaticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(true)) 2185*333d2b36SAndroid Build Coastguard Worker wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps)) 2186*333d2b36SAndroid Build Coastguard Worker for _, dep := range wholeStaticDeps { 2187*333d2b36SAndroid Build Coastguard Worker wholeStaticDepNames = append(wholeStaticDepNames, dep.Name()) 2188*333d2b36SAndroid Build Coastguard Worker } 2189*333d2b36SAndroid Build Coastguard Worker 2190*333d2b36SAndroid Build Coastguard Worker wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs)) 2191*333d2b36SAndroid Build Coastguard Worker for _, dep := range deps.WholeStaticLibs { 2192*333d2b36SAndroid Build Coastguard Worker wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String()) 2193*333d2b36SAndroid Build Coastguard Worker } 2194*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames)) 2195*333d2b36SAndroid Build Coastguard Worker complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths)) 2196*333d2b36SAndroid Build Coastguard Worker} 2197*333d2b36SAndroid Build Coastguard Worker 2198*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) maybeUnhideFromMake() { 2199*333d2b36SAndroid Build Coastguard Worker // If a lib is directly included in any of the APEXes or is not available to the 2200*333d2b36SAndroid Build Coastguard Worker // platform (which is often the case when the stub is provided as a prebuilt), 2201*333d2b36SAndroid Build Coastguard Worker // unhide the stubs variant having the latest version gets visible to make. In 2202*333d2b36SAndroid Build Coastguard Worker // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to 2203*333d2b36SAndroid Build Coastguard Worker // force anything in the make world to link against the stubs library. (unless it 2204*333d2b36SAndroid Build Coastguard Worker // is explicitly referenced via .bootstrap suffix or the module is marked with 2205*333d2b36SAndroid Build Coastguard Worker // 'bootstrap: true'). 2206*333d2b36SAndroid Build Coastguard Worker if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() && 2207*333d2b36SAndroid Build Coastguard Worker !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() && 2208*333d2b36SAndroid Build Coastguard Worker c.IsStubs() && !c.InVendorRamdisk() { 2209*333d2b36SAndroid Build Coastguard Worker c.Properties.HideFromMake = false // unhide 2210*333d2b36SAndroid Build Coastguard Worker // Note: this is still non-installable 2211*333d2b36SAndroid Build Coastguard Worker } 2212*333d2b36SAndroid Build Coastguard Worker} 2213*333d2b36SAndroid Build Coastguard Worker 2214*333d2b36SAndroid Build Coastguard Worker// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the 2215*333d2b36SAndroid Build Coastguard Worker// install hooks for installable modules, like binaries and tests. 2216*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) { 2217*333d2b36SAndroid Build Coastguard Worker if !proptools.BoolDefault(c.Installable(), true) { 2218*333d2b36SAndroid Build Coastguard Worker // If the module has been specifically configure to not be installed then 2219*333d2b36SAndroid Build Coastguard Worker // hide from make as otherwise it will break when running inside make 2220*333d2b36SAndroid Build Coastguard Worker // as the output path to install will not be specified. Not all uninstallable 2221*333d2b36SAndroid Build Coastguard Worker // modules can be hidden from make as some are needed for resolving make side 2222*333d2b36SAndroid Build Coastguard Worker // dependencies. 2223*333d2b36SAndroid Build Coastguard Worker c.HideFromMake() 2224*333d2b36SAndroid Build Coastguard Worker c.SkipInstall() 2225*333d2b36SAndroid Build Coastguard Worker } else if !installable(c, apexInfo) { 2226*333d2b36SAndroid Build Coastguard Worker c.SkipInstall() 2227*333d2b36SAndroid Build Coastguard Worker } 2228*333d2b36SAndroid Build Coastguard Worker 2229*333d2b36SAndroid Build Coastguard Worker // Still call c.installer.install though, the installs will be stored as PackageSpecs 2230*333d2b36SAndroid Build Coastguard Worker // to allow using the outputs in a genrule. 2231*333d2b36SAndroid Build Coastguard Worker if c.installer != nil && c.outputFile.Valid() { 2232*333d2b36SAndroid Build Coastguard Worker c.installer.install(ctx, c.outputFile.Path()) 2233*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 2234*333d2b36SAndroid Build Coastguard Worker return 2235*333d2b36SAndroid Build Coastguard Worker } 2236*333d2b36SAndroid Build Coastguard Worker } 2237*333d2b36SAndroid Build Coastguard Worker} 2238*333d2b36SAndroid Build Coastguard Worker 2239*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain { 2240*333d2b36SAndroid Build Coastguard Worker if c.cachedToolchain == nil { 2241*333d2b36SAndroid Build Coastguard Worker c.cachedToolchain = config.FindToolchainWithContext(ctx) 2242*333d2b36SAndroid Build Coastguard Worker } 2243*333d2b36SAndroid Build Coastguard Worker return c.cachedToolchain 2244*333d2b36SAndroid Build Coastguard Worker} 2245*333d2b36SAndroid Build Coastguard Worker 2246*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) begin(ctx BaseModuleContext) { 2247*333d2b36SAndroid Build Coastguard Worker for _, generator := range c.generators { 2248*333d2b36SAndroid Build Coastguard Worker generator.GeneratorInit(ctx) 2249*333d2b36SAndroid Build Coastguard Worker } 2250*333d2b36SAndroid Build Coastguard Worker if c.compiler != nil { 2251*333d2b36SAndroid Build Coastguard Worker c.compiler.compilerInit(ctx) 2252*333d2b36SAndroid Build Coastguard Worker } 2253*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 2254*333d2b36SAndroid Build Coastguard Worker c.linker.linkerInit(ctx) 2255*333d2b36SAndroid Build Coastguard Worker } 2256*333d2b36SAndroid Build Coastguard Worker if c.stl != nil { 2257*333d2b36SAndroid Build Coastguard Worker c.stl.begin(ctx) 2258*333d2b36SAndroid Build Coastguard Worker } 2259*333d2b36SAndroid Build Coastguard Worker if c.sanitize != nil { 2260*333d2b36SAndroid Build Coastguard Worker c.sanitize.begin(ctx) 2261*333d2b36SAndroid Build Coastguard Worker } 2262*333d2b36SAndroid Build Coastguard Worker if c.coverage != nil { 2263*333d2b36SAndroid Build Coastguard Worker c.coverage.begin(ctx) 2264*333d2b36SAndroid Build Coastguard Worker } 2265*333d2b36SAndroid Build Coastguard Worker if c.afdo != nil { 2266*333d2b36SAndroid Build Coastguard Worker c.afdo.begin(ctx) 2267*333d2b36SAndroid Build Coastguard Worker } 2268*333d2b36SAndroid Build Coastguard Worker if c.lto != nil { 2269*333d2b36SAndroid Build Coastguard Worker c.lto.begin(ctx) 2270*333d2b36SAndroid Build Coastguard Worker } 2271*333d2b36SAndroid Build Coastguard Worker if c.orderfile != nil { 2272*333d2b36SAndroid Build Coastguard Worker c.orderfile.begin(ctx) 2273*333d2b36SAndroid Build Coastguard Worker } 2274*333d2b36SAndroid Build Coastguard Worker if ctx.useSdk() && c.IsSdkVariant() { 2275*333d2b36SAndroid Build Coastguard Worker version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion()) 2276*333d2b36SAndroid Build Coastguard Worker if err != nil { 2277*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", err.Error()) 2278*333d2b36SAndroid Build Coastguard Worker c.Properties.Sdk_version = nil 2279*333d2b36SAndroid Build Coastguard Worker } else { 2280*333d2b36SAndroid Build Coastguard Worker c.Properties.Sdk_version = StringPtr(version.String()) 2281*333d2b36SAndroid Build Coastguard Worker } 2282*333d2b36SAndroid Build Coastguard Worker } 2283*333d2b36SAndroid Build Coastguard Worker} 2284*333d2b36SAndroid Build Coastguard Worker 2285*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) deps(ctx DepsContext) Deps { 2286*333d2b36SAndroid Build Coastguard Worker deps := Deps{} 2287*333d2b36SAndroid Build Coastguard Worker 2288*333d2b36SAndroid Build Coastguard Worker for _, generator := range c.generators { 2289*333d2b36SAndroid Build Coastguard Worker deps = generator.GeneratorDeps(ctx, deps) 2290*333d2b36SAndroid Build Coastguard Worker } 2291*333d2b36SAndroid Build Coastguard Worker if c.compiler != nil { 2292*333d2b36SAndroid Build Coastguard Worker deps = c.compiler.compilerDeps(ctx, deps) 2293*333d2b36SAndroid Build Coastguard Worker } 2294*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 2295*333d2b36SAndroid Build Coastguard Worker deps = c.linker.linkerDeps(ctx, deps) 2296*333d2b36SAndroid Build Coastguard Worker } 2297*333d2b36SAndroid Build Coastguard Worker if c.stl != nil { 2298*333d2b36SAndroid Build Coastguard Worker deps = c.stl.deps(ctx, deps) 2299*333d2b36SAndroid Build Coastguard Worker } 2300*333d2b36SAndroid Build Coastguard Worker if c.coverage != nil { 2301*333d2b36SAndroid Build Coastguard Worker deps = c.coverage.deps(ctx, deps) 2302*333d2b36SAndroid Build Coastguard Worker } 2303*333d2b36SAndroid Build Coastguard Worker 2304*333d2b36SAndroid Build Coastguard Worker deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs) 2305*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs) 2306*333d2b36SAndroid Build Coastguard Worker deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs) 2307*333d2b36SAndroid Build Coastguard Worker deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs) 2308*333d2b36SAndroid Build Coastguard Worker deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs) 2309*333d2b36SAndroid Build Coastguard Worker deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs) 2310*333d2b36SAndroid Build Coastguard Worker deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs) 2311*333d2b36SAndroid Build Coastguard Worker deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs) 2312*333d2b36SAndroid Build Coastguard Worker 2313*333d2b36SAndroid Build Coastguard Worker if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil { 2314*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("shared_libs", "%s", err.Error()) 2315*333d2b36SAndroid Build Coastguard Worker } 2316*333d2b36SAndroid Build Coastguard Worker 2317*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.ReexportSharedLibHeaders { 2318*333d2b36SAndroid Build Coastguard Worker if !inList(lib, deps.SharedLibs) { 2319*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib) 2320*333d2b36SAndroid Build Coastguard Worker } 2321*333d2b36SAndroid Build Coastguard Worker } 2322*333d2b36SAndroid Build Coastguard Worker 2323*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.ReexportStaticLibHeaders { 2324*333d2b36SAndroid Build Coastguard Worker if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) { 2325*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs or whole_static_libs: '%s'", lib) 2326*333d2b36SAndroid Build Coastguard Worker } 2327*333d2b36SAndroid Build Coastguard Worker } 2328*333d2b36SAndroid Build Coastguard Worker 2329*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.ReexportHeaderLibHeaders { 2330*333d2b36SAndroid Build Coastguard Worker if !inList(lib, deps.HeaderLibs) { 2331*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib) 2332*333d2b36SAndroid Build Coastguard Worker } 2333*333d2b36SAndroid Build Coastguard Worker } 2334*333d2b36SAndroid Build Coastguard Worker 2335*333d2b36SAndroid Build Coastguard Worker for _, gen := range deps.ReexportGeneratedHeaders { 2336*333d2b36SAndroid Build Coastguard Worker if !inList(gen, deps.GeneratedHeaders) { 2337*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen) 2338*333d2b36SAndroid Build Coastguard Worker } 2339*333d2b36SAndroid Build Coastguard Worker } 2340*333d2b36SAndroid Build Coastguard Worker 2341*333d2b36SAndroid Build Coastguard Worker return deps 2342*333d2b36SAndroid Build Coastguard Worker} 2343*333d2b36SAndroid Build Coastguard Worker 2344*333d2b36SAndroid Build Coastguard Workerfunc checkConflictingExplicitVersions(libs []string) error { 2345*333d2b36SAndroid Build Coastguard Worker withoutVersion := func(s string) string { 2346*333d2b36SAndroid Build Coastguard Worker name, _ := StubsLibNameAndVersion(s) 2347*333d2b36SAndroid Build Coastguard Worker return name 2348*333d2b36SAndroid Build Coastguard Worker } 2349*333d2b36SAndroid Build Coastguard Worker var errs []error 2350*333d2b36SAndroid Build Coastguard Worker for i, lib := range libs { 2351*333d2b36SAndroid Build Coastguard Worker libName := withoutVersion(lib) 2352*333d2b36SAndroid Build Coastguard Worker libsToCompare := libs[i+1:] 2353*333d2b36SAndroid Build Coastguard Worker j := slices.IndexFunc(libsToCompare, func(s string) bool { 2354*333d2b36SAndroid Build Coastguard Worker return withoutVersion(s) == libName 2355*333d2b36SAndroid Build Coastguard Worker }) 2356*333d2b36SAndroid Build Coastguard Worker if j >= 0 { 2357*333d2b36SAndroid Build Coastguard Worker errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q", 2358*333d2b36SAndroid Build Coastguard Worker lib, libsToCompare[j])) 2359*333d2b36SAndroid Build Coastguard Worker } 2360*333d2b36SAndroid Build Coastguard Worker } 2361*333d2b36SAndroid Build Coastguard Worker return errors.Join(errs...) 2362*333d2b36SAndroid Build Coastguard Worker} 2363*333d2b36SAndroid Build Coastguard Worker 2364*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) beginMutator(actx android.BottomUpMutatorContext) { 2365*333d2b36SAndroid Build Coastguard Worker ctx := &baseModuleContext{ 2366*333d2b36SAndroid Build Coastguard Worker BaseModuleContext: actx, 2367*333d2b36SAndroid Build Coastguard Worker moduleContextImpl: moduleContextImpl{ 2368*333d2b36SAndroid Build Coastguard Worker mod: c, 2369*333d2b36SAndroid Build Coastguard Worker }, 2370*333d2b36SAndroid Build Coastguard Worker } 2371*333d2b36SAndroid Build Coastguard Worker ctx.ctx = ctx 2372*333d2b36SAndroid Build Coastguard Worker 2373*333d2b36SAndroid Build Coastguard Worker c.begin(ctx) 2374*333d2b36SAndroid Build Coastguard Worker} 2375*333d2b36SAndroid Build Coastguard Worker 2376*333d2b36SAndroid Build Coastguard Worker// Split name#version into name and version 2377*333d2b36SAndroid Build Coastguard Workerfunc StubsLibNameAndVersion(name string) (string, string) { 2378*333d2b36SAndroid Build Coastguard Worker if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 { 2379*333d2b36SAndroid Build Coastguard Worker version := name[sharp+1:] 2380*333d2b36SAndroid Build Coastguard Worker libname := name[:sharp] 2381*333d2b36SAndroid Build Coastguard Worker return libname, version 2382*333d2b36SAndroid Build Coastguard Worker } 2383*333d2b36SAndroid Build Coastguard Worker return name, "" 2384*333d2b36SAndroid Build Coastguard Worker} 2385*333d2b36SAndroid Build Coastguard Worker 2386*333d2b36SAndroid Build Coastguard Workerfunc GetCrtVariations(ctx android.BottomUpMutatorContext, 2387*333d2b36SAndroid Build Coastguard Worker m LinkableInterface) []blueprint.Variation { 2388*333d2b36SAndroid Build Coastguard Worker if ctx.Os() != android.Android { 2389*333d2b36SAndroid Build Coastguard Worker return nil 2390*333d2b36SAndroid Build Coastguard Worker } 2391*333d2b36SAndroid Build Coastguard Worker if m.UseSdk() { 2392*333d2b36SAndroid Build Coastguard Worker // Choose the CRT that best satisfies the min_sdk_version requirement of this module 2393*333d2b36SAndroid Build Coastguard Worker minSdkVersion := m.MinSdkVersion() 2394*333d2b36SAndroid Build Coastguard Worker if minSdkVersion == "" || minSdkVersion == "apex_inherit" { 2395*333d2b36SAndroid Build Coastguard Worker minSdkVersion = m.SdkVersion() 2396*333d2b36SAndroid Build Coastguard Worker } 2397*333d2b36SAndroid Build Coastguard Worker apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion) 2398*333d2b36SAndroid Build Coastguard Worker if err != nil { 2399*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("min_sdk_version", err.Error()) 2400*333d2b36SAndroid Build Coastguard Worker } 2401*333d2b36SAndroid Build Coastguard Worker 2402*333d2b36SAndroid Build Coastguard Worker // Raise the minSdkVersion to the minimum supported for the architecture. 2403*333d2b36SAndroid Build Coastguard Worker minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType) 2404*333d2b36SAndroid Build Coastguard Worker if apiLevel.LessThan(minApiForArch) { 2405*333d2b36SAndroid Build Coastguard Worker apiLevel = minApiForArch 2406*333d2b36SAndroid Build Coastguard Worker } 2407*333d2b36SAndroid Build Coastguard Worker 2408*333d2b36SAndroid Build Coastguard Worker return []blueprint.Variation{ 2409*333d2b36SAndroid Build Coastguard Worker {Mutator: "sdk", Variation: "sdk"}, 2410*333d2b36SAndroid Build Coastguard Worker {Mutator: "version", Variation: apiLevel.String()}, 2411*333d2b36SAndroid Build Coastguard Worker } 2412*333d2b36SAndroid Build Coastguard Worker } 2413*333d2b36SAndroid Build Coastguard Worker return []blueprint.Variation{ 2414*333d2b36SAndroid Build Coastguard Worker {Mutator: "sdk", Variation: ""}, 2415*333d2b36SAndroid Build Coastguard Worker } 2416*333d2b36SAndroid Build Coastguard Worker} 2417*333d2b36SAndroid Build Coastguard Worker 2418*333d2b36SAndroid Build Coastguard Workerfunc AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface, 2419*333d2b36SAndroid Build Coastguard Worker variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) { 2420*333d2b36SAndroid Build Coastguard Worker 2421*333d2b36SAndroid Build Coastguard Worker variations = append([]blueprint.Variation(nil), variations...) 2422*333d2b36SAndroid Build Coastguard Worker 2423*333d2b36SAndroid Build Coastguard Worker if version != "" && canBeOrLinkAgainstVersionVariants(mod) { 2424*333d2b36SAndroid Build Coastguard Worker // Version is explicitly specified. i.e. libFoo#30 2425*333d2b36SAndroid Build Coastguard Worker if version == "impl" { 2426*333d2b36SAndroid Build Coastguard Worker version = "" 2427*333d2b36SAndroid Build Coastguard Worker } 2428*333d2b36SAndroid Build Coastguard Worker variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version}) 2429*333d2b36SAndroid Build Coastguard Worker if tag, ok := depTag.(libraryDependencyTag); ok { 2430*333d2b36SAndroid Build Coastguard Worker tag.explicitlyVersioned = true 2431*333d2b36SAndroid Build Coastguard Worker // depTag is an interface that contains a concrete non-pointer struct. That makes the local 2432*333d2b36SAndroid Build Coastguard Worker // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign 2433*333d2b36SAndroid Build Coastguard Worker // the modified copy to depTag. 2434*333d2b36SAndroid Build Coastguard Worker depTag = tag 2435*333d2b36SAndroid Build Coastguard Worker } else { 2436*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Unexpected dependency tag: %T", depTag)) 2437*333d2b36SAndroid Build Coastguard Worker } 2438*333d2b36SAndroid Build Coastguard Worker } 2439*333d2b36SAndroid Build Coastguard Worker 2440*333d2b36SAndroid Build Coastguard Worker if far { 2441*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(variations, depTag, name) 2442*333d2b36SAndroid Build Coastguard Worker } else { 2443*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(variations, depTag, name) 2444*333d2b36SAndroid Build Coastguard Worker } 2445*333d2b36SAndroid Build Coastguard Worker} 2446*333d2b36SAndroid Build Coastguard Worker 2447*333d2b36SAndroid Build Coastguard Workerfunc GetReplaceModuleName(lib string, replaceMap map[string]string) string { 2448*333d2b36SAndroid Build Coastguard Worker if snapshot, ok := replaceMap[lib]; ok { 2449*333d2b36SAndroid Build Coastguard Worker return snapshot 2450*333d2b36SAndroid Build Coastguard Worker } 2451*333d2b36SAndroid Build Coastguard Worker 2452*333d2b36SAndroid Build Coastguard Worker return lib 2453*333d2b36SAndroid Build Coastguard Worker} 2454*333d2b36SAndroid Build Coastguard Worker 2455*333d2b36SAndroid Build Coastguard Worker// FilterNdkLibs takes a list of names of shared libraries and scans it for two types 2456*333d2b36SAndroid Build Coastguard Worker// of names: 2457*333d2b36SAndroid Build Coastguard Worker// 2458*333d2b36SAndroid Build Coastguard Worker// 1. Name of an NDK library that refers to an ndk_library module. 2459*333d2b36SAndroid Build Coastguard Worker// 2460*333d2b36SAndroid Build Coastguard Worker// For each of these, it adds the name of the ndk_library module to the list of 2461*333d2b36SAndroid Build Coastguard Worker// variant libs. 2462*333d2b36SAndroid Build Coastguard Worker// 2463*333d2b36SAndroid Build Coastguard Worker// 2. Anything else (so anything that isn't an NDK library). 2464*333d2b36SAndroid Build Coastguard Worker// 2465*333d2b36SAndroid Build Coastguard Worker// It adds these to the nonvariantLibs list. 2466*333d2b36SAndroid Build Coastguard Worker// 2467*333d2b36SAndroid Build Coastguard Worker// The caller can then know to add the variantLibs dependencies differently from the 2468*333d2b36SAndroid Build Coastguard Worker// nonvariantLibs 2469*333d2b36SAndroid Build Coastguard Workerfunc FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) { 2470*333d2b36SAndroid Build Coastguard Worker variantLibs = []string{} 2471*333d2b36SAndroid Build Coastguard Worker 2472*333d2b36SAndroid Build Coastguard Worker nonvariantLibs = []string{} 2473*333d2b36SAndroid Build Coastguard Worker for _, entry := range list { 2474*333d2b36SAndroid Build Coastguard Worker // strip #version suffix out 2475*333d2b36SAndroid Build Coastguard Worker name, _ := StubsLibNameAndVersion(entry) 2476*333d2b36SAndroid Build Coastguard Worker if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) { 2477*333d2b36SAndroid Build Coastguard Worker variantLibs = append(variantLibs, name+ndkLibrarySuffix) 2478*333d2b36SAndroid Build Coastguard Worker } else { 2479*333d2b36SAndroid Build Coastguard Worker nonvariantLibs = append(nonvariantLibs, entry) 2480*333d2b36SAndroid Build Coastguard Worker } 2481*333d2b36SAndroid Build Coastguard Worker } 2482*333d2b36SAndroid Build Coastguard Worker return nonvariantLibs, variantLibs 2483*333d2b36SAndroid Build Coastguard Worker 2484*333d2b36SAndroid Build Coastguard Worker} 2485*333d2b36SAndroid Build Coastguard Worker 2486*333d2b36SAndroid Build Coastguard Workerfunc rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) { 2487*333d2b36SAndroid Build Coastguard Worker nonVariantLibs := []string{} 2488*333d2b36SAndroid Build Coastguard Worker variantLibs := []string{} 2489*333d2b36SAndroid Build Coastguard Worker 2490*333d2b36SAndroid Build Coastguard Worker for _, lib := range libs { 2491*333d2b36SAndroid Build Coastguard Worker replaceLibName := GetReplaceModuleName(lib, replaceList) 2492*333d2b36SAndroid Build Coastguard Worker if replaceLibName == lib { 2493*333d2b36SAndroid Build Coastguard Worker // Do not handle any libs which are not in API imports 2494*333d2b36SAndroid Build Coastguard Worker nonVariantLibs = append(nonVariantLibs, replaceLibName) 2495*333d2b36SAndroid Build Coastguard Worker } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) { 2496*333d2b36SAndroid Build Coastguard Worker variantLibs = append(variantLibs, replaceLibName) 2497*333d2b36SAndroid Build Coastguard Worker } else { 2498*333d2b36SAndroid Build Coastguard Worker nonVariantLibs = append(nonVariantLibs, replaceLibName) 2499*333d2b36SAndroid Build Coastguard Worker } 2500*333d2b36SAndroid Build Coastguard Worker } 2501*333d2b36SAndroid Build Coastguard Worker 2502*333d2b36SAndroid Build Coastguard Worker return nonVariantLibs, variantLibs 2503*333d2b36SAndroid Build Coastguard Worker} 2504*333d2b36SAndroid Build Coastguard Worker 2505*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) shouldUseApiSurface() bool { 2506*333d2b36SAndroid Build Coastguard Worker if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled { 2507*333d2b36SAndroid Build Coastguard Worker if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant { 2508*333d2b36SAndroid Build Coastguard Worker // LLNDK Variant 2509*333d2b36SAndroid Build Coastguard Worker return true 2510*333d2b36SAndroid Build Coastguard Worker } 2511*333d2b36SAndroid Build Coastguard Worker 2512*333d2b36SAndroid Build Coastguard Worker if c.Properties.IsSdkVariant { 2513*333d2b36SAndroid Build Coastguard Worker // NDK Variant 2514*333d2b36SAndroid Build Coastguard Worker return true 2515*333d2b36SAndroid Build Coastguard Worker } 2516*333d2b36SAndroid Build Coastguard Worker } 2517*333d2b36SAndroid Build Coastguard Worker 2518*333d2b36SAndroid Build Coastguard Worker return false 2519*333d2b36SAndroid Build Coastguard Worker} 2520*333d2b36SAndroid Build Coastguard Worker 2521*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { 2522*333d2b36SAndroid Build Coastguard Worker if !c.Enabled(actx) { 2523*333d2b36SAndroid Build Coastguard Worker return 2524*333d2b36SAndroid Build Coastguard Worker } 2525*333d2b36SAndroid Build Coastguard Worker 2526*333d2b36SAndroid Build Coastguard Worker ctx := &depsContext{ 2527*333d2b36SAndroid Build Coastguard Worker BottomUpMutatorContext: actx, 2528*333d2b36SAndroid Build Coastguard Worker moduleContextImpl: moduleContextImpl{ 2529*333d2b36SAndroid Build Coastguard Worker mod: c, 2530*333d2b36SAndroid Build Coastguard Worker }, 2531*333d2b36SAndroid Build Coastguard Worker } 2532*333d2b36SAndroid Build Coastguard Worker ctx.ctx = ctx 2533*333d2b36SAndroid Build Coastguard Worker 2534*333d2b36SAndroid Build Coastguard Worker deps := c.deps(ctx) 2535*333d2b36SAndroid Build Coastguard Worker 2536*333d2b36SAndroid Build Coastguard Worker apiNdkLibs := []string{} 2537*333d2b36SAndroid Build Coastguard Worker apiLateNdkLibs := []string{} 2538*333d2b36SAndroid Build Coastguard Worker 2539*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs 2540*333d2b36SAndroid Build Coastguard Worker 2541*333d2b36SAndroid Build Coastguard Worker variantNdkLibs := []string{} 2542*333d2b36SAndroid Build Coastguard Worker variantLateNdkLibs := []string{} 2543*333d2b36SAndroid Build Coastguard Worker if ctx.Os() == android.Android { 2544*333d2b36SAndroid Build Coastguard Worker deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs) 2545*333d2b36SAndroid Build Coastguard Worker deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs) 2546*333d2b36SAndroid Build Coastguard Worker deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders) 2547*333d2b36SAndroid Build Coastguard Worker } 2548*333d2b36SAndroid Build Coastguard Worker 2549*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.HeaderLibs { 2550*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: headerLibraryDependency} 2551*333d2b36SAndroid Build Coastguard Worker if inList(lib, deps.ReexportHeaderLibHeaders) { 2552*333d2b36SAndroid Build Coastguard Worker depTag.reexportFlags = true 2553*333d2b36SAndroid Build Coastguard Worker } 2554*333d2b36SAndroid Build Coastguard Worker 2555*333d2b36SAndroid Build Coastguard Worker if c.isNDKStubLibrary() { 2556*333d2b36SAndroid Build Coastguard Worker variationExists := actx.OtherModuleDependencyVariantExists(nil, lib) 2557*333d2b36SAndroid Build Coastguard Worker if variationExists { 2558*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(nil, depTag, lib) 2559*333d2b36SAndroid Build Coastguard Worker } else { 2560*333d2b36SAndroid Build Coastguard Worker // dependencies to ndk_headers fall here as ndk_headers do not have 2561*333d2b36SAndroid Build Coastguard Worker // any variants. 2562*333d2b36SAndroid Build Coastguard Worker actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib) 2563*333d2b36SAndroid Build Coastguard Worker } 2564*333d2b36SAndroid Build Coastguard Worker } else if c.IsStubs() { 2565*333d2b36SAndroid Build Coastguard Worker actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()), 2566*333d2b36SAndroid Build Coastguard Worker depTag, lib) 2567*333d2b36SAndroid Build Coastguard Worker } else { 2568*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(nil, depTag, lib) 2569*333d2b36SAndroid Build Coastguard Worker } 2570*333d2b36SAndroid Build Coastguard Worker } 2571*333d2b36SAndroid Build Coastguard Worker 2572*333d2b36SAndroid Build Coastguard Worker if c.isNDKStubLibrary() { 2573*333d2b36SAndroid Build Coastguard Worker // NDK stubs depend on their implementation because the ABI dumps are 2574*333d2b36SAndroid Build Coastguard Worker // generated from the implementation library. 2575*333d2b36SAndroid Build Coastguard Worker 2576*333d2b36SAndroid Build Coastguard Worker actx.AddFarVariationDependencies(append(ctx.Target().Variations(), 2577*333d2b36SAndroid Build Coastguard Worker c.ImageVariation(), 2578*333d2b36SAndroid Build Coastguard Worker blueprint.Variation{Mutator: "link", Variation: "shared"}, 2579*333d2b36SAndroid Build Coastguard Worker ), stubImplementation, c.BaseModuleName()) 2580*333d2b36SAndroid Build Coastguard Worker } 2581*333d2b36SAndroid Build Coastguard Worker 2582*333d2b36SAndroid Build Coastguard Worker // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs. 2583*333d2b36SAndroid Build Coastguard Worker if c.ImageVariation().Variation == android.CoreVariation && c.Device() && 2584*333d2b36SAndroid Build Coastguard Worker c.Target().NativeBridge == android.NativeBridgeDisabled { 2585*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies( 2586*333d2b36SAndroid Build Coastguard Worker []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}}, 2587*333d2b36SAndroid Build Coastguard Worker llndkHeaderLibTag, 2588*333d2b36SAndroid Build Coastguard Worker deps.LlndkHeaderLibs...) 2589*333d2b36SAndroid Build Coastguard Worker } 2590*333d2b36SAndroid Build Coastguard Worker 2591*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.WholeStaticLibs { 2592*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true} 2593*333d2b36SAndroid Build Coastguard Worker 2594*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2595*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 2596*333d2b36SAndroid Build Coastguard Worker }, depTag, lib) 2597*333d2b36SAndroid Build Coastguard Worker } 2598*333d2b36SAndroid Build Coastguard Worker 2599*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.StaticLibs { 2600*333d2b36SAndroid Build Coastguard Worker // Some dependencies listed in static_libs might actually be rust_ffi rlib variants. 2601*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: staticLibraryDependency} 2602*333d2b36SAndroid Build Coastguard Worker 2603*333d2b36SAndroid Build Coastguard Worker if inList(lib, deps.ReexportStaticLibHeaders) { 2604*333d2b36SAndroid Build Coastguard Worker depTag.reexportFlags = true 2605*333d2b36SAndroid Build Coastguard Worker } 2606*333d2b36SAndroid Build Coastguard Worker if inList(lib, deps.ExcludeLibsForApex) { 2607*333d2b36SAndroid Build Coastguard Worker depTag.excludeInApex = true 2608*333d2b36SAndroid Build Coastguard Worker } 2609*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2610*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 2611*333d2b36SAndroid Build Coastguard Worker }, depTag, lib) 2612*333d2b36SAndroid Build Coastguard Worker } 2613*333d2b36SAndroid Build Coastguard Worker 2614*333d2b36SAndroid Build Coastguard Worker // staticUnwinderDep is treated as staticDep for Q apexes 2615*333d2b36SAndroid Build Coastguard Worker // so that native libraries/binaries are linked with static unwinder 2616*333d2b36SAndroid Build Coastguard Worker // because Q libc doesn't have unwinder APIs 2617*333d2b36SAndroid Build Coastguard Worker if deps.StaticUnwinderIfLegacy { 2618*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true} 2619*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2620*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 2621*333d2b36SAndroid Build Coastguard Worker }, depTag, staticUnwinder(actx)) 2622*333d2b36SAndroid Build Coastguard Worker } 2623*333d2b36SAndroid Build Coastguard Worker 2624*333d2b36SAndroid Build Coastguard Worker // shared lib names without the #version suffix 2625*333d2b36SAndroid Build Coastguard Worker var sharedLibNames []string 2626*333d2b36SAndroid Build Coastguard Worker 2627*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.SharedLibs { 2628*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: sharedLibraryDependency} 2629*333d2b36SAndroid Build Coastguard Worker if inList(lib, deps.ReexportSharedLibHeaders) { 2630*333d2b36SAndroid Build Coastguard Worker depTag.reexportFlags = true 2631*333d2b36SAndroid Build Coastguard Worker } 2632*333d2b36SAndroid Build Coastguard Worker if inList(lib, deps.ExcludeLibsForApex) { 2633*333d2b36SAndroid Build Coastguard Worker depTag.excludeInApex = true 2634*333d2b36SAndroid Build Coastguard Worker } 2635*333d2b36SAndroid Build Coastguard Worker if inList(lib, deps.ExcludeLibsForNonApex) { 2636*333d2b36SAndroid Build Coastguard Worker depTag.excludeInNonApex = true 2637*333d2b36SAndroid Build Coastguard Worker } 2638*333d2b36SAndroid Build Coastguard Worker 2639*333d2b36SAndroid Build Coastguard Worker name, version := StubsLibNameAndVersion(lib) 2640*333d2b36SAndroid Build Coastguard Worker sharedLibNames = append(sharedLibNames, name) 2641*333d2b36SAndroid Build Coastguard Worker 2642*333d2b36SAndroid Build Coastguard Worker variations := []blueprint.Variation{ 2643*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2644*333d2b36SAndroid Build Coastguard Worker } 2645*333d2b36SAndroid Build Coastguard Worker AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false) 2646*333d2b36SAndroid Build Coastguard Worker } 2647*333d2b36SAndroid Build Coastguard Worker 2648*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.LateStaticLibs { 2649*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency} 2650*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2651*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 2652*333d2b36SAndroid Build Coastguard Worker }, depTag, lib) 2653*333d2b36SAndroid Build Coastguard Worker } 2654*333d2b36SAndroid Build Coastguard Worker 2655*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.UnexportedStaticLibs { 2656*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true} 2657*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2658*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "static"}, 2659*333d2b36SAndroid Build Coastguard Worker }, depTag, lib) 2660*333d2b36SAndroid Build Coastguard Worker } 2661*333d2b36SAndroid Build Coastguard Worker 2662*333d2b36SAndroid Build Coastguard Worker for _, lib := range deps.LateSharedLibs { 2663*333d2b36SAndroid Build Coastguard Worker if inList(lib, sharedLibNames) { 2664*333d2b36SAndroid Build Coastguard Worker // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...) 2665*333d2b36SAndroid Build Coastguard Worker // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be 2666*333d2b36SAndroid Build Coastguard Worker // linking against both the stubs lib and the non-stubs lib at the same time. 2667*333d2b36SAndroid Build Coastguard Worker continue 2668*333d2b36SAndroid Build Coastguard Worker } 2669*333d2b36SAndroid Build Coastguard Worker depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency} 2670*333d2b36SAndroid Build Coastguard Worker variations := []blueprint.Variation{ 2671*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2672*333d2b36SAndroid Build Coastguard Worker } 2673*333d2b36SAndroid Build Coastguard Worker AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false) 2674*333d2b36SAndroid Build Coastguard Worker } 2675*333d2b36SAndroid Build Coastguard Worker 2676*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2677*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2678*333d2b36SAndroid Build Coastguard Worker }, dataLibDepTag, deps.DataLibs...) 2679*333d2b36SAndroid Build Coastguard Worker 2680*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...) 2681*333d2b36SAndroid Build Coastguard Worker 2682*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2683*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2684*333d2b36SAndroid Build Coastguard Worker }, runtimeDepTag, deps.RuntimeLibs...) 2685*333d2b36SAndroid Build Coastguard Worker 2686*333d2b36SAndroid Build Coastguard Worker actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...) 2687*333d2b36SAndroid Build Coastguard Worker 2688*333d2b36SAndroid Build Coastguard Worker for _, gen := range deps.GeneratedHeaders { 2689*333d2b36SAndroid Build Coastguard Worker depTag := genHeaderDepTag 2690*333d2b36SAndroid Build Coastguard Worker if inList(gen, deps.ReexportGeneratedHeaders) { 2691*333d2b36SAndroid Build Coastguard Worker depTag = genHeaderExportDepTag 2692*333d2b36SAndroid Build Coastguard Worker } 2693*333d2b36SAndroid Build Coastguard Worker actx.AddDependency(c, depTag, gen) 2694*333d2b36SAndroid Build Coastguard Worker } 2695*333d2b36SAndroid Build Coastguard Worker 2696*333d2b36SAndroid Build Coastguard Worker for _, gen := range deps.DeviceFirstGeneratedHeaders { 2697*333d2b36SAndroid Build Coastguard Worker depTag := genHeaderDepTag 2698*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen) 2699*333d2b36SAndroid Build Coastguard Worker } 2700*333d2b36SAndroid Build Coastguard Worker 2701*333d2b36SAndroid Build Coastguard Worker crtVariations := GetCrtVariations(ctx, c) 2702*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...) 2703*333d2b36SAndroid Build Coastguard Worker for _, crt := range deps.CrtBegin { 2704*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(crtVariations, CrtBeginDepTag, 2705*333d2b36SAndroid Build Coastguard Worker crt) 2706*333d2b36SAndroid Build Coastguard Worker } 2707*333d2b36SAndroid Build Coastguard Worker for _, crt := range deps.CrtEnd { 2708*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies(crtVariations, CrtEndDepTag, 2709*333d2b36SAndroid Build Coastguard Worker crt) 2710*333d2b36SAndroid Build Coastguard Worker } 2711*333d2b36SAndroid Build Coastguard Worker if deps.DynamicLinker != "" { 2712*333d2b36SAndroid Build Coastguard Worker actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker) 2713*333d2b36SAndroid Build Coastguard Worker } 2714*333d2b36SAndroid Build Coastguard Worker 2715*333d2b36SAndroid Build Coastguard Worker version := ctx.sdkVersion() 2716*333d2b36SAndroid Build Coastguard Worker 2717*333d2b36SAndroid Build Coastguard Worker ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version} 2718*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2719*333d2b36SAndroid Build Coastguard Worker {Mutator: "version", Variation: version}, 2720*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2721*333d2b36SAndroid Build Coastguard Worker }, ndkStubDepTag, variantNdkLibs...) 2722*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2723*333d2b36SAndroid Build Coastguard Worker {Mutator: "version", Variation: version}, 2724*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2725*333d2b36SAndroid Build Coastguard Worker }, ndkStubDepTag, apiNdkLibs...) 2726*333d2b36SAndroid Build Coastguard Worker 2727*333d2b36SAndroid Build Coastguard Worker ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version} 2728*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2729*333d2b36SAndroid Build Coastguard Worker {Mutator: "version", Variation: version}, 2730*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2731*333d2b36SAndroid Build Coastguard Worker }, ndkLateStubDepTag, variantLateNdkLibs...) 2732*333d2b36SAndroid Build Coastguard Worker actx.AddVariationDependencies([]blueprint.Variation{ 2733*333d2b36SAndroid Build Coastguard Worker {Mutator: "version", Variation: version}, 2734*333d2b36SAndroid Build Coastguard Worker {Mutator: "link", Variation: "shared"}, 2735*333d2b36SAndroid Build Coastguard Worker }, ndkLateStubDepTag, apiLateNdkLibs...) 2736*333d2b36SAndroid Build Coastguard Worker 2737*333d2b36SAndroid Build Coastguard Worker if len(deps.AidlLibs) > 0 { 2738*333d2b36SAndroid Build Coastguard Worker actx.AddDependency( 2739*333d2b36SAndroid Build Coastguard Worker c, 2740*333d2b36SAndroid Build Coastguard Worker aidlLibraryTag, 2741*333d2b36SAndroid Build Coastguard Worker deps.AidlLibs..., 2742*333d2b36SAndroid Build Coastguard Worker ) 2743*333d2b36SAndroid Build Coastguard Worker } 2744*333d2b36SAndroid Build Coastguard Worker 2745*333d2b36SAndroid Build Coastguard Worker} 2746*333d2b36SAndroid Build Coastguard Worker 2747*333d2b36SAndroid Build Coastguard Workerfunc BeginMutator(ctx android.BottomUpMutatorContext) { 2748*333d2b36SAndroid Build Coastguard Worker if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) { 2749*333d2b36SAndroid Build Coastguard Worker c.beginMutator(ctx) 2750*333d2b36SAndroid Build Coastguard Worker } 2751*333d2b36SAndroid Build Coastguard Worker} 2752*333d2b36SAndroid Build Coastguard Worker 2753*333d2b36SAndroid Build Coastguard Worker// Whether a module can link to another module, taking into 2754*333d2b36SAndroid Build Coastguard Worker// account NDK linking. 2755*333d2b36SAndroid Build Coastguard Workerfunc checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface, 2756*333d2b36SAndroid Build Coastguard Worker tag blueprint.DependencyTag) { 2757*333d2b36SAndroid Build Coastguard Worker 2758*333d2b36SAndroid Build Coastguard Worker switch t := tag.(type) { 2759*333d2b36SAndroid Build Coastguard Worker case dependencyTag: 2760*333d2b36SAndroid Build Coastguard Worker if t != vndkExtDepTag { 2761*333d2b36SAndroid Build Coastguard Worker return 2762*333d2b36SAndroid Build Coastguard Worker } 2763*333d2b36SAndroid Build Coastguard Worker case libraryDependencyTag: 2764*333d2b36SAndroid Build Coastguard Worker default: 2765*333d2b36SAndroid Build Coastguard Worker return 2766*333d2b36SAndroid Build Coastguard Worker } 2767*333d2b36SAndroid Build Coastguard Worker 2768*333d2b36SAndroid Build Coastguard Worker if from.Target().Os != android.Android { 2769*333d2b36SAndroid Build Coastguard Worker // Host code is not restricted 2770*333d2b36SAndroid Build Coastguard Worker return 2771*333d2b36SAndroid Build Coastguard Worker } 2772*333d2b36SAndroid Build Coastguard Worker 2773*333d2b36SAndroid Build Coastguard Worker if from.SdkVersion() == "" { 2774*333d2b36SAndroid Build Coastguard Worker // Platform code can link to anything 2775*333d2b36SAndroid Build Coastguard Worker return 2776*333d2b36SAndroid Build Coastguard Worker } 2777*333d2b36SAndroid Build Coastguard Worker if from.InRamdisk() { 2778*333d2b36SAndroid Build Coastguard Worker // Ramdisk code is not NDK 2779*333d2b36SAndroid Build Coastguard Worker return 2780*333d2b36SAndroid Build Coastguard Worker } 2781*333d2b36SAndroid Build Coastguard Worker if from.InVendorRamdisk() { 2782*333d2b36SAndroid Build Coastguard Worker // Vendor ramdisk code is not NDK 2783*333d2b36SAndroid Build Coastguard Worker return 2784*333d2b36SAndroid Build Coastguard Worker } 2785*333d2b36SAndroid Build Coastguard Worker if from.InRecovery() { 2786*333d2b36SAndroid Build Coastguard Worker // Recovery code is not NDK 2787*333d2b36SAndroid Build Coastguard Worker return 2788*333d2b36SAndroid Build Coastguard Worker } 2789*333d2b36SAndroid Build Coastguard Worker if c, ok := to.(*Module); ok { 2790*333d2b36SAndroid Build Coastguard Worker if c.StubDecorator() { 2791*333d2b36SAndroid Build Coastguard Worker // These aren't real libraries, but are the stub shared libraries that are included in 2792*333d2b36SAndroid Build Coastguard Worker // the NDK. 2793*333d2b36SAndroid Build Coastguard Worker return 2794*333d2b36SAndroid Build Coastguard Worker } 2795*333d2b36SAndroid Build Coastguard Worker } 2796*333d2b36SAndroid Build Coastguard Worker 2797*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" { 2798*333d2b36SAndroid Build Coastguard Worker // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version) 2799*333d2b36SAndroid Build Coastguard Worker // to link to libc++ (non-NDK and without sdk_version). 2800*333d2b36SAndroid Build Coastguard Worker return 2801*333d2b36SAndroid Build Coastguard Worker } 2802*333d2b36SAndroid Build Coastguard Worker 2803*333d2b36SAndroid Build Coastguard Worker if to.SdkVersion() == "" { 2804*333d2b36SAndroid Build Coastguard Worker // NDK code linking to platform code is never okay. 2805*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("depends on non-NDK-built library %q", 2806*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleName(to.Module())) 2807*333d2b36SAndroid Build Coastguard Worker return 2808*333d2b36SAndroid Build Coastguard Worker } 2809*333d2b36SAndroid Build Coastguard Worker 2810*333d2b36SAndroid Build Coastguard Worker // At this point we know we have two NDK libraries, but we need to 2811*333d2b36SAndroid Build Coastguard Worker // check that we're not linking against anything built against a higher 2812*333d2b36SAndroid Build Coastguard Worker // API level, as it is only valid to link against older or equivalent 2813*333d2b36SAndroid Build Coastguard Worker // APIs. 2814*333d2b36SAndroid Build Coastguard Worker 2815*333d2b36SAndroid Build Coastguard Worker // Current can link against anything. 2816*333d2b36SAndroid Build Coastguard Worker if from.SdkVersion() != "current" { 2817*333d2b36SAndroid Build Coastguard Worker // Otherwise we need to check. 2818*333d2b36SAndroid Build Coastguard Worker if to.SdkVersion() == "current" { 2819*333d2b36SAndroid Build Coastguard Worker // Current can't be linked against by anything else. 2820*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("links %q built against newer API version %q", 2821*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleName(to.Module()), "current") 2822*333d2b36SAndroid Build Coastguard Worker } else { 2823*333d2b36SAndroid Build Coastguard Worker fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion()) 2824*333d2b36SAndroid Build Coastguard Worker if err != nil { 2825*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", 2826*333d2b36SAndroid Build Coastguard Worker "Invalid sdk_version value (must be int, preview or current): %q", 2827*333d2b36SAndroid Build Coastguard Worker from.SdkVersion()) 2828*333d2b36SAndroid Build Coastguard Worker } 2829*333d2b36SAndroid Build Coastguard Worker toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion()) 2830*333d2b36SAndroid Build Coastguard Worker if err != nil { 2831*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", 2832*333d2b36SAndroid Build Coastguard Worker "Invalid sdk_version value (must be int, preview or current): %q", 2833*333d2b36SAndroid Build Coastguard Worker to.SdkVersion()) 2834*333d2b36SAndroid Build Coastguard Worker } 2835*333d2b36SAndroid Build Coastguard Worker 2836*333d2b36SAndroid Build Coastguard Worker if toApi.GreaterThan(fromApi) { 2837*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("links %q built against newer API version %q", 2838*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleName(to.Module()), to.SdkVersion()) 2839*333d2b36SAndroid Build Coastguard Worker } 2840*333d2b36SAndroid Build Coastguard Worker } 2841*333d2b36SAndroid Build Coastguard Worker } 2842*333d2b36SAndroid Build Coastguard Worker 2843*333d2b36SAndroid Build Coastguard Worker // Also check that the two STL choices are compatible. 2844*333d2b36SAndroid Build Coastguard Worker fromStl := from.SelectedStl() 2845*333d2b36SAndroid Build Coastguard Worker toStl := to.SelectedStl() 2846*333d2b36SAndroid Build Coastguard Worker if fromStl == "" || toStl == "" { 2847*333d2b36SAndroid Build Coastguard Worker // Libraries that don't use the STL are unrestricted. 2848*333d2b36SAndroid Build Coastguard Worker } else if fromStl == "ndk_system" || toStl == "ndk_system" { 2849*333d2b36SAndroid Build Coastguard Worker // We can be permissive with the system "STL" since it is only the C++ 2850*333d2b36SAndroid Build Coastguard Worker // ABI layer, but in the future we should make sure that everyone is 2851*333d2b36SAndroid Build Coastguard Worker // using either libc++ or nothing. 2852*333d2b36SAndroid Build Coastguard Worker } else if getNdkStlFamily(from) != getNdkStlFamily(to) { 2853*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q", 2854*333d2b36SAndroid Build Coastguard Worker from.SelectedStl(), ctx.OtherModuleName(to.Module()), 2855*333d2b36SAndroid Build Coastguard Worker to.SelectedStl()) 2856*333d2b36SAndroid Build Coastguard Worker } 2857*333d2b36SAndroid Build Coastguard Worker} 2858*333d2b36SAndroid Build Coastguard Worker 2859*333d2b36SAndroid Build Coastguard Workerfunc checkLinkTypeMutator(ctx android.BottomUpMutatorContext) { 2860*333d2b36SAndroid Build Coastguard Worker if c, ok := ctx.Module().(*Module); ok { 2861*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(dep android.Module) { 2862*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 2863*333d2b36SAndroid Build Coastguard Worker ccDep, ok := dep.(LinkableInterface) 2864*333d2b36SAndroid Build Coastguard Worker if ok { 2865*333d2b36SAndroid Build Coastguard Worker checkLinkType(ctx, c, ccDep, depTag) 2866*333d2b36SAndroid Build Coastguard Worker } 2867*333d2b36SAndroid Build Coastguard Worker }) 2868*333d2b36SAndroid Build Coastguard Worker } 2869*333d2b36SAndroid Build Coastguard Worker} 2870*333d2b36SAndroid Build Coastguard Worker 2871*333d2b36SAndroid Build Coastguard Worker// Tests whether the dependent library is okay to be double loaded inside a single process. 2872*333d2b36SAndroid Build Coastguard Worker// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library, 2873*333d2b36SAndroid Build Coastguard Worker// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true 2874*333d2b36SAndroid Build Coastguard Worker// or as vndk-sp (vndk: { enabled: true, support_system_process: true}). 2875*333d2b36SAndroid Build Coastguard Workerfunc checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) { 2876*333d2b36SAndroid Build Coastguard Worker check := func(child, parent android.Module) bool { 2877*333d2b36SAndroid Build Coastguard Worker to, ok := child.(*Module) 2878*333d2b36SAndroid Build Coastguard Worker if !ok { 2879*333d2b36SAndroid Build Coastguard Worker return false 2880*333d2b36SAndroid Build Coastguard Worker } 2881*333d2b36SAndroid Build Coastguard Worker 2882*333d2b36SAndroid Build Coastguard Worker if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() { 2883*333d2b36SAndroid Build Coastguard Worker return false 2884*333d2b36SAndroid Build Coastguard Worker } 2885*333d2b36SAndroid Build Coastguard Worker 2886*333d2b36SAndroid Build Coastguard Worker // These dependencies are not excercised at runtime. Tracking these will give us 2887*333d2b36SAndroid Build Coastguard Worker // false negative, so skip. 2888*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(child) 2889*333d2b36SAndroid Build Coastguard Worker if IsHeaderDepTag(depTag) { 2890*333d2b36SAndroid Build Coastguard Worker return false 2891*333d2b36SAndroid Build Coastguard Worker } 2892*333d2b36SAndroid Build Coastguard Worker if depTag == staticVariantTag { 2893*333d2b36SAndroid Build Coastguard Worker return false 2894*333d2b36SAndroid Build Coastguard Worker } 2895*333d2b36SAndroid Build Coastguard Worker if depTag == stubImplDepTag { 2896*333d2b36SAndroid Build Coastguard Worker return false 2897*333d2b36SAndroid Build Coastguard Worker } 2898*333d2b36SAndroid Build Coastguard Worker if depTag == android.RequiredDepTag { 2899*333d2b36SAndroid Build Coastguard Worker return false 2900*333d2b36SAndroid Build Coastguard Worker } 2901*333d2b36SAndroid Build Coastguard Worker 2902*333d2b36SAndroid Build Coastguard Worker // Even if target lib has no vendor variant, keep checking dependency 2903*333d2b36SAndroid Build Coastguard Worker // graph in case it depends on vendor_available or product_available 2904*333d2b36SAndroid Build Coastguard Worker // but not double_loadable transtively. 2905*333d2b36SAndroid Build Coastguard Worker if !to.HasNonSystemVariants() { 2906*333d2b36SAndroid Build Coastguard Worker return true 2907*333d2b36SAndroid Build Coastguard Worker } 2908*333d2b36SAndroid Build Coastguard Worker 2909*333d2b36SAndroid Build Coastguard Worker // The happy path. Keep tracking dependencies until we hit a non double-loadable 2910*333d2b36SAndroid Build Coastguard Worker // one. 2911*333d2b36SAndroid Build Coastguard Worker if Bool(to.VendorProperties.Double_loadable) { 2912*333d2b36SAndroid Build Coastguard Worker return true 2913*333d2b36SAndroid Build Coastguard Worker } 2914*333d2b36SAndroid Build Coastguard Worker 2915*333d2b36SAndroid Build Coastguard Worker if to.IsLlndk() { 2916*333d2b36SAndroid Build Coastguard Worker return false 2917*333d2b36SAndroid Build Coastguard Worker } 2918*333d2b36SAndroid Build Coastguard Worker 2919*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+ 2920*333d2b36SAndroid Build Coastguard Worker "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+ 2921*333d2b36SAndroid Build Coastguard Worker "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false)) 2922*333d2b36SAndroid Build Coastguard Worker return false 2923*333d2b36SAndroid Build Coastguard Worker } 2924*333d2b36SAndroid Build Coastguard Worker if module, ok := ctx.Module().(*Module); ok { 2925*333d2b36SAndroid Build Coastguard Worker if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() { 2926*333d2b36SAndroid Build Coastguard Worker if lib.hasLLNDKStubs() { 2927*333d2b36SAndroid Build Coastguard Worker ctx.WalkDeps(check) 2928*333d2b36SAndroid Build Coastguard Worker } 2929*333d2b36SAndroid Build Coastguard Worker } 2930*333d2b36SAndroid Build Coastguard Worker } 2931*333d2b36SAndroid Build Coastguard Worker} 2932*333d2b36SAndroid Build Coastguard Worker 2933*333d2b36SAndroid Build Coastguard Workerfunc findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel { 2934*333d2b36SAndroid Build Coastguard Worker // For the dependency from platform to apex, use the latest stubs 2935*333d2b36SAndroid Build Coastguard Worker apexSdkVersion := android.FutureApiLevel 2936*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 2937*333d2b36SAndroid Build Coastguard Worker apexSdkVersion = apexInfo.MinSdkVersion 2938*333d2b36SAndroid Build Coastguard Worker } 2939*333d2b36SAndroid Build Coastguard Worker 2940*333d2b36SAndroid Build Coastguard Worker if android.InList("hwaddress", ctx.Config().SanitizeDevice()) { 2941*333d2b36SAndroid Build Coastguard Worker // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000) 2942*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+)). 2943*333d2b36SAndroid Build Coastguard Worker // (b/144430859) 2944*333d2b36SAndroid Build Coastguard Worker apexSdkVersion = android.FutureApiLevel 2945*333d2b36SAndroid Build Coastguard Worker } 2946*333d2b36SAndroid Build Coastguard Worker 2947*333d2b36SAndroid Build Coastguard Worker return apexSdkVersion 2948*333d2b36SAndroid Build Coastguard Worker} 2949*333d2b36SAndroid Build Coastguard Worker 2950*333d2b36SAndroid Build Coastguard Worker// Convert dependencies to paths. Returns a PathDeps containing paths 2951*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { 2952*333d2b36SAndroid Build Coastguard Worker var depPaths PathDeps 2953*333d2b36SAndroid Build Coastguard Worker 2954*333d2b36SAndroid Build Coastguard Worker var directStaticDeps []StaticLibraryInfo 2955*333d2b36SAndroid Build Coastguard Worker var directSharedDeps []SharedLibraryInfo 2956*333d2b36SAndroid Build Coastguard Worker 2957*333d2b36SAndroid Build Coastguard Worker reexportExporter := func(exporter FlagExporterInfo) { 2958*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...) 2959*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...) 2960*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...) 2961*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...) 2962*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...) 2963*333d2b36SAndroid Build Coastguard Worker } 2964*333d2b36SAndroid Build Coastguard Worker 2965*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 2966*333d2b36SAndroid Build Coastguard Worker c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo) 2967*333d2b36SAndroid Build Coastguard Worker 2968*333d2b36SAndroid Build Coastguard Worker skipModuleList := map[string]bool{} 2969*333d2b36SAndroid Build Coastguard Worker 2970*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(dep android.Module) { 2971*333d2b36SAndroid Build Coastguard Worker depName := ctx.OtherModuleName(dep) 2972*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 2973*333d2b36SAndroid Build Coastguard Worker 2974*333d2b36SAndroid Build Coastguard Worker if _, ok := skipModuleList[depName]; ok { 2975*333d2b36SAndroid Build Coastguard Worker // skip this module because original module or API imported module matching with this should be used instead. 2976*333d2b36SAndroid Build Coastguard Worker return 2977*333d2b36SAndroid Build Coastguard Worker } 2978*333d2b36SAndroid Build Coastguard Worker 2979*333d2b36SAndroid Build Coastguard Worker if depTag == android.DarwinUniversalVariantTag { 2980*333d2b36SAndroid Build Coastguard Worker depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile() 2981*333d2b36SAndroid Build Coastguard Worker return 2982*333d2b36SAndroid Build Coastguard Worker } 2983*333d2b36SAndroid Build Coastguard Worker 2984*333d2b36SAndroid Build Coastguard Worker if depTag == aidlLibraryTag { 2985*333d2b36SAndroid Build Coastguard Worker if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok { 2986*333d2b36SAndroid Build Coastguard Worker depPaths.AidlLibraryInfos = append( 2987*333d2b36SAndroid Build Coastguard Worker depPaths.AidlLibraryInfos, 2988*333d2b36SAndroid Build Coastguard Worker aidlLibraryInfo, 2989*333d2b36SAndroid Build Coastguard Worker ) 2990*333d2b36SAndroid Build Coastguard Worker } 2991*333d2b36SAndroid Build Coastguard Worker } 2992*333d2b36SAndroid Build Coastguard Worker 2993*333d2b36SAndroid Build Coastguard Worker ccDep, ok := dep.(LinkableInterface) 2994*333d2b36SAndroid Build Coastguard Worker if !ok { 2995*333d2b36SAndroid Build Coastguard Worker 2996*333d2b36SAndroid Build Coastguard Worker // handling for a few module types that aren't cc Module but that are also supported 2997*333d2b36SAndroid Build Coastguard Worker switch depTag { 2998*333d2b36SAndroid Build Coastguard Worker case genSourceDepTag: 2999*333d2b36SAndroid Build Coastguard Worker if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 3000*333d2b36SAndroid Build Coastguard Worker depPaths.GeneratedSources = append(depPaths.GeneratedSources, 3001*333d2b36SAndroid Build Coastguard Worker genRule.GeneratedSourceFiles()...) 3002*333d2b36SAndroid Build Coastguard Worker } else { 3003*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName) 3004*333d2b36SAndroid Build Coastguard Worker } 3005*333d2b36SAndroid Build Coastguard Worker // Support exported headers from a generated_sources dependency 3006*333d2b36SAndroid Build Coastguard Worker fallthrough 3007*333d2b36SAndroid Build Coastguard Worker case genHeaderDepTag, genHeaderExportDepTag: 3008*333d2b36SAndroid Build Coastguard Worker if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 3009*333d2b36SAndroid Build Coastguard Worker depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, 3010*333d2b36SAndroid Build Coastguard Worker genRule.GeneratedDeps()...) 3011*333d2b36SAndroid Build Coastguard Worker dirs := genRule.GeneratedHeaderDirs() 3012*333d2b36SAndroid Build Coastguard Worker depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...) 3013*333d2b36SAndroid Build Coastguard Worker if depTag == genHeaderExportDepTag { 3014*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...) 3015*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, 3016*333d2b36SAndroid Build Coastguard Worker genRule.GeneratedSourceFiles()...) 3017*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...) 3018*333d2b36SAndroid Build Coastguard Worker // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. 3019*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...) 3020*333d2b36SAndroid Build Coastguard Worker 3021*333d2b36SAndroid Build Coastguard Worker } 3022*333d2b36SAndroid Build Coastguard Worker } else { 3023*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q is not a genrule", depName) 3024*333d2b36SAndroid Build Coastguard Worker } 3025*333d2b36SAndroid Build Coastguard Worker case CrtBeginDepTag: 3026*333d2b36SAndroid Build Coastguard Worker depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, "")) 3027*333d2b36SAndroid Build Coastguard Worker case CrtEndDepTag: 3028*333d2b36SAndroid Build Coastguard Worker depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, "")) 3029*333d2b36SAndroid Build Coastguard Worker } 3030*333d2b36SAndroid Build Coastguard Worker return 3031*333d2b36SAndroid Build Coastguard Worker } 3032*333d2b36SAndroid Build Coastguard Worker 3033*333d2b36SAndroid Build Coastguard Worker if depTag == android.ProtoPluginDepTag { 3034*333d2b36SAndroid Build Coastguard Worker return 3035*333d2b36SAndroid Build Coastguard Worker } 3036*333d2b36SAndroid Build Coastguard Worker 3037*333d2b36SAndroid Build Coastguard Worker if depTag == android.RequiredDepTag { 3038*333d2b36SAndroid Build Coastguard Worker return 3039*333d2b36SAndroid Build Coastguard Worker } 3040*333d2b36SAndroid Build Coastguard Worker 3041*333d2b36SAndroid Build Coastguard Worker if dep.Target().Os != ctx.Os() { 3042*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("OS mismatch between %q (%s) and %q (%s)", ctx.ModuleName(), ctx.Os().Name, depName, dep.Target().Os.Name) 3043*333d2b36SAndroid Build Coastguard Worker return 3044*333d2b36SAndroid Build Coastguard Worker } 3045*333d2b36SAndroid Build Coastguard Worker if dep.Target().Arch.ArchType != ctx.Arch().ArchType { 3046*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)", 3047*333d2b36SAndroid Build Coastguard Worker ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType) 3048*333d2b36SAndroid Build Coastguard Worker return 3049*333d2b36SAndroid Build Coastguard Worker } 3050*333d2b36SAndroid Build Coastguard Worker 3051*333d2b36SAndroid Build Coastguard Worker if depTag == reuseObjTag { 3052*333d2b36SAndroid Build Coastguard Worker // Skip reused objects for stub libraries, they use their own stub object file instead. 3053*333d2b36SAndroid Build Coastguard Worker // The reuseObjTag dependency still exists because the LinkageMutator runs before the 3054*333d2b36SAndroid Build Coastguard Worker // version mutator, so the stubs variant is created from the shared variant that 3055*333d2b36SAndroid Build Coastguard Worker // already has the reuseObjTag dependency on the static variant. 3056*333d2b36SAndroid Build Coastguard Worker if !c.library.buildStubs() { 3057*333d2b36SAndroid Build Coastguard Worker staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider) 3058*333d2b36SAndroid Build Coastguard Worker objs := staticAnalogue.ReuseObjects 3059*333d2b36SAndroid Build Coastguard Worker depPaths.Objs = depPaths.Objs.Append(objs) 3060*333d2b36SAndroid Build Coastguard Worker depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) 3061*333d2b36SAndroid Build Coastguard Worker reexportExporter(depExporterInfo) 3062*333d2b36SAndroid Build Coastguard Worker } 3063*333d2b36SAndroid Build Coastguard Worker return 3064*333d2b36SAndroid Build Coastguard Worker } 3065*333d2b36SAndroid Build Coastguard Worker 3066*333d2b36SAndroid Build Coastguard Worker if depTag == llndkHeaderLibTag { 3067*333d2b36SAndroid Build Coastguard Worker depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) 3068*333d2b36SAndroid Build Coastguard Worker depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...) 3069*333d2b36SAndroid Build Coastguard Worker depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...) 3070*333d2b36SAndroid Build Coastguard Worker } 3071*333d2b36SAndroid Build Coastguard Worker 3072*333d2b36SAndroid Build Coastguard Worker linkFile := ccDep.OutputFile() 3073*333d2b36SAndroid Build Coastguard Worker 3074*333d2b36SAndroid Build Coastguard Worker if libDepTag, ok := depTag.(libraryDependencyTag); ok { 3075*333d2b36SAndroid Build Coastguard Worker // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859) 3076*333d2b36SAndroid Build Coastguard Worker if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) { 3077*333d2b36SAndroid Build Coastguard Worker return 3078*333d2b36SAndroid Build Coastguard Worker } 3079*333d2b36SAndroid Build Coastguard Worker 3080*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() && libDepTag.excludeInApex { 3081*333d2b36SAndroid Build Coastguard Worker return 3082*333d2b36SAndroid Build Coastguard Worker } 3083*333d2b36SAndroid Build Coastguard Worker if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex { 3084*333d2b36SAndroid Build Coastguard Worker return 3085*333d2b36SAndroid Build Coastguard Worker } 3086*333d2b36SAndroid Build Coastguard Worker 3087*333d2b36SAndroid Build Coastguard Worker depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) 3088*333d2b36SAndroid Build Coastguard Worker 3089*333d2b36SAndroid Build Coastguard Worker var ptr *android.Paths 3090*333d2b36SAndroid Build Coastguard Worker var depPtr *android.Paths 3091*333d2b36SAndroid Build Coastguard Worker 3092*333d2b36SAndroid Build Coastguard Worker depFile := android.OptionalPath{} 3093*333d2b36SAndroid Build Coastguard Worker 3094*333d2b36SAndroid Build Coastguard Worker switch { 3095*333d2b36SAndroid Build Coastguard Worker case libDepTag.header(): 3096*333d2b36SAndroid Build Coastguard Worker if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib { 3097*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AllowMissingDependencies() { 3098*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q is not a header library", depName) 3099*333d2b36SAndroid Build Coastguard Worker } else { 3100*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{depName}) 3101*333d2b36SAndroid Build Coastguard Worker } 3102*333d2b36SAndroid Build Coastguard Worker return 3103*333d2b36SAndroid Build Coastguard Worker } 3104*333d2b36SAndroid Build Coastguard Worker case libDepTag.shared(): 3105*333d2b36SAndroid Build Coastguard Worker if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib { 3106*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AllowMissingDependencies() { 3107*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q is not a shared library", depName) 3108*333d2b36SAndroid Build Coastguard Worker } else { 3109*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{depName}) 3110*333d2b36SAndroid Build Coastguard Worker } 3111*333d2b36SAndroid Build Coastguard Worker return 3112*333d2b36SAndroid Build Coastguard Worker } 3113*333d2b36SAndroid Build Coastguard Worker 3114*333d2b36SAndroid Build Coastguard Worker sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep) 3115*333d2b36SAndroid Build Coastguard Worker depExporterInfo = returnedDepExporterInfo 3116*333d2b36SAndroid Build Coastguard Worker 3117*333d2b36SAndroid Build Coastguard Worker // Stubs lib doesn't link to the shared lib dependencies. Don't set 3118*333d2b36SAndroid Build Coastguard Worker // linkFile, depFile, and ptr. 3119*333d2b36SAndroid Build Coastguard Worker if c.IsStubs() { 3120*333d2b36SAndroid Build Coastguard Worker break 3121*333d2b36SAndroid Build Coastguard Worker } 3122*333d2b36SAndroid Build Coastguard Worker 3123*333d2b36SAndroid Build Coastguard Worker linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary) 3124*333d2b36SAndroid Build Coastguard Worker depFile = sharedLibraryInfo.TableOfContents 3125*333d2b36SAndroid Build Coastguard Worker 3126*333d2b36SAndroid Build Coastguard Worker if !sharedLibraryInfo.IsStubs { 3127*333d2b36SAndroid Build Coastguard Worker depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, "")) 3128*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok { 3129*333d2b36SAndroid Build Coastguard Worker depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) 3130*333d2b36SAndroid Build Coastguard Worker } 3131*333d2b36SAndroid Build Coastguard Worker } 3132*333d2b36SAndroid Build Coastguard Worker 3133*333d2b36SAndroid Build Coastguard Worker ptr = &depPaths.SharedLibs 3134*333d2b36SAndroid Build Coastguard Worker switch libDepTag.Order { 3135*333d2b36SAndroid Build Coastguard Worker case earlyLibraryDependency: 3136*333d2b36SAndroid Build Coastguard Worker ptr = &depPaths.EarlySharedLibs 3137*333d2b36SAndroid Build Coastguard Worker depPtr = &depPaths.EarlySharedLibsDeps 3138*333d2b36SAndroid Build Coastguard Worker case normalLibraryDependency: 3139*333d2b36SAndroid Build Coastguard Worker ptr = &depPaths.SharedLibs 3140*333d2b36SAndroid Build Coastguard Worker depPtr = &depPaths.SharedLibsDeps 3141*333d2b36SAndroid Build Coastguard Worker directSharedDeps = append(directSharedDeps, sharedLibraryInfo) 3142*333d2b36SAndroid Build Coastguard Worker case lateLibraryDependency: 3143*333d2b36SAndroid Build Coastguard Worker ptr = &depPaths.LateSharedLibs 3144*333d2b36SAndroid Build Coastguard Worker depPtr = &depPaths.LateSharedLibsDeps 3145*333d2b36SAndroid Build Coastguard Worker default: 3146*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order)) 3147*333d2b36SAndroid Build Coastguard Worker } 3148*333d2b36SAndroid Build Coastguard Worker 3149*333d2b36SAndroid Build Coastguard Worker case libDepTag.static(): 3150*333d2b36SAndroid Build Coastguard Worker if ccDep.RustLibraryInterface() { 3151*333d2b36SAndroid Build Coastguard Worker rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()} 3152*333d2b36SAndroid Build Coastguard Worker depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep) 3153*333d2b36SAndroid Build Coastguard Worker depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...) 3154*333d2b36SAndroid Build Coastguard Worker if libDepTag.wholeStatic { 3155*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...) 3156*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep) 3157*333d2b36SAndroid Build Coastguard Worker 3158*333d2b36SAndroid Build Coastguard Worker // If whole_static, track this as we want to make sure that in a final linkage for a shared library, 3159*333d2b36SAndroid Build Coastguard Worker // exported functions from the rust generated staticlib still exported. 3160*333d2b36SAndroid Build Coastguard Worker if c.CcLibrary() && c.Shared() { 3161*333d2b36SAndroid Build Coastguard Worker c.WholeRustStaticlib = true 3162*333d2b36SAndroid Build Coastguard Worker } 3163*333d2b36SAndroid Build Coastguard Worker } 3164*333d2b36SAndroid Build Coastguard Worker 3165*333d2b36SAndroid Build Coastguard Worker } else { 3166*333d2b36SAndroid Build Coastguard Worker staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider) 3167*333d2b36SAndroid Build Coastguard Worker if !isStaticLib { 3168*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AllowMissingDependencies() { 3169*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q is not a static library", depName) 3170*333d2b36SAndroid Build Coastguard Worker } else { 3171*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{depName}) 3172*333d2b36SAndroid Build Coastguard Worker } 3173*333d2b36SAndroid Build Coastguard Worker return 3174*333d2b36SAndroid Build Coastguard Worker } 3175*333d2b36SAndroid Build Coastguard Worker 3176*333d2b36SAndroid Build Coastguard Worker // Stubs lib doesn't link to the static lib dependencies. Don't set 3177*333d2b36SAndroid Build Coastguard Worker // linkFile, depFile, and ptr. 3178*333d2b36SAndroid Build Coastguard Worker if c.IsStubs() { 3179*333d2b36SAndroid Build Coastguard Worker break 3180*333d2b36SAndroid Build Coastguard Worker } 3181*333d2b36SAndroid Build Coastguard Worker 3182*333d2b36SAndroid Build Coastguard Worker linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary) 3183*333d2b36SAndroid Build Coastguard Worker if libDepTag.wholeStatic { 3184*333d2b36SAndroid Build Coastguard Worker ptr = &depPaths.WholeStaticLibs 3185*333d2b36SAndroid Build Coastguard Worker if len(staticLibraryInfo.Objects.objFiles) > 0 { 3186*333d2b36SAndroid Build Coastguard Worker depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects) 3187*333d2b36SAndroid Build Coastguard Worker } else { 3188*333d2b36SAndroid Build Coastguard Worker // This case normally catches prebuilt static 3189*333d2b36SAndroid Build Coastguard Worker // libraries, but it can also occur when 3190*333d2b36SAndroid Build Coastguard Worker // AllowMissingDependencies is on and the 3191*333d2b36SAndroid Build Coastguard Worker // dependencies has no sources of its own 3192*333d2b36SAndroid Build Coastguard Worker // but has a whole_static_libs dependency 3193*333d2b36SAndroid Build Coastguard Worker // on a missing library. We want to depend 3194*333d2b36SAndroid Build Coastguard Worker // on the .a file so that there is something 3195*333d2b36SAndroid Build Coastguard Worker // in the dependency tree that contains the 3196*333d2b36SAndroid Build Coastguard Worker // error rule for the missing transitive 3197*333d2b36SAndroid Build Coastguard Worker // dependency. 3198*333d2b36SAndroid Build Coastguard Worker depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path()) 3199*333d2b36SAndroid Build Coastguard Worker } 3200*333d2b36SAndroid Build Coastguard Worker depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, 3201*333d2b36SAndroid Build Coastguard Worker staticLibraryInfo.WholeStaticLibsFromPrebuilts...) 3202*333d2b36SAndroid Build Coastguard Worker } else { 3203*333d2b36SAndroid Build Coastguard Worker switch libDepTag.Order { 3204*333d2b36SAndroid Build Coastguard Worker case earlyLibraryDependency: 3205*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("early static libs not supported")) 3206*333d2b36SAndroid Build Coastguard Worker case normalLibraryDependency: 3207*333d2b36SAndroid Build Coastguard Worker // static dependencies will be handled separately so they can be ordered 3208*333d2b36SAndroid Build Coastguard Worker // using transitive dependencies. 3209*333d2b36SAndroid Build Coastguard Worker ptr = nil 3210*333d2b36SAndroid Build Coastguard Worker directStaticDeps = append(directStaticDeps, staticLibraryInfo) 3211*333d2b36SAndroid Build Coastguard Worker case lateLibraryDependency: 3212*333d2b36SAndroid Build Coastguard Worker ptr = &depPaths.LateStaticLibs 3213*333d2b36SAndroid Build Coastguard Worker default: 3214*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order)) 3215*333d2b36SAndroid Build Coastguard Worker } 3216*333d2b36SAndroid Build Coastguard Worker } 3217*333d2b36SAndroid Build Coastguard Worker 3218*333d2b36SAndroid Build Coastguard Worker // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs 3219*333d2b36SAndroid Build Coastguard Worker depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...) 3220*333d2b36SAndroid Build Coastguard Worker 3221*333d2b36SAndroid Build Coastguard Worker if libDepTag.unexportedSymbols { 3222*333d2b36SAndroid Build Coastguard Worker depPaths.LdFlags = append(depPaths.LdFlags, 3223*333d2b36SAndroid Build Coastguard Worker "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base()) 3224*333d2b36SAndroid Build Coastguard Worker } 3225*333d2b36SAndroid Build Coastguard Worker } 3226*333d2b36SAndroid Build Coastguard Worker } 3227*333d2b36SAndroid Build Coastguard Worker 3228*333d2b36SAndroid Build Coastguard Worker if libDepTag.static() && !libDepTag.wholeStatic && !ccDep.RustLibraryInterface() { 3229*333d2b36SAndroid Build Coastguard Worker if !ccDep.CcLibraryInterface() || !ccDep.Static() { 3230*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q not a static library", depName) 3231*333d2b36SAndroid Build Coastguard Worker return 3232*333d2b36SAndroid Build Coastguard Worker } 3233*333d2b36SAndroid Build Coastguard Worker 3234*333d2b36SAndroid Build Coastguard Worker // When combining coverage files for shared libraries and executables, coverage files 3235*333d2b36SAndroid Build Coastguard Worker // in static libraries act as if they were whole static libraries. The same goes for 3236*333d2b36SAndroid Build Coastguard Worker // source based Abi dump files. 3237*333d2b36SAndroid Build Coastguard Worker if c, ok := ccDep.(*Module); ok { 3238*333d2b36SAndroid Build Coastguard Worker staticLib := c.linker.(libraryInterface) 3239*333d2b36SAndroid Build Coastguard Worker depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, 3240*333d2b36SAndroid Build Coastguard Worker staticLib.objs().coverageFiles...) 3241*333d2b36SAndroid Build Coastguard Worker depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles, 3242*333d2b36SAndroid Build Coastguard Worker staticLib.objs().sAbiDumpFiles...) 3243*333d2b36SAndroid Build Coastguard Worker } else { 3244*333d2b36SAndroid Build Coastguard Worker // Handle non-CC modules here 3245*333d2b36SAndroid Build Coastguard Worker depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, 3246*333d2b36SAndroid Build Coastguard Worker ccDep.CoverageFiles()...) 3247*333d2b36SAndroid Build Coastguard Worker } 3248*333d2b36SAndroid Build Coastguard Worker } 3249*333d2b36SAndroid Build Coastguard Worker 3250*333d2b36SAndroid Build Coastguard Worker if ptr != nil { 3251*333d2b36SAndroid Build Coastguard Worker if !linkFile.Valid() { 3252*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AllowMissingDependencies() { 3253*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q missing output file", depName) 3254*333d2b36SAndroid Build Coastguard Worker } else { 3255*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{depName}) 3256*333d2b36SAndroid Build Coastguard Worker } 3257*333d2b36SAndroid Build Coastguard Worker return 3258*333d2b36SAndroid Build Coastguard Worker } 3259*333d2b36SAndroid Build Coastguard Worker *ptr = append(*ptr, linkFile.Path()) 3260*333d2b36SAndroid Build Coastguard Worker } 3261*333d2b36SAndroid Build Coastguard Worker 3262*333d2b36SAndroid Build Coastguard Worker if depPtr != nil { 3263*333d2b36SAndroid Build Coastguard Worker dep := depFile 3264*333d2b36SAndroid Build Coastguard Worker if !dep.Valid() { 3265*333d2b36SAndroid Build Coastguard Worker dep = linkFile 3266*333d2b36SAndroid Build Coastguard Worker } 3267*333d2b36SAndroid Build Coastguard Worker *depPtr = append(*depPtr, dep.Path()) 3268*333d2b36SAndroid Build Coastguard Worker } 3269*333d2b36SAndroid Build Coastguard Worker 3270*333d2b36SAndroid Build Coastguard Worker depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...) 3271*333d2b36SAndroid Build Coastguard Worker depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...) 3272*333d2b36SAndroid Build Coastguard Worker depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...) 3273*333d2b36SAndroid Build Coastguard Worker depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...) 3274*333d2b36SAndroid Build Coastguard Worker depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...) 3275*333d2b36SAndroid Build Coastguard Worker 3276*333d2b36SAndroid Build Coastguard Worker // Only re-export RustRlibDeps for cc static libs 3277*333d2b36SAndroid Build Coastguard Worker if c.static() { 3278*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...) 3279*333d2b36SAndroid Build Coastguard Worker } 3280*333d2b36SAndroid Build Coastguard Worker 3281*333d2b36SAndroid Build Coastguard Worker if libDepTag.reexportFlags { 3282*333d2b36SAndroid Build Coastguard Worker reexportExporter(depExporterInfo) 3283*333d2b36SAndroid Build Coastguard Worker // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. 3284*333d2b36SAndroid Build Coastguard Worker // Re-exported shared library headers must be included as well since they can help us with type information 3285*333d2b36SAndroid Build Coastguard Worker // about template instantiations (instantiated from their headers). 3286*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedIncludes = append( 3287*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...) 3288*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedSystemIncludes = append( 3289*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...) 3290*333d2b36SAndroid Build Coastguard Worker } 3291*333d2b36SAndroid Build Coastguard Worker 3292*333d2b36SAndroid Build Coastguard Worker makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix 3293*333d2b36SAndroid Build Coastguard Worker switch { 3294*333d2b36SAndroid Build Coastguard Worker case libDepTag.header(): 3295*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkHeaderLibs = append( 3296*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkHeaderLibs, makeLibName) 3297*333d2b36SAndroid Build Coastguard Worker case libDepTag.shared(): 3298*333d2b36SAndroid Build Coastguard Worker // Note: the order of libs in this list is not important because 3299*333d2b36SAndroid Build Coastguard Worker // they merely serve as Make dependencies and do not affect this lib itself. 3300*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkSharedLibs = append( 3301*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkSharedLibs, makeLibName) 3302*333d2b36SAndroid Build Coastguard Worker case libDepTag.static(): 3303*333d2b36SAndroid Build Coastguard Worker if !ccDep.RustLibraryInterface() { 3304*333d2b36SAndroid Build Coastguard Worker if libDepTag.wholeStatic { 3305*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkWholeStaticLibs = append( 3306*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkWholeStaticLibs, makeLibName) 3307*333d2b36SAndroid Build Coastguard Worker } else { 3308*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkStaticLibs = append( 3309*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkStaticLibs, makeLibName) 3310*333d2b36SAndroid Build Coastguard Worker } 3311*333d2b36SAndroid Build Coastguard Worker } 3312*333d2b36SAndroid Build Coastguard Worker } 3313*333d2b36SAndroid Build Coastguard Worker } else if !c.IsStubs() { 3314*333d2b36SAndroid Build Coastguard Worker // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies. 3315*333d2b36SAndroid Build Coastguard Worker 3316*333d2b36SAndroid Build Coastguard Worker switch depTag { 3317*333d2b36SAndroid Build Coastguard Worker case runtimeDepTag: 3318*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkRuntimeLibs = append( 3319*333d2b36SAndroid Build Coastguard Worker c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix) 3320*333d2b36SAndroid Build Coastguard Worker case objDepTag: 3321*333d2b36SAndroid Build Coastguard Worker depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path()) 3322*333d2b36SAndroid Build Coastguard Worker case CrtBeginDepTag: 3323*333d2b36SAndroid Build Coastguard Worker depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path()) 3324*333d2b36SAndroid Build Coastguard Worker case CrtEndDepTag: 3325*333d2b36SAndroid Build Coastguard Worker depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path()) 3326*333d2b36SAndroid Build Coastguard Worker case dynamicLinkerDepTag: 3327*333d2b36SAndroid Build Coastguard Worker depPaths.DynamicLinker = linkFile 3328*333d2b36SAndroid Build Coastguard Worker } 3329*333d2b36SAndroid Build Coastguard Worker } 3330*333d2b36SAndroid Build Coastguard Worker }) 3331*333d2b36SAndroid Build Coastguard Worker 3332*333d2b36SAndroid Build Coastguard Worker // use the ordered dependencies as this module's dependencies 3333*333d2b36SAndroid Build Coastguard Worker orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps) 3334*333d2b36SAndroid Build Coastguard Worker depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs 3335*333d2b36SAndroid Build Coastguard Worker depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...) 3336*333d2b36SAndroid Build Coastguard Worker 3337*333d2b36SAndroid Build Coastguard Worker // Dedup exported flags from dependencies 3338*333d2b36SAndroid Build Coastguard Worker depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags) 3339*333d2b36SAndroid Build Coastguard Worker depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs) 3340*333d2b36SAndroid Build Coastguard Worker depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs) 3341*333d2b36SAndroid Build Coastguard Worker depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps) 3342*333d2b36SAndroid Build Coastguard Worker depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps) 3343*333d2b36SAndroid Build Coastguard Worker 3344*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs) 3345*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs) 3346*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags) 3347*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps) 3348*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders) 3349*333d2b36SAndroid Build Coastguard Worker depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps) 3350*333d2b36SAndroid Build Coastguard Worker 3351*333d2b36SAndroid Build Coastguard Worker if c.sabi != nil { 3352*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes) 3353*333d2b36SAndroid Build Coastguard Worker c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes) 3354*333d2b36SAndroid Build Coastguard Worker } 3355*333d2b36SAndroid Build Coastguard Worker 3356*333d2b36SAndroid Build Coastguard Worker return depPaths 3357*333d2b36SAndroid Build Coastguard Worker} 3358*333d2b36SAndroid Build Coastguard Worker 3359*333d2b36SAndroid Build Coastguard Workerfunc ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool { 3360*333d2b36SAndroid Build Coastguard Worker inVendorOrProduct := false 3361*333d2b36SAndroid Build Coastguard Worker bootstrap := false 3362*333d2b36SAndroid Build Coastguard Worker if linkable, ok := parent.(LinkableInterface); !ok { 3363*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName()) 3364*333d2b36SAndroid Build Coastguard Worker } else { 3365*333d2b36SAndroid Build Coastguard Worker inVendorOrProduct = linkable.InVendorOrProduct() 3366*333d2b36SAndroid Build Coastguard Worker bootstrap = linkable.Bootstrap() 3367*333d2b36SAndroid Build Coastguard Worker } 3368*333d2b36SAndroid Build Coastguard Worker 3369*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider) 3370*333d2b36SAndroid Build Coastguard Worker 3371*333d2b36SAndroid Build Coastguard Worker useStubs := false 3372*333d2b36SAndroid Build Coastguard Worker 3373*333d2b36SAndroid Build Coastguard Worker if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK 3374*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 3375*333d2b36SAndroid Build Coastguard Worker // For platform libraries, use current version of LLNDK 3376*333d2b36SAndroid Build Coastguard Worker // If this is for use_vendor apex we will apply the same rules 3377*333d2b36SAndroid Build Coastguard Worker // of apex sdk enforcement below to choose right version. 3378*333d2b36SAndroid Build Coastguard Worker useStubs = true 3379*333d2b36SAndroid Build Coastguard Worker } 3380*333d2b36SAndroid Build Coastguard Worker } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis { 3381*333d2b36SAndroid Build Coastguard Worker // If not building for APEX or the containing APEX allows the use of 3382*333d2b36SAndroid Build Coastguard Worker // platform APIs, use stubs only when it is from an APEX (and not from 3383*333d2b36SAndroid Build Coastguard Worker // platform) However, for host, ramdisk, vendor_ramdisk, recovery or 3384*333d2b36SAndroid Build Coastguard Worker // bootstrap modules, always link to non-stub variant 3385*333d2b36SAndroid Build Coastguard Worker isNotInPlatform := dep.(android.ApexModule).NotInPlatform() 3386*333d2b36SAndroid Build Coastguard Worker 3387*333d2b36SAndroid Build Coastguard Worker useStubs = isNotInPlatform && !bootstrap 3388*333d2b36SAndroid Build Coastguard Worker } else { 3389*333d2b36SAndroid Build Coastguard Worker // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl) 3390*333d2b36SAndroid Build Coastguard Worker useStubs = true 3391*333d2b36SAndroid Build Coastguard Worker } 3392*333d2b36SAndroid Build Coastguard Worker 3393*333d2b36SAndroid Build Coastguard Worker return useStubs 3394*333d2b36SAndroid Build Coastguard Worker} 3395*333d2b36SAndroid Build Coastguard Worker 3396*333d2b36SAndroid Build Coastguard Worker// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant 3397*333d2b36SAndroid Build Coastguard Worker// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right 3398*333d2b36SAndroid Build Coastguard Worker// dependency. The stub variant is selected when the dependency crosses a boundary where each side 3399*333d2b36SAndroid Build Coastguard Worker// has different level of updatability. For example, if a library foo in an APEX depends on a 3400*333d2b36SAndroid Build Coastguard Worker// library bar which provides stable interface and exists in the platform, foo uses the stub variant 3401*333d2b36SAndroid Build Coastguard Worker// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the 3402*333d2b36SAndroid Build Coastguard Worker// same APEX as foo, the non-stub variant of bar is used. 3403*333d2b36SAndroid Build Coastguard Workerfunc ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) { 3404*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 3405*333d2b36SAndroid Build Coastguard Worker libDepTag, ok := depTag.(libraryDependencyTag) 3406*333d2b36SAndroid Build Coastguard Worker if !ok || !libDepTag.shared() { 3407*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Unexpected dependency tag: %T", depTag)) 3408*333d2b36SAndroid Build Coastguard Worker } 3409*333d2b36SAndroid Build Coastguard Worker 3410*333d2b36SAndroid Build Coastguard Worker sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider) 3411*333d2b36SAndroid Build Coastguard Worker depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) 3412*333d2b36SAndroid Build Coastguard Worker sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider) 3413*333d2b36SAndroid Build Coastguard Worker 3414*333d2b36SAndroid Build Coastguard Worker if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 { 3415*333d2b36SAndroid Build Coastguard Worker // when to use (unspecified) stubs, use the latest one. 3416*333d2b36SAndroid Build Coastguard Worker if ShouldUseStubForApex(ctx, ctx.Module(), dep) { 3417*333d2b36SAndroid Build Coastguard Worker stubs := sharedLibraryStubsInfo.SharedStubLibraries 3418*333d2b36SAndroid Build Coastguard Worker toUse := stubs[len(stubs)-1] 3419*333d2b36SAndroid Build Coastguard Worker sharedLibraryInfo = toUse.SharedLibraryInfo 3420*333d2b36SAndroid Build Coastguard Worker depExporterInfo = toUse.FlagExporterInfo 3421*333d2b36SAndroid Build Coastguard Worker } 3422*333d2b36SAndroid Build Coastguard Worker } 3423*333d2b36SAndroid Build Coastguard Worker return sharedLibraryInfo, depExporterInfo 3424*333d2b36SAndroid Build Coastguard Worker} 3425*333d2b36SAndroid Build Coastguard Worker 3426*333d2b36SAndroid Build Coastguard Worker// orderStaticModuleDeps rearranges the order of the static library dependencies of the module 3427*333d2b36SAndroid Build Coastguard Worker// to match the topological order of the dependency tree, including any static analogues of 3428*333d2b36SAndroid Build Coastguard Worker// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet 3429*333d2b36SAndroid Build Coastguard Worker// of the transitive dependencies. 3430*333d2b36SAndroid Build Coastguard Workerfunc orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) { 3431*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL) 3432*333d2b36SAndroid Build Coastguard Worker var staticPaths android.Paths 3433*333d2b36SAndroid Build Coastguard Worker for _, staticDep := range staticDeps { 3434*333d2b36SAndroid Build Coastguard Worker staticPaths = append(staticPaths, staticDep.StaticLibrary) 3435*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering) 3436*333d2b36SAndroid Build Coastguard Worker } 3437*333d2b36SAndroid Build Coastguard Worker for _, sharedDep := range sharedDeps { 3438*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering) 3439*333d2b36SAndroid Build Coastguard Worker } 3440*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibs := transitiveStaticLibsBuilder.Build() 3441*333d2b36SAndroid Build Coastguard Worker 3442*333d2b36SAndroid Build Coastguard Worker orderedTransitiveStaticLibs := transitiveStaticLibs.ToList() 3443*333d2b36SAndroid Build Coastguard Worker 3444*333d2b36SAndroid Build Coastguard Worker // reorder the dependencies based on transitive dependencies 3445*333d2b36SAndroid Build Coastguard Worker staticPaths = android.FirstUniquePaths(staticPaths) 3446*333d2b36SAndroid Build Coastguard Worker _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths) 3447*333d2b36SAndroid Build Coastguard Worker 3448*333d2b36SAndroid Build Coastguard Worker if len(orderedStaticPaths) != len(staticPaths) { 3449*333d2b36SAndroid Build Coastguard Worker missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths) 3450*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths)) 3451*333d2b36SAndroid Build Coastguard Worker } 3452*333d2b36SAndroid Build Coastguard Worker 3453*333d2b36SAndroid Build Coastguard Worker return orderedStaticPaths, transitiveStaticLibs 3454*333d2b36SAndroid Build Coastguard Worker} 3455*333d2b36SAndroid Build Coastguard Worker 3456*333d2b36SAndroid Build Coastguard Worker// BaseLibName trims known prefixes and suffixes 3457*333d2b36SAndroid Build Coastguard Workerfunc BaseLibName(depName string) string { 3458*333d2b36SAndroid Build Coastguard Worker libName := strings.TrimSuffix(depName, llndkLibrarySuffix) 3459*333d2b36SAndroid Build Coastguard Worker libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix) 3460*333d2b36SAndroid Build Coastguard Worker libName = android.RemoveOptionalPrebuiltPrefix(libName) 3461*333d2b36SAndroid Build Coastguard Worker return libName 3462*333d2b36SAndroid Build Coastguard Worker} 3463*333d2b36SAndroid Build Coastguard Worker 3464*333d2b36SAndroid Build Coastguard Workerfunc MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string { 3465*333d2b36SAndroid Build Coastguard Worker libName := BaseLibName(depName) 3466*333d2b36SAndroid Build Coastguard Worker ccDepModule, _ := ccDep.(*Module) 3467*333d2b36SAndroid Build Coastguard Worker isLLndk := ccDepModule != nil && ccDepModule.IsLlndk() 3468*333d2b36SAndroid Build Coastguard Worker nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk 3469*333d2b36SAndroid Build Coastguard Worker 3470*333d2b36SAndroid Build Coastguard Worker if ccDepModule != nil { 3471*333d2b36SAndroid Build Coastguard Worker // Use base module name for snapshots when exporting to Makefile. 3472*333d2b36SAndroid Build Coastguard Worker if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok { 3473*333d2b36SAndroid Build Coastguard Worker baseName := ccDepModule.BaseModuleName() 3474*333d2b36SAndroid Build Coastguard Worker 3475*333d2b36SAndroid Build Coastguard Worker return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() 3476*333d2b36SAndroid Build Coastguard Worker } 3477*333d2b36SAndroid Build Coastguard Worker } 3478*333d2b36SAndroid Build Coastguard Worker 3479*333d2b36SAndroid Build Coastguard Worker if ccDep.InVendorOrProduct() && nonSystemVariantsExist { 3480*333d2b36SAndroid Build Coastguard Worker // The vendor and product modules in Make will have been renamed to not conflict with the 3481*333d2b36SAndroid Build Coastguard Worker // core module, so update the dependency name here accordingly. 3482*333d2b36SAndroid Build Coastguard Worker return libName + ccDep.SubName() 3483*333d2b36SAndroid Build Coastguard Worker } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() { 3484*333d2b36SAndroid Build Coastguard Worker return libName + RamdiskSuffix 3485*333d2b36SAndroid Build Coastguard Worker } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() { 3486*333d2b36SAndroid Build Coastguard Worker return libName + VendorRamdiskSuffix 3487*333d2b36SAndroid Build Coastguard Worker } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() { 3488*333d2b36SAndroid Build Coastguard Worker return libName + RecoverySuffix 3489*333d2b36SAndroid Build Coastguard Worker } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled { 3490*333d2b36SAndroid Build Coastguard Worker return libName + NativeBridgeSuffix 3491*333d2b36SAndroid Build Coastguard Worker } else { 3492*333d2b36SAndroid Build Coastguard Worker return libName 3493*333d2b36SAndroid Build Coastguard Worker } 3494*333d2b36SAndroid Build Coastguard Worker} 3495*333d2b36SAndroid Build Coastguard Worker 3496*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInData() bool { 3497*333d2b36SAndroid Build Coastguard Worker if c.installer == nil { 3498*333d2b36SAndroid Build Coastguard Worker return false 3499*333d2b36SAndroid Build Coastguard Worker } 3500*333d2b36SAndroid Build Coastguard Worker return c.installer.inData() 3501*333d2b36SAndroid Build Coastguard Worker} 3502*333d2b36SAndroid Build Coastguard Worker 3503*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInSanitizerDir() bool { 3504*333d2b36SAndroid Build Coastguard Worker if c.installer == nil { 3505*333d2b36SAndroid Build Coastguard Worker return false 3506*333d2b36SAndroid Build Coastguard Worker } 3507*333d2b36SAndroid Build Coastguard Worker if c.sanitize != nil && c.sanitize.inSanitizerDir() { 3508*333d2b36SAndroid Build Coastguard Worker return true 3509*333d2b36SAndroid Build Coastguard Worker } 3510*333d2b36SAndroid Build Coastguard Worker return c.installer.inSanitizerDir() 3511*333d2b36SAndroid Build Coastguard Worker} 3512*333d2b36SAndroid Build Coastguard Worker 3513*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInRamdisk() bool { 3514*333d2b36SAndroid Build Coastguard Worker return c.InRamdisk() 3515*333d2b36SAndroid Build Coastguard Worker} 3516*333d2b36SAndroid Build Coastguard Worker 3517*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInVendorRamdisk() bool { 3518*333d2b36SAndroid Build Coastguard Worker return c.InVendorRamdisk() 3519*333d2b36SAndroid Build Coastguard Worker} 3520*333d2b36SAndroid Build Coastguard Worker 3521*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInRecovery() bool { 3522*333d2b36SAndroid Build Coastguard Worker return c.InRecovery() 3523*333d2b36SAndroid Build Coastguard Worker} 3524*333d2b36SAndroid Build Coastguard Worker 3525*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) MakeUninstallable() { 3526*333d2b36SAndroid Build Coastguard Worker if c.installer == nil { 3527*333d2b36SAndroid Build Coastguard Worker c.ModuleBase.MakeUninstallable() 3528*333d2b36SAndroid Build Coastguard Worker return 3529*333d2b36SAndroid Build Coastguard Worker } 3530*333d2b36SAndroid Build Coastguard Worker c.installer.makeUninstallable(c) 3531*333d2b36SAndroid Build Coastguard Worker} 3532*333d2b36SAndroid Build Coastguard Worker 3533*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HostToolPath() android.OptionalPath { 3534*333d2b36SAndroid Build Coastguard Worker if c.installer == nil { 3535*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 3536*333d2b36SAndroid Build Coastguard Worker } 3537*333d2b36SAndroid Build Coastguard Worker return c.installer.hostToolPath() 3538*333d2b36SAndroid Build Coastguard Worker} 3539*333d2b36SAndroid Build Coastguard Worker 3540*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IntermPathForModuleOut() android.OptionalPath { 3541*333d2b36SAndroid Build Coastguard Worker return c.outputFile 3542*333d2b36SAndroid Build Coastguard Worker} 3543*333d2b36SAndroid Build Coastguard Worker 3544*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) static() bool { 3545*333d2b36SAndroid Build Coastguard Worker if static, ok := c.linker.(interface { 3546*333d2b36SAndroid Build Coastguard Worker static() bool 3547*333d2b36SAndroid Build Coastguard Worker }); ok { 3548*333d2b36SAndroid Build Coastguard Worker return static.static() 3549*333d2b36SAndroid Build Coastguard Worker } 3550*333d2b36SAndroid Build Coastguard Worker return false 3551*333d2b36SAndroid Build Coastguard Worker} 3552*333d2b36SAndroid Build Coastguard Worker 3553*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) staticBinary() bool { 3554*333d2b36SAndroid Build Coastguard Worker if static, ok := c.linker.(interface { 3555*333d2b36SAndroid Build Coastguard Worker staticBinary() bool 3556*333d2b36SAndroid Build Coastguard Worker }); ok { 3557*333d2b36SAndroid Build Coastguard Worker return static.staticBinary() 3558*333d2b36SAndroid Build Coastguard Worker } 3559*333d2b36SAndroid Build Coastguard Worker return false 3560*333d2b36SAndroid Build Coastguard Worker} 3561*333d2b36SAndroid Build Coastguard Worker 3562*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) testBinary() bool { 3563*333d2b36SAndroid Build Coastguard Worker if test, ok := c.linker.(interface { 3564*333d2b36SAndroid Build Coastguard Worker testBinary() bool 3565*333d2b36SAndroid Build Coastguard Worker }); ok { 3566*333d2b36SAndroid Build Coastguard Worker return test.testBinary() 3567*333d2b36SAndroid Build Coastguard Worker } 3568*333d2b36SAndroid Build Coastguard Worker return false 3569*333d2b36SAndroid Build Coastguard Worker} 3570*333d2b36SAndroid Build Coastguard Worker 3571*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) testLibrary() bool { 3572*333d2b36SAndroid Build Coastguard Worker if test, ok := c.linker.(interface { 3573*333d2b36SAndroid Build Coastguard Worker testLibrary() bool 3574*333d2b36SAndroid Build Coastguard Worker }); ok { 3575*333d2b36SAndroid Build Coastguard Worker return test.testLibrary() 3576*333d2b36SAndroid Build Coastguard Worker } 3577*333d2b36SAndroid Build Coastguard Worker return false 3578*333d2b36SAndroid Build Coastguard Worker} 3579*333d2b36SAndroid Build Coastguard Worker 3580*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) benchmarkBinary() bool { 3581*333d2b36SAndroid Build Coastguard Worker if b, ok := c.linker.(interface { 3582*333d2b36SAndroid Build Coastguard Worker benchmarkBinary() bool 3583*333d2b36SAndroid Build Coastguard Worker }); ok { 3584*333d2b36SAndroid Build Coastguard Worker return b.benchmarkBinary() 3585*333d2b36SAndroid Build Coastguard Worker } 3586*333d2b36SAndroid Build Coastguard Worker return false 3587*333d2b36SAndroid Build Coastguard Worker} 3588*333d2b36SAndroid Build Coastguard Worker 3589*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) fuzzBinary() bool { 3590*333d2b36SAndroid Build Coastguard Worker if f, ok := c.linker.(interface { 3591*333d2b36SAndroid Build Coastguard Worker fuzzBinary() bool 3592*333d2b36SAndroid Build Coastguard Worker }); ok { 3593*333d2b36SAndroid Build Coastguard Worker return f.fuzzBinary() 3594*333d2b36SAndroid Build Coastguard Worker } 3595*333d2b36SAndroid Build Coastguard Worker return false 3596*333d2b36SAndroid Build Coastguard Worker} 3597*333d2b36SAndroid Build Coastguard Worker 3598*333d2b36SAndroid Build Coastguard Worker// Header returns true if the module is a header-only variant. (See cc/library.go header()). 3599*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Header() bool { 3600*333d2b36SAndroid Build Coastguard Worker if h, ok := c.linker.(interface { 3601*333d2b36SAndroid Build Coastguard Worker header() bool 3602*333d2b36SAndroid Build Coastguard Worker }); ok { 3603*333d2b36SAndroid Build Coastguard Worker return h.header() 3604*333d2b36SAndroid Build Coastguard Worker } 3605*333d2b36SAndroid Build Coastguard Worker return false 3606*333d2b36SAndroid Build Coastguard Worker} 3607*333d2b36SAndroid Build Coastguard Worker 3608*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Binary() bool { 3609*333d2b36SAndroid Build Coastguard Worker if b, ok := c.linker.(interface { 3610*333d2b36SAndroid Build Coastguard Worker binary() bool 3611*333d2b36SAndroid Build Coastguard Worker }); ok { 3612*333d2b36SAndroid Build Coastguard Worker return b.binary() 3613*333d2b36SAndroid Build Coastguard Worker } 3614*333d2b36SAndroid Build Coastguard Worker return false 3615*333d2b36SAndroid Build Coastguard Worker} 3616*333d2b36SAndroid Build Coastguard Worker 3617*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) StaticExecutable() bool { 3618*333d2b36SAndroid Build Coastguard Worker if b, ok := c.linker.(*binaryDecorator); ok { 3619*333d2b36SAndroid Build Coastguard Worker return b.static() 3620*333d2b36SAndroid Build Coastguard Worker } 3621*333d2b36SAndroid Build Coastguard Worker return false 3622*333d2b36SAndroid Build Coastguard Worker} 3623*333d2b36SAndroid Build Coastguard Worker 3624*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Object() bool { 3625*333d2b36SAndroid Build Coastguard Worker if o, ok := c.linker.(interface { 3626*333d2b36SAndroid Build Coastguard Worker object() bool 3627*333d2b36SAndroid Build Coastguard Worker }); ok { 3628*333d2b36SAndroid Build Coastguard Worker return o.object() 3629*333d2b36SAndroid Build Coastguard Worker } 3630*333d2b36SAndroid Build Coastguard Worker return false 3631*333d2b36SAndroid Build Coastguard Worker} 3632*333d2b36SAndroid Build Coastguard Worker 3633*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) Dylib() bool { 3634*333d2b36SAndroid Build Coastguard Worker return false 3635*333d2b36SAndroid Build Coastguard Worker} 3636*333d2b36SAndroid Build Coastguard Worker 3637*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) Rlib() bool { 3638*333d2b36SAndroid Build Coastguard Worker return false 3639*333d2b36SAndroid Build Coastguard Worker} 3640*333d2b36SAndroid Build Coastguard Worker 3641*333d2b36SAndroid Build Coastguard Workerfunc GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string { 3642*333d2b36SAndroid Build Coastguard Worker if c.InVendorOrProduct() { 3643*333d2b36SAndroid Build Coastguard Worker if c.IsLlndk() { 3644*333d2b36SAndroid Build Coastguard Worker return "native:vndk" 3645*333d2b36SAndroid Build Coastguard Worker } 3646*333d2b36SAndroid Build Coastguard Worker if c.InProduct() { 3647*333d2b36SAndroid Build Coastguard Worker return "native:product" 3648*333d2b36SAndroid Build Coastguard Worker } 3649*333d2b36SAndroid Build Coastguard Worker return "native:vendor" 3650*333d2b36SAndroid Build Coastguard Worker } else if c.InRamdisk() { 3651*333d2b36SAndroid Build Coastguard Worker return "native:ramdisk" 3652*333d2b36SAndroid Build Coastguard Worker } else if c.InVendorRamdisk() { 3653*333d2b36SAndroid Build Coastguard Worker return "native:vendor_ramdisk" 3654*333d2b36SAndroid Build Coastguard Worker } else if c.InRecovery() { 3655*333d2b36SAndroid Build Coastguard Worker return "native:recovery" 3656*333d2b36SAndroid Build Coastguard Worker } else if c.Target().Os == android.Android && c.SdkVersion() != "" { 3657*333d2b36SAndroid Build Coastguard Worker return "native:ndk:none:none" 3658*333d2b36SAndroid Build Coastguard Worker // TODO(b/114741097): use the correct ndk stl once build errors have been fixed 3659*333d2b36SAndroid Build Coastguard Worker //family, link := getNdkStlFamilyAndLinkType(c) 3660*333d2b36SAndroid Build Coastguard Worker //return fmt.Sprintf("native:ndk:%s:%s", family, link) 3661*333d2b36SAndroid Build Coastguard Worker } else { 3662*333d2b36SAndroid Build Coastguard Worker return "native:platform" 3663*333d2b36SAndroid Build Coastguard Worker } 3664*333d2b36SAndroid Build Coastguard Worker} 3665*333d2b36SAndroid Build Coastguard Worker 3666*333d2b36SAndroid Build Coastguard Worker// Overrides ApexModule.IsInstallabeToApex() 3667*333d2b36SAndroid Build Coastguard Worker// Only shared/runtime libraries . 3668*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsInstallableToApex() bool { 3669*333d2b36SAndroid Build Coastguard Worker if lib := c.library; lib != nil { 3670*333d2b36SAndroid Build Coastguard Worker // Stub libs and prebuilt libs in a versioned SDK are not 3671*333d2b36SAndroid Build Coastguard Worker // installable to APEX even though they are shared libs. 3672*333d2b36SAndroid Build Coastguard Worker return lib.shared() && !lib.buildStubs() 3673*333d2b36SAndroid Build Coastguard Worker } 3674*333d2b36SAndroid Build Coastguard Worker return false 3675*333d2b36SAndroid Build Coastguard Worker} 3676*333d2b36SAndroid Build Coastguard Worker 3677*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AvailableFor(what string) bool { 3678*333d2b36SAndroid Build Coastguard Worker if linker, ok := c.linker.(interface { 3679*333d2b36SAndroid Build Coastguard Worker availableFor(string) bool 3680*333d2b36SAndroid Build Coastguard Worker }); ok { 3681*333d2b36SAndroid Build Coastguard Worker return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what) 3682*333d2b36SAndroid Build Coastguard Worker } else { 3683*333d2b36SAndroid Build Coastguard Worker return c.ApexModuleBase.AvailableFor(what) 3684*333d2b36SAndroid Build Coastguard Worker } 3685*333d2b36SAndroid Build Coastguard Worker} 3686*333d2b36SAndroid Build Coastguard Worker 3687*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) EverInstallable() bool { 3688*333d2b36SAndroid Build Coastguard Worker return c.installer != nil && 3689*333d2b36SAndroid Build Coastguard Worker // Check to see whether the module is actually ever installable. 3690*333d2b36SAndroid Build Coastguard Worker c.installer.everInstallable() 3691*333d2b36SAndroid Build Coastguard Worker} 3692*333d2b36SAndroid Build Coastguard Worker 3693*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) PreventInstall() bool { 3694*333d2b36SAndroid Build Coastguard Worker return c.Properties.PreventInstall 3695*333d2b36SAndroid Build Coastguard Worker} 3696*333d2b36SAndroid Build Coastguard Worker 3697*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Installable() *bool { 3698*333d2b36SAndroid Build Coastguard Worker if c.library != nil { 3699*333d2b36SAndroid Build Coastguard Worker if i := c.library.installable(); i != nil { 3700*333d2b36SAndroid Build Coastguard Worker return i 3701*333d2b36SAndroid Build Coastguard Worker } 3702*333d2b36SAndroid Build Coastguard Worker } 3703*333d2b36SAndroid Build Coastguard Worker return c.Properties.Installable 3704*333d2b36SAndroid Build Coastguard Worker} 3705*333d2b36SAndroid Build Coastguard Worker 3706*333d2b36SAndroid Build Coastguard Workerfunc installable(c LinkableInterface, apexInfo android.ApexInfo) bool { 3707*333d2b36SAndroid Build Coastguard Worker ret := c.EverInstallable() && 3708*333d2b36SAndroid Build Coastguard Worker // Check to see whether the module has been configured to not be installed. 3709*333d2b36SAndroid Build Coastguard Worker proptools.BoolDefault(c.Installable(), true) && 3710*333d2b36SAndroid Build Coastguard Worker !c.PreventInstall() && c.OutputFile().Valid() 3711*333d2b36SAndroid Build Coastguard Worker 3712*333d2b36SAndroid Build Coastguard Worker // The platform variant doesn't need further condition. Apex variants however might not 3713*333d2b36SAndroid Build Coastguard Worker // be installable because it will likely to be included in the APEX and won't appear 3714*333d2b36SAndroid Build Coastguard Worker // in the system partition. 3715*333d2b36SAndroid Build Coastguard Worker if apexInfo.IsForPlatform() { 3716*333d2b36SAndroid Build Coastguard Worker return ret 3717*333d2b36SAndroid Build Coastguard Worker } 3718*333d2b36SAndroid Build Coastguard Worker 3719*333d2b36SAndroid Build Coastguard Worker // Special case for modules that are configured to be installed to /data, which includes 3720*333d2b36SAndroid Build Coastguard Worker // test modules. For these modules, both APEX and non-APEX variants are considered as 3721*333d2b36SAndroid Build Coastguard Worker // installable. This is because even the APEX variants won't be included in the APEX, but 3722*333d2b36SAndroid Build Coastguard Worker // will anyway be installed to /data/*. 3723*333d2b36SAndroid Build Coastguard Worker // See b/146995717 3724*333d2b36SAndroid Build Coastguard Worker if c.InstallInData() { 3725*333d2b36SAndroid Build Coastguard Worker return ret 3726*333d2b36SAndroid Build Coastguard Worker } 3727*333d2b36SAndroid Build Coastguard Worker 3728*333d2b36SAndroid Build Coastguard Worker return false 3729*333d2b36SAndroid Build Coastguard Worker} 3730*333d2b36SAndroid Build Coastguard Worker 3731*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) { 3732*333d2b36SAndroid Build Coastguard Worker if c.linker != nil { 3733*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(*libraryDecorator); ok { 3734*333d2b36SAndroid Build Coastguard Worker library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w) 3735*333d2b36SAndroid Build Coastguard Worker } 3736*333d2b36SAndroid Build Coastguard Worker } 3737*333d2b36SAndroid Build Coastguard Worker} 3738*333d2b36SAndroid Build Coastguard Worker 3739*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Module)(nil) 3740*333d2b36SAndroid Build Coastguard Worker 3741*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 3742*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 3743*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 3744*333d2b36SAndroid Build Coastguard Worker libDepTag, isLibDepTag := depTag.(libraryDependencyTag) 3745*333d2b36SAndroid Build Coastguard Worker 3746*333d2b36SAndroid Build Coastguard Worker if cc, ok := dep.(*Module); ok { 3747*333d2b36SAndroid Build Coastguard Worker if cc.HasStubsVariants() { 3748*333d2b36SAndroid Build Coastguard Worker if isLibDepTag && libDepTag.shared() { 3749*333d2b36SAndroid Build Coastguard Worker // dynamic dep to a stubs lib crosses APEX boundary 3750*333d2b36SAndroid Build Coastguard Worker return false 3751*333d2b36SAndroid Build Coastguard Worker } 3752*333d2b36SAndroid Build Coastguard Worker if IsRuntimeDepTag(depTag) { 3753*333d2b36SAndroid Build Coastguard Worker // runtime dep to a stubs lib also crosses APEX boundary 3754*333d2b36SAndroid Build Coastguard Worker return false 3755*333d2b36SAndroid Build Coastguard Worker } 3756*333d2b36SAndroid Build Coastguard Worker } 3757*333d2b36SAndroid Build Coastguard Worker if cc.IsLlndk() { 3758*333d2b36SAndroid Build Coastguard Worker return false 3759*333d2b36SAndroid Build Coastguard Worker } 3760*333d2b36SAndroid Build Coastguard Worker if isLibDepTag && c.static() && libDepTag.shared() { 3761*333d2b36SAndroid Build Coastguard Worker // shared_lib dependency from a static lib is considered as crossing 3762*333d2b36SAndroid Build Coastguard Worker // the APEX boundary because the dependency doesn't actually is 3763*333d2b36SAndroid Build Coastguard Worker // linked; the dependency is used only during the compilation phase. 3764*333d2b36SAndroid Build Coastguard Worker return false 3765*333d2b36SAndroid Build Coastguard Worker } 3766*333d2b36SAndroid Build Coastguard Worker 3767*333d2b36SAndroid Build Coastguard Worker if isLibDepTag && libDepTag.excludeInApex { 3768*333d2b36SAndroid Build Coastguard Worker return false 3769*333d2b36SAndroid Build Coastguard Worker } 3770*333d2b36SAndroid Build Coastguard Worker } 3771*333d2b36SAndroid Build Coastguard Worker if depTag == stubImplDepTag { 3772*333d2b36SAndroid Build Coastguard Worker // We don't track from an implementation library to its stubs. 3773*333d2b36SAndroid Build Coastguard Worker return false 3774*333d2b36SAndroid Build Coastguard Worker } 3775*333d2b36SAndroid Build Coastguard Worker if depTag == staticVariantTag { 3776*333d2b36SAndroid Build Coastguard Worker // This dependency is for optimization (reuse *.o from the static lib). It doesn't 3777*333d2b36SAndroid Build Coastguard Worker // actually mean that the static lib (and its dependencies) are copied into the 3778*333d2b36SAndroid Build Coastguard Worker // APEX. 3779*333d2b36SAndroid Build Coastguard Worker return false 3780*333d2b36SAndroid Build Coastguard Worker } 3781*333d2b36SAndroid Build Coastguard Worker return true 3782*333d2b36SAndroid Build Coastguard Worker} 3783*333d2b36SAndroid Build Coastguard Worker 3784*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 3785*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 3786*333d2b36SAndroid Build Coastguard Worker sdkVersion android.ApiLevel) error { 3787*333d2b36SAndroid Build Coastguard Worker // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700) 3788*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") { 3789*333d2b36SAndroid Build Coastguard Worker return nil 3790*333d2b36SAndroid Build Coastguard Worker } 3791*333d2b36SAndroid Build Coastguard Worker // We don't check for prebuilt modules 3792*333d2b36SAndroid Build Coastguard Worker if _, ok := c.linker.(prebuiltLinkerInterface); ok { 3793*333d2b36SAndroid Build Coastguard Worker return nil 3794*333d2b36SAndroid Build Coastguard Worker } 3795*333d2b36SAndroid Build Coastguard Worker 3796*333d2b36SAndroid Build Coastguard Worker minSdkVersion := c.MinSdkVersion() 3797*333d2b36SAndroid Build Coastguard Worker if minSdkVersion == "apex_inherit" { 3798*333d2b36SAndroid Build Coastguard Worker return nil 3799*333d2b36SAndroid Build Coastguard Worker } 3800*333d2b36SAndroid Build Coastguard Worker if minSdkVersion == "" { 3801*333d2b36SAndroid Build Coastguard Worker // JNI libs within APK-in-APEX fall into here 3802*333d2b36SAndroid Build Coastguard Worker // Those are okay to set sdk_version instead 3803*333d2b36SAndroid Build Coastguard Worker // We don't have to check if this is a SDK variant because 3804*333d2b36SAndroid Build Coastguard Worker // non-SDK variant resets sdk_version, which works too. 3805*333d2b36SAndroid Build Coastguard Worker minSdkVersion = c.SdkVersion() 3806*333d2b36SAndroid Build Coastguard Worker } 3807*333d2b36SAndroid Build Coastguard Worker if minSdkVersion == "" { 3808*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("neither min_sdk_version nor sdk_version specificed") 3809*333d2b36SAndroid Build Coastguard Worker } 3810*333d2b36SAndroid Build Coastguard Worker // Not using nativeApiLevelFromUser because the context here is not 3811*333d2b36SAndroid Build Coastguard Worker // necessarily a native context. 3812*333d2b36SAndroid Build Coastguard Worker ver, err := android.ApiLevelFromUser(ctx, minSdkVersion) 3813*333d2b36SAndroid Build Coastguard Worker if err != nil { 3814*333d2b36SAndroid Build Coastguard Worker return err 3815*333d2b36SAndroid Build Coastguard Worker } 3816*333d2b36SAndroid Build Coastguard Worker 3817*333d2b36SAndroid Build Coastguard Worker // A dependency only needs to support a min_sdk_version at least 3818*333d2b36SAndroid Build Coastguard Worker // as high as the api level that the architecture was introduced in. 3819*333d2b36SAndroid Build Coastguard Worker // This allows introducing new architectures in the platform that 3820*333d2b36SAndroid Build Coastguard Worker // need to be included in apexes that normally require an older 3821*333d2b36SAndroid Build Coastguard Worker // min_sdk_version. 3822*333d2b36SAndroid Build Coastguard Worker minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType) 3823*333d2b36SAndroid Build Coastguard Worker if sdkVersion.LessThan(minApiForArch) { 3824*333d2b36SAndroid Build Coastguard Worker sdkVersion = minApiForArch 3825*333d2b36SAndroid Build Coastguard Worker } 3826*333d2b36SAndroid Build Coastguard Worker 3827*333d2b36SAndroid Build Coastguard Worker if ver.GreaterThan(sdkVersion) { 3828*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("newer SDK(%v)", ver) 3829*333d2b36SAndroid Build Coastguard Worker } 3830*333d2b36SAndroid Build Coastguard Worker return nil 3831*333d2b36SAndroid Build Coastguard Worker} 3832*333d2b36SAndroid Build Coastguard Worker 3833*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 3834*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) AlwaysRequiresPlatformApexVariant() bool { 3835*333d2b36SAndroid Build Coastguard Worker // stub libraries and native bridge libraries are always available to platform 3836*333d2b36SAndroid Build Coastguard Worker return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled 3837*333d2b36SAndroid Build Coastguard Worker} 3838*333d2b36SAndroid Build Coastguard Worker 3839*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) overriddenModules() []string { 3840*333d2b36SAndroid Build Coastguard Worker if o, ok := c.linker.(overridable); ok { 3841*333d2b36SAndroid Build Coastguard Worker return o.overriddenModules() 3842*333d2b36SAndroid Build Coastguard Worker } 3843*333d2b36SAndroid Build Coastguard Worker return nil 3844*333d2b36SAndroid Build Coastguard Worker} 3845*333d2b36SAndroid Build Coastguard Worker 3846*333d2b36SAndroid Build Coastguard Workertype moduleType int 3847*333d2b36SAndroid Build Coastguard Worker 3848*333d2b36SAndroid Build Coastguard Workerconst ( 3849*333d2b36SAndroid Build Coastguard Worker unknownType moduleType = iota 3850*333d2b36SAndroid Build Coastguard Worker binary 3851*333d2b36SAndroid Build Coastguard Worker object 3852*333d2b36SAndroid Build Coastguard Worker fullLibrary 3853*333d2b36SAndroid Build Coastguard Worker staticLibrary 3854*333d2b36SAndroid Build Coastguard Worker sharedLibrary 3855*333d2b36SAndroid Build Coastguard Worker headerLibrary 3856*333d2b36SAndroid Build Coastguard Worker testBin // testBinary already declared 3857*333d2b36SAndroid Build Coastguard Worker ndkLibrary 3858*333d2b36SAndroid Build Coastguard Worker) 3859*333d2b36SAndroid Build Coastguard Worker 3860*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) typ() moduleType { 3861*333d2b36SAndroid Build Coastguard Worker if c.testBinary() { 3862*333d2b36SAndroid Build Coastguard Worker // testBinary is also a binary, so this comes before the c.Binary() 3863*333d2b36SAndroid Build Coastguard Worker // conditional. A testBinary has additional implicit dependencies and 3864*333d2b36SAndroid Build Coastguard Worker // other test-only semantics. 3865*333d2b36SAndroid Build Coastguard Worker return testBin 3866*333d2b36SAndroid Build Coastguard Worker } else if c.Binary() { 3867*333d2b36SAndroid Build Coastguard Worker return binary 3868*333d2b36SAndroid Build Coastguard Worker } else if c.Object() { 3869*333d2b36SAndroid Build Coastguard Worker return object 3870*333d2b36SAndroid Build Coastguard Worker } else if c.testLibrary() { 3871*333d2b36SAndroid Build Coastguard Worker // TODO(b/244431896) properly convert cc_test_library to its own macro. This 3872*333d2b36SAndroid Build Coastguard Worker // will let them add implicit compile deps on gtest, for example. 3873*333d2b36SAndroid Build Coastguard Worker // 3874*333d2b36SAndroid Build Coastguard Worker // For now, treat them as regular libraries. 3875*333d2b36SAndroid Build Coastguard Worker return fullLibrary 3876*333d2b36SAndroid Build Coastguard Worker } else if c.CcLibrary() { 3877*333d2b36SAndroid Build Coastguard Worker static := false 3878*333d2b36SAndroid Build Coastguard Worker shared := false 3879*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(*libraryDecorator); ok { 3880*333d2b36SAndroid Build Coastguard Worker static = library.MutatedProperties.BuildStatic 3881*333d2b36SAndroid Build Coastguard Worker shared = library.MutatedProperties.BuildShared 3882*333d2b36SAndroid Build Coastguard Worker } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok { 3883*333d2b36SAndroid Build Coastguard Worker static = library.MutatedProperties.BuildStatic 3884*333d2b36SAndroid Build Coastguard Worker shared = library.MutatedProperties.BuildShared 3885*333d2b36SAndroid Build Coastguard Worker } 3886*333d2b36SAndroid Build Coastguard Worker if static && shared { 3887*333d2b36SAndroid Build Coastguard Worker return fullLibrary 3888*333d2b36SAndroid Build Coastguard Worker } else if !static && !shared { 3889*333d2b36SAndroid Build Coastguard Worker return headerLibrary 3890*333d2b36SAndroid Build Coastguard Worker } else if static { 3891*333d2b36SAndroid Build Coastguard Worker return staticLibrary 3892*333d2b36SAndroid Build Coastguard Worker } 3893*333d2b36SAndroid Build Coastguard Worker return sharedLibrary 3894*333d2b36SAndroid Build Coastguard Worker } else if c.isNDKStubLibrary() { 3895*333d2b36SAndroid Build Coastguard Worker return ndkLibrary 3896*333d2b36SAndroid Build Coastguard Worker } 3897*333d2b36SAndroid Build Coastguard Worker return unknownType 3898*333d2b36SAndroid Build Coastguard Worker} 3899*333d2b36SAndroid Build Coastguard Worker 3900*333d2b36SAndroid Build Coastguard Worker// Defaults 3901*333d2b36SAndroid Build Coastguard Workertype Defaults struct { 3902*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 3903*333d2b36SAndroid Build Coastguard Worker android.DefaultsModuleBase 3904*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 3905*333d2b36SAndroid Build Coastguard Worker} 3906*333d2b36SAndroid Build Coastguard Worker 3907*333d2b36SAndroid Build Coastguard Worker// cc_defaults provides a set of properties that can be inherited by other cc 3908*333d2b36SAndroid Build Coastguard Worker// modules. A module can use the properties from a cc_defaults using 3909*333d2b36SAndroid Build Coastguard Worker// `defaults: ["<:default_module_name>"]`. Properties of both modules are 3910*333d2b36SAndroid Build Coastguard Worker// merged (when possible) by prepending the default module's values to the 3911*333d2b36SAndroid Build Coastguard Worker// depending module's values. 3912*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() android.Module { 3913*333d2b36SAndroid Build Coastguard Worker return DefaultsFactory() 3914*333d2b36SAndroid Build Coastguard Worker} 3915*333d2b36SAndroid Build Coastguard Worker 3916*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory(props ...interface{}) android.Module { 3917*333d2b36SAndroid Build Coastguard Worker module := &Defaults{} 3918*333d2b36SAndroid Build Coastguard Worker 3919*333d2b36SAndroid Build Coastguard Worker module.AddProperties(props...) 3920*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 3921*333d2b36SAndroid Build Coastguard Worker &BaseProperties{}, 3922*333d2b36SAndroid Build Coastguard Worker &VendorProperties{}, 3923*333d2b36SAndroid Build Coastguard Worker &BaseCompilerProperties{}, 3924*333d2b36SAndroid Build Coastguard Worker &BaseLinkerProperties{}, 3925*333d2b36SAndroid Build Coastguard Worker &ObjectLinkerProperties{}, 3926*333d2b36SAndroid Build Coastguard Worker &LibraryProperties{}, 3927*333d2b36SAndroid Build Coastguard Worker &StaticProperties{}, 3928*333d2b36SAndroid Build Coastguard Worker &SharedProperties{}, 3929*333d2b36SAndroid Build Coastguard Worker &FlagExporterProperties{}, 3930*333d2b36SAndroid Build Coastguard Worker &BinaryLinkerProperties{}, 3931*333d2b36SAndroid Build Coastguard Worker &TestLinkerProperties{}, 3932*333d2b36SAndroid Build Coastguard Worker &TestInstallerProperties{}, 3933*333d2b36SAndroid Build Coastguard Worker &TestBinaryProperties{}, 3934*333d2b36SAndroid Build Coastguard Worker &BenchmarkProperties{}, 3935*333d2b36SAndroid Build Coastguard Worker &fuzz.FuzzProperties{}, 3936*333d2b36SAndroid Build Coastguard Worker &StlProperties{}, 3937*333d2b36SAndroid Build Coastguard Worker &SanitizeProperties{}, 3938*333d2b36SAndroid Build Coastguard Worker &StripProperties{}, 3939*333d2b36SAndroid Build Coastguard Worker &InstallerProperties{}, 3940*333d2b36SAndroid Build Coastguard Worker &TidyProperties{}, 3941*333d2b36SAndroid Build Coastguard Worker &CoverageProperties{}, 3942*333d2b36SAndroid Build Coastguard Worker &SAbiProperties{}, 3943*333d2b36SAndroid Build Coastguard Worker <OProperties{}, 3944*333d2b36SAndroid Build Coastguard Worker &AfdoProperties{}, 3945*333d2b36SAndroid Build Coastguard Worker &OrderfileProperties{}, 3946*333d2b36SAndroid Build Coastguard Worker &android.ProtoProperties{}, 3947*333d2b36SAndroid Build Coastguard Worker // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules. 3948*333d2b36SAndroid Build Coastguard Worker &RustBindgenClangProperties{}, 3949*333d2b36SAndroid Build Coastguard Worker &prebuiltLinkerProperties{}, 3950*333d2b36SAndroid Build Coastguard Worker ) 3951*333d2b36SAndroid Build Coastguard Worker 3952*333d2b36SAndroid Build Coastguard Worker android.InitDefaultsModule(module) 3953*333d2b36SAndroid Build Coastguard Worker 3954*333d2b36SAndroid Build Coastguard Worker return module 3955*333d2b36SAndroid Build Coastguard Worker} 3956*333d2b36SAndroid Build Coastguard Worker 3957*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsSdkVariant() bool { 3958*333d2b36SAndroid Build Coastguard Worker return c.Properties.IsSdkVariant 3959*333d2b36SAndroid Build Coastguard Worker} 3960*333d2b36SAndroid Build Coastguard Worker 3961*333d2b36SAndroid Build Coastguard Workerfunc kytheExtractAllFactory() android.Singleton { 3962*333d2b36SAndroid Build Coastguard Worker return &kytheExtractAllSingleton{} 3963*333d2b36SAndroid Build Coastguard Worker} 3964*333d2b36SAndroid Build Coastguard Worker 3965*333d2b36SAndroid Build Coastguard Workertype kytheExtractAllSingleton struct { 3966*333d2b36SAndroid Build Coastguard Worker} 3967*333d2b36SAndroid Build Coastguard Worker 3968*333d2b36SAndroid Build Coastguard Workerfunc (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) { 3969*333d2b36SAndroid Build Coastguard Worker var xrefTargets android.Paths 3970*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModuleProxies(func(module android.ModuleProxy) { 3971*333d2b36SAndroid Build Coastguard Worker files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).kytheFiles 3972*333d2b36SAndroid Build Coastguard Worker if len(files) > 0 { 3973*333d2b36SAndroid Build Coastguard Worker xrefTargets = append(xrefTargets, files...) 3974*333d2b36SAndroid Build Coastguard Worker } 3975*333d2b36SAndroid Build Coastguard Worker }) 3976*333d2b36SAndroid Build Coastguard Worker // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets 3977*333d2b36SAndroid Build Coastguard Worker if len(xrefTargets) > 0 { 3978*333d2b36SAndroid Build Coastguard Worker ctx.Phony("xref_cxx", xrefTargets...) 3979*333d2b36SAndroid Build Coastguard Worker } 3980*333d2b36SAndroid Build Coastguard Worker} 3981*333d2b36SAndroid Build Coastguard Worker 3982*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Partition() string { 3983*333d2b36SAndroid Build Coastguard Worker if p, ok := c.installer.(interface { 3984*333d2b36SAndroid Build Coastguard Worker getPartition() string 3985*333d2b36SAndroid Build Coastguard Worker }); ok { 3986*333d2b36SAndroid Build Coastguard Worker return p.getPartition() 3987*333d2b36SAndroid Build Coastguard Worker } 3988*333d2b36SAndroid Build Coastguard Worker return "" 3989*333d2b36SAndroid Build Coastguard Worker} 3990*333d2b36SAndroid Build Coastguard Worker 3991*333d2b36SAndroid Build Coastguard Workertype sourceModuleName interface { 3992*333d2b36SAndroid Build Coastguard Worker sourceModuleName() string 3993*333d2b36SAndroid Build Coastguard Worker} 3994*333d2b36SAndroid Build Coastguard Worker 3995*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) BaseModuleName() string { 3996*333d2b36SAndroid Build Coastguard Worker if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" { 3997*333d2b36SAndroid Build Coastguard Worker // if the prebuilt module sets a source_module_name in Android.bp, use that 3998*333d2b36SAndroid Build Coastguard Worker return smn.sourceModuleName() 3999*333d2b36SAndroid Build Coastguard Worker } 4000*333d2b36SAndroid Build Coastguard Worker return c.ModuleBase.BaseModuleName() 4001*333d2b36SAndroid Build Coastguard Worker} 4002*333d2b36SAndroid Build Coastguard Worker 4003*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) stubsSymbolFilePath() android.Path { 4004*333d2b36SAndroid Build Coastguard Worker if library, ok := c.linker.(*libraryDecorator); ok { 4005*333d2b36SAndroid Build Coastguard Worker return library.stubsSymbolFilePath 4006*333d2b36SAndroid Build Coastguard Worker } 4007*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{}.Path() 4008*333d2b36SAndroid Build Coastguard Worker} 4009*333d2b36SAndroid Build Coastguard Worker 4010*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool 4011*333d2b36SAndroid Build Coastguard Workervar BoolDefault = proptools.BoolDefault 4012*333d2b36SAndroid Build Coastguard Workervar BoolPtr = proptools.BoolPtr 4013*333d2b36SAndroid Build Coastguard Workervar String = proptools.String 4014*333d2b36SAndroid Build Coastguard Workervar StringPtr = proptools.StringPtr 4015