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 android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker// This is the primary location to write and read all configuration values and 18*333d2b36SAndroid Build Coastguard Worker// product variables necessary for soong_build's operation. 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Workerimport ( 21*333d2b36SAndroid Build Coastguard Worker "encoding/json" 22*333d2b36SAndroid Build Coastguard Worker "fmt" 23*333d2b36SAndroid Build Coastguard Worker "os" 24*333d2b36SAndroid Build Coastguard Worker "path/filepath" 25*333d2b36SAndroid Build Coastguard Worker "runtime" 26*333d2b36SAndroid Build Coastguard Worker "strconv" 27*333d2b36SAndroid Build Coastguard Worker "strings" 28*333d2b36SAndroid Build Coastguard Worker "sync" 29*333d2b36SAndroid Build Coastguard Worker "unicode" 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker "android/soong/shared" 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 34*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/bootstrap" 35*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 36*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker "android/soong/android/soongconfig" 39*333d2b36SAndroid Build Coastguard Worker "android/soong/remoteexec" 40*333d2b36SAndroid Build Coastguard Worker) 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Worker// Bool re-exports proptools.Bool for the android package. 43*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker// String re-exports proptools.String for the android package. 46*333d2b36SAndroid Build Coastguard Workervar String = proptools.String 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker// StringDefault re-exports proptools.StringDefault for the android package. 49*333d2b36SAndroid Build Coastguard Workervar StringDefault = proptools.StringDefault 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker// FutureApiLevelInt is a placeholder constant for unreleased API levels. 52*333d2b36SAndroid Build Coastguard Workerconst FutureApiLevelInt = 10000 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker// PrivateApiLevel represents the api level of SdkSpecPrivate (sdk_version: "") 55*333d2b36SAndroid Build Coastguard Worker// This api_level exists to differentiate user-provided "" from "current" sdk_version 56*333d2b36SAndroid Build Coastguard Worker// The differentiation is necessary to enable different validation rules for these two possible values. 57*333d2b36SAndroid Build Coastguard Workervar PrivateApiLevel = ApiLevel{ 58*333d2b36SAndroid Build Coastguard Worker value: "current", // The value is current since aidl expects `current` as the default (TestAidlFlagsWithMinSdkVersion) 59*333d2b36SAndroid Build Coastguard Worker number: FutureApiLevelInt + 1, // This is used to differentiate it from FutureApiLevel 60*333d2b36SAndroid Build Coastguard Worker isPreview: true, 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker// FutureApiLevel represents unreleased API levels. 64*333d2b36SAndroid Build Coastguard Workervar FutureApiLevel = ApiLevel{ 65*333d2b36SAndroid Build Coastguard Worker value: "current", 66*333d2b36SAndroid Build Coastguard Worker number: FutureApiLevelInt, 67*333d2b36SAndroid Build Coastguard Worker isPreview: true, 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker// The product variables file name, containing product config from Kati. 71*333d2b36SAndroid Build Coastguard Workerconst productVariablesFileName = "soong.variables" 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker// A Config object represents the entire build configuration for Android. 74*333d2b36SAndroid Build Coastguard Workertype Config struct { 75*333d2b36SAndroid Build Coastguard Worker *config 76*333d2b36SAndroid Build Coastguard Worker} 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Workertype SoongBuildMode int 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workertype CmdArgs struct { 81*333d2b36SAndroid Build Coastguard Worker bootstrap.Args 82*333d2b36SAndroid Build Coastguard Worker RunGoTests bool 83*333d2b36SAndroid Build Coastguard Worker OutDir string 84*333d2b36SAndroid Build Coastguard Worker SoongOutDir string 85*333d2b36SAndroid Build Coastguard Worker SoongVariables string 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker ModuleGraphFile string 88*333d2b36SAndroid Build Coastguard Worker ModuleActionsFile string 89*333d2b36SAndroid Build Coastguard Worker DocFile string 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker BuildFromSourceStub bool 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker EnsureAllowlistIntegrity bool 94*333d2b36SAndroid Build Coastguard Worker} 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker// Build modes that soong_build can run as. 97*333d2b36SAndroid Build Coastguard Workerconst ( 98*333d2b36SAndroid Build Coastguard Worker // Don't use bazel at all during module analysis. 99*333d2b36SAndroid Build Coastguard Worker AnalysisNoBazel SoongBuildMode = iota 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker // Create a JSON representation of the module graph and exit. 102*333d2b36SAndroid Build Coastguard Worker GenerateModuleGraph 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker // Generate a documentation file for module type definitions and exit. 105*333d2b36SAndroid Build Coastguard Worker GenerateDocFile 106*333d2b36SAndroid Build Coastguard Worker) 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Workerconst testKeyDir = "build/make/target/product/security" 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker// SoongOutDir returns the build output directory for the configuration. 111*333d2b36SAndroid Build Coastguard Workerfunc (c Config) SoongOutDir() string { 112*333d2b36SAndroid Build Coastguard Worker return c.soongOutDir 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker// tempDir returns the path to out/soong/.temp, which is cleared at the beginning of every build. 116*333d2b36SAndroid Build Coastguard Workerfunc (c Config) tempDir() string { 117*333d2b36SAndroid Build Coastguard Worker return shared.TempDirForOutDir(c.soongOutDir) 118*333d2b36SAndroid Build Coastguard Worker} 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Workerfunc (c Config) OutDir() string { 121*333d2b36SAndroid Build Coastguard Worker return c.outDir 122*333d2b36SAndroid Build Coastguard Worker} 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Workerfunc (c Config) RunGoTests() bool { 125*333d2b36SAndroid Build Coastguard Worker return c.runGoTests 126*333d2b36SAndroid Build Coastguard Worker} 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Workerfunc (c Config) DebugCompilation() bool { 129*333d2b36SAndroid Build Coastguard Worker return false // Never compile Go code in the main build for debugging 130*333d2b36SAndroid Build Coastguard Worker} 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Workerfunc (c Config) Subninjas() []string { 133*333d2b36SAndroid Build Coastguard Worker return []string{} 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Workerfunc (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation { 137*333d2b36SAndroid Build Coastguard Worker return []bootstrap.PrimaryBuilderInvocation{} 138*333d2b36SAndroid Build Coastguard Worker} 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test. 141*333d2b36SAndroid Build Coastguard Workerfunc (c Config) RunningInsideUnitTest() bool { 142*333d2b36SAndroid Build Coastguard Worker return c.config.TestProductVariables != nil 143*333d2b36SAndroid Build Coastguard Worker} 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker// DisableHiddenApiChecks returns true if hiddenapi checks have been disabled. 146*333d2b36SAndroid Build Coastguard Worker// For 'eng' target variant hiddenapi checks are disabled by default for performance optimisation, 147*333d2b36SAndroid Build Coastguard Worker// but can be enabled by setting environment variable ENABLE_HIDDENAPI_FLAGS=true. 148*333d2b36SAndroid Build Coastguard Worker// For other target variants hiddenapi check are enabled by default but can be disabled by 149*333d2b36SAndroid Build Coastguard Worker// setting environment variable UNSAFE_DISABLE_HIDDENAPI_FLAGS=true. 150*333d2b36SAndroid Build Coastguard Worker// If both ENABLE_HIDDENAPI_FLAGS=true and UNSAFE_DISABLE_HIDDENAPI_FLAGS=true, then 151*333d2b36SAndroid Build Coastguard Worker// ENABLE_HIDDENAPI_FLAGS=true will be triggered and hiddenapi checks will be considered enabled. 152*333d2b36SAndroid Build Coastguard Workerfunc (c Config) DisableHiddenApiChecks() bool { 153*333d2b36SAndroid Build Coastguard Worker return !c.IsEnvTrue("ENABLE_HIDDENAPI_FLAGS") && 154*333d2b36SAndroid Build Coastguard Worker (c.IsEnvTrue("UNSAFE_DISABLE_HIDDENAPI_FLAGS") || 155*333d2b36SAndroid Build Coastguard Worker Bool(c.productVariables.Eng)) 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker// DisableVerifyOverlaps returns true if verify_overlaps is skipped. 159*333d2b36SAndroid Build Coastguard Worker// Mismatch in version of apexes and module SDK is required for mainline prebuilts to work in 160*333d2b36SAndroid Build Coastguard Worker// trunk stable. 161*333d2b36SAndroid Build Coastguard Worker// Thus, verify_overlaps is disabled when RELEASE_DEFAULT_MODULE_BUILD_FROM_SOURCE is set to false. 162*333d2b36SAndroid Build Coastguard Worker// TODO(b/308174018): Re-enable verify_overlaps for both builr from source/mainline prebuilts. 163*333d2b36SAndroid Build Coastguard Workerfunc (c Config) DisableVerifyOverlaps() bool { 164*333d2b36SAndroid Build Coastguard Worker if c.IsEnvFalse("DISABLE_VERIFY_OVERLAPS") && c.ReleaseDisableVerifyOverlaps() { 165*333d2b36SAndroid Build Coastguard Worker panic("The current release configuration does not support verify_overlaps. DISABLE_VERIFY_OVERLAPS cannot be set to false") 166*333d2b36SAndroid Build Coastguard Worker } 167*333d2b36SAndroid Build Coastguard Worker return c.IsEnvTrue("DISABLE_VERIFY_OVERLAPS") || c.ReleaseDisableVerifyOverlaps() || !c.ReleaseDefaultModuleBuildFromSource() 168*333d2b36SAndroid Build Coastguard Worker} 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Workerfunc (c Config) CoverageSuffix() string { 171*333d2b36SAndroid Build Coastguard Worker if v := c.IsEnvTrue("EMMA_INSTRUMENT"); v { 172*333d2b36SAndroid Build Coastguard Worker return "coverage." 173*333d2b36SAndroid Build Coastguard Worker } 174*333d2b36SAndroid Build Coastguard Worker return "" 175*333d2b36SAndroid Build Coastguard Worker} 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker// MaxPageSizeSupported returns the max page size supported by the device. This 178*333d2b36SAndroid Build Coastguard Worker// value will define the ELF segment alignment for binaries (executables and 179*333d2b36SAndroid Build Coastguard Worker// shared libraries). 180*333d2b36SAndroid Build Coastguard Workerfunc (c Config) MaxPageSizeSupported() string { 181*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.DeviceMaxPageSizeSupported) 182*333d2b36SAndroid Build Coastguard Worker} 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Worker// NoBionicPageSizeMacro returns true when AOSP is page size agnostic. 185*333d2b36SAndroid Build Coastguard Worker// This means that the bionic's macro PAGE_SIZE won't be defined. 186*333d2b36SAndroid Build Coastguard Worker// Returns false when AOSP is NOT page size agnostic. 187*333d2b36SAndroid Build Coastguard Worker// This means that bionic's macro PAGE_SIZE is defined. 188*333d2b36SAndroid Build Coastguard Workerfunc (c Config) NoBionicPageSizeMacro() bool { 189*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.DeviceNoBionicPageSizeMacro) 190*333d2b36SAndroid Build Coastguard Worker} 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Worker// The release version passed to aconfig, derived from RELEASE_VERSION 193*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseVersion() string { 194*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.ReleaseVersion 195*333d2b36SAndroid Build Coastguard Worker} 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Worker// The aconfig value set passed to aconfig, derived from RELEASE_VERSION 198*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseAconfigValueSets() []string { 199*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.ReleaseAconfigValueSets 200*333d2b36SAndroid Build Coastguard Worker} 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseAconfigExtraReleaseConfigs() []string { 203*333d2b36SAndroid Build Coastguard Worker result := []string{} 204*333d2b36SAndroid Build Coastguard Worker if val, ok := c.config.productVariables.BuildFlags["RELEASE_ACONFIG_EXTRA_RELEASE_CONFIGS"]; ok { 205*333d2b36SAndroid Build Coastguard Worker if len(val) > 0 { 206*333d2b36SAndroid Build Coastguard Worker // Remove any duplicates from the list. 207*333d2b36SAndroid Build Coastguard Worker found := make(map[string]bool) 208*333d2b36SAndroid Build Coastguard Worker for _, k := range strings.Split(val, " ") { 209*333d2b36SAndroid Build Coastguard Worker if !found[k] { 210*333d2b36SAndroid Build Coastguard Worker found[k] = true 211*333d2b36SAndroid Build Coastguard Worker result = append(result, k) 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker } 214*333d2b36SAndroid Build Coastguard Worker } 215*333d2b36SAndroid Build Coastguard Worker } 216*333d2b36SAndroid Build Coastguard Worker return result 217*333d2b36SAndroid Build Coastguard Worker} 218*333d2b36SAndroid Build Coastguard Worker 219*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseAconfigExtraReleaseConfigsValueSets() map[string][]string { 220*333d2b36SAndroid Build Coastguard Worker result := make(map[string][]string) 221*333d2b36SAndroid Build Coastguard Worker for _, rcName := range c.ReleaseAconfigExtraReleaseConfigs() { 222*333d2b36SAndroid Build Coastguard Worker if value, ok := c.config.productVariables.BuildFlags["RELEASE_ACONFIG_VALUE_SETS_"+rcName]; ok { 223*333d2b36SAndroid Build Coastguard Worker result[rcName] = strings.Split(value, " ") 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker return result 227*333d2b36SAndroid Build Coastguard Worker} 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Worker// The flag default permission value passed to aconfig 230*333d2b36SAndroid Build Coastguard Worker// derived from RELEASE_ACONFIG_FLAG_DEFAULT_PERMISSION 231*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseAconfigFlagDefaultPermission() string { 232*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.ReleaseAconfigFlagDefaultPermission 233*333d2b36SAndroid Build Coastguard Worker} 234*333d2b36SAndroid Build Coastguard Worker 235*333d2b36SAndroid Build Coastguard Worker// Enable object size sanitizer 236*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseBuildObjectSizeSanitizer() bool { 237*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_BUILD_OBJECT_SIZE_SANITIZER") 238*333d2b36SAndroid Build Coastguard Worker} 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Worker// The flag indicating behavior for the tree wrt building modules or using prebuilts 241*333d2b36SAndroid Build Coastguard Worker// derived from RELEASE_DEFAULT_MODULE_BUILD_FROM_SOURCE 242*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseDefaultModuleBuildFromSource() bool { 243*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.ReleaseDefaultModuleBuildFromSource == nil || 244*333d2b36SAndroid Build Coastguard Worker Bool(c.config.productVariables.ReleaseDefaultModuleBuildFromSource) 245*333d2b36SAndroid Build Coastguard Worker} 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseDefaultUpdatableModuleVersion() string { 248*333d2b36SAndroid Build Coastguard Worker if val, exists := c.GetBuildFlag("RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION"); exists { 249*333d2b36SAndroid Build Coastguard Worker return val 250*333d2b36SAndroid Build Coastguard Worker } 251*333d2b36SAndroid Build Coastguard Worker panic("RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION is missing from build flags.") 252*333d2b36SAndroid Build Coastguard Worker} 253*333d2b36SAndroid Build Coastguard Worker 254*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseDisableVerifyOverlaps() bool { 255*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_DISABLE_VERIFY_OVERLAPS_CHECK") 256*333d2b36SAndroid Build Coastguard Worker} 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker// Enables flagged apis annotated with READ_WRITE aconfig flags to be included in the stubs 259*333d2b36SAndroid Build Coastguard Worker// and hiddenapi flags so that they are accessible at runtime 260*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseExportRuntimeApis() bool { 261*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.ExportRuntimeApis) 262*333d2b36SAndroid Build Coastguard Worker} 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Worker// Enables ABI monitoring of NDK libraries 265*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseNdkAbiMonitored() bool { 266*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_NDK_ABI_MONITORED") 267*333d2b36SAndroid Build Coastguard Worker} 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Worker// Enable read flag from new storage, for C/C++ 270*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseReadFromNewStorageCc() bool { 271*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_READ_FROM_NEW_STORAGE_CC") 272*333d2b36SAndroid Build Coastguard Worker} 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseHiddenApiExportableStubs() bool { 275*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_HIDDEN_API_EXPORTABLE_STUBS") || 276*333d2b36SAndroid Build Coastguard Worker Bool(c.config.productVariables.HiddenapiExportableStubs) 277*333d2b36SAndroid Build Coastguard Worker} 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Worker// Enable read flag from new storage 280*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseReadFromNewStorage() bool { 281*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_READ_FROM_NEW_STORAGE") 282*333d2b36SAndroid Build Coastguard Worker} 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseCreateAconfigStorageFile() bool { 285*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_CREATE_ACONFIG_STORAGE_FILE") 286*333d2b36SAndroid Build Coastguard Worker} 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Workerfunc (c Config) ReleaseUseSystemFeatureBuildFlags() bool { 289*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_USE_SYSTEM_FEATURE_BUILD_FLAGS") 290*333d2b36SAndroid Build Coastguard Worker} 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Worker// A DeviceConfig object represents the configuration for a particular device 293*333d2b36SAndroid Build Coastguard Worker// being built. For now there will only be one of these, but in the future there 294*333d2b36SAndroid Build Coastguard Worker// may be multiple devices being built. 295*333d2b36SAndroid Build Coastguard Workertype DeviceConfig struct { 296*333d2b36SAndroid Build Coastguard Worker *deviceConfig 297*333d2b36SAndroid Build Coastguard Worker} 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker// VendorConfig represents the configuration for vendor-specific behavior. 300*333d2b36SAndroid Build Coastguard Workertype VendorConfig soongconfig.SoongConfig 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker// Definition of general build configuration for soong_build. Some of these 303*333d2b36SAndroid Build Coastguard Worker// product configuration values are read from Kati-generated soong.variables. 304*333d2b36SAndroid Build Coastguard Workertype config struct { 305*333d2b36SAndroid Build Coastguard Worker // Options configurable with soong.variables 306*333d2b36SAndroid Build Coastguard Worker productVariables ProductVariables 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker // Only available on configs created by TestConfig 309*333d2b36SAndroid Build Coastguard Worker TestProductVariables *ProductVariables 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker ProductVariablesFileName string 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Worker // BuildOS stores the OsType for the OS that the build is running on. 314*333d2b36SAndroid Build Coastguard Worker BuildOS OsType 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker // BuildArch stores the ArchType for the CPU that the build is running on. 317*333d2b36SAndroid Build Coastguard Worker BuildArch ArchType 318*333d2b36SAndroid Build Coastguard Worker 319*333d2b36SAndroid Build Coastguard Worker Targets map[OsType][]Target 320*333d2b36SAndroid Build Coastguard Worker BuildOSTarget Target // the Target for tools run on the build machine 321*333d2b36SAndroid Build Coastguard Worker BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine 322*333d2b36SAndroid Build Coastguard Worker AndroidCommonTarget Target // the Target for common modules for the Android device 323*333d2b36SAndroid Build Coastguard Worker AndroidFirstDeviceTarget Target // the first Target for modules for the Android device 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker // Flags for Partial Compile, derived from SOONG_PARTIAL_COMPILE. 326*333d2b36SAndroid Build Coastguard Worker partialCompileFlags partialCompileFlags 327*333d2b36SAndroid Build Coastguard Worker 328*333d2b36SAndroid Build Coastguard Worker // multilibConflicts for an ArchType is true if there is earlier configured 329*333d2b36SAndroid Build Coastguard Worker // device architecture with the same multilib value. 330*333d2b36SAndroid Build Coastguard Worker multilibConflicts map[ArchType]bool 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker deviceConfig *deviceConfig 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker outDir string // The output directory (usually out/) 335*333d2b36SAndroid Build Coastguard Worker soongOutDir string 336*333d2b36SAndroid Build Coastguard Worker moduleListFile string // the path to the file which lists blueprint files to parse. 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker runGoTests bool 339*333d2b36SAndroid Build Coastguard Worker 340*333d2b36SAndroid Build Coastguard Worker env map[string]string 341*333d2b36SAndroid Build Coastguard Worker envLock sync.Mutex 342*333d2b36SAndroid Build Coastguard Worker envDeps map[string]string 343*333d2b36SAndroid Build Coastguard Worker envFrozen bool 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker // Changes behavior based on whether Kati runs after soong_build, or if soong_build 346*333d2b36SAndroid Build Coastguard Worker // runs standalone. 347*333d2b36SAndroid Build Coastguard Worker katiEnabled bool 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker captureBuild bool // true for tests, saves build parameters for each module 350*333d2b36SAndroid Build Coastguard Worker ignoreEnvironment bool // true for tests, returns empty from all Getenv calls 351*333d2b36SAndroid Build Coastguard Worker 352*333d2b36SAndroid Build Coastguard Worker fs pathtools.FileSystem 353*333d2b36SAndroid Build Coastguard Worker mockBpList string 354*333d2b36SAndroid Build Coastguard Worker 355*333d2b36SAndroid Build Coastguard Worker BuildMode SoongBuildMode 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Worker // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error 358*333d2b36SAndroid Build Coastguard Worker // in tests when a path doesn't exist. 359*333d2b36SAndroid Build Coastguard Worker TestAllowNonExistentPaths bool 360*333d2b36SAndroid Build Coastguard Worker 361*333d2b36SAndroid Build Coastguard Worker // The list of files that when changed, must invalidate soong_build to 362*333d2b36SAndroid Build Coastguard Worker // regenerate build.ninja. 363*333d2b36SAndroid Build Coastguard Worker ninjaFileDepsSet sync.Map 364*333d2b36SAndroid Build Coastguard Worker 365*333d2b36SAndroid Build Coastguard Worker OncePer 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker // If buildFromSourceStub is true then the Java API stubs are 368*333d2b36SAndroid Build Coastguard Worker // built from the source Java files, not the signature text files. 369*333d2b36SAndroid Build Coastguard Worker buildFromSourceStub bool 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker // If ensureAllowlistIntegrity is true, then the presence of any allowlisted 372*333d2b36SAndroid Build Coastguard Worker // modules that aren't mixed-built for at least one variant will cause a build 373*333d2b36SAndroid Build Coastguard Worker // failure 374*333d2b36SAndroid Build Coastguard Worker ensureAllowlistIntegrity bool 375*333d2b36SAndroid Build Coastguard Worker} 376*333d2b36SAndroid Build Coastguard Worker 377*333d2b36SAndroid Build Coastguard Workertype partialCompileFlags struct { 378*333d2b36SAndroid Build Coastguard Worker // Is partial compilation enabled at all? 379*333d2b36SAndroid Build Coastguard Worker enabled bool 380*333d2b36SAndroid Build Coastguard Worker 381*333d2b36SAndroid Build Coastguard Worker // Whether to use d8 instead of r8 382*333d2b36SAndroid Build Coastguard Worker use_d8 bool 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Worker // Add others as needed. 385*333d2b36SAndroid Build Coastguard Worker} 386*333d2b36SAndroid Build Coastguard Worker 387*333d2b36SAndroid Build Coastguard Workertype deviceConfig struct { 388*333d2b36SAndroid Build Coastguard Worker config *config 389*333d2b36SAndroid Build Coastguard Worker OncePer 390*333d2b36SAndroid Build Coastguard Worker} 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Workertype jsonConfigurable interface { 393*333d2b36SAndroid Build Coastguard Worker SetDefaultConfig() 394*333d2b36SAndroid Build Coastguard Worker} 395*333d2b36SAndroid Build Coastguard Worker 396*333d2b36SAndroid Build Coastguard Worker// Parse SOONG_PARTIAL_COMPILE. 397*333d2b36SAndroid Build Coastguard Worker// 398*333d2b36SAndroid Build Coastguard Worker// SOONG_PARTIAL_COMPILE determines which features are enabled or disabled in 399*333d2b36SAndroid Build Coastguard Worker// rule generation. Changing this environment variable causes reanalysis. 400*333d2b36SAndroid Build Coastguard Worker// 401*333d2b36SAndroid Build Coastguard Worker// SOONG_USE_PARTIAL_COMPILE determines whether or not we **use** PARTIAL_COMPILE. 402*333d2b36SAndroid Build Coastguard Worker// Rule generation must support both cases, since changing it does not cause 403*333d2b36SAndroid Build Coastguard Worker// reanalysis. 404*333d2b36SAndroid Build Coastguard Worker// 405*333d2b36SAndroid Build Coastguard Worker// The user-facing documentation shows: 406*333d2b36SAndroid Build Coastguard Worker// 407*333d2b36SAndroid Build Coastguard Worker// - empty or not set: "The current default state" 408*333d2b36SAndroid Build Coastguard Worker// - "true" or "on": enable all stable partial compile features. 409*333d2b36SAndroid Build Coastguard Worker// - "false" or "off": disable partial compile completely. 410*333d2b36SAndroid Build Coastguard Worker// 411*333d2b36SAndroid Build Coastguard Worker// What we actually allow is a comma separated list of tokens, whose first 412*333d2b36SAndroid Build Coastguard Worker// character may be "+" (enable) or "-" (disable). If neither is present, "+" 413*333d2b36SAndroid Build Coastguard Worker// is assumed. For example, "on,+use_d8" will enable partial compilation, and 414*333d2b36SAndroid Build Coastguard Worker// additionally set the use_d8 flag (regardless of whether it is opt-in or 415*333d2b36SAndroid Build Coastguard Worker// opt-out). 416*333d2b36SAndroid Build Coastguard Worker// 417*333d2b36SAndroid Build Coastguard Worker// To add a new feature to the list, add the field in the struct 418*333d2b36SAndroid Build Coastguard Worker// `partialCompileFlags` above, and then add the name of the field in the 419*333d2b36SAndroid Build Coastguard Worker// switch statement below. 420*333d2b36SAndroid Build Coastguard Workervar defaultPartialCompileFlags = partialCompileFlags{ 421*333d2b36SAndroid Build Coastguard Worker // Set any opt-out flags here. Opt-in flags are off by default. 422*333d2b36SAndroid Build Coastguard Worker enabled: false, 423*333d2b36SAndroid Build Coastguard Worker} 424*333d2b36SAndroid Build Coastguard Worker 425*333d2b36SAndroid Build Coastguard Workerfunc (c *config) parsePartialCompileFlags(isEngBuild bool) (partialCompileFlags, error) { 426*333d2b36SAndroid Build Coastguard Worker if !isEngBuild { 427*333d2b36SAndroid Build Coastguard Worker return partialCompileFlags{}, nil 428*333d2b36SAndroid Build Coastguard Worker } 429*333d2b36SAndroid Build Coastguard Worker value := c.Getenv("SOONG_PARTIAL_COMPILE") 430*333d2b36SAndroid Build Coastguard Worker if value == "" { 431*333d2b36SAndroid Build Coastguard Worker return defaultPartialCompileFlags, nil 432*333d2b36SAndroid Build Coastguard Worker } 433*333d2b36SAndroid Build Coastguard Worker 434*333d2b36SAndroid Build Coastguard Worker ret := defaultPartialCompileFlags 435*333d2b36SAndroid Build Coastguard Worker tokens := strings.Split(strings.ToLower(value), ",") 436*333d2b36SAndroid Build Coastguard Worker makeVal := func(state string, defaultValue bool) bool { 437*333d2b36SAndroid Build Coastguard Worker switch state { 438*333d2b36SAndroid Build Coastguard Worker case "": 439*333d2b36SAndroid Build Coastguard Worker return defaultValue 440*333d2b36SAndroid Build Coastguard Worker case "-": 441*333d2b36SAndroid Build Coastguard Worker return false 442*333d2b36SAndroid Build Coastguard Worker case "+": 443*333d2b36SAndroid Build Coastguard Worker return true 444*333d2b36SAndroid Build Coastguard Worker } 445*333d2b36SAndroid Build Coastguard Worker return false 446*333d2b36SAndroid Build Coastguard Worker } 447*333d2b36SAndroid Build Coastguard Worker for _, tok := range tokens { 448*333d2b36SAndroid Build Coastguard Worker var state string 449*333d2b36SAndroid Build Coastguard Worker if len(tok) == 0 { 450*333d2b36SAndroid Build Coastguard Worker continue 451*333d2b36SAndroid Build Coastguard Worker } 452*333d2b36SAndroid Build Coastguard Worker switch tok[0:1] { 453*333d2b36SAndroid Build Coastguard Worker case "": 454*333d2b36SAndroid Build Coastguard Worker // Ignore empty tokens. 455*333d2b36SAndroid Build Coastguard Worker continue 456*333d2b36SAndroid Build Coastguard Worker case "-", "+": 457*333d2b36SAndroid Build Coastguard Worker state = tok[0:1] 458*333d2b36SAndroid Build Coastguard Worker tok = tok[1:] 459*333d2b36SAndroid Build Coastguard Worker default: 460*333d2b36SAndroid Build Coastguard Worker // Treat `feature` as `+feature`. 461*333d2b36SAndroid Build Coastguard Worker state = "+" 462*333d2b36SAndroid Build Coastguard Worker } 463*333d2b36SAndroid Build Coastguard Worker switch tok { 464*333d2b36SAndroid Build Coastguard Worker case "true": 465*333d2b36SAndroid Build Coastguard Worker ret = defaultPartialCompileFlags 466*333d2b36SAndroid Build Coastguard Worker ret.enabled = true 467*333d2b36SAndroid Build Coastguard Worker case "false": 468*333d2b36SAndroid Build Coastguard Worker // Set everything to false. 469*333d2b36SAndroid Build Coastguard Worker ret = partialCompileFlags{} 470*333d2b36SAndroid Build Coastguard Worker case "enabled": 471*333d2b36SAndroid Build Coastguard Worker ret.enabled = makeVal(state, defaultPartialCompileFlags.enabled) 472*333d2b36SAndroid Build Coastguard Worker case "use_d8": 473*333d2b36SAndroid Build Coastguard Worker ret.use_d8 = makeVal(state, defaultPartialCompileFlags.use_d8) 474*333d2b36SAndroid Build Coastguard Worker default: 475*333d2b36SAndroid Build Coastguard Worker return partialCompileFlags{}, fmt.Errorf("Unknown SOONG_PARTIAL_COMPILE value: %v", tok) 476*333d2b36SAndroid Build Coastguard Worker } 477*333d2b36SAndroid Build Coastguard Worker } 478*333d2b36SAndroid Build Coastguard Worker return ret, nil 479*333d2b36SAndroid Build Coastguard Worker} 480*333d2b36SAndroid Build Coastguard Worker 481*333d2b36SAndroid Build Coastguard Workerfunc loadConfig(config *config) error { 482*333d2b36SAndroid Build Coastguard Worker return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName)) 483*333d2b36SAndroid Build Coastguard Worker} 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker// Checks if the string is a valid go identifier. This is equivalent to blueprint's definition 486*333d2b36SAndroid Build Coastguard Worker// of an identifier, so it will match the same identifiers as those that can be used in bp files. 487*333d2b36SAndroid Build Coastguard Workerfunc isGoIdentifier(ident string) bool { 488*333d2b36SAndroid Build Coastguard Worker for i, r := range ident { 489*333d2b36SAndroid Build Coastguard Worker valid := r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r) && i > 0 490*333d2b36SAndroid Build Coastguard Worker if !valid { 491*333d2b36SAndroid Build Coastguard Worker return false 492*333d2b36SAndroid Build Coastguard Worker } 493*333d2b36SAndroid Build Coastguard Worker } 494*333d2b36SAndroid Build Coastguard Worker return len(ident) > 0 495*333d2b36SAndroid Build Coastguard Worker} 496*333d2b36SAndroid Build Coastguard Worker 497*333d2b36SAndroid Build Coastguard Worker// loadFromConfigFile loads and decodes configuration options from a JSON file 498*333d2b36SAndroid Build Coastguard Worker// in the current working directory. 499*333d2b36SAndroid Build Coastguard Workerfunc loadFromConfigFile(configurable *ProductVariables, filename string) error { 500*333d2b36SAndroid Build Coastguard Worker // Try to open the file 501*333d2b36SAndroid Build Coastguard Worker configFileReader, err := os.Open(filename) 502*333d2b36SAndroid Build Coastguard Worker defer configFileReader.Close() 503*333d2b36SAndroid Build Coastguard Worker if os.IsNotExist(err) { 504*333d2b36SAndroid Build Coastguard Worker // Need to create a file, so that blueprint & ninja don't get in 505*333d2b36SAndroid Build Coastguard Worker // a dependency tracking loop. 506*333d2b36SAndroid Build Coastguard Worker // Make a file-configurable-options with defaults, write it out using 507*333d2b36SAndroid Build Coastguard Worker // a json writer. 508*333d2b36SAndroid Build Coastguard Worker configurable.SetDefaultConfig() 509*333d2b36SAndroid Build Coastguard Worker err = saveToConfigFile(configurable, filename) 510*333d2b36SAndroid Build Coastguard Worker if err != nil { 511*333d2b36SAndroid Build Coastguard Worker return err 512*333d2b36SAndroid Build Coastguard Worker } 513*333d2b36SAndroid Build Coastguard Worker } else if err != nil { 514*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("config file: could not open %s: %s", filename, err.Error()) 515*333d2b36SAndroid Build Coastguard Worker } else { 516*333d2b36SAndroid Build Coastguard Worker // Make a decoder for it 517*333d2b36SAndroid Build Coastguard Worker jsonDecoder := json.NewDecoder(configFileReader) 518*333d2b36SAndroid Build Coastguard Worker jsonDecoder.DisallowUnknownFields() 519*333d2b36SAndroid Build Coastguard Worker err = jsonDecoder.Decode(configurable) 520*333d2b36SAndroid Build Coastguard Worker if err != nil { 521*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error()) 522*333d2b36SAndroid Build Coastguard Worker } 523*333d2b36SAndroid Build Coastguard Worker } 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Worker if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) { 526*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set") 527*333d2b36SAndroid Build Coastguard Worker } 528*333d2b36SAndroid Build Coastguard Worker 529*333d2b36SAndroid Build Coastguard Worker configurable.Native_coverage = proptools.BoolPtr( 530*333d2b36SAndroid Build Coastguard Worker Bool(configurable.GcovCoverage) || 531*333d2b36SAndroid Build Coastguard Worker Bool(configurable.ClangCoverage)) 532*333d2b36SAndroid Build Coastguard Worker 533*333d2b36SAndroid Build Coastguard Worker // The go scanner's definition of identifiers is c-style identifiers, but allowing unicode's 534*333d2b36SAndroid Build Coastguard Worker // definition of letters and digits. This is the same scanner that blueprint uses, so it 535*333d2b36SAndroid Build Coastguard Worker // will allow the same identifiers as are valid in bp files. 536*333d2b36SAndroid Build Coastguard Worker for namespace := range configurable.VendorVars { 537*333d2b36SAndroid Build Coastguard Worker if !isGoIdentifier(namespace) { 538*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("soong config namespaces must be valid identifiers: %q", namespace) 539*333d2b36SAndroid Build Coastguard Worker } 540*333d2b36SAndroid Build Coastguard Worker for variable := range configurable.VendorVars[namespace] { 541*333d2b36SAndroid Build Coastguard Worker if !isGoIdentifier(variable) { 542*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("soong config variables must be valid identifiers: %q", variable) 543*333d2b36SAndroid Build Coastguard Worker } 544*333d2b36SAndroid Build Coastguard Worker } 545*333d2b36SAndroid Build Coastguard Worker } 546*333d2b36SAndroid Build Coastguard Worker 547*333d2b36SAndroid Build Coastguard Worker // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version; 548*333d2b36SAndroid Build Coastguard Worker // if false (pre-released version, for example), use Platform_sdk_codename. 549*333d2b36SAndroid Build Coastguard Worker if Bool(configurable.Platform_sdk_final) { 550*333d2b36SAndroid Build Coastguard Worker if configurable.Platform_sdk_version != nil { 551*333d2b36SAndroid Build Coastguard Worker configurable.Platform_sdk_version_or_codename = 552*333d2b36SAndroid Build Coastguard Worker proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version))) 553*333d2b36SAndroid Build Coastguard Worker } else { 554*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer") 555*333d2b36SAndroid Build Coastguard Worker } 556*333d2b36SAndroid Build Coastguard Worker } else { 557*333d2b36SAndroid Build Coastguard Worker configurable.Platform_sdk_version_or_codename = 558*333d2b36SAndroid Build Coastguard Worker proptools.StringPtr(String(configurable.Platform_sdk_codename)) 559*333d2b36SAndroid Build Coastguard Worker } 560*333d2b36SAndroid Build Coastguard Worker 561*333d2b36SAndroid Build Coastguard Worker return nil 562*333d2b36SAndroid Build Coastguard Worker} 563*333d2b36SAndroid Build Coastguard Worker 564*333d2b36SAndroid Build Coastguard Worker// atomically writes the config file in case two copies of soong_build are running simultaneously 565*333d2b36SAndroid Build Coastguard Worker// (for example, docs generation and ninja manifest generation) 566*333d2b36SAndroid Build Coastguard Workerfunc saveToConfigFile(config *ProductVariables, filename string) error { 567*333d2b36SAndroid Build Coastguard Worker data, err := json.MarshalIndent(&config, "", " ") 568*333d2b36SAndroid Build Coastguard Worker if err != nil { 569*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("cannot marshal config data: %s", err.Error()) 570*333d2b36SAndroid Build Coastguard Worker } 571*333d2b36SAndroid Build Coastguard Worker 572*333d2b36SAndroid Build Coastguard Worker f, err := os.CreateTemp(filepath.Dir(filename), "config") 573*333d2b36SAndroid Build Coastguard Worker if err != nil { 574*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error()) 575*333d2b36SAndroid Build Coastguard Worker } 576*333d2b36SAndroid Build Coastguard Worker defer os.Remove(f.Name()) 577*333d2b36SAndroid Build Coastguard Worker defer f.Close() 578*333d2b36SAndroid Build Coastguard Worker 579*333d2b36SAndroid Build Coastguard Worker _, err = f.Write(data) 580*333d2b36SAndroid Build Coastguard Worker if err != nil { 581*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error()) 582*333d2b36SAndroid Build Coastguard Worker } 583*333d2b36SAndroid Build Coastguard Worker 584*333d2b36SAndroid Build Coastguard Worker _, err = f.WriteString("\n") 585*333d2b36SAndroid Build Coastguard Worker if err != nil { 586*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error()) 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker f.Close() 590*333d2b36SAndroid Build Coastguard Worker os.Rename(f.Name(), filename) 591*333d2b36SAndroid Build Coastguard Worker 592*333d2b36SAndroid Build Coastguard Worker return nil 593*333d2b36SAndroid Build Coastguard Worker} 594*333d2b36SAndroid Build Coastguard Worker 595*333d2b36SAndroid Build Coastguard Worker// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that 596*333d2b36SAndroid Build Coastguard Worker// use the android package. 597*333d2b36SAndroid Build Coastguard Workerfunc NullConfig(outDir, soongOutDir string) Config { 598*333d2b36SAndroid Build Coastguard Worker return Config{ 599*333d2b36SAndroid Build Coastguard Worker config: &config{ 600*333d2b36SAndroid Build Coastguard Worker outDir: outDir, 601*333d2b36SAndroid Build Coastguard Worker soongOutDir: soongOutDir, 602*333d2b36SAndroid Build Coastguard Worker fs: pathtools.OsFs, 603*333d2b36SAndroid Build Coastguard Worker }, 604*333d2b36SAndroid Build Coastguard Worker } 605*333d2b36SAndroid Build Coastguard Worker} 606*333d2b36SAndroid Build Coastguard Worker 607*333d2b36SAndroid Build Coastguard Worker// NewConfig creates a new Config object. The srcDir argument specifies the path 608*333d2b36SAndroid Build Coastguard Worker// to the root source directory. It also loads the config file, if found. 609*333d2b36SAndroid Build Coastguard Workerfunc NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) { 610*333d2b36SAndroid Build Coastguard Worker // Make a config with default options. 611*333d2b36SAndroid Build Coastguard Worker config := &config{ 612*333d2b36SAndroid Build Coastguard Worker ProductVariablesFileName: cmdArgs.SoongVariables, 613*333d2b36SAndroid Build Coastguard Worker 614*333d2b36SAndroid Build Coastguard Worker env: availableEnv, 615*333d2b36SAndroid Build Coastguard Worker 616*333d2b36SAndroid Build Coastguard Worker outDir: cmdArgs.OutDir, 617*333d2b36SAndroid Build Coastguard Worker soongOutDir: cmdArgs.SoongOutDir, 618*333d2b36SAndroid Build Coastguard Worker runGoTests: cmdArgs.RunGoTests, 619*333d2b36SAndroid Build Coastguard Worker multilibConflicts: make(map[ArchType]bool), 620*333d2b36SAndroid Build Coastguard Worker 621*333d2b36SAndroid Build Coastguard Worker moduleListFile: cmdArgs.ModuleListFile, 622*333d2b36SAndroid Build Coastguard Worker fs: pathtools.NewOsFs(absSrcDir), 623*333d2b36SAndroid Build Coastguard Worker 624*333d2b36SAndroid Build Coastguard Worker buildFromSourceStub: cmdArgs.BuildFromSourceStub, 625*333d2b36SAndroid Build Coastguard Worker } 626*333d2b36SAndroid Build Coastguard Worker variant, ok := os.LookupEnv("TARGET_BUILD_VARIANT") 627*333d2b36SAndroid Build Coastguard Worker isEngBuild := !ok || variant == "eng" 628*333d2b36SAndroid Build Coastguard Worker 629*333d2b36SAndroid Build Coastguard Worker config.deviceConfig = &deviceConfig{ 630*333d2b36SAndroid Build Coastguard Worker config: config, 631*333d2b36SAndroid Build Coastguard Worker } 632*333d2b36SAndroid Build Coastguard Worker 633*333d2b36SAndroid Build Coastguard Worker // Soundness check of the build and source directories. This won't catch strange 634*333d2b36SAndroid Build Coastguard Worker // configurations with symlinks, but at least checks the obvious case. 635*333d2b36SAndroid Build Coastguard Worker absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir) 636*333d2b36SAndroid Build Coastguard Worker if err != nil { 637*333d2b36SAndroid Build Coastguard Worker return Config{}, err 638*333d2b36SAndroid Build Coastguard Worker } 639*333d2b36SAndroid Build Coastguard Worker 640*333d2b36SAndroid Build Coastguard Worker absSrcDir, err := filepath.Abs(".") 641*333d2b36SAndroid Build Coastguard Worker if err != nil { 642*333d2b36SAndroid Build Coastguard Worker return Config{}, err 643*333d2b36SAndroid Build Coastguard Worker } 644*333d2b36SAndroid Build Coastguard Worker 645*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(absSrcDir, absBuildDir) { 646*333d2b36SAndroid Build Coastguard Worker return Config{}, fmt.Errorf("Build dir must not contain source directory") 647*333d2b36SAndroid Build Coastguard Worker } 648*333d2b36SAndroid Build Coastguard Worker 649*333d2b36SAndroid Build Coastguard Worker // Load any configurable options from the configuration file 650*333d2b36SAndroid Build Coastguard Worker err = loadConfig(config) 651*333d2b36SAndroid Build Coastguard Worker if err != nil { 652*333d2b36SAndroid Build Coastguard Worker return Config{}, err 653*333d2b36SAndroid Build Coastguard Worker } 654*333d2b36SAndroid Build Coastguard Worker 655*333d2b36SAndroid Build Coastguard Worker KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled") 656*333d2b36SAndroid Build Coastguard Worker if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil { 657*333d2b36SAndroid Build Coastguard Worker config.katiEnabled = true 658*333d2b36SAndroid Build Coastguard Worker } 659*333d2b36SAndroid Build Coastguard Worker 660*333d2b36SAndroid Build Coastguard Worker determineBuildOS(config) 661*333d2b36SAndroid Build Coastguard Worker 662*333d2b36SAndroid Build Coastguard Worker // Sets up the map of target OSes to the finer grained compilation targets 663*333d2b36SAndroid Build Coastguard Worker // that are configured from the product variables. 664*333d2b36SAndroid Build Coastguard Worker targets, err := decodeTargetProductVariables(config) 665*333d2b36SAndroid Build Coastguard Worker if err != nil { 666*333d2b36SAndroid Build Coastguard Worker return Config{}, err 667*333d2b36SAndroid Build Coastguard Worker } 668*333d2b36SAndroid Build Coastguard Worker 669*333d2b36SAndroid Build Coastguard Worker config.partialCompileFlags, err = config.parsePartialCompileFlags(isEngBuild) 670*333d2b36SAndroid Build Coastguard Worker if err != nil { 671*333d2b36SAndroid Build Coastguard Worker return Config{}, err 672*333d2b36SAndroid Build Coastguard Worker } 673*333d2b36SAndroid Build Coastguard Worker 674*333d2b36SAndroid Build Coastguard Worker // Make the CommonOS OsType available for all products. 675*333d2b36SAndroid Build Coastguard Worker targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]} 676*333d2b36SAndroid Build Coastguard Worker 677*333d2b36SAndroid Build Coastguard Worker var archConfig []archConfig 678*333d2b36SAndroid Build Coastguard Worker if config.NdkAbis() { 679*333d2b36SAndroid Build Coastguard Worker archConfig = getNdkAbisConfig() 680*333d2b36SAndroid Build Coastguard Worker } else if config.AmlAbis() { 681*333d2b36SAndroid Build Coastguard Worker archConfig = getAmlAbisConfig() 682*333d2b36SAndroid Build Coastguard Worker } 683*333d2b36SAndroid Build Coastguard Worker 684*333d2b36SAndroid Build Coastguard Worker if archConfig != nil { 685*333d2b36SAndroid Build Coastguard Worker androidTargets, err := decodeAndroidArchSettings(archConfig) 686*333d2b36SAndroid Build Coastguard Worker if err != nil { 687*333d2b36SAndroid Build Coastguard Worker return Config{}, err 688*333d2b36SAndroid Build Coastguard Worker } 689*333d2b36SAndroid Build Coastguard Worker targets[Android] = androidTargets 690*333d2b36SAndroid Build Coastguard Worker } 691*333d2b36SAndroid Build Coastguard Worker 692*333d2b36SAndroid Build Coastguard Worker multilib := make(map[string]bool) 693*333d2b36SAndroid Build Coastguard Worker for _, target := range targets[Android] { 694*333d2b36SAndroid Build Coastguard Worker if seen := multilib[target.Arch.ArchType.Multilib]; seen { 695*333d2b36SAndroid Build Coastguard Worker config.multilibConflicts[target.Arch.ArchType] = true 696*333d2b36SAndroid Build Coastguard Worker } 697*333d2b36SAndroid Build Coastguard Worker multilib[target.Arch.ArchType.Multilib] = true 698*333d2b36SAndroid Build Coastguard Worker } 699*333d2b36SAndroid Build Coastguard Worker 700*333d2b36SAndroid Build Coastguard Worker // Map of OS to compilation targets. 701*333d2b36SAndroid Build Coastguard Worker config.Targets = targets 702*333d2b36SAndroid Build Coastguard Worker 703*333d2b36SAndroid Build Coastguard Worker // Compilation targets for host tools. 704*333d2b36SAndroid Build Coastguard Worker config.BuildOSTarget = config.Targets[config.BuildOS][0] 705*333d2b36SAndroid Build Coastguard Worker config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0] 706*333d2b36SAndroid Build Coastguard Worker 707*333d2b36SAndroid Build Coastguard Worker // Compilation targets for Android. 708*333d2b36SAndroid Build Coastguard Worker if len(config.Targets[Android]) > 0 { 709*333d2b36SAndroid Build Coastguard Worker config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0] 710*333d2b36SAndroid Build Coastguard Worker config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0] 711*333d2b36SAndroid Build Coastguard Worker } 712*333d2b36SAndroid Build Coastguard Worker 713*333d2b36SAndroid Build Coastguard Worker setBuildMode := func(arg string, mode SoongBuildMode) { 714*333d2b36SAndroid Build Coastguard Worker if arg != "" { 715*333d2b36SAndroid Build Coastguard Worker if config.BuildMode != AnalysisNoBazel { 716*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg) 717*333d2b36SAndroid Build Coastguard Worker os.Exit(1) 718*333d2b36SAndroid Build Coastguard Worker } 719*333d2b36SAndroid Build Coastguard Worker config.BuildMode = mode 720*333d2b36SAndroid Build Coastguard Worker } 721*333d2b36SAndroid Build Coastguard Worker } 722*333d2b36SAndroid Build Coastguard Worker setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph) 723*333d2b36SAndroid Build Coastguard Worker setBuildMode(cmdArgs.DocFile, GenerateDocFile) 724*333d2b36SAndroid Build Coastguard Worker 725*333d2b36SAndroid Build Coastguard Worker config.productVariables.Build_from_text_stub = boolPtr(config.BuildFromTextStub()) 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker return Config{config}, err 728*333d2b36SAndroid Build Coastguard Worker} 729*333d2b36SAndroid Build Coastguard Worker 730*333d2b36SAndroid Build Coastguard Worker// mockFileSystem replaces all reads with accesses to the provided map of 731*333d2b36SAndroid Build Coastguard Worker// filenames to contents stored as a byte slice. 732*333d2b36SAndroid Build Coastguard Workerfunc (c *config) mockFileSystem(bp string, fs map[string][]byte) { 733*333d2b36SAndroid Build Coastguard Worker mockFS := map[string][]byte{} 734*333d2b36SAndroid Build Coastguard Worker 735*333d2b36SAndroid Build Coastguard Worker if _, exists := mockFS["Android.bp"]; !exists { 736*333d2b36SAndroid Build Coastguard Worker mockFS["Android.bp"] = []byte(bp) 737*333d2b36SAndroid Build Coastguard Worker } 738*333d2b36SAndroid Build Coastguard Worker 739*333d2b36SAndroid Build Coastguard Worker for k, v := range fs { 740*333d2b36SAndroid Build Coastguard Worker mockFS[k] = v 741*333d2b36SAndroid Build Coastguard Worker } 742*333d2b36SAndroid Build Coastguard Worker 743*333d2b36SAndroid Build Coastguard Worker // no module list file specified; find every file named Blueprints or Android.bp 744*333d2b36SAndroid Build Coastguard Worker pathsToParse := []string{} 745*333d2b36SAndroid Build Coastguard Worker for candidate := range mockFS { 746*333d2b36SAndroid Build Coastguard Worker base := filepath.Base(candidate) 747*333d2b36SAndroid Build Coastguard Worker if base == "Android.bp" { 748*333d2b36SAndroid Build Coastguard Worker pathsToParse = append(pathsToParse, candidate) 749*333d2b36SAndroid Build Coastguard Worker } 750*333d2b36SAndroid Build Coastguard Worker } 751*333d2b36SAndroid Build Coastguard Worker if len(pathsToParse) < 1 { 752*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS)) 753*333d2b36SAndroid Build Coastguard Worker } 754*333d2b36SAndroid Build Coastguard Worker mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n")) 755*333d2b36SAndroid Build Coastguard Worker 756*333d2b36SAndroid Build Coastguard Worker c.fs = pathtools.MockFs(mockFS) 757*333d2b36SAndroid Build Coastguard Worker c.mockBpList = blueprint.MockModuleListFile 758*333d2b36SAndroid Build Coastguard Worker} 759*333d2b36SAndroid Build Coastguard Worker 760*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SetAllowMissingDependencies() { 761*333d2b36SAndroid Build Coastguard Worker c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true) 762*333d2b36SAndroid Build Coastguard Worker} 763*333d2b36SAndroid Build Coastguard Worker 764*333d2b36SAndroid Build Coastguard Worker// BlueprintToolLocation returns the directory containing build system tools 765*333d2b36SAndroid Build Coastguard Worker// from Blueprint, like soong_zip and merge_zips. 766*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HostToolDir() string { 767*333d2b36SAndroid Build Coastguard Worker if c.KatiEnabled() { 768*333d2b36SAndroid Build Coastguard Worker return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin") 769*333d2b36SAndroid Build Coastguard Worker } else { 770*333d2b36SAndroid Build Coastguard Worker return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin") 771*333d2b36SAndroid Build Coastguard Worker } 772*333d2b36SAndroid Build Coastguard Worker} 773*333d2b36SAndroid Build Coastguard Worker 774*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HostToolPath(ctx PathContext, tool string) Path { 775*333d2b36SAndroid Build Coastguard Worker path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", tool) 776*333d2b36SAndroid Build Coastguard Worker return path 777*333d2b36SAndroid Build Coastguard Worker} 778*333d2b36SAndroid Build Coastguard Worker 779*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HostJNIToolPath(ctx PathContext, lib string) Path { 780*333d2b36SAndroid Build Coastguard Worker ext := ".so" 781*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" { 782*333d2b36SAndroid Build Coastguard Worker ext = ".dylib" 783*333d2b36SAndroid Build Coastguard Worker } 784*333d2b36SAndroid Build Coastguard Worker path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", lib+ext) 785*333d2b36SAndroid Build Coastguard Worker return path 786*333d2b36SAndroid Build Coastguard Worker} 787*333d2b36SAndroid Build Coastguard Worker 788*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HostJavaToolPath(ctx PathContext, tool string) Path { 789*333d2b36SAndroid Build Coastguard Worker path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", tool) 790*333d2b36SAndroid Build Coastguard Worker return path 791*333d2b36SAndroid Build Coastguard Worker} 792*333d2b36SAndroid Build Coastguard Worker 793*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HostCcSharedLibPath(ctx PathContext, lib string) Path { 794*333d2b36SAndroid Build Coastguard Worker libDir := "lib" 795*333d2b36SAndroid Build Coastguard Worker if ctx.Config().BuildArch.Multilib == "lib64" { 796*333d2b36SAndroid Build Coastguard Worker libDir = "lib64" 797*333d2b36SAndroid Build Coastguard Worker } 798*333d2b36SAndroid Build Coastguard Worker return pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, libDir, lib+".so") 799*333d2b36SAndroid Build Coastguard Worker} 800*333d2b36SAndroid Build Coastguard Worker 801*333d2b36SAndroid Build Coastguard Worker// PrebuiltOS returns the name of the host OS used in prebuilts directories. 802*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PrebuiltOS() string { 803*333d2b36SAndroid Build Coastguard Worker switch runtime.GOOS { 804*333d2b36SAndroid Build Coastguard Worker case "linux": 805*333d2b36SAndroid Build Coastguard Worker return "linux-x86" 806*333d2b36SAndroid Build Coastguard Worker case "darwin": 807*333d2b36SAndroid Build Coastguard Worker return "darwin-x86" 808*333d2b36SAndroid Build Coastguard Worker default: 809*333d2b36SAndroid Build Coastguard Worker panic("Unknown GOOS") 810*333d2b36SAndroid Build Coastguard Worker } 811*333d2b36SAndroid Build Coastguard Worker} 812*333d2b36SAndroid Build Coastguard Worker 813*333d2b36SAndroid Build Coastguard Worker// GoRoot returns the path to the root directory of the Go toolchain. 814*333d2b36SAndroid Build Coastguard Workerfunc (c *config) GoRoot() string { 815*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS()) 816*333d2b36SAndroid Build Coastguard Worker} 817*333d2b36SAndroid Build Coastguard Worker 818*333d2b36SAndroid Build Coastguard Worker// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing 819*333d2b36SAndroid Build Coastguard Worker// checked-in tools, like Kati, Ninja or Toybox, for the current host OS. 820*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path { 821*333d2b36SAndroid Build Coastguard Worker return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool) 822*333d2b36SAndroid Build Coastguard Worker} 823*333d2b36SAndroid Build Coastguard Worker 824*333d2b36SAndroid Build Coastguard Worker// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command 825*333d2b36SAndroid Build Coastguard Worker// to preserve symlinks. 826*333d2b36SAndroid Build Coastguard Workerfunc (c *config) CpPreserveSymlinksFlags() string { 827*333d2b36SAndroid Build Coastguard Worker switch runtime.GOOS { 828*333d2b36SAndroid Build Coastguard Worker case "darwin": 829*333d2b36SAndroid Build Coastguard Worker return "-R" 830*333d2b36SAndroid Build Coastguard Worker case "linux": 831*333d2b36SAndroid Build Coastguard Worker return "-d" 832*333d2b36SAndroid Build Coastguard Worker default: 833*333d2b36SAndroid Build Coastguard Worker return "" 834*333d2b36SAndroid Build Coastguard Worker } 835*333d2b36SAndroid Build Coastguard Worker} 836*333d2b36SAndroid Build Coastguard Worker 837*333d2b36SAndroid Build Coastguard Workerfunc (c *config) Getenv(key string) string { 838*333d2b36SAndroid Build Coastguard Worker var val string 839*333d2b36SAndroid Build Coastguard Worker var exists bool 840*333d2b36SAndroid Build Coastguard Worker c.envLock.Lock() 841*333d2b36SAndroid Build Coastguard Worker defer c.envLock.Unlock() 842*333d2b36SAndroid Build Coastguard Worker if c.envDeps == nil { 843*333d2b36SAndroid Build Coastguard Worker c.envDeps = make(map[string]string) 844*333d2b36SAndroid Build Coastguard Worker } 845*333d2b36SAndroid Build Coastguard Worker if val, exists = c.envDeps[key]; !exists { 846*333d2b36SAndroid Build Coastguard Worker if c.envFrozen { 847*333d2b36SAndroid Build Coastguard Worker panic("Cannot access new environment variables after envdeps are frozen") 848*333d2b36SAndroid Build Coastguard Worker } 849*333d2b36SAndroid Build Coastguard Worker val, _ = c.env[key] 850*333d2b36SAndroid Build Coastguard Worker c.envDeps[key] = val 851*333d2b36SAndroid Build Coastguard Worker } 852*333d2b36SAndroid Build Coastguard Worker return val 853*333d2b36SAndroid Build Coastguard Worker} 854*333d2b36SAndroid Build Coastguard Worker 855*333d2b36SAndroid Build Coastguard Workerfunc (c *config) GetenvWithDefault(key string, defaultValue string) string { 856*333d2b36SAndroid Build Coastguard Worker ret := c.Getenv(key) 857*333d2b36SAndroid Build Coastguard Worker if ret == "" { 858*333d2b36SAndroid Build Coastguard Worker return defaultValue 859*333d2b36SAndroid Build Coastguard Worker } 860*333d2b36SAndroid Build Coastguard Worker return ret 861*333d2b36SAndroid Build Coastguard Worker} 862*333d2b36SAndroid Build Coastguard Worker 863*333d2b36SAndroid Build Coastguard Workerfunc (c *config) IsEnvTrue(key string) bool { 864*333d2b36SAndroid Build Coastguard Worker value := strings.ToLower(c.Getenv(key)) 865*333d2b36SAndroid Build Coastguard Worker return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true" 866*333d2b36SAndroid Build Coastguard Worker} 867*333d2b36SAndroid Build Coastguard Worker 868*333d2b36SAndroid Build Coastguard Workerfunc (c *config) IsEnvFalse(key string) bool { 869*333d2b36SAndroid Build Coastguard Worker value := strings.ToLower(c.Getenv(key)) 870*333d2b36SAndroid Build Coastguard Worker return value == "0" || value == "n" || value == "no" || value == "off" || value == "false" 871*333d2b36SAndroid Build Coastguard Worker} 872*333d2b36SAndroid Build Coastguard Worker 873*333d2b36SAndroid Build Coastguard Workerfunc (c *config) TargetsJava21() bool { 874*333d2b36SAndroid Build Coastguard Worker return c.productVariables.GetBuildFlagBool("RELEASE_TARGET_JAVA_21") 875*333d2b36SAndroid Build Coastguard Worker} 876*333d2b36SAndroid Build Coastguard Worker 877*333d2b36SAndroid Build Coastguard Worker// EnvDeps returns the environment variables this build depends on. The first 878*333d2b36SAndroid Build Coastguard Worker// call to this function blocks future reads from the environment. 879*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnvDeps() map[string]string { 880*333d2b36SAndroid Build Coastguard Worker c.envLock.Lock() 881*333d2b36SAndroid Build Coastguard Worker defer c.envLock.Unlock() 882*333d2b36SAndroid Build Coastguard Worker c.envFrozen = true 883*333d2b36SAndroid Build Coastguard Worker return c.envDeps 884*333d2b36SAndroid Build Coastguard Worker} 885*333d2b36SAndroid Build Coastguard Worker 886*333d2b36SAndroid Build Coastguard Workerfunc (c *config) KatiEnabled() bool { 887*333d2b36SAndroid Build Coastguard Worker return c.katiEnabled 888*333d2b36SAndroid Build Coastguard Worker} 889*333d2b36SAndroid Build Coastguard Worker 890*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductVariables() ProductVariables { 891*333d2b36SAndroid Build Coastguard Worker return c.productVariables 892*333d2b36SAndroid Build Coastguard Worker} 893*333d2b36SAndroid Build Coastguard Worker 894*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildId() string { 895*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.BuildId) 896*333d2b36SAndroid Build Coastguard Worker} 897*333d2b36SAndroid Build Coastguard Worker 898*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DisplayBuildNumber() bool { 899*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.DisplayBuildNumber) 900*333d2b36SAndroid Build Coastguard Worker} 901*333d2b36SAndroid Build Coastguard Worker 902*333d2b36SAndroid Build Coastguard Worker// BuildFingerprintFile returns the path to a text file containing metadata 903*333d2b36SAndroid Build Coastguard Worker// representing the current build's fingerprint. 904*333d2b36SAndroid Build Coastguard Worker// 905*333d2b36SAndroid Build Coastguard Worker// Rules that want to reference the build fingerprint should read from this file 906*333d2b36SAndroid Build Coastguard Worker// without depending on it. They will run whenever their other dependencies 907*333d2b36SAndroid Build Coastguard Worker// require them to run and get the current build fingerprint. This ensures they 908*333d2b36SAndroid Build Coastguard Worker// don't rebuild on every incremental build when the build number changes. 909*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildFingerprintFile(ctx PathContext) Path { 910*333d2b36SAndroid Build Coastguard Worker return PathForArbitraryOutput(ctx, "target", "product", c.DeviceName(), String(c.productVariables.BuildFingerprintFile)) 911*333d2b36SAndroid Build Coastguard Worker} 912*333d2b36SAndroid Build Coastguard Worker 913*333d2b36SAndroid Build Coastguard Worker// BuildNumberFile returns the path to a text file containing metadata 914*333d2b36SAndroid Build Coastguard Worker// representing the current build's number. 915*333d2b36SAndroid Build Coastguard Worker// 916*333d2b36SAndroid Build Coastguard Worker// Rules that want to reference the build number should read from this file 917*333d2b36SAndroid Build Coastguard Worker// without depending on it. They will run whenever their other dependencies 918*333d2b36SAndroid Build Coastguard Worker// require them to run and get the current build number. This ensures they don't 919*333d2b36SAndroid Build Coastguard Worker// rebuild on every incremental build when the build number changes. 920*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildNumberFile(ctx PathContext) Path { 921*333d2b36SAndroid Build Coastguard Worker return PathForOutput(ctx, String(c.productVariables.BuildNumberFile)) 922*333d2b36SAndroid Build Coastguard Worker} 923*333d2b36SAndroid Build Coastguard Worker 924*333d2b36SAndroid Build Coastguard Worker// BuildHostnameFile returns the path to a text file containing metadata 925*333d2b36SAndroid Build Coastguard Worker// representing the current build's host name. 926*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildHostnameFile(ctx PathContext) Path { 927*333d2b36SAndroid Build Coastguard Worker return PathForOutput(ctx, String(c.productVariables.BuildHostnameFile)) 928*333d2b36SAndroid Build Coastguard Worker} 929*333d2b36SAndroid Build Coastguard Worker 930*333d2b36SAndroid Build Coastguard Worker// BuildThumbprintFile returns the path to a text file containing metadata 931*333d2b36SAndroid Build Coastguard Worker// representing the current build's thumbprint. 932*333d2b36SAndroid Build Coastguard Worker// 933*333d2b36SAndroid Build Coastguard Worker// Rules that want to reference the build thumbprint should read from this file 934*333d2b36SAndroid Build Coastguard Worker// without depending on it. They will run whenever their other dependencies 935*333d2b36SAndroid Build Coastguard Worker// require them to run and get the current build thumbprint. This ensures they 936*333d2b36SAndroid Build Coastguard Worker// don't rebuild on every incremental build when the build thumbprint changes. 937*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildThumbprintFile(ctx PathContext) Path { 938*333d2b36SAndroid Build Coastguard Worker return PathForArbitraryOutput(ctx, "target", "product", c.DeviceName(), String(c.productVariables.BuildThumbprintFile)) 939*333d2b36SAndroid Build Coastguard Worker} 940*333d2b36SAndroid Build Coastguard Worker 941*333d2b36SAndroid Build Coastguard Worker// DeviceName returns the name of the current device target. 942*333d2b36SAndroid Build Coastguard Worker// TODO: take an AndroidModuleContext to select the device name for multi-device builds 943*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceName() string { 944*333d2b36SAndroid Build Coastguard Worker return *c.productVariables.DeviceName 945*333d2b36SAndroid Build Coastguard Worker} 946*333d2b36SAndroid Build Coastguard Worker 947*333d2b36SAndroid Build Coastguard Worker// DeviceProduct returns the current product target. There could be multiple of 948*333d2b36SAndroid Build Coastguard Worker// these per device type. 949*333d2b36SAndroid Build Coastguard Worker// 950*333d2b36SAndroid Build Coastguard Worker// NOTE: Do not base conditional logic on this value. It may break product inheritance. 951*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceProduct() string { 952*333d2b36SAndroid Build Coastguard Worker return *c.productVariables.DeviceProduct 953*333d2b36SAndroid Build Coastguard Worker} 954*333d2b36SAndroid Build Coastguard Worker 955*333d2b36SAndroid Build Coastguard Worker// HasDeviceProduct returns if the build has a product. A build will not 956*333d2b36SAndroid Build Coastguard Worker// necessarily have a product when --skip-config is passed to soong, like it is 957*333d2b36SAndroid Build Coastguard Worker// in prebuilts/build-tools/build-prebuilts.sh 958*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HasDeviceProduct() bool { 959*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceProduct != nil 960*333d2b36SAndroid Build Coastguard Worker} 961*333d2b36SAndroid Build Coastguard Worker 962*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceAbi() []string { 963*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceAbi 964*333d2b36SAndroid Build Coastguard Worker} 965*333d2b36SAndroid Build Coastguard Worker 966*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceResourceOverlays() []string { 967*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceResourceOverlays 968*333d2b36SAndroid Build Coastguard Worker} 969*333d2b36SAndroid Build Coastguard Worker 970*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductResourceOverlays() []string { 971*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductResourceOverlays 972*333d2b36SAndroid Build Coastguard Worker} 973*333d2b36SAndroid Build Coastguard Worker 974*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformDisplayVersionName() string { 975*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_display_version_name) 976*333d2b36SAndroid Build Coastguard Worker} 977*333d2b36SAndroid Build Coastguard Worker 978*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformVersionName() string { 979*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_version_name) 980*333d2b36SAndroid Build Coastguard Worker} 981*333d2b36SAndroid Build Coastguard Worker 982*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformSdkVersion() ApiLevel { 983*333d2b36SAndroid Build Coastguard Worker return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version) 984*333d2b36SAndroid Build Coastguard Worker} 985*333d2b36SAndroid Build Coastguard Worker 986*333d2b36SAndroid Build Coastguard Workerfunc (c *config) RawPlatformSdkVersion() *int { 987*333d2b36SAndroid Build Coastguard Worker return c.productVariables.Platform_sdk_version 988*333d2b36SAndroid Build Coastguard Worker} 989*333d2b36SAndroid Build Coastguard Worker 990*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformSdkFinal() bool { 991*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Platform_sdk_final) 992*333d2b36SAndroid Build Coastguard Worker} 993*333d2b36SAndroid Build Coastguard Worker 994*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformSdkCodename() string { 995*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_sdk_codename) 996*333d2b36SAndroid Build Coastguard Worker} 997*333d2b36SAndroid Build Coastguard Worker 998*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformSdkExtensionVersion() int { 999*333d2b36SAndroid Build Coastguard Worker return *c.productVariables.Platform_sdk_extension_version 1000*333d2b36SAndroid Build Coastguard Worker} 1001*333d2b36SAndroid Build Coastguard Worker 1002*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformBaseSdkExtensionVersion() int { 1003*333d2b36SAndroid Build Coastguard Worker return *c.productVariables.Platform_base_sdk_extension_version 1004*333d2b36SAndroid Build Coastguard Worker} 1005*333d2b36SAndroid Build Coastguard Worker 1006*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformSecurityPatch() string { 1007*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_security_patch) 1008*333d2b36SAndroid Build Coastguard Worker} 1009*333d2b36SAndroid Build Coastguard Worker 1010*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformPreviewSdkVersion() string { 1011*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_preview_sdk_version) 1012*333d2b36SAndroid Build Coastguard Worker} 1013*333d2b36SAndroid Build Coastguard Worker 1014*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformMinSupportedTargetSdkVersion() string { 1015*333d2b36SAndroid Build Coastguard Worker var val, ok = c.productVariables.BuildFlags["RELEASE_PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION"] 1016*333d2b36SAndroid Build Coastguard Worker if !ok { 1017*333d2b36SAndroid Build Coastguard Worker return "" 1018*333d2b36SAndroid Build Coastguard Worker } 1019*333d2b36SAndroid Build Coastguard Worker return val 1020*333d2b36SAndroid Build Coastguard Worker} 1021*333d2b36SAndroid Build Coastguard Worker 1022*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformBaseOS() string { 1023*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_base_os) 1024*333d2b36SAndroid Build Coastguard Worker} 1025*333d2b36SAndroid Build Coastguard Worker 1026*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformVersionLastStable() string { 1027*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_version_last_stable) 1028*333d2b36SAndroid Build Coastguard Worker} 1029*333d2b36SAndroid Build Coastguard Worker 1030*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformVersionKnownCodenames() string { 1031*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.Platform_version_known_codenames) 1032*333d2b36SAndroid Build Coastguard Worker} 1033*333d2b36SAndroid Build Coastguard Worker 1034*333d2b36SAndroid Build Coastguard Workerfunc (c *config) MinSupportedSdkVersion() ApiLevel { 1035*333d2b36SAndroid Build Coastguard Worker return uncheckedFinalApiLevel(21) 1036*333d2b36SAndroid Build Coastguard Worker} 1037*333d2b36SAndroid Build Coastguard Worker 1038*333d2b36SAndroid Build Coastguard Workerfunc (c *config) FinalApiLevels() []ApiLevel { 1039*333d2b36SAndroid Build Coastguard Worker var levels []ApiLevel 1040*333d2b36SAndroid Build Coastguard Worker for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ { 1041*333d2b36SAndroid Build Coastguard Worker levels = append(levels, uncheckedFinalApiLevel(i)) 1042*333d2b36SAndroid Build Coastguard Worker } 1043*333d2b36SAndroid Build Coastguard Worker return levels 1044*333d2b36SAndroid Build Coastguard Worker} 1045*333d2b36SAndroid Build Coastguard Worker 1046*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PreviewApiLevels() []ApiLevel { 1047*333d2b36SAndroid Build Coastguard Worker var levels []ApiLevel 1048*333d2b36SAndroid Build Coastguard Worker i := 0 1049*333d2b36SAndroid Build Coastguard Worker for _, codename := range c.PlatformVersionActiveCodenames() { 1050*333d2b36SAndroid Build Coastguard Worker if codename == "REL" { 1051*333d2b36SAndroid Build Coastguard Worker continue 1052*333d2b36SAndroid Build Coastguard Worker } 1053*333d2b36SAndroid Build Coastguard Worker 1054*333d2b36SAndroid Build Coastguard Worker levels = append(levels, ApiLevel{ 1055*333d2b36SAndroid Build Coastguard Worker value: codename, 1056*333d2b36SAndroid Build Coastguard Worker number: i, 1057*333d2b36SAndroid Build Coastguard Worker isPreview: true, 1058*333d2b36SAndroid Build Coastguard Worker }) 1059*333d2b36SAndroid Build Coastguard Worker i++ 1060*333d2b36SAndroid Build Coastguard Worker } 1061*333d2b36SAndroid Build Coastguard Worker return levels 1062*333d2b36SAndroid Build Coastguard Worker} 1063*333d2b36SAndroid Build Coastguard Worker 1064*333d2b36SAndroid Build Coastguard Workerfunc (c *config) LatestPreviewApiLevel() ApiLevel { 1065*333d2b36SAndroid Build Coastguard Worker level := NoneApiLevel 1066*333d2b36SAndroid Build Coastguard Worker for _, l := range c.PreviewApiLevels() { 1067*333d2b36SAndroid Build Coastguard Worker if l.GreaterThan(level) { 1068*333d2b36SAndroid Build Coastguard Worker level = l 1069*333d2b36SAndroid Build Coastguard Worker } 1070*333d2b36SAndroid Build Coastguard Worker } 1071*333d2b36SAndroid Build Coastguard Worker return level 1072*333d2b36SAndroid Build Coastguard Worker} 1073*333d2b36SAndroid Build Coastguard Worker 1074*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AllSupportedApiLevels() []ApiLevel { 1075*333d2b36SAndroid Build Coastguard Worker var levels []ApiLevel 1076*333d2b36SAndroid Build Coastguard Worker levels = append(levels, c.FinalApiLevels()...) 1077*333d2b36SAndroid Build Coastguard Worker return append(levels, c.PreviewApiLevels()...) 1078*333d2b36SAndroid Build Coastguard Worker} 1079*333d2b36SAndroid Build Coastguard Worker 1080*333d2b36SAndroid Build Coastguard Worker// DefaultAppTargetSdk returns the API level that platform apps are targeting. 1081*333d2b36SAndroid Build Coastguard Worker// This converts a codename to the exact ApiLevel it represents. 1082*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel { 1083*333d2b36SAndroid Build Coastguard Worker if Bool(c.productVariables.Platform_sdk_final) { 1084*333d2b36SAndroid Build Coastguard Worker return c.PlatformSdkVersion() 1085*333d2b36SAndroid Build Coastguard Worker } 1086*333d2b36SAndroid Build Coastguard Worker codename := c.PlatformSdkCodename() 1087*333d2b36SAndroid Build Coastguard Worker hostOnlyBuild := c.productVariables.DeviceArch == nil 1088*333d2b36SAndroid Build Coastguard Worker if codename == "" { 1089*333d2b36SAndroid Build Coastguard Worker // There are some host-only builds (those are invoked by build-prebuilts.sh) which 1090*333d2b36SAndroid Build Coastguard Worker // don't set platform sdk codename. Platform sdk codename makes sense only when we 1091*333d2b36SAndroid Build Coastguard Worker // are building the platform. So we don't enforce the below panic for the host-only 1092*333d2b36SAndroid Build Coastguard Worker // builds. 1093*333d2b36SAndroid Build Coastguard Worker if hostOnlyBuild { 1094*333d2b36SAndroid Build Coastguard Worker return NoneApiLevel 1095*333d2b36SAndroid Build Coastguard Worker } 1096*333d2b36SAndroid Build Coastguard Worker panic("Platform_sdk_codename must be set") 1097*333d2b36SAndroid Build Coastguard Worker } 1098*333d2b36SAndroid Build Coastguard Worker if codename == "REL" { 1099*333d2b36SAndroid Build Coastguard Worker panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true") 1100*333d2b36SAndroid Build Coastguard Worker } 1101*333d2b36SAndroid Build Coastguard Worker return ApiLevelOrPanic(ctx, codename) 1102*333d2b36SAndroid Build Coastguard Worker} 1103*333d2b36SAndroid Build Coastguard Worker 1104*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PartialCompileFlags() partialCompileFlags { 1105*333d2b36SAndroid Build Coastguard Worker return c.partialCompileFlags 1106*333d2b36SAndroid Build Coastguard Worker} 1107*333d2b36SAndroid Build Coastguard Worker 1108*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AppsDefaultVersionName() string { 1109*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.AppsDefaultVersionName) 1110*333d2b36SAndroid Build Coastguard Worker} 1111*333d2b36SAndroid Build Coastguard Worker 1112*333d2b36SAndroid Build Coastguard Worker// Codenames that are active in the current lunch target. 1113*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformVersionActiveCodenames() []string { 1114*333d2b36SAndroid Build Coastguard Worker return c.productVariables.Platform_version_active_codenames 1115*333d2b36SAndroid Build Coastguard Worker} 1116*333d2b36SAndroid Build Coastguard Worker 1117*333d2b36SAndroid Build Coastguard Worker// All unreleased codenames. 1118*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PlatformVersionAllPreviewCodenames() []string { 1119*333d2b36SAndroid Build Coastguard Worker return c.productVariables.Platform_version_all_preview_codenames 1120*333d2b36SAndroid Build Coastguard Worker} 1121*333d2b36SAndroid Build Coastguard Worker 1122*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductAAPTConfig() []string { 1123*333d2b36SAndroid Build Coastguard Worker return c.productVariables.AAPTConfig 1124*333d2b36SAndroid Build Coastguard Worker} 1125*333d2b36SAndroid Build Coastguard Worker 1126*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductAAPTPreferredConfig() string { 1127*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.AAPTPreferredConfig) 1128*333d2b36SAndroid Build Coastguard Worker} 1129*333d2b36SAndroid Build Coastguard Worker 1130*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductAAPTCharacteristics() string { 1131*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.AAPTCharacteristics) 1132*333d2b36SAndroid Build Coastguard Worker} 1133*333d2b36SAndroid Build Coastguard Worker 1134*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductAAPTPrebuiltDPI() []string { 1135*333d2b36SAndroid Build Coastguard Worker return c.productVariables.AAPTPrebuiltDPI 1136*333d2b36SAndroid Build Coastguard Worker} 1137*333d2b36SAndroid Build Coastguard Worker 1138*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath { 1139*333d2b36SAndroid Build Coastguard Worker defaultCert := String(c.productVariables.DefaultAppCertificate) 1140*333d2b36SAndroid Build Coastguard Worker if defaultCert != "" { 1141*333d2b36SAndroid Build Coastguard Worker return PathForSource(ctx, filepath.Dir(defaultCert)) 1142*333d2b36SAndroid Build Coastguard Worker } 1143*333d2b36SAndroid Build Coastguard Worker return PathForSource(ctx, testKeyDir) 1144*333d2b36SAndroid Build Coastguard Worker} 1145*333d2b36SAndroid Build Coastguard Worker 1146*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) { 1147*333d2b36SAndroid Build Coastguard Worker defaultCert := String(c.productVariables.DefaultAppCertificate) 1148*333d2b36SAndroid Build Coastguard Worker if defaultCert != "" { 1149*333d2b36SAndroid Build Coastguard Worker return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8") 1150*333d2b36SAndroid Build Coastguard Worker } 1151*333d2b36SAndroid Build Coastguard Worker defaultDir := c.DefaultAppCertificateDir(ctx) 1152*333d2b36SAndroid Build Coastguard Worker return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8") 1153*333d2b36SAndroid Build Coastguard Worker} 1154*333d2b36SAndroid Build Coastguard Worker 1155*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ExtraOtaKeys(ctx PathContext, recovery bool) []SourcePath { 1156*333d2b36SAndroid Build Coastguard Worker var otaKeys []string 1157*333d2b36SAndroid Build Coastguard Worker if recovery { 1158*333d2b36SAndroid Build Coastguard Worker otaKeys = c.productVariables.ExtraOtaRecoveryKeys 1159*333d2b36SAndroid Build Coastguard Worker } else { 1160*333d2b36SAndroid Build Coastguard Worker otaKeys = c.productVariables.ExtraOtaKeys 1161*333d2b36SAndroid Build Coastguard Worker } 1162*333d2b36SAndroid Build Coastguard Worker 1163*333d2b36SAndroid Build Coastguard Worker otaPaths := make([]SourcePath, len(otaKeys)) 1164*333d2b36SAndroid Build Coastguard Worker for i, key := range otaKeys { 1165*333d2b36SAndroid Build Coastguard Worker otaPaths[i] = PathForSource(ctx, key+".x509.pem") 1166*333d2b36SAndroid Build Coastguard Worker } 1167*333d2b36SAndroid Build Coastguard Worker 1168*333d2b36SAndroid Build Coastguard Worker return otaPaths 1169*333d2b36SAndroid Build Coastguard Worker} 1170*333d2b36SAndroid Build Coastguard Worker 1171*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildKeys() string { 1172*333d2b36SAndroid Build Coastguard Worker defaultCert := String(c.productVariables.DefaultAppCertificate) 1173*333d2b36SAndroid Build Coastguard Worker if defaultCert == "" || defaultCert == filepath.Join(testKeyDir, "testkey") { 1174*333d2b36SAndroid Build Coastguard Worker return "test-keys" 1175*333d2b36SAndroid Build Coastguard Worker } 1176*333d2b36SAndroid Build Coastguard Worker return "dev-keys" 1177*333d2b36SAndroid Build Coastguard Worker} 1178*333d2b36SAndroid Build Coastguard Worker 1179*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ApexKeyDir(ctx ModuleContext) SourcePath { 1180*333d2b36SAndroid Build Coastguard Worker // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE 1181*333d2b36SAndroid Build Coastguard Worker defaultCert := String(c.productVariables.DefaultAppCertificate) 1182*333d2b36SAndroid Build Coastguard Worker if defaultCert == "" || filepath.Dir(defaultCert) == testKeyDir { 1183*333d2b36SAndroid Build Coastguard Worker // When defaultCert is unset or is set to the testkeys path, use the APEX keys 1184*333d2b36SAndroid Build Coastguard Worker // that is under the module dir 1185*333d2b36SAndroid Build Coastguard Worker return pathForModuleSrc(ctx) 1186*333d2b36SAndroid Build Coastguard Worker } 1187*333d2b36SAndroid Build Coastguard Worker // If not, APEX keys are under the specified directory 1188*333d2b36SAndroid Build Coastguard Worker return PathForSource(ctx, filepath.Dir(defaultCert)) 1189*333d2b36SAndroid Build Coastguard Worker} 1190*333d2b36SAndroid Build Coastguard Worker 1191*333d2b36SAndroid Build Coastguard Worker// Certificate for the NetworkStack sepolicy context 1192*333d2b36SAndroid Build Coastguard Workerfunc (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath { 1193*333d2b36SAndroid Build Coastguard Worker cert := String(c.productVariables.MainlineSepolicyDevCertificates) 1194*333d2b36SAndroid Build Coastguard Worker if cert != "" { 1195*333d2b36SAndroid Build Coastguard Worker return PathForSource(ctx, cert) 1196*333d2b36SAndroid Build Coastguard Worker } 1197*333d2b36SAndroid Build Coastguard Worker return c.DefaultAppCertificateDir(ctx) 1198*333d2b36SAndroid Build Coastguard Worker} 1199*333d2b36SAndroid Build Coastguard Worker 1200*333d2b36SAndroid Build Coastguard Worker// AllowMissingDependencies configures Blueprint/Soong to not fail when modules 1201*333d2b36SAndroid Build Coastguard Worker// are configured to depend on non-existent modules. Note that this does not 1202*333d2b36SAndroid Build Coastguard Worker// affect missing input dependencies at the Ninja level. 1203*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AllowMissingDependencies() bool { 1204*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Allow_missing_dependencies) 1205*333d2b36SAndroid Build Coastguard Worker} 1206*333d2b36SAndroid Build Coastguard Worker 1207*333d2b36SAndroid Build Coastguard Worker// Returns true if a full platform source tree cannot be assumed. 1208*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UnbundledBuild() bool { 1209*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Unbundled_build) 1210*333d2b36SAndroid Build Coastguard Worker} 1211*333d2b36SAndroid Build Coastguard Worker 1212*333d2b36SAndroid Build Coastguard Worker// Returns true if building apps that aren't bundled with the platform. 1213*333d2b36SAndroid Build Coastguard Worker// UnbundledBuild() is always true when this is true. 1214*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UnbundledBuildApps() bool { 1215*333d2b36SAndroid Build Coastguard Worker return len(c.productVariables.Unbundled_build_apps) > 0 1216*333d2b36SAndroid Build Coastguard Worker} 1217*333d2b36SAndroid Build Coastguard Worker 1218*333d2b36SAndroid Build Coastguard Worker// Returns true if building image that aren't bundled with the platform. 1219*333d2b36SAndroid Build Coastguard Worker// UnbundledBuild() is always true when this is true. 1220*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UnbundledBuildImage() bool { 1221*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Unbundled_build_image) 1222*333d2b36SAndroid Build Coastguard Worker} 1223*333d2b36SAndroid Build Coastguard Worker 1224*333d2b36SAndroid Build Coastguard Worker// Returns true if building modules against prebuilt SDKs. 1225*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AlwaysUsePrebuiltSdks() bool { 1226*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Always_use_prebuilt_sdks) 1227*333d2b36SAndroid Build Coastguard Worker} 1228*333d2b36SAndroid Build Coastguard Worker 1229*333d2b36SAndroid Build Coastguard Workerfunc (c *config) MinimizeJavaDebugInfo() bool { 1230*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng) 1231*333d2b36SAndroid Build Coastguard Worker} 1232*333d2b36SAndroid Build Coastguard Worker 1233*333d2b36SAndroid Build Coastguard Workerfunc (c *config) Debuggable() bool { 1234*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Debuggable) 1235*333d2b36SAndroid Build Coastguard Worker} 1236*333d2b36SAndroid Build Coastguard Worker 1237*333d2b36SAndroid Build Coastguard Workerfunc (c *config) Eng() bool { 1238*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Eng) 1239*333d2b36SAndroid Build Coastguard Worker} 1240*333d2b36SAndroid Build Coastguard Worker 1241*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildType() string { 1242*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.BuildType) 1243*333d2b36SAndroid Build Coastguard Worker} 1244*333d2b36SAndroid Build Coastguard Worker 1245*333d2b36SAndroid Build Coastguard Worker// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or 1246*333d2b36SAndroid Build Coastguard Worker// Common if there are no device architectures. 1247*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DevicePrimaryArchType() ArchType { 1248*333d2b36SAndroid Build Coastguard Worker if androidTargets := c.Targets[Android]; len(androidTargets) > 0 { 1249*333d2b36SAndroid Build Coastguard Worker return androidTargets[0].Arch.ArchType 1250*333d2b36SAndroid Build Coastguard Worker } 1251*333d2b36SAndroid Build Coastguard Worker return Common 1252*333d2b36SAndroid Build Coastguard Worker} 1253*333d2b36SAndroid Build Coastguard Worker 1254*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SanitizeHost() []string { 1255*333d2b36SAndroid Build Coastguard Worker return append([]string(nil), c.productVariables.SanitizeHost...) 1256*333d2b36SAndroid Build Coastguard Worker} 1257*333d2b36SAndroid Build Coastguard Worker 1258*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SanitizeDevice() []string { 1259*333d2b36SAndroid Build Coastguard Worker return append([]string(nil), c.productVariables.SanitizeDevice...) 1260*333d2b36SAndroid Build Coastguard Worker} 1261*333d2b36SAndroid Build Coastguard Worker 1262*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SanitizeDeviceDiag() []string { 1263*333d2b36SAndroid Build Coastguard Worker return append([]string(nil), c.productVariables.SanitizeDeviceDiag...) 1264*333d2b36SAndroid Build Coastguard Worker} 1265*333d2b36SAndroid Build Coastguard Worker 1266*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SanitizeDeviceArch() []string { 1267*333d2b36SAndroid Build Coastguard Worker return append([]string(nil), c.productVariables.SanitizeDeviceArch...) 1268*333d2b36SAndroid Build Coastguard Worker} 1269*333d2b36SAndroid Build Coastguard Worker 1270*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnableCFI() bool { 1271*333d2b36SAndroid Build Coastguard Worker if c.productVariables.EnableCFI == nil { 1272*333d2b36SAndroid Build Coastguard Worker return true 1273*333d2b36SAndroid Build Coastguard Worker } 1274*333d2b36SAndroid Build Coastguard Worker return *c.productVariables.EnableCFI 1275*333d2b36SAndroid Build Coastguard Worker} 1276*333d2b36SAndroid Build Coastguard Worker 1277*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DisableScudo() bool { 1278*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.DisableScudo) 1279*333d2b36SAndroid Build Coastguard Worker} 1280*333d2b36SAndroid Build Coastguard Worker 1281*333d2b36SAndroid Build Coastguard Workerfunc (c *config) Android64() bool { 1282*333d2b36SAndroid Build Coastguard Worker for _, t := range c.Targets[Android] { 1283*333d2b36SAndroid Build Coastguard Worker if t.Arch.ArchType.Multilib == "lib64" { 1284*333d2b36SAndroid Build Coastguard Worker return true 1285*333d2b36SAndroid Build Coastguard Worker } 1286*333d2b36SAndroid Build Coastguard Worker } 1287*333d2b36SAndroid Build Coastguard Worker 1288*333d2b36SAndroid Build Coastguard Worker return false 1289*333d2b36SAndroid Build Coastguard Worker} 1290*333d2b36SAndroid Build Coastguard Worker 1291*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseGoma() bool { 1292*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseGoma) 1293*333d2b36SAndroid Build Coastguard Worker} 1294*333d2b36SAndroid Build Coastguard Worker 1295*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseABFS() bool { 1296*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseABFS) 1297*333d2b36SAndroid Build Coastguard Worker} 1298*333d2b36SAndroid Build Coastguard Worker 1299*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseRBE() bool { 1300*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseRBE) 1301*333d2b36SAndroid Build Coastguard Worker} 1302*333d2b36SAndroid Build Coastguard Worker 1303*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseRBEJAVAC() bool { 1304*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseRBEJAVAC) 1305*333d2b36SAndroid Build Coastguard Worker} 1306*333d2b36SAndroid Build Coastguard Worker 1307*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseRBER8() bool { 1308*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseRBER8) 1309*333d2b36SAndroid Build Coastguard Worker} 1310*333d2b36SAndroid Build Coastguard Worker 1311*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseRBED8() bool { 1312*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseRBED8) 1313*333d2b36SAndroid Build Coastguard Worker} 1314*333d2b36SAndroid Build Coastguard Worker 1315*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseRemoteBuild() bool { 1316*333d2b36SAndroid Build Coastguard Worker return c.UseGoma() || c.UseRBE() 1317*333d2b36SAndroid Build Coastguard Worker} 1318*333d2b36SAndroid Build Coastguard Worker 1319*333d2b36SAndroid Build Coastguard Workerfunc (c *config) RunErrorProne() bool { 1320*333d2b36SAndroid Build Coastguard Worker return c.IsEnvTrue("RUN_ERROR_PRONE") 1321*333d2b36SAndroid Build Coastguard Worker} 1322*333d2b36SAndroid Build Coastguard Worker 1323*333d2b36SAndroid Build Coastguard Worker// XrefCorpusName returns the Kythe cross-reference corpus name. 1324*333d2b36SAndroid Build Coastguard Workerfunc (c *config) XrefCorpusName() string { 1325*333d2b36SAndroid Build Coastguard Worker return c.Getenv("XREF_CORPUS") 1326*333d2b36SAndroid Build Coastguard Worker} 1327*333d2b36SAndroid Build Coastguard Worker 1328*333d2b36SAndroid Build Coastguard Worker// XrefCuEncoding returns the compilation unit encoding to use for Kythe code 1329*333d2b36SAndroid Build Coastguard Worker// xrefs. Can be 'json' (default), 'proto' or 'all'. 1330*333d2b36SAndroid Build Coastguard Workerfunc (c *config) XrefCuEncoding() string { 1331*333d2b36SAndroid Build Coastguard Worker if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" { 1332*333d2b36SAndroid Build Coastguard Worker return enc 1333*333d2b36SAndroid Build Coastguard Worker } 1334*333d2b36SAndroid Build Coastguard Worker return "json" 1335*333d2b36SAndroid Build Coastguard Worker} 1336*333d2b36SAndroid Build Coastguard Worker 1337*333d2b36SAndroid Build Coastguard Worker// XrefCuJavaSourceMax returns the maximum number of the Java source files 1338*333d2b36SAndroid Build Coastguard Worker// in a single compilation unit 1339*333d2b36SAndroid Build Coastguard Workerconst xrefJavaSourceFileMaxDefault = "1000" 1340*333d2b36SAndroid Build Coastguard Worker 1341*333d2b36SAndroid Build Coastguard Workerfunc (c Config) XrefCuJavaSourceMax() string { 1342*333d2b36SAndroid Build Coastguard Worker v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE") 1343*333d2b36SAndroid Build Coastguard Worker if v == "" { 1344*333d2b36SAndroid Build Coastguard Worker return xrefJavaSourceFileMaxDefault 1345*333d2b36SAndroid Build Coastguard Worker } 1346*333d2b36SAndroid Build Coastguard Worker if _, err := strconv.ParseUint(v, 0, 0); err != nil { 1347*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(os.Stderr, 1348*333d2b36SAndroid Build Coastguard Worker "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s", 1349*333d2b36SAndroid Build Coastguard Worker err, xrefJavaSourceFileMaxDefault) 1350*333d2b36SAndroid Build Coastguard Worker return xrefJavaSourceFileMaxDefault 1351*333d2b36SAndroid Build Coastguard Worker } 1352*333d2b36SAndroid Build Coastguard Worker return v 1353*333d2b36SAndroid Build Coastguard Worker 1354*333d2b36SAndroid Build Coastguard Worker} 1355*333d2b36SAndroid Build Coastguard Worker 1356*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EmitXrefRules() bool { 1357*333d2b36SAndroid Build Coastguard Worker return c.XrefCorpusName() != "" 1358*333d2b36SAndroid Build Coastguard Worker} 1359*333d2b36SAndroid Build Coastguard Worker 1360*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ClangTidy() bool { 1361*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.ClangTidy) 1362*333d2b36SAndroid Build Coastguard Worker} 1363*333d2b36SAndroid Build Coastguard Worker 1364*333d2b36SAndroid Build Coastguard Workerfunc (c *config) TidyChecks() string { 1365*333d2b36SAndroid Build Coastguard Worker if c.productVariables.TidyChecks == nil { 1366*333d2b36SAndroid Build Coastguard Worker return "" 1367*333d2b36SAndroid Build Coastguard Worker } 1368*333d2b36SAndroid Build Coastguard Worker return *c.productVariables.TidyChecks 1369*333d2b36SAndroid Build Coastguard Worker} 1370*333d2b36SAndroid Build Coastguard Worker 1371*333d2b36SAndroid Build Coastguard Workerfunc (c *config) LibartImgHostBaseAddress() string { 1372*333d2b36SAndroid Build Coastguard Worker return "0x70000000" 1373*333d2b36SAndroid Build Coastguard Worker} 1374*333d2b36SAndroid Build Coastguard Worker 1375*333d2b36SAndroid Build Coastguard Workerfunc (c *config) LibartImgDeviceBaseAddress() string { 1376*333d2b36SAndroid Build Coastguard Worker return "0x70000000" 1377*333d2b36SAndroid Build Coastguard Worker} 1378*333d2b36SAndroid Build Coastguard Worker 1379*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ArtUseReadBarrier() bool { 1380*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.ArtUseReadBarrier) 1381*333d2b36SAndroid Build Coastguard Worker} 1382*333d2b36SAndroid Build Coastguard Worker 1383*333d2b36SAndroid Build Coastguard Worker// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs, 1384*333d2b36SAndroid Build Coastguard Worker// but some modules still depend on it. 1385*333d2b36SAndroid Build Coastguard Worker// 1386*333d2b36SAndroid Build Coastguard Worker// More info: https://source.android.com/devices/architecture/rros 1387*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnforceRROForModule(name string) bool { 1388*333d2b36SAndroid Build Coastguard Worker enforceList := c.productVariables.EnforceRROTargets 1389*333d2b36SAndroid Build Coastguard Worker 1390*333d2b36SAndroid Build Coastguard Worker if len(enforceList) > 0 { 1391*333d2b36SAndroid Build Coastguard Worker if InList("*", enforceList) { 1392*333d2b36SAndroid Build Coastguard Worker return true 1393*333d2b36SAndroid Build Coastguard Worker } 1394*333d2b36SAndroid Build Coastguard Worker return InList(name, enforceList) 1395*333d2b36SAndroid Build Coastguard Worker } 1396*333d2b36SAndroid Build Coastguard Worker return false 1397*333d2b36SAndroid Build Coastguard Worker} 1398*333d2b36SAndroid Build Coastguard Worker 1399*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnforceRROExcludedOverlay(path string) bool { 1400*333d2b36SAndroid Build Coastguard Worker excluded := c.productVariables.EnforceRROExcludedOverlays 1401*333d2b36SAndroid Build Coastguard Worker if len(excluded) > 0 { 1402*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, excluded) 1403*333d2b36SAndroid Build Coastguard Worker } 1404*333d2b36SAndroid Build Coastguard Worker return false 1405*333d2b36SAndroid Build Coastguard Worker} 1406*333d2b36SAndroid Build Coastguard Worker 1407*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnforceRROGlobally() bool { 1408*333d2b36SAndroid Build Coastguard Worker enforceList := c.productVariables.EnforceRROTargets 1409*333d2b36SAndroid Build Coastguard Worker return InList("*", enforceList) 1410*333d2b36SAndroid Build Coastguard Worker} 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ExportedNamespaces() []string { 1413*333d2b36SAndroid Build Coastguard Worker return append([]string(nil), c.productVariables.NamespacesToExport...) 1414*333d2b36SAndroid Build Coastguard Worker} 1415*333d2b36SAndroid Build Coastguard Worker 1416*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SourceRootDirs() []string { 1417*333d2b36SAndroid Build Coastguard Worker return c.productVariables.SourceRootDirs 1418*333d2b36SAndroid Build Coastguard Worker} 1419*333d2b36SAndroid Build Coastguard Worker 1420*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HostStaticBinaries() bool { 1421*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.HostStaticBinaries) 1422*333d2b36SAndroid Build Coastguard Worker} 1423*333d2b36SAndroid Build Coastguard Worker 1424*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UncompressPrivAppDex() bool { 1425*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UncompressPrivAppDex) 1426*333d2b36SAndroid Build Coastguard Worker} 1427*333d2b36SAndroid Build Coastguard Worker 1428*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ModulesLoadedByPrivilegedModules() []string { 1429*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ModulesLoadedByPrivilegedModules 1430*333d2b36SAndroid Build Coastguard Worker} 1431*333d2b36SAndroid Build Coastguard Worker 1432*333d2b36SAndroid Build Coastguard Worker// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in 1433*333d2b36SAndroid Build Coastguard Worker// the output directory, if it was created during the product configuration 1434*333d2b36SAndroid Build Coastguard Worker// phase by Kati. 1435*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath { 1436*333d2b36SAndroid Build Coastguard Worker if c.productVariables.DexpreoptGlobalConfig == nil { 1437*333d2b36SAndroid Build Coastguard Worker return OptionalPathForPath(nil) 1438*333d2b36SAndroid Build Coastguard Worker } 1439*333d2b36SAndroid Build Coastguard Worker return OptionalPathForPath( 1440*333d2b36SAndroid Build Coastguard Worker pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig)) 1441*333d2b36SAndroid Build Coastguard Worker} 1442*333d2b36SAndroid Build Coastguard Worker 1443*333d2b36SAndroid Build Coastguard Worker// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global 1444*333d2b36SAndroid Build Coastguard Worker// configuration. Since the configuration file was created by Kati during 1445*333d2b36SAndroid Build Coastguard Worker// product configuration (externally of soong_build), it's not tracked, so we 1446*333d2b36SAndroid Build Coastguard Worker// also manually add a Ninja file dependency on the configuration file to the 1447*333d2b36SAndroid Build Coastguard Worker// rule that creates the main build.ninja file. This ensures that build.ninja is 1448*333d2b36SAndroid Build Coastguard Worker// regenerated correctly if dexpreopt.config changes. 1449*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) { 1450*333d2b36SAndroid Build Coastguard Worker path := c.DexpreoptGlobalConfigPath(ctx) 1451*333d2b36SAndroid Build Coastguard Worker if !path.Valid() { 1452*333d2b36SAndroid Build Coastguard Worker return nil, nil 1453*333d2b36SAndroid Build Coastguard Worker } 1454*333d2b36SAndroid Build Coastguard Worker ctx.AddNinjaFileDeps(path.String()) 1455*333d2b36SAndroid Build Coastguard Worker return os.ReadFile(absolutePath(path.String())) 1456*333d2b36SAndroid Build Coastguard Worker} 1457*333d2b36SAndroid Build Coastguard Worker 1458*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) WithDexpreopt() bool { 1459*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.WithDexpreopt 1460*333d2b36SAndroid Build Coastguard Worker} 1461*333d2b36SAndroid Build Coastguard Worker 1462*333d2b36SAndroid Build Coastguard Workerfunc (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool { 1463*333d2b36SAndroid Build Coastguard Worker return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid() 1464*333d2b36SAndroid Build Coastguard Worker} 1465*333d2b36SAndroid Build Coastguard Worker 1466*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HasMultilibConflict(arch ArchType) bool { 1467*333d2b36SAndroid Build Coastguard Worker return c.multilibConflicts[arch] 1468*333d2b36SAndroid Build Coastguard Worker} 1469*333d2b36SAndroid Build Coastguard Worker 1470*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PrebuiltHiddenApiDir(_ PathContext) string { 1471*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.PrebuiltHiddenApiDir) 1472*333d2b36SAndroid Build Coastguard Worker} 1473*333d2b36SAndroid Build Coastguard Worker 1474*333d2b36SAndroid Build Coastguard Workerfunc (c *config) VendorApiLevel() string { 1475*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.VendorApiLevel) 1476*333d2b36SAndroid Build Coastguard Worker} 1477*333d2b36SAndroid Build Coastguard Worker 1478*333d2b36SAndroid Build Coastguard Workerfunc (c *config) PrevVendorApiLevel() string { 1479*333d2b36SAndroid Build Coastguard Worker vendorApiLevel, err := strconv.Atoi(c.VendorApiLevel()) 1480*333d2b36SAndroid Build Coastguard Worker if err != nil { 1481*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Cannot parse vendor API level %s to an integer: %s", 1482*333d2b36SAndroid Build Coastguard Worker c.VendorApiLevel(), err)) 1483*333d2b36SAndroid Build Coastguard Worker } 1484*333d2b36SAndroid Build Coastguard Worker // The version before trunk stable is 34. 1485*333d2b36SAndroid Build Coastguard Worker if vendorApiLevel == 202404 { 1486*333d2b36SAndroid Build Coastguard Worker return "34" 1487*333d2b36SAndroid Build Coastguard Worker } 1488*333d2b36SAndroid Build Coastguard Worker if vendorApiLevel >= 1 && vendorApiLevel <= 34 { 1489*333d2b36SAndroid Build Coastguard Worker return strconv.Itoa(vendorApiLevel - 1) 1490*333d2b36SAndroid Build Coastguard Worker } 1491*333d2b36SAndroid Build Coastguard Worker if vendorApiLevel < 202404 || vendorApiLevel%100 != 4 { 1492*333d2b36SAndroid Build Coastguard Worker panic("Unknown vendor API level " + c.VendorApiLevel()) 1493*333d2b36SAndroid Build Coastguard Worker } 1494*333d2b36SAndroid Build Coastguard Worker return strconv.Itoa(vendorApiLevel - 100) 1495*333d2b36SAndroid Build Coastguard Worker} 1496*333d2b36SAndroid Build Coastguard Worker 1497*333d2b36SAndroid Build Coastguard Workerfunc IsTrunkStableVendorApiLevel(level string) bool { 1498*333d2b36SAndroid Build Coastguard Worker levelInt, err := strconv.Atoi(level) 1499*333d2b36SAndroid Build Coastguard Worker return err == nil && levelInt >= 202404 1500*333d2b36SAndroid Build Coastguard Worker} 1501*333d2b36SAndroid Build Coastguard Worker 1502*333d2b36SAndroid Build Coastguard Workerfunc (c *config) VendorApiLevelFrozen() bool { 1503*333d2b36SAndroid Build Coastguard Worker return c.productVariables.GetBuildFlagBool("RELEASE_BOARD_API_LEVEL_FROZEN") 1504*333d2b36SAndroid Build Coastguard Worker} 1505*333d2b36SAndroid Build Coastguard Worker 1506*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) Arches() []Arch { 1507*333d2b36SAndroid Build Coastguard Worker var arches []Arch 1508*333d2b36SAndroid Build Coastguard Worker for _, target := range c.config.Targets[Android] { 1509*333d2b36SAndroid Build Coastguard Worker arches = append(arches, target.Arch) 1510*333d2b36SAndroid Build Coastguard Worker } 1511*333d2b36SAndroid Build Coastguard Worker return arches 1512*333d2b36SAndroid Build Coastguard Worker} 1513*333d2b36SAndroid Build Coastguard Worker 1514*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BinderBitness() string { 1515*333d2b36SAndroid Build Coastguard Worker is32BitBinder := c.config.productVariables.Binder32bit 1516*333d2b36SAndroid Build Coastguard Worker if is32BitBinder != nil && *is32BitBinder { 1517*333d2b36SAndroid Build Coastguard Worker return "32" 1518*333d2b36SAndroid Build Coastguard Worker } 1519*333d2b36SAndroid Build Coastguard Worker return "64" 1520*333d2b36SAndroid Build Coastguard Worker} 1521*333d2b36SAndroid Build Coastguard Worker 1522*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) RecoveryPath() string { 1523*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.RecoveryPath != nil { 1524*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.RecoveryPath 1525*333d2b36SAndroid Build Coastguard Worker } 1526*333d2b36SAndroid Build Coastguard Worker return "recovery" 1527*333d2b36SAndroid Build Coastguard Worker} 1528*333d2b36SAndroid Build Coastguard Worker 1529*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) VendorPath() string { 1530*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.VendorPath != nil { 1531*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.VendorPath 1532*333d2b36SAndroid Build Coastguard Worker } 1533*333d2b36SAndroid Build Coastguard Worker return "vendor" 1534*333d2b36SAndroid Build Coastguard Worker} 1535*333d2b36SAndroid Build Coastguard Worker 1536*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) VendorDlkmPath() string { 1537*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.VendorDlkmPath != nil { 1538*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.VendorDlkmPath 1539*333d2b36SAndroid Build Coastguard Worker } 1540*333d2b36SAndroid Build Coastguard Worker return "vendor_dlkm" 1541*333d2b36SAndroid Build Coastguard Worker} 1542*333d2b36SAndroid Build Coastguard Worker 1543*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildingVendorImage() bool { 1544*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(c.config.productVariables.BuildingVendorImage) 1545*333d2b36SAndroid Build Coastguard Worker} 1546*333d2b36SAndroid Build Coastguard Worker 1547*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) CurrentApiLevelForVendorModules() string { 1548*333d2b36SAndroid Build Coastguard Worker return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current") 1549*333d2b36SAndroid Build Coastguard Worker} 1550*333d2b36SAndroid Build Coastguard Worker 1551*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ExtraVndkVersions() []string { 1552*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.ExtraVndkVersions 1553*333d2b36SAndroid Build Coastguard Worker} 1554*333d2b36SAndroid Build Coastguard Worker 1555*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SystemSdkVersions() []string { 1556*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.DeviceSystemSdkVersions 1557*333d2b36SAndroid Build Coastguard Worker} 1558*333d2b36SAndroid Build Coastguard Worker 1559*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) PlatformSystemSdkVersions() []string { 1560*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.Platform_systemsdk_versions 1561*333d2b36SAndroid Build Coastguard Worker} 1562*333d2b36SAndroid Build Coastguard Worker 1563*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OdmPath() string { 1564*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.OdmPath != nil { 1565*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.OdmPath 1566*333d2b36SAndroid Build Coastguard Worker } 1567*333d2b36SAndroid Build Coastguard Worker return "odm" 1568*333d2b36SAndroid Build Coastguard Worker} 1569*333d2b36SAndroid Build Coastguard Worker 1570*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildingOdmImage() bool { 1571*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(c.config.productVariables.BuildingOdmImage) 1572*333d2b36SAndroid Build Coastguard Worker} 1573*333d2b36SAndroid Build Coastguard Worker 1574*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OdmDlkmPath() string { 1575*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.OdmDlkmPath != nil { 1576*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.OdmDlkmPath 1577*333d2b36SAndroid Build Coastguard Worker } 1578*333d2b36SAndroid Build Coastguard Worker return "odm_dlkm" 1579*333d2b36SAndroid Build Coastguard Worker} 1580*333d2b36SAndroid Build Coastguard Worker 1581*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ProductPath() string { 1582*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.ProductPath != nil { 1583*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.ProductPath 1584*333d2b36SAndroid Build Coastguard Worker } 1585*333d2b36SAndroid Build Coastguard Worker return "product" 1586*333d2b36SAndroid Build Coastguard Worker} 1587*333d2b36SAndroid Build Coastguard Worker 1588*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildingProductImage() bool { 1589*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(c.config.productVariables.BuildingProductImage) 1590*333d2b36SAndroid Build Coastguard Worker} 1591*333d2b36SAndroid Build Coastguard Worker 1592*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SystemExtPath() string { 1593*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.SystemExtPath != nil { 1594*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.SystemExtPath 1595*333d2b36SAndroid Build Coastguard Worker } 1596*333d2b36SAndroid Build Coastguard Worker return "system_ext" 1597*333d2b36SAndroid Build Coastguard Worker} 1598*333d2b36SAndroid Build Coastguard Worker 1599*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SystemDlkmPath() string { 1600*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.SystemDlkmPath != nil { 1601*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.SystemDlkmPath 1602*333d2b36SAndroid Build Coastguard Worker } 1603*333d2b36SAndroid Build Coastguard Worker return "system_dlkm" 1604*333d2b36SAndroid Build Coastguard Worker} 1605*333d2b36SAndroid Build Coastguard Worker 1606*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OemPath() string { 1607*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.OemPath != nil { 1608*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.OemPath 1609*333d2b36SAndroid Build Coastguard Worker } 1610*333d2b36SAndroid Build Coastguard Worker return "oem" 1611*333d2b36SAndroid Build Coastguard Worker} 1612*333d2b36SAndroid Build Coastguard Worker 1613*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) UserdataPath() string { 1614*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.UserdataPath != nil { 1615*333d2b36SAndroid Build Coastguard Worker return *c.config.productVariables.UserdataPath 1616*333d2b36SAndroid Build Coastguard Worker } 1617*333d2b36SAndroid Build Coastguard Worker return "data" 1618*333d2b36SAndroid Build Coastguard Worker} 1619*333d2b36SAndroid Build Coastguard Worker 1620*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildingUserdataImage() bool { 1621*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(c.config.productVariables.BuildingUserdataImage) 1622*333d2b36SAndroid Build Coastguard Worker} 1623*333d2b36SAndroid Build Coastguard Worker 1624*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildingRecoveryImage() bool { 1625*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(c.config.productVariables.BuildingRecoveryImage) 1626*333d2b36SAndroid Build Coastguard Worker} 1627*333d2b36SAndroid Build Coastguard Worker 1628*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BtConfigIncludeDir() string { 1629*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.BtConfigIncludeDir) 1630*333d2b36SAndroid Build Coastguard Worker} 1631*333d2b36SAndroid Build Coastguard Worker 1632*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) DeviceKernelHeaderDirs() []string { 1633*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.DeviceKernelHeaders 1634*333d2b36SAndroid Build Coastguard Worker} 1635*333d2b36SAndroid Build Coastguard Worker 1636*333d2b36SAndroid Build Coastguard Worker// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for 1637*333d2b36SAndroid Build Coastguard Worker// path. Coverage is enabled by default when the product variable 1638*333d2b36SAndroid Build Coastguard Worker// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is 1639*333d2b36SAndroid Build Coastguard Worker// enabled for any path which is part of this variable (and not part of the 1640*333d2b36SAndroid Build Coastguard Worker// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths 1641*333d2b36SAndroid Build Coastguard Worker// represents any path. 1642*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool { 1643*333d2b36SAndroid Build Coastguard Worker coverage := false 1644*333d2b36SAndroid Build Coastguard Worker if len(c.config.productVariables.JavaCoveragePaths) == 0 || 1645*333d2b36SAndroid Build Coastguard Worker InList("*", c.config.productVariables.JavaCoveragePaths) || 1646*333d2b36SAndroid Build Coastguard Worker HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) { 1647*333d2b36SAndroid Build Coastguard Worker coverage = true 1648*333d2b36SAndroid Build Coastguard Worker } 1649*333d2b36SAndroid Build Coastguard Worker if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 { 1650*333d2b36SAndroid Build Coastguard Worker if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) { 1651*333d2b36SAndroid Build Coastguard Worker coverage = false 1652*333d2b36SAndroid Build Coastguard Worker } 1653*333d2b36SAndroid Build Coastguard Worker } 1654*333d2b36SAndroid Build Coastguard Worker return coverage 1655*333d2b36SAndroid Build Coastguard Worker} 1656*333d2b36SAndroid Build Coastguard Worker 1657*333d2b36SAndroid Build Coastguard Worker// Returns true if gcov or clang coverage is enabled. 1658*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) NativeCoverageEnabled() bool { 1659*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.GcovCoverage) || 1660*333d2b36SAndroid Build Coastguard Worker Bool(c.config.productVariables.ClangCoverage) 1661*333d2b36SAndroid Build Coastguard Worker} 1662*333d2b36SAndroid Build Coastguard Worker 1663*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ClangCoverageEnabled() bool { 1664*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.ClangCoverage) 1665*333d2b36SAndroid Build Coastguard Worker} 1666*333d2b36SAndroid Build Coastguard Worker 1667*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ClangCoverageContinuousMode() bool { 1668*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.ClangCoverageContinuousMode) 1669*333d2b36SAndroid Build Coastguard Worker} 1670*333d2b36SAndroid Build Coastguard Worker 1671*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) GcovCoverageEnabled() bool { 1672*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.GcovCoverage) 1673*333d2b36SAndroid Build Coastguard Worker} 1674*333d2b36SAndroid Build Coastguard Worker 1675*333d2b36SAndroid Build Coastguard Worker// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native 1676*333d2b36SAndroid Build Coastguard Worker// code coverage is enabled for path. By default, coverage is not enabled for a 1677*333d2b36SAndroid Build Coastguard Worker// given path unless it is part of the NativeCoveragePaths product variable (and 1678*333d2b36SAndroid Build Coastguard Worker// not part of the NativeCoverageExcludePaths product variable). Value "*" in 1679*333d2b36SAndroid Build Coastguard Worker// NativeCoveragePaths represents any path. 1680*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool { 1681*333d2b36SAndroid Build Coastguard Worker coverage := false 1682*333d2b36SAndroid Build Coastguard Worker if len(c.config.productVariables.NativeCoveragePaths) > 0 { 1683*333d2b36SAndroid Build Coastguard Worker if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) { 1684*333d2b36SAndroid Build Coastguard Worker coverage = true 1685*333d2b36SAndroid Build Coastguard Worker } 1686*333d2b36SAndroid Build Coastguard Worker } 1687*333d2b36SAndroid Build Coastguard Worker if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 { 1688*333d2b36SAndroid Build Coastguard Worker if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) { 1689*333d2b36SAndroid Build Coastguard Worker coverage = false 1690*333d2b36SAndroid Build Coastguard Worker } 1691*333d2b36SAndroid Build Coastguard Worker } 1692*333d2b36SAndroid Build Coastguard Worker return coverage 1693*333d2b36SAndroid Build Coastguard Worker} 1694*333d2b36SAndroid Build Coastguard Worker 1695*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) PgoAdditionalProfileDirs() []string { 1696*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.PgoAdditionalProfileDirs 1697*333d2b36SAndroid Build Coastguard Worker} 1698*333d2b36SAndroid Build Coastguard Worker 1699*333d2b36SAndroid Build Coastguard Worker// AfdoProfile returns fully qualified path associated to the given module name 1700*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) AfdoProfile(name string) (string, error) { 1701*333d2b36SAndroid Build Coastguard Worker for _, afdoProfile := range c.config.productVariables.AfdoProfiles { 1702*333d2b36SAndroid Build Coastguard Worker split := strings.Split(afdoProfile, ":") 1703*333d2b36SAndroid Build Coastguard Worker if len(split) != 3 { 1704*333d2b36SAndroid Build Coastguard Worker return "", fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+ 1705*333d2b36SAndroid Build Coastguard Worker "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile) 1706*333d2b36SAndroid Build Coastguard Worker } 1707*333d2b36SAndroid Build Coastguard Worker if split[0] == name { 1708*333d2b36SAndroid Build Coastguard Worker return strings.Join([]string{split[1], split[2]}, ":"), nil 1709*333d2b36SAndroid Build Coastguard Worker } 1710*333d2b36SAndroid Build Coastguard Worker } 1711*333d2b36SAndroid Build Coastguard Worker return "", nil 1712*333d2b36SAndroid Build Coastguard Worker} 1713*333d2b36SAndroid Build Coastguard Worker 1714*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) VendorSepolicyDirs() []string { 1715*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BoardVendorSepolicyDirs 1716*333d2b36SAndroid Build Coastguard Worker} 1717*333d2b36SAndroid Build Coastguard Worker 1718*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OdmSepolicyDirs() []string { 1719*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BoardOdmSepolicyDirs 1720*333d2b36SAndroid Build Coastguard Worker} 1721*333d2b36SAndroid Build Coastguard Worker 1722*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SystemExtPublicSepolicyDirs() []string { 1723*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.SystemExtPublicSepolicyDirs 1724*333d2b36SAndroid Build Coastguard Worker} 1725*333d2b36SAndroid Build Coastguard Worker 1726*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string { 1727*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.SystemExtPrivateSepolicyDirs 1728*333d2b36SAndroid Build Coastguard Worker} 1729*333d2b36SAndroid Build Coastguard Worker 1730*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SepolicyM4Defs() []string { 1731*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BoardSepolicyM4Defs 1732*333d2b36SAndroid Build Coastguard Worker} 1733*333d2b36SAndroid Build Coastguard Worker 1734*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) { 1735*333d2b36SAndroid Build Coastguard Worker return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name, 1736*333d2b36SAndroid Build Coastguard Worker "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>") 1737*333d2b36SAndroid Build Coastguard Worker} 1738*333d2b36SAndroid Build Coastguard Worker 1739*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) { 1740*333d2b36SAndroid Build Coastguard Worker return findOverrideValue(c.config.productVariables.CertificateOverrides, name, 1741*333d2b36SAndroid Build Coastguard Worker "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>") 1742*333d2b36SAndroid Build Coastguard Worker} 1743*333d2b36SAndroid Build Coastguard Worker 1744*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) OverridePackageNameFor(name string) string { 1745*333d2b36SAndroid Build Coastguard Worker newName, overridden := findOverrideValue( 1746*333d2b36SAndroid Build Coastguard Worker c.config.productVariables.PackageNameOverrides, 1747*333d2b36SAndroid Build Coastguard Worker name, 1748*333d2b36SAndroid Build Coastguard Worker "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>") 1749*333d2b36SAndroid Build Coastguard Worker if overridden { 1750*333d2b36SAndroid Build Coastguard Worker return newName 1751*333d2b36SAndroid Build Coastguard Worker } 1752*333d2b36SAndroid Build Coastguard Worker return name 1753*333d2b36SAndroid Build Coastguard Worker} 1754*333d2b36SAndroid Build Coastguard Worker 1755*333d2b36SAndroid Build Coastguard Workerfunc findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) { 1756*333d2b36SAndroid Build Coastguard Worker if overrides == nil || len(overrides) == 0 { 1757*333d2b36SAndroid Build Coastguard Worker return "", false 1758*333d2b36SAndroid Build Coastguard Worker } 1759*333d2b36SAndroid Build Coastguard Worker for _, o := range overrides { 1760*333d2b36SAndroid Build Coastguard Worker split := strings.Split(o, ":") 1761*333d2b36SAndroid Build Coastguard Worker if len(split) != 2 { 1762*333d2b36SAndroid Build Coastguard Worker // This shouldn't happen as this is first checked in make, but just in case. 1763*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf(errorMsg, o)) 1764*333d2b36SAndroid Build Coastguard Worker } 1765*333d2b36SAndroid Build Coastguard Worker if matchPattern(split[0], name) { 1766*333d2b36SAndroid Build Coastguard Worker return substPattern(split[0], split[1], name), true 1767*333d2b36SAndroid Build Coastguard Worker } 1768*333d2b36SAndroid Build Coastguard Worker } 1769*333d2b36SAndroid Build Coastguard Worker return "", false 1770*333d2b36SAndroid Build Coastguard Worker} 1771*333d2b36SAndroid Build Coastguard Worker 1772*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string { 1773*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride) 1774*333d2b36SAndroid Build Coastguard Worker} 1775*333d2b36SAndroid Build Coastguard Worker 1776*333d2b36SAndroid Build Coastguard Workerfunc (c *config) IntegerOverflowDisabledForPath(path string) bool { 1777*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.IntegerOverflowExcludePaths) == 0 { 1778*333d2b36SAndroid Build Coastguard Worker return false 1779*333d2b36SAndroid Build Coastguard Worker } 1780*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths) 1781*333d2b36SAndroid Build Coastguard Worker} 1782*333d2b36SAndroid Build Coastguard Worker 1783*333d2b36SAndroid Build Coastguard Workerfunc (c *config) CFIDisabledForPath(path string) bool { 1784*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.CFIExcludePaths) == 0 { 1785*333d2b36SAndroid Build Coastguard Worker return false 1786*333d2b36SAndroid Build Coastguard Worker } 1787*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.CFIExcludePaths) 1788*333d2b36SAndroid Build Coastguard Worker} 1789*333d2b36SAndroid Build Coastguard Worker 1790*333d2b36SAndroid Build Coastguard Workerfunc (c *config) CFIEnabledForPath(path string) bool { 1791*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.CFIIncludePaths) == 0 { 1792*333d2b36SAndroid Build Coastguard Worker return false 1793*333d2b36SAndroid Build Coastguard Worker } 1794*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path) 1795*333d2b36SAndroid Build Coastguard Worker} 1796*333d2b36SAndroid Build Coastguard Worker 1797*333d2b36SAndroid Build Coastguard Workerfunc (c *config) MemtagHeapDisabledForPath(path string) bool { 1798*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.MemtagHeapExcludePaths) == 0 { 1799*333d2b36SAndroid Build Coastguard Worker return false 1800*333d2b36SAndroid Build Coastguard Worker } 1801*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths) 1802*333d2b36SAndroid Build Coastguard Worker} 1803*333d2b36SAndroid Build Coastguard Worker 1804*333d2b36SAndroid Build Coastguard Workerfunc (c *config) MemtagHeapAsyncEnabledForPath(path string) bool { 1805*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 { 1806*333d2b36SAndroid Build Coastguard Worker return false 1807*333d2b36SAndroid Build Coastguard Worker } 1808*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path) 1809*333d2b36SAndroid Build Coastguard Worker} 1810*333d2b36SAndroid Build Coastguard Worker 1811*333d2b36SAndroid Build Coastguard Workerfunc (c *config) MemtagHeapSyncEnabledForPath(path string) bool { 1812*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 { 1813*333d2b36SAndroid Build Coastguard Worker return false 1814*333d2b36SAndroid Build Coastguard Worker } 1815*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path) 1816*333d2b36SAndroid Build Coastguard Worker} 1817*333d2b36SAndroid Build Coastguard Worker 1818*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HWASanDisabledForPath(path string) bool { 1819*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.HWASanExcludePaths) == 0 { 1820*333d2b36SAndroid Build Coastguard Worker return false 1821*333d2b36SAndroid Build Coastguard Worker } 1822*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.HWASanExcludePaths) 1823*333d2b36SAndroid Build Coastguard Worker} 1824*333d2b36SAndroid Build Coastguard Worker 1825*333d2b36SAndroid Build Coastguard Workerfunc (c *config) HWASanEnabledForPath(path string) bool { 1826*333d2b36SAndroid Build Coastguard Worker if len(c.productVariables.HWASanIncludePaths) == 0 { 1827*333d2b36SAndroid Build Coastguard Worker return false 1828*333d2b36SAndroid Build Coastguard Worker } 1829*333d2b36SAndroid Build Coastguard Worker return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths) && !c.HWASanDisabledForPath(path) 1830*333d2b36SAndroid Build Coastguard Worker} 1831*333d2b36SAndroid Build Coastguard Worker 1832*333d2b36SAndroid Build Coastguard Workerfunc (c *config) VendorConfig(name string) VendorConfig { 1833*333d2b36SAndroid Build Coastguard Worker return soongconfig.Config(c.productVariables.VendorVars[name]) 1834*333d2b36SAndroid Build Coastguard Worker} 1835*333d2b36SAndroid Build Coastguard Worker 1836*333d2b36SAndroid Build Coastguard Workerfunc (c *config) NdkAbis() bool { 1837*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Ndk_abis) 1838*333d2b36SAndroid Build Coastguard Worker} 1839*333d2b36SAndroid Build Coastguard Worker 1840*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AmlAbis() bool { 1841*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Aml_abis) 1842*333d2b36SAndroid Build Coastguard Worker} 1843*333d2b36SAndroid Build Coastguard Worker 1844*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ForceApexSymlinkOptimization() bool { 1845*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.ForceApexSymlinkOptimization) 1846*333d2b36SAndroid Build Coastguard Worker} 1847*333d2b36SAndroid Build Coastguard Worker 1848*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ApexCompressionEnabled() bool { 1849*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps() 1850*333d2b36SAndroid Build Coastguard Worker} 1851*333d2b36SAndroid Build Coastguard Worker 1852*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DefaultApexPayloadType() string { 1853*333d2b36SAndroid Build Coastguard Worker return StringDefault(c.productVariables.DefaultApexPayloadType, "ext4") 1854*333d2b36SAndroid Build Coastguard Worker} 1855*333d2b36SAndroid Build Coastguard Worker 1856*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseSoongSystemImage() bool { 1857*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.UseSoongSystemImage) 1858*333d2b36SAndroid Build Coastguard Worker} 1859*333d2b36SAndroid Build Coastguard Worker 1860*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SoongDefinedSystemImage() string { 1861*333d2b36SAndroid Build Coastguard Worker if c.UseSoongSystemImage() { 1862*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.ProductSoongDefinedSystemImage) 1863*333d2b36SAndroid Build Coastguard Worker } 1864*333d2b36SAndroid Build Coastguard Worker return "" 1865*333d2b36SAndroid Build Coastguard Worker} 1866*333d2b36SAndroid Build Coastguard Worker 1867*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnforceSystemCertificate() bool { 1868*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.EnforceSystemCertificate) 1869*333d2b36SAndroid Build Coastguard Worker} 1870*333d2b36SAndroid Build Coastguard Worker 1871*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnforceSystemCertificateAllowList() []string { 1872*333d2b36SAndroid Build Coastguard Worker return c.productVariables.EnforceSystemCertificateAllowList 1873*333d2b36SAndroid Build Coastguard Worker} 1874*333d2b36SAndroid Build Coastguard Worker 1875*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnforceProductPartitionInterface() bool { 1876*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.EnforceProductPartitionInterface) 1877*333d2b36SAndroid Build Coastguard Worker} 1878*333d2b36SAndroid Build Coastguard Worker 1879*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductHiddenAPIStubs() []string { 1880*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductHiddenAPIStubs 1881*333d2b36SAndroid Build Coastguard Worker} 1882*333d2b36SAndroid Build Coastguard Worker 1883*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductHiddenAPIStubsSystem() []string { 1884*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductHiddenAPIStubsSystem 1885*333d2b36SAndroid Build Coastguard Worker} 1886*333d2b36SAndroid Build Coastguard Worker 1887*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductHiddenAPIStubsTest() []string { 1888*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductHiddenAPIStubsTest 1889*333d2b36SAndroid Build Coastguard Worker} 1890*333d2b36SAndroid Build Coastguard Worker 1891*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) TargetFSConfigGen() []string { 1892*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.TargetFSConfigGen 1893*333d2b36SAndroid Build Coastguard Worker} 1894*333d2b36SAndroid Build Coastguard Worker 1895*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductPublicSepolicyDirs() []string { 1896*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductPublicSepolicyDirs 1897*333d2b36SAndroid Build Coastguard Worker} 1898*333d2b36SAndroid Build Coastguard Worker 1899*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductPrivateSepolicyDirs() []string { 1900*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductPrivateSepolicyDirs 1901*333d2b36SAndroid Build Coastguard Worker} 1902*333d2b36SAndroid Build Coastguard Worker 1903*333d2b36SAndroid Build Coastguard Workerfunc (c *config) TargetMultitreeUpdateMeta() bool { 1904*333d2b36SAndroid Build Coastguard Worker return c.productVariables.MultitreeUpdateMeta 1905*333d2b36SAndroid Build Coastguard Worker} 1906*333d2b36SAndroid Build Coastguard Worker 1907*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) DeviceArch() string { 1908*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.DeviceArch) 1909*333d2b36SAndroid Build Coastguard Worker} 1910*333d2b36SAndroid Build Coastguard Worker 1911*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) DeviceArchVariant() string { 1912*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.DeviceArchVariant) 1913*333d2b36SAndroid Build Coastguard Worker} 1914*333d2b36SAndroid Build Coastguard Worker 1915*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) DeviceSecondaryArch() string { 1916*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.DeviceSecondaryArch) 1917*333d2b36SAndroid Build Coastguard Worker} 1918*333d2b36SAndroid Build Coastguard Worker 1919*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) DeviceSecondaryArchVariant() string { 1920*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.DeviceSecondaryArchVariant) 1921*333d2b36SAndroid Build Coastguard Worker} 1922*333d2b36SAndroid Build Coastguard Worker 1923*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BoardUsesRecoveryAsBoot() bool { 1924*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot) 1925*333d2b36SAndroid Build Coastguard Worker} 1926*333d2b36SAndroid Build Coastguard Worker 1927*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BoardKernelBinaries() []string { 1928*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BoardKernelBinaries 1929*333d2b36SAndroid Build Coastguard Worker} 1930*333d2b36SAndroid Build Coastguard Worker 1931*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string { 1932*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BoardKernelModuleInterfaceVersions 1933*333d2b36SAndroid Build Coastguard Worker} 1934*333d2b36SAndroid Build Coastguard Worker 1935*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool { 1936*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot) 1937*333d2b36SAndroid Build Coastguard Worker} 1938*333d2b36SAndroid Build Coastguard Worker 1939*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) PlatformSepolicyVersion() string { 1940*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.PlatformSepolicyVersion) 1941*333d2b36SAndroid Build Coastguard Worker} 1942*333d2b36SAndroid Build Coastguard Worker 1943*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) PlatformSepolicyCompatVersions() []string { 1944*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.PlatformSepolicyCompatVersions 1945*333d2b36SAndroid Build Coastguard Worker} 1946*333d2b36SAndroid Build Coastguard Worker 1947*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BoardSepolicyVers() string { 1948*333d2b36SAndroid Build Coastguard Worker if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" { 1949*333d2b36SAndroid Build Coastguard Worker return ver 1950*333d2b36SAndroid Build Coastguard Worker } 1951*333d2b36SAndroid Build Coastguard Worker return c.PlatformSepolicyVersion() 1952*333d2b36SAndroid Build Coastguard Worker} 1953*333d2b36SAndroid Build Coastguard Worker 1954*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string { 1955*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir) 1956*333d2b36SAndroid Build Coastguard Worker} 1957*333d2b36SAndroid Build Coastguard Worker 1958*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string { 1959*333d2b36SAndroid Build Coastguard Worker return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir) 1960*333d2b36SAndroid Build Coastguard Worker} 1961*333d2b36SAndroid Build Coastguard Worker 1962*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool { 1963*333d2b36SAndroid Build Coastguard Worker return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != "" 1964*333d2b36SAndroid Build Coastguard Worker} 1965*333d2b36SAndroid Build Coastguard Worker 1966*333d2b36SAndroid Build Coastguard Workerfunc createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) { 1967*333d2b36SAndroid Build Coastguard Worker var ret = make(map[string]bool) 1968*333d2b36SAndroid Build Coastguard Worker for _, dir := range dirs { 1969*333d2b36SAndroid Build Coastguard Worker clean := filepath.Clean(dir) 1970*333d2b36SAndroid Build Coastguard Worker if previous[clean] || ret[clean] { 1971*333d2b36SAndroid Build Coastguard Worker return nil, fmt.Errorf("Duplicate entry %s", dir) 1972*333d2b36SAndroid Build Coastguard Worker } 1973*333d2b36SAndroid Build Coastguard Worker ret[clean] = true 1974*333d2b36SAndroid Build Coastguard Worker } 1975*333d2b36SAndroid Build Coastguard Worker return ret, nil 1976*333d2b36SAndroid Build Coastguard Worker} 1977*333d2b36SAndroid Build Coastguard Worker 1978*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool { 1979*333d2b36SAndroid Build Coastguard Worker dirMap := c.Once(onceKey, func() interface{} { 1980*333d2b36SAndroid Build Coastguard Worker ret, err := createDirsMap(previous, dirs) 1981*333d2b36SAndroid Build Coastguard Worker if err != nil { 1982*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("%s: %w", onceKey.key, err)) 1983*333d2b36SAndroid Build Coastguard Worker } 1984*333d2b36SAndroid Build Coastguard Worker return ret 1985*333d2b36SAndroid Build Coastguard Worker }) 1986*333d2b36SAndroid Build Coastguard Worker if dirMap == nil { 1987*333d2b36SAndroid Build Coastguard Worker return nil 1988*333d2b36SAndroid Build Coastguard Worker } 1989*333d2b36SAndroid Build Coastguard Worker return dirMap.(map[string]bool) 1990*333d2b36SAndroid Build Coastguard Worker} 1991*333d2b36SAndroid Build Coastguard Worker 1992*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) ShippingApiLevel() ApiLevel { 1993*333d2b36SAndroid Build Coastguard Worker if c.config.productVariables.Shipping_api_level == nil { 1994*333d2b36SAndroid Build Coastguard Worker return NoneApiLevel 1995*333d2b36SAndroid Build Coastguard Worker } 1996*333d2b36SAndroid Build Coastguard Worker apiLevel, _ := strconv.Atoi(*c.config.productVariables.Shipping_api_level) 1997*333d2b36SAndroid Build Coastguard Worker return uncheckedFinalApiLevel(apiLevel) 1998*333d2b36SAndroid Build Coastguard Worker} 1999*333d2b36SAndroid Build Coastguard Worker 2000*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenPluginValidation() []string { 2001*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenPluginValidation 2002*333d2b36SAndroid Build Coastguard Worker} 2003*333d2b36SAndroid Build Coastguard Worker 2004*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenClangAsFlags() bool { 2005*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenClangAsFlags 2006*333d2b36SAndroid Build Coastguard Worker} 2007*333d2b36SAndroid Build Coastguard Worker 2008*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenClangCFlags() bool { 2009*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenClangCFlags 2010*333d2b36SAndroid Build Coastguard Worker} 2011*333d2b36SAndroid Build Coastguard Worker 2012*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenClangProperty() bool { 2013*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenClangProperty 2014*333d2b36SAndroid Build Coastguard Worker} 2015*333d2b36SAndroid Build Coastguard Worker 2016*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool { 2017*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenEnforceSyspropOwner 2018*333d2b36SAndroid Build Coastguard Worker} 2019*333d2b36SAndroid Build Coastguard Worker 2020*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool { 2021*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow 2022*333d2b36SAndroid Build Coastguard Worker} 2023*333d2b36SAndroid Build Coastguard Worker 2024*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool { 2025*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildDebugfsRestrictionsEnabled 2026*333d2b36SAndroid Build Coastguard Worker} 2027*333d2b36SAndroid Build Coastguard Worker 2028*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool { 2029*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenVendorPropertyNamespace 2030*333d2b36SAndroid Build Coastguard Worker} 2031*333d2b36SAndroid Build Coastguard Worker 2032*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenInputDir(name string) bool { 2033*333d2b36SAndroid Build Coastguard Worker return InList(name, c.config.productVariables.BuildBrokenInputDirModules) 2034*333d2b36SAndroid Build Coastguard Worker} 2035*333d2b36SAndroid Build Coastguard Worker 2036*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenDontCheckSystemSdk() bool { 2037*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenDontCheckSystemSdk 2038*333d2b36SAndroid Build Coastguard Worker} 2039*333d2b36SAndroid Build Coastguard Worker 2040*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildBrokenDupSysprop() bool { 2041*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.BuildBrokenDupSysprop 2042*333d2b36SAndroid Build Coastguard Worker} 2043*333d2b36SAndroid Build Coastguard Worker 2044*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildWarningBadOptionalUsesLibsAllowlist() []string { 2045*333d2b36SAndroid Build Coastguard Worker return c.productVariables.BuildWarningBadOptionalUsesLibsAllowlist 2046*333d2b36SAndroid Build Coastguard Worker} 2047*333d2b36SAndroid Build Coastguard Worker 2048*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) GenruleSandboxing() bool { 2049*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.GenruleSandboxing) 2050*333d2b36SAndroid Build Coastguard Worker} 2051*333d2b36SAndroid Build Coastguard Worker 2052*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool { 2053*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.RequiresInsecureExecmemForSwiftshader 2054*333d2b36SAndroid Build Coastguard Worker} 2055*333d2b36SAndroid Build Coastguard Worker 2056*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) Release_aidl_use_unfrozen() bool { 2057*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.Release_aidl_use_unfrozen) 2058*333d2b36SAndroid Build Coastguard Worker} 2059*333d2b36SAndroid Build Coastguard Worker 2060*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SelinuxIgnoreNeverallows() bool { 2061*333d2b36SAndroid Build Coastguard Worker return c.productVariables.SelinuxIgnoreNeverallows 2062*333d2b36SAndroid Build Coastguard Worker} 2063*333d2b36SAndroid Build Coastguard Worker 2064*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string { 2065*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.SepolicyFreezeTestExtraDirs 2066*333d2b36SAndroid Build Coastguard Worker} 2067*333d2b36SAndroid Build Coastguard Worker 2068*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string { 2069*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs 2070*333d2b36SAndroid Build Coastguard Worker} 2071*333d2b36SAndroid Build Coastguard Worker 2072*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool { 2073*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GenerateAidlNdkPlatformBackend 2074*333d2b36SAndroid Build Coastguard Worker} 2075*333d2b36SAndroid Build Coastguard Worker 2076*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) AconfigContainerValidation() string { 2077*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.AconfigContainerValidation 2078*333d2b36SAndroid Build Coastguard Worker} 2079*333d2b36SAndroid Build Coastguard Worker 2080*333d2b36SAndroid Build Coastguard Workerfunc (c *config) IgnorePrefer32OnDevice() bool { 2081*333d2b36SAndroid Build Coastguard Worker return c.productVariables.IgnorePrefer32OnDevice 2082*333d2b36SAndroid Build Coastguard Worker} 2083*333d2b36SAndroid Build Coastguard Worker 2084*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BootJars() []string { 2085*333d2b36SAndroid Build Coastguard Worker return c.Once(earlyBootJarsKey, func() interface{} { 2086*333d2b36SAndroid Build Coastguard Worker list := c.productVariables.BootJars.CopyOfJars() 2087*333d2b36SAndroid Build Coastguard Worker return append(list, c.productVariables.ApexBootJars.CopyOfJars()...) 2088*333d2b36SAndroid Build Coastguard Worker }).([]string) 2089*333d2b36SAndroid Build Coastguard Worker} 2090*333d2b36SAndroid Build Coastguard Worker 2091*333d2b36SAndroid Build Coastguard Workerfunc (c *config) NonApexBootJars() ConfiguredJarList { 2092*333d2b36SAndroid Build Coastguard Worker return c.productVariables.BootJars 2093*333d2b36SAndroid Build Coastguard Worker} 2094*333d2b36SAndroid Build Coastguard Worker 2095*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ApexBootJars() ConfiguredJarList { 2096*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ApexBootJars 2097*333d2b36SAndroid Build Coastguard Worker} 2098*333d2b36SAndroid Build Coastguard Worker 2099*333d2b36SAndroid Build Coastguard Workerfunc (c *config) RBEWrapper() string { 2100*333d2b36SAndroid Build Coastguard Worker return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath) 2101*333d2b36SAndroid Build Coastguard Worker} 2102*333d2b36SAndroid Build Coastguard Worker 2103*333d2b36SAndroid Build Coastguard Worker// UseHostMusl returns true if the host target has been configured to build against musl libc. 2104*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseHostMusl() bool { 2105*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.HostMusl) 2106*333d2b36SAndroid Build Coastguard Worker} 2107*333d2b36SAndroid Build Coastguard Worker 2108*333d2b36SAndroid Build Coastguard Worker// ApiSurfaces directory returns the source path inside the api_surfaces repo 2109*333d2b36SAndroid Build Coastguard Worker// (relative to workspace root). 2110*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ApiSurfacesDir(s ApiSurface, version string) string { 2111*333d2b36SAndroid Build Coastguard Worker return filepath.Join( 2112*333d2b36SAndroid Build Coastguard Worker "build", 2113*333d2b36SAndroid Build Coastguard Worker "bazel", 2114*333d2b36SAndroid Build Coastguard Worker "api_surfaces", 2115*333d2b36SAndroid Build Coastguard Worker s.String(), 2116*333d2b36SAndroid Build Coastguard Worker version) 2117*333d2b36SAndroid Build Coastguard Worker} 2118*333d2b36SAndroid Build Coastguard Worker 2119*333d2b36SAndroid Build Coastguard Workerfunc (c *config) JavaCoverageEnabled() bool { 2120*333d2b36SAndroid Build Coastguard Worker return c.IsEnvTrue("EMMA_INSTRUMENT") || c.IsEnvTrue("EMMA_INSTRUMENT_STATIC") || c.IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") 2121*333d2b36SAndroid Build Coastguard Worker} 2122*333d2b36SAndroid Build Coastguard Worker 2123*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) BuildFromSourceStub() bool { 2124*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.BuildFromSourceStub) 2125*333d2b36SAndroid Build Coastguard Worker} 2126*333d2b36SAndroid Build Coastguard Worker 2127*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildFromTextStub() bool { 2128*333d2b36SAndroid Build Coastguard Worker // TODO: b/302320354 - Remove the coverage build specific logic once the 2129*333d2b36SAndroid Build Coastguard Worker // robust solution for handling native properties in from-text stub build 2130*333d2b36SAndroid Build Coastguard Worker // is implemented. 2131*333d2b36SAndroid Build Coastguard Worker return !c.buildFromSourceStub && 2132*333d2b36SAndroid Build Coastguard Worker !c.JavaCoverageEnabled() && 2133*333d2b36SAndroid Build Coastguard Worker !c.deviceConfig.BuildFromSourceStub() 2134*333d2b36SAndroid Build Coastguard Worker} 2135*333d2b36SAndroid Build Coastguard Worker 2136*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SetBuildFromTextStub(b bool) { 2137*333d2b36SAndroid Build Coastguard Worker c.buildFromSourceStub = !b 2138*333d2b36SAndroid Build Coastguard Worker c.productVariables.Build_from_text_stub = boolPtr(b) 2139*333d2b36SAndroid Build Coastguard Worker} 2140*333d2b36SAndroid Build Coastguard Worker 2141*333d2b36SAndroid Build Coastguard Workerfunc (c *deviceConfig) CheckVendorSeappViolations() bool { 2142*333d2b36SAndroid Build Coastguard Worker return Bool(c.config.productVariables.CheckVendorSeappViolations) 2143*333d2b36SAndroid Build Coastguard Worker} 2144*333d2b36SAndroid Build Coastguard Worker 2145*333d2b36SAndroid Build Coastguard Workerfunc (c *config) GetBuildFlag(name string) (string, bool) { 2146*333d2b36SAndroid Build Coastguard Worker val, ok := c.productVariables.BuildFlags[name] 2147*333d2b36SAndroid Build Coastguard Worker return val, ok 2148*333d2b36SAndroid Build Coastguard Worker} 2149*333d2b36SAndroid Build Coastguard Worker 2150*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseOptimizedResourceShrinkingByDefault() bool { 2151*333d2b36SAndroid Build Coastguard Worker return c.productVariables.GetBuildFlagBool("RELEASE_USE_OPTIMIZED_RESOURCE_SHRINKING_BY_DEFAULT") 2152*333d2b36SAndroid Build Coastguard Worker} 2153*333d2b36SAndroid Build Coastguard Worker 2154*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseResourceProcessorByDefault() bool { 2155*333d2b36SAndroid Build Coastguard Worker return c.productVariables.GetBuildFlagBool("RELEASE_USE_RESOURCE_PROCESSOR_BY_DEFAULT") 2156*333d2b36SAndroid Build Coastguard Worker} 2157*333d2b36SAndroid Build Coastguard Worker 2158*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseTransitiveJarsInClasspath() bool { 2159*333d2b36SAndroid Build Coastguard Worker return c.productVariables.GetBuildFlagBool("RELEASE_USE_TRANSITIVE_JARS_IN_CLASSPATH") 2160*333d2b36SAndroid Build Coastguard Worker} 2161*333d2b36SAndroid Build Coastguard Worker 2162*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseDexV41() bool { 2163*333d2b36SAndroid Build Coastguard Worker return c.productVariables.GetBuildFlagBool("RELEASE_USE_DEX_V41") 2164*333d2b36SAndroid Build Coastguard Worker} 2165*333d2b36SAndroid Build Coastguard Worker 2166*333d2b36SAndroid Build Coastguard Workervar ( 2167*333d2b36SAndroid Build Coastguard Worker mainlineApexContributionBuildFlagsToApexNames = map[string]string{ 2168*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_ADBD": "com.android.adbd", 2169*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "com.android.adservices", 2170*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_APPSEARCH": "com.android.appsearch", 2171*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_ART": "com.android.art", 2172*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_BLUETOOTH": "com.android.btservices", 2173*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_CAPTIVEPORTALLOGIN": "", 2174*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_CELLBROADCAST": "com.android.cellbroadcast", 2175*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_CONFIGINFRASTRUCTURE": "com.android.configinfrastructure", 2176*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_CONNECTIVITY": "com.android.tethering", 2177*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_CONSCRYPT": "com.android.conscrypt", 2178*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_CRASHRECOVERY": "", 2179*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_DEVICELOCK": "com.android.devicelock", 2180*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_DOCUMENTSUIGOOGLE": "", 2181*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_EXTSERVICES": "com.android.extservices", 2182*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_HEALTHFITNESS": "com.android.healthfitness", 2183*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_IPSEC": "com.android.ipsec", 2184*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_MEDIA": "com.android.media", 2185*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_MEDIAPROVIDER": "com.android.mediaprovider", 2186*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_MODULE_METADATA": "", 2187*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_NETWORKSTACKGOOGLE": "", 2188*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_NEURALNETWORKS": "com.android.neuralnetworks", 2189*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_ONDEVICEPERSONALIZATION": "com.android.ondevicepersonalization", 2190*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_PERMISSION": "com.android.permission", 2191*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_PRIMARY_LIBS": "", 2192*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_REMOTEKEYPROVISIONING": "com.android.rkpd", 2193*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_RESOLV": "com.android.resolv", 2194*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_SCHEDULING": "com.android.scheduling", 2195*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_SDKEXTENSIONS": "com.android.sdkext", 2196*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_SWCODEC": "com.android.media.swcodec", 2197*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_STATSD": "com.android.os.statsd", 2198*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_TELEMETRY_TVP": "", 2199*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_TZDATA": "com.android.tzdata", 2200*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_UWB": "com.android.uwb", 2201*333d2b36SAndroid Build Coastguard Worker "RELEASE_APEX_CONTRIBUTIONS_WIFI": "com.android.wifi", 2202*333d2b36SAndroid Build Coastguard Worker } 2203*333d2b36SAndroid Build Coastguard Worker) 2204*333d2b36SAndroid Build Coastguard Worker 2205*333d2b36SAndroid Build Coastguard Worker// Returns the list of _selected_ apex_contributions 2206*333d2b36SAndroid Build Coastguard Worker// Each mainline module will have one entry in the list 2207*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AllApexContributions() []string { 2208*333d2b36SAndroid Build Coastguard Worker ret := []string{} 2209*333d2b36SAndroid Build Coastguard Worker for _, f := range SortedKeys(mainlineApexContributionBuildFlagsToApexNames) { 2210*333d2b36SAndroid Build Coastguard Worker if val, exists := c.GetBuildFlag(f); exists && val != "" { 2211*333d2b36SAndroid Build Coastguard Worker ret = append(ret, val) 2212*333d2b36SAndroid Build Coastguard Worker } 2213*333d2b36SAndroid Build Coastguard Worker } 2214*333d2b36SAndroid Build Coastguard Worker return ret 2215*333d2b36SAndroid Build Coastguard Worker} 2216*333d2b36SAndroid Build Coastguard Worker 2217*333d2b36SAndroid Build Coastguard Workerfunc (c *config) AllMainlineApexNames() []string { 2218*333d2b36SAndroid Build Coastguard Worker return SortedStringValues(mainlineApexContributionBuildFlagsToApexNames) 2219*333d2b36SAndroid Build Coastguard Worker} 2220*333d2b36SAndroid Build Coastguard Worker 2221*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BuildIgnoreApexContributionContents() *bool { 2222*333d2b36SAndroid Build Coastguard Worker return c.productVariables.BuildIgnoreApexContributionContents 2223*333d2b36SAndroid Build Coastguard Worker} 2224*333d2b36SAndroid Build Coastguard Worker 2225*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductLocales() []string { 2226*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductLocales 2227*333d2b36SAndroid Build Coastguard Worker} 2228*333d2b36SAndroid Build Coastguard Worker 2229*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductDefaultWifiChannels() []string { 2230*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductDefaultWifiChannels 2231*333d2b36SAndroid Build Coastguard Worker} 2232*333d2b36SAndroid Build Coastguard Worker 2233*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BoardUseVbmetaDigestInFingerprint() bool { 2234*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.BoardUseVbmetaDigestInFingerprint) 2235*333d2b36SAndroid Build Coastguard Worker} 2236*333d2b36SAndroid Build Coastguard Worker 2237*333d2b36SAndroid Build Coastguard Workerfunc (c *config) OemProperties() []string { 2238*333d2b36SAndroid Build Coastguard Worker return c.productVariables.OemProperties 2239*333d2b36SAndroid Build Coastguard Worker} 2240*333d2b36SAndroid Build Coastguard Worker 2241*333d2b36SAndroid Build Coastguard Workerfunc (c *config) UseDebugArt() bool { 2242*333d2b36SAndroid Build Coastguard Worker if c.productVariables.ArtTargetIncludeDebugBuild != nil { 2243*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.ArtTargetIncludeDebugBuild) 2244*333d2b36SAndroid Build Coastguard Worker } 2245*333d2b36SAndroid Build Coastguard Worker 2246*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.Eng) 2247*333d2b36SAndroid Build Coastguard Worker} 2248*333d2b36SAndroid Build Coastguard Worker 2249*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SystemPropFiles(ctx PathContext) Paths { 2250*333d2b36SAndroid Build Coastguard Worker return PathsForSource(ctx, c.productVariables.SystemPropFiles) 2251*333d2b36SAndroid Build Coastguard Worker} 2252*333d2b36SAndroid Build Coastguard Worker 2253*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SystemExtPropFiles(ctx PathContext) Paths { 2254*333d2b36SAndroid Build Coastguard Worker return PathsForSource(ctx, c.productVariables.SystemExtPropFiles) 2255*333d2b36SAndroid Build Coastguard Worker} 2256*333d2b36SAndroid Build Coastguard Worker 2257*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductPropFiles(ctx PathContext) Paths { 2258*333d2b36SAndroid Build Coastguard Worker return PathsForSource(ctx, c.productVariables.ProductPropFiles) 2259*333d2b36SAndroid Build Coastguard Worker} 2260*333d2b36SAndroid Build Coastguard Worker 2261*333d2b36SAndroid Build Coastguard Workerfunc (c *config) OdmPropFiles(ctx PathContext) Paths { 2262*333d2b36SAndroid Build Coastguard Worker return PathsForSource(ctx, c.productVariables.OdmPropFiles) 2263*333d2b36SAndroid Build Coastguard Worker} 2264*333d2b36SAndroid Build Coastguard Worker 2265*333d2b36SAndroid Build Coastguard Workerfunc (c *config) VendorPropFiles(ctx PathContext) Paths { 2266*333d2b36SAndroid Build Coastguard Worker return PathsForSource(ctx, c.productVariables.VendorPropFiles) 2267*333d2b36SAndroid Build Coastguard Worker} 2268*333d2b36SAndroid Build Coastguard Worker 2269*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ExtraAllowedDepsTxt() string { 2270*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.ExtraAllowedDepsTxt) 2271*333d2b36SAndroid Build Coastguard Worker} 2272*333d2b36SAndroid Build Coastguard Worker 2273*333d2b36SAndroid Build Coastguard Workerfunc (c *config) EnableUffdGc() string { 2274*333d2b36SAndroid Build Coastguard Worker return String(c.productVariables.EnableUffdGc) 2275*333d2b36SAndroid Build Coastguard Worker} 2276*333d2b36SAndroid Build Coastguard Worker 2277*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceFrameworkCompatibilityMatrixFile() []string { 2278*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceFrameworkCompatibilityMatrixFile 2279*333d2b36SAndroid Build Coastguard Worker} 2280*333d2b36SAndroid Build Coastguard Worker 2281*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceProductCompatibilityMatrixFile() []string { 2282*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceProductCompatibilityMatrixFile 2283*333d2b36SAndroid Build Coastguard Worker} 2284*333d2b36SAndroid Build Coastguard Worker 2285*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BoardAvbEnable() bool { 2286*333d2b36SAndroid Build Coastguard Worker return Bool(c.productVariables.BoardAvbEnable) 2287*333d2b36SAndroid Build Coastguard Worker} 2288*333d2b36SAndroid Build Coastguard Worker 2289*333d2b36SAndroid Build Coastguard Workerfunc (c *config) BoardAvbSystemAddHashtreeFooterArgs() []string { 2290*333d2b36SAndroid Build Coastguard Worker return c.productVariables.BoardAvbSystemAddHashtreeFooterArgs 2291*333d2b36SAndroid Build Coastguard Worker} 2292*333d2b36SAndroid Build Coastguard Worker 2293*333d2b36SAndroid Build Coastguard Worker// Returns true if RELEASE_INSTALL_APEX_SYSTEMSERVER_DEXPREOPT_SAME_PARTITION is set to true. 2294*333d2b36SAndroid Build Coastguard Worker// If true, dexpreopt files of apex system server jars will be installed in the same partition as the parent apex. 2295*333d2b36SAndroid Build Coastguard Worker// If false, all these files will be installed in /system partition. 2296*333d2b36SAndroid Build Coastguard Workerfunc (c Config) InstallApexSystemServerDexpreoptSamePartition() bool { 2297*333d2b36SAndroid Build Coastguard Worker return c.config.productVariables.GetBuildFlagBool("RELEASE_INSTALL_APEX_SYSTEMSERVER_DEXPREOPT_SAME_PARTITION") 2298*333d2b36SAndroid Build Coastguard Worker} 2299*333d2b36SAndroid Build Coastguard Worker 2300*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceMatrixFile() []string { 2301*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceMatrixFile 2302*333d2b36SAndroid Build Coastguard Worker} 2303*333d2b36SAndroid Build Coastguard Worker 2304*333d2b36SAndroid Build Coastguard Workerfunc (c *config) ProductManifestFiles() []string { 2305*333d2b36SAndroid Build Coastguard Worker return c.productVariables.ProductManifestFiles 2306*333d2b36SAndroid Build Coastguard Worker} 2307*333d2b36SAndroid Build Coastguard Worker 2308*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SystemManifestFile() []string { 2309*333d2b36SAndroid Build Coastguard Worker return c.productVariables.SystemManifestFile 2310*333d2b36SAndroid Build Coastguard Worker} 2311*333d2b36SAndroid Build Coastguard Worker 2312*333d2b36SAndroid Build Coastguard Workerfunc (c *config) SystemExtManifestFiles() []string { 2313*333d2b36SAndroid Build Coastguard Worker return c.productVariables.SystemExtManifestFiles 2314*333d2b36SAndroid Build Coastguard Worker} 2315*333d2b36SAndroid Build Coastguard Worker 2316*333d2b36SAndroid Build Coastguard Workerfunc (c *config) DeviceManifestFiles() []string { 2317*333d2b36SAndroid Build Coastguard Worker return c.productVariables.DeviceManifestFiles 2318*333d2b36SAndroid Build Coastguard Worker} 2319*333d2b36SAndroid Build Coastguard Worker 2320*333d2b36SAndroid Build Coastguard Workerfunc (c *config) OdmManifestFiles() []string { 2321*333d2b36SAndroid Build Coastguard Worker return c.productVariables.OdmManifestFiles 2322*333d2b36SAndroid Build Coastguard Worker} 2323