blob: 4ed107d4fd08c50dc629a99466bb323ac80e29c0 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
Jingwen Chenc711fec2020-11-22 23:52:50 -050017// This is the primary location to write and read all configuration values and
18// product variables necessary for soong_build's operation.
19
Colin Cross3f40fa42015-01-30 17:27:36 -080020import (
Cole Faust082c5f32022-08-04 15:49:20 -070021 "bytes"
Colin Cross3f40fa42015-01-30 17:27:36 -080022 "encoding/json"
23 "fmt"
24 "os"
Colin Cross35cec122015-04-02 14:37:16 -070025 "path/filepath"
Sam Delmerico5c32bbf2022-01-20 20:15:02 +000026 "reflect"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "runtime"
Inseob Kim60c32f02020-12-21 22:53:05 +090028 "strconv"
Dan Willemsen34cc69e2015-09-23 15:26:20 -070029 "strings"
Colin Crossc1e86a32015-04-15 12:33:28 -070030 "sync"
Colin Cross6ff51382015-12-17 16:39:19 -080031
Colin Cross98be1bb2019-12-13 20:41:13 -080032 "github.com/google/blueprint"
Colin Crosse87040b2017-12-11 15:52:26 -080033 "github.com/google/blueprint/bootstrap"
Colin Cross98be1bb2019-12-13 20:41:13 -080034 "github.com/google/blueprint/pathtools"
Colin Cross6ff51382015-12-17 16:39:19 -080035 "github.com/google/blueprint/proptools"
Colin Cross9d34f352019-11-22 16:03:51 -080036
37 "android/soong/android/soongconfig"
Liz Kammer09f947d2021-05-12 14:51:49 -040038 "android/soong/bazel"
Colin Cross77cdcfd2021-03-12 11:28:25 -080039 "android/soong/remoteexec"
Liz Kammer72beb342022-02-03 08:42:10 -050040 "android/soong/starlark_fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080041)
42
Jingwen Chenc711fec2020-11-22 23:52:50 -050043// Bool re-exports proptools.Bool for the android package.
Colin Cross6ff51382015-12-17 16:39:19 -080044var Bool = proptools.Bool
Jingwen Chenc711fec2020-11-22 23:52:50 -050045
46// String re-exports proptools.String for the android package.
Jack He8cc71432016-12-08 15:45:07 -080047var String = proptools.String
Jingwen Chenc711fec2020-11-22 23:52:50 -050048
49// StringDefault re-exports proptools.StringDefault for the android package.
Jeongik Cha219141c2020-08-06 23:00:37 +090050var StringDefault = proptools.StringDefault
Jiyong Park6a927c42020-01-21 02:03:43 +090051
Jingwen Chenc711fec2020-11-22 23:52:50 -050052// FutureApiLevelInt is a placeholder constant for unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070053const FutureApiLevelInt = 10000
54
Spandan Das15da5882023-03-02 23:36:39 +000055// PrivateApiLevel represents the api level of SdkSpecPrivate (sdk_version: "")
56// This api_level exists to differentiate user-provided "" from "current" sdk_version
57// The differentiation is necessary to enable different validation rules for these two possible values.
58var PrivateApiLevel = ApiLevel{
59 value: "current", // The value is current since aidl expects `current` as the default (TestAidlFlagsWithMinSdkVersion)
60 number: FutureApiLevelInt + 1, // This is used to differentiate it from FutureApiLevel
61 isPreview: true,
62}
63
Jingwen Chenc711fec2020-11-22 23:52:50 -050064// FutureApiLevel represents unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070065var FutureApiLevel = ApiLevel{
66 value: "current",
67 number: FutureApiLevelInt,
68 isPreview: true,
69}
Colin Cross6ff51382015-12-17 16:39:19 -080070
Jingwen Chenc4d91bc2020-11-24 22:59:26 -050071// The product variables file name, containing product config from Kati.
Dan Willemsen87b17d12015-07-14 00:39:06 -070072const productVariablesFileName = "soong.variables"
Colin Cross3f40fa42015-01-30 17:27:36 -080073
Colin Cross9272ade2016-08-17 15:24:12 -070074// A Config object represents the entire build configuration for Android.
Colin Crossc3c0a492015-04-10 15:43:55 -070075type Config struct {
76 *config
77}
78
Chris Parsonsad876012022-08-20 14:48:32 -040079type SoongBuildMode int
80
Sasha Smundakaf5ca922022-12-12 21:23:34 -080081type CmdArgs struct {
82 bootstrap.Args
83 RunGoTests bool
84 OutDir string
85 SoongOutDir string
86
87 SymlinkForestMarker string
88 Bp2buildMarker string
89 BazelQueryViewDir string
90 BazelApiBp2buildDir string
91 ModuleGraphFile string
92 ModuleActionsFile string
93 DocFile string
94
LaMont Jones52a72432023-03-09 18:19:35 +000095 MultitreeBuild bool
96
Sasha Smundakaf5ca922022-12-12 21:23:34 -080097 BazelMode bool
98 BazelModeDev bool
99 BazelModeStaging bool
100 BazelForceEnabledModules string
Chris Parsons9402ca82023-02-23 17:28:06 -0500101
102 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000103
104 BuildFromTextStub bool
MarkDacekf47e1422023-04-19 16:47:36 +0000105
106 EnsureAllowlistIntegrity bool
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800107}
108
Chris Parsonsad876012022-08-20 14:48:32 -0400109// Build modes that soong_build can run as.
110const (
111 // Don't use bazel at all during module analysis.
112 AnalysisNoBazel SoongBuildMode = iota
113
Lukacs T. Berkic541cd22022-10-26 07:26:50 +0000114 // Symlink fores mode: merge two directory trees into a symlink forest
115 SymlinkForest
116
Chris Parsonsad876012022-08-20 14:48:32 -0400117 // Bp2build mode: Generate BUILD files from blueprint files and exit.
118 Bp2build
119
120 // Generate BUILD files which faithfully represent the dependency graph of
121 // blueprint modules. Individual BUILD targets will not, however, faitfhully
122 // express build semantics.
123 GenerateQueryView
124
Spandan Das5af0bd32022-09-28 20:43:08 +0000125 // Generate BUILD files for API contributions to API surfaces
126 ApiBp2build
127
Chris Parsonsad876012022-08-20 14:48:32 -0400128 // Create a JSON representation of the module graph and exit.
129 GenerateModuleGraph
130
131 // Generate a documentation file for module type definitions and exit.
132 GenerateDocFile
133
134 // Use bazel during analysis of many allowlisted build modules. The allowlist
135 // is considered a "developer mode" allowlist, as some modules may be
136 // allowlisted on an experimental basis.
137 BazelDevMode
138
MarkDacekb78465d2022-10-18 20:10:16 +0000139 // Use bazel during analysis of a few allowlisted build modules. The allowlist
140 // is considered "staging, as these are modules being prepared to be released
141 // into prod mode shortly after.
142 BazelStagingMode
143
Chris Parsonsad876012022-08-20 14:48:32 -0400144 // Use bazel during analysis of build modules from an allowlist carefully
145 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400146 BazelProdMode
147)
148
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200149// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200150func (c Config) SoongOutDir() string {
151 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700152}
153
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200154func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200155 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100156}
157
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200158func (c Config) RunGoTests() bool {
159 return c.runGoTests
160}
161
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100162func (c Config) DebugCompilation() bool {
163 return false // Never compile Go code in the main build for debugging
164}
165
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200166func (c Config) Subninjas() []string {
167 return []string{}
168}
169
170func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
171 return []bootstrap.PrimaryBuilderInvocation{}
172}
173
Paul Duffin74135582022-10-06 11:01:59 +0100174// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
175func (c Config) RunningInsideUnitTest() bool {
176 return c.config.TestProductVariables != nil
177}
178
Juan Yescas05d4d902023-04-07 10:35:35 -0700179// MaxPageSizeSupported returns the max page size supported by the device. This
180// value will define the ELF segment alignment for binaries (executables and
181// shared libraries).
182func (c Config) MaxPageSizeSupported() string {
183 return String(c.config.productVariables.DeviceMaxPageSizeSupported)
184}
185
Joe Onoratofee845a2023-05-09 08:14:14 -0700186// The release version passed to aconfig, derived from RELEASE_VERSION
187func (c Config) ReleaseVersion() string {
188 return c.config.productVariables.ReleaseVersion
189}
190
191// The flag values files passed to aconfig, derived from RELEASE_VERSION
192func (c Config) ReleaseDeviceConfigValueSets() []string {
193 return c.config.productVariables.ReleaseDeviceConfigValueSets
194}
195
Jingwen Chenc711fec2020-11-22 23:52:50 -0500196// A DeviceConfig object represents the configuration for a particular device
197// being built. For now there will only be one of these, but in the future there
198// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700199type DeviceConfig struct {
200 *deviceConfig
201}
202
Jingwen Chenc711fec2020-11-22 23:52:50 -0500203// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800204type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700205
Jingwen Chenc711fec2020-11-22 23:52:50 -0500206// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500207// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700208type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500209 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800210 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800211
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700212 // Only available on configs created by TestConfig
213 TestProductVariables *productVariables
214
Jingwen Chenc711fec2020-11-22 23:52:50 -0500215 // A specialized context object for Bazel/Soong mixed builds and migration
216 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400217 BazelContext BazelContext
218
Dan Willemsen87b17d12015-07-14 00:39:06 -0700219 ProductVariablesFileName string
220
Colin Cross0c66bc62021-07-20 09:47:41 -0700221 // BuildOS stores the OsType for the OS that the build is running on.
222 BuildOS OsType
223
224 // BuildArch stores the ArchType for the CPU that the build is running on.
225 BuildArch ArchType
226
Jaewoong Jung642916f2020-10-09 17:25:15 -0700227 Targets map[OsType][]Target
228 BuildOSTarget Target // the Target for tools run on the build machine
229 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
230 AndroidCommonTarget Target // the Target for common modules for the Android device
231 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700232
Jingwen Chenc711fec2020-11-22 23:52:50 -0500233 // multilibConflicts for an ArchType is true if there is earlier configured
234 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700235 multilibConflicts map[ArchType]bool
236
Colin Cross9272ade2016-08-17 15:24:12 -0700237 deviceConfig *deviceConfig
238
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200239 outDir string // The output directory (usually out/)
240 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400241 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700242
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200243 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200244
Colin Cross6ccbc912017-10-10 23:07:38 -0700245 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700246 envLock sync.Mutex
247 envDeps map[string]string
248 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800249
Jingwen Chencda22c92020-11-23 00:22:30 -0500250 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
251 // runs standalone.
252 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700253
Colin Cross32616ed2017-09-05 21:56:44 -0700254 captureBuild bool // true for tests, saves build parameters for each module
255 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700256
Colin Cross98be1bb2019-12-13 20:41:13 -0800257 fs pathtools.FileSystem
258 mockBpList string
259
Chris Parsonsad876012022-08-20 14:48:32 -0400260 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700261 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000262 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500263
LaMont Jones52a72432023-03-09 18:19:35 +0000264 // If MultitreeBuild is true then this is one inner tree of a multitree
265 // build directed by the multitree orchestrator.
266 MultitreeBuild bool
267
Colin Cross5e6a7972020-06-07 16:56:32 -0700268 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
269 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000270 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700271
Jingwen Chenc711fec2020-11-22 23:52:50 -0500272 // The list of files that when changed, must invalidate soong_build to
273 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700274 ninjaFileDepsSet sync.Map
275
Colin Cross9272ade2016-08-17 15:24:12 -0700276 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000277
Chris Parsonsad876012022-08-20 14:48:32 -0400278 // These fields are only used for metrics collection. A module should be added
279 // to these maps only if its implementation supports Bazel handling in mixed
280 // builds. A module being in the "enabled" list indicates that there is a
281 // variant of that module for which bazel-handling actually took place.
282 // A module being in the "disabled" list indicates that there is a variant of
283 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000284 mixedBuildsLock sync.Mutex
285 mixedBuildEnabledModules map[string]struct{}
286 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000287
288 // These are modules to be built with Bazel beyond the allowlisted/build-mode
289 // specified modules. They are passed via the command-line flag
290 // "--bazel-force-enabled-modules"
291 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500292
293 // If true, for any requests to Bazel, communicate with a Bazel proxy using
294 // unix sockets, instead of spawning Bazel as a subprocess.
295 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000296
297 // If buildFromTextStub is true then the Java API stubs are
298 // built from the signature text files, not the source Java files.
299 buildFromTextStub bool
MarkDacekf47e1422023-04-19 16:47:36 +0000300
301 // If ensureAllowlistIntegrity is true, then the presence of any allowlisted
302 // modules that aren't mixed-built for at least one variant will cause a build
303 // failure
304 ensureAllowlistIntegrity bool
Colin Cross9272ade2016-08-17 15:24:12 -0700305}
306
307type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700308 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700309 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800310}
311
Colin Cross485e5722015-08-27 13:28:01 -0700312type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700313 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700314}
Colin Cross3f40fa42015-01-30 17:27:36 -0800315
Colin Cross485e5722015-08-27 13:28:01 -0700316func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000317 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700318}
319
Jingwen Chenc711fec2020-11-22 23:52:50 -0500320// loadFromConfigFile loads and decodes configuration options from a JSON file
321// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400322func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800323 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700324 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800325 defer configFileReader.Close()
326 if os.IsNotExist(err) {
327 // Need to create a file, so that blueprint & ninja don't get in
328 // a dependency tracking loop.
329 // Make a file-configurable-options with defaults, write it out using
330 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700331 configurable.SetDefaultConfig()
332 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800333 if err != nil {
334 return err
335 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800336 } else if err != nil {
337 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800338 } else {
339 // Make a decoder for it
340 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700341 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800342 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800343 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800344 }
345 }
346
Liz Kammer09f947d2021-05-12 14:51:49 -0400347 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
348 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
349 }
350
351 configurable.Native_coverage = proptools.BoolPtr(
352 Bool(configurable.GcovCoverage) ||
353 Bool(configurable.ClangCoverage))
354
Yuntao Xu402e9b02021-08-09 15:44:44 -0700355 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
356 // if false (pre-released version, for example), use Platform_sdk_codename.
357 if Bool(configurable.Platform_sdk_final) {
358 if configurable.Platform_sdk_version != nil {
359 configurable.Platform_sdk_version_or_codename =
360 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
361 } else {
362 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
363 }
364 } else {
365 configurable.Platform_sdk_version_or_codename =
366 proptools.StringPtr(String(configurable.Platform_sdk_codename))
367 }
368
Liz Kammer09f947d2021-05-12 14:51:49 -0400369 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800370}
371
Colin Crossd8f20142016-11-03 09:43:26 -0700372// atomically writes the config file in case two copies of soong_build are running simultaneously
373// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400374func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800375 data, err := json.MarshalIndent(&config, "", " ")
376 if err != nil {
377 return fmt.Errorf("cannot marshal config data: %s", err.Error())
378 }
379
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800380 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800381 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500382 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800383 }
Colin Crossd8f20142016-11-03 09:43:26 -0700384 defer os.Remove(f.Name())
385 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800386
Colin Crossd8f20142016-11-03 09:43:26 -0700387 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800388 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700389 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
390 }
391
Colin Crossd8f20142016-11-03 09:43:26 -0700392 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700393 if err != nil {
394 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800395 }
396
Colin Crossd8f20142016-11-03 09:43:26 -0700397 f.Close()
398 os.Rename(f.Name(), filename)
399
Colin Cross3f40fa42015-01-30 17:27:36 -0800400 return nil
401}
402
Liz Kammer09f947d2021-05-12 14:51:49 -0400403func saveToBazelConfigFile(config *productVariables, outDir string) error {
404 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
405 err := createDirIfNonexistent(dir, os.ModePerm)
406 if err != nil {
407 return fmt.Errorf("Could not create dir %s: %s", dir, err)
408 }
409
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000410 nonArchVariantProductVariables := []string{}
411 archVariantProductVariables := []string{}
412 p := variableProperties{}
413 t := reflect.TypeOf(p.Product_variables)
414 for i := 0; i < t.NumField(); i++ {
415 f := t.Field(i)
416 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
417 if proptools.HasTag(f, "android", "arch_variant") {
418 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
419 }
420 }
421
Liz Kammer72beb342022-02-03 08:42:10 -0500422 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000423 if err != nil {
424 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
425 }
426
Liz Kammer72beb342022-02-03 08:42:10 -0500427 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000428 if err != nil {
429 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
430 }
431
432 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400433 if err != nil {
434 return fmt.Errorf("cannot marshal config data: %s", err.Error())
435 }
Cole Faust082c5f32022-08-04 15:49:20 -0700436 // The backslashes need to be escaped because this text is going to be put
437 // inside a Starlark string literal.
438 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400439
440 bzl := []string{
441 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000442 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
443 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
444 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
445 "\n", `
446product_vars = _product_vars
Cole Fausteb644cf2023-04-11 13:48:17 -0700447
448# TODO(b/269577299) Remove these when everything switches over to loading them from product_variable_constants.bzl
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000449product_var_constraints = _product_var_constraints
450arch_variant_product_var_constraints = _arch_variant_product_var_constraints
451`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400452 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500453 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
454 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400455 if err != nil {
456 return fmt.Errorf("Could not write .bzl config file %s", err)
457 }
Cole Fausteb644cf2023-04-11 13:48:17 -0700458 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variable_constants.bzl"), []byte(fmt.Sprintf(`
459product_var_constraints = %s
460arch_variant_product_var_constraints = %s
461`, nonArchVariantProductVariablesJson, archVariantProductVariablesJson)), 0644)
462 if err != nil {
463 return fmt.Errorf("Could not write .bzl config file %s", err)
464 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500465 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
466 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400467 if err != nil {
468 return fmt.Errorf("Could not write BUILD config file %s", err)
469 }
470
471 return nil
472}
473
Colin Cross988414c2020-01-11 01:11:46 +0000474// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
475// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200476func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000477 return Config{
478 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200479 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200480 soongOutDir: soongOutDir,
481 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000482 },
483 }
484}
485
Jingwen Chenc711fec2020-11-22 23:52:50 -0500486// NewConfig creates a new Config object. The srcDir argument specifies the path
487// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800488func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500489 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700490 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800491 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700492
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200493 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700494
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800495 outDir: cmdArgs.OutDir,
496 soongOutDir: cmdArgs.SoongOutDir,
497 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200498 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800499
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800500 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000501 fs: pathtools.NewOsFs(absSrcDir),
502 mixedBuildDisabledModules: make(map[string]struct{}),
503 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000504 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500505
LaMont Jones52a72432023-03-09 18:19:35 +0000506 MultitreeBuild: cmdArgs.MultitreeBuild,
507 UseBazelProxy: cmdArgs.UseBazelProxy,
Jihoon Kang1bff0342023-01-17 20:40:22 +0000508
509 buildFromTextStub: cmdArgs.BuildFromTextStub,
Colin Cross68f55102015-03-25 14:43:57 -0700510 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800511
Dan Willemsen00269f22017-07-06 16:59:48 -0700512 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700513 config: config,
514 }
515
Liz Kammer7941b302020-07-28 13:27:34 -0700516 // Soundness check of the build and source directories. This won't catch strange
517 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800518 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700519 if err != nil {
520 return Config{}, err
521 }
522
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200523 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700524 if err != nil {
525 return Config{}, err
526 }
527
528 if strings.HasPrefix(absSrcDir, absBuildDir) {
529 return Config{}, fmt.Errorf("Build dir must not contain source directory")
530 }
531
Colin Cross3f40fa42015-01-30 17:27:36 -0800532 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700533 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800534 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700535 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800536 }
537
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800538 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500539 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
540 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800541 }
542
Colin Cross0c66bc62021-07-20 09:47:41 -0700543 determineBuildOS(config)
544
Jingwen Chenc711fec2020-11-22 23:52:50 -0500545 // Sets up the map of target OSes to the finer grained compilation targets
546 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700547 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700548 if err != nil {
549 return Config{}, err
550 }
551
Paul Duffin1356d8c2020-02-25 19:26:33 +0000552 // Make the CommonOS OsType available for all products.
553 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
554
Dan Albert4098deb2016-10-19 14:04:41 -0700555 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500556 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700557 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000558 } else if config.AmlAbis() {
559 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700560 }
561
562 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500563 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800564 if err != nil {
565 return Config{}, err
566 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700567 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800568 }
569
Colin Cross3b19f5d2019-09-17 14:45:31 -0700570 multilib := make(map[string]bool)
571 for _, target := range targets[Android] {
572 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
573 config.multilibConflicts[target.Arch.ArchType] = true
574 }
575 multilib[target.Arch.ArchType.Multilib] = true
576 }
577
Jingwen Chenc711fec2020-11-22 23:52:50 -0500578 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700579 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500580
581 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700582 config.BuildOSTarget = config.Targets[config.BuildOS][0]
583 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500584
585 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700586 if len(config.Targets[Android]) > 0 {
587 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000588 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700589 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700590
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500591 setBuildMode := func(arg string, mode SoongBuildMode) {
592 if arg != "" {
593 if config.BuildMode != AnalysisNoBazel {
594 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
595 os.Exit(1)
596 }
597 config.BuildMode = mode
598 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800599 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500600 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
601 if arg {
602 if config.BuildMode != AnalysisNoBazel {
603 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
604 os.Exit(1)
605 }
606 config.BuildMode = mode
607 }
608 }
609 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
610 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
611 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
612 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
613 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
614 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
615 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
616 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
617 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800618
MarkDacek1de78f32023-05-02 21:00:48 +0000619 for _, module := range getForceEnabledModulesFromFlag(cmdArgs.BazelForceEnabledModules) {
MarkDacekd06db5d2022-11-29 00:47:59 +0000620 config.bazelForceEnabledModules[module] = struct{}{}
621 }
MarkDacek9c094ca2023-03-16 19:15:19 +0000622 config.BazelContext, err = NewBazelContext(config)
623 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
MarkDacekd06db5d2022-11-29 00:47:59 +0000624
Jingwen Chenc711fec2020-11-22 23:52:50 -0500625 return Config{config}, err
626}
Colin Cross988414c2020-01-11 01:11:46 +0000627
MarkDacek1de78f32023-05-02 21:00:48 +0000628func getForceEnabledModulesFromFlag(forceEnabledFlag string) []string {
629 if forceEnabledFlag == "" {
630 return []string{}
631 }
632 return strings.Split(forceEnabledFlag, ",")
633}
634
Colin Cross98be1bb2019-12-13 20:41:13 -0800635// mockFileSystem replaces all reads with accesses to the provided map of
636// filenames to contents stored as a byte slice.
637func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
638 mockFS := map[string][]byte{}
639
640 if _, exists := mockFS["Android.bp"]; !exists {
641 mockFS["Android.bp"] = []byte(bp)
642 }
643
644 for k, v := range fs {
645 mockFS[k] = v
646 }
647
648 // no module list file specified; find every file named Blueprints or Android.bp
649 pathsToParse := []string{}
650 for candidate := range mockFS {
651 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200652 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800653 pathsToParse = append(pathsToParse, candidate)
654 }
655 }
656 if len(pathsToParse) < 1 {
657 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
658 }
659 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
660
661 c.fs = pathtools.MockFs(mockFS)
662 c.mockBpList = blueprint.MockModuleListFile
663}
664
Jason Wuff1bb312022-12-21 09:57:26 -0500665// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
666// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400667// Returns true if "Bazel builds" is enabled. In this mode, part of build
668// analysis is handled by Bazel.
669func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500670 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
671 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500672 return false
673 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500674 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500675 return false
676 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500677 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500678 return false
679 }
680 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500681 return false
682 }
683 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500684 return false
685 }
686 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500687 return false
688 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500689 return true
690 }).(bool)
691
692 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
693 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400694}
695
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100696func (c *config) SetAllowMissingDependencies() {
697 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
698}
699
Jingwen Chenc711fec2020-11-22 23:52:50 -0500700// BlueprintToolLocation returns the directory containing build system tools
701// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200702func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700703 if c.KatiEnabled() {
704 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
705 } else {
706 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
707 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700708}
709
Dan Willemsen60e62f02018-11-16 21:05:32 -0800710func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700711 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
712 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800713}
714
Colin Cross790ef352021-10-25 19:15:55 -0700715func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000716 ext := ".so"
717 if runtime.GOOS == "darwin" {
718 ext = ".dylib"
719 }
Colin Cross790ef352021-10-25 19:15:55 -0700720 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
721 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000722}
723
Colin Crossae5330a2021-11-03 13:31:22 -0700724func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
725 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700726 return path
727}
728
Vinh Tran09581952023-05-16 16:03:20 -0400729func (c *config) HostCcSharedLibPath(ctx PathContext, lib string) Path {
730 libDir := "lib"
731 if ctx.Config().BuildArch.Multilib == "lib64" {
732 libDir = "lib64"
733 }
734 return pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, libDir, false, lib+".so")
735}
736
Jingwen Chenc711fec2020-11-22 23:52:50 -0500737// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700738func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800739 switch runtime.GOOS {
740 case "linux":
741 return "linux-x86"
742 case "darwin":
743 return "darwin-x86"
744 default:
745 panic("Unknown GOOS")
746 }
747}
748
749// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700750func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200751 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800752}
753
Jingwen Chenc711fec2020-11-22 23:52:50 -0500754// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
755// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700756func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
757 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
758}
759
Jingwen Chenc711fec2020-11-22 23:52:50 -0500760// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
761// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700762func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700763 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800764 case "darwin":
765 return "-R"
766 case "linux":
767 return "-d"
768 default:
769 return ""
770 }
771}
Colin Cross68f55102015-03-25 14:43:57 -0700772
Colin Cross1332b002015-04-07 17:11:30 -0700773func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700774 var val string
775 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700776 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800777 defer c.envLock.Unlock()
778 if c.envDeps == nil {
779 c.envDeps = make(map[string]string)
780 }
Colin Cross68f55102015-03-25 14:43:57 -0700781 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700782 if c.envFrozen {
783 panic("Cannot access new environment variables after envdeps are frozen")
784 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700785 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700786 c.envDeps[key] = val
787 }
788 return val
789}
790
Colin Cross99d7c232016-11-23 16:52:04 -0800791func (c *config) GetenvWithDefault(key string, defaultValue string) string {
792 ret := c.Getenv(key)
793 if ret == "" {
794 return defaultValue
795 }
796 return ret
797}
798
799func (c *config) IsEnvTrue(key string) bool {
800 value := c.Getenv(key)
801 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
802}
803
804func (c *config) IsEnvFalse(key string) bool {
805 value := c.Getenv(key)
806 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
807}
808
Jingwen Chenc711fec2020-11-22 23:52:50 -0500809// EnvDeps returns the environment variables this build depends on. The first
810// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700811func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700812 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800813 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700814 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700815 return c.envDeps
816}
Colin Cross35cec122015-04-02 14:37:16 -0700817
Jingwen Chencda22c92020-11-23 00:22:30 -0500818func (c *config) KatiEnabled() bool {
819 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800820}
821
Nan Zhang581fd212018-01-10 16:06:12 -0800822func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800823 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800824}
825
Jingwen Chenc711fec2020-11-22 23:52:50 -0500826// BuildNumberFile returns the path to a text file containing metadata
827// representing the current build's number.
828//
829// Rules that want to reference the build number should read from this file
830// without depending on it. They will run whenever their other dependencies
831// require them to run and get the current build number. This ensures they don't
832// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800833func (c *config) BuildNumberFile(ctx PathContext) Path {
834 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800835}
836
Jingwen Chenc711fec2020-11-22 23:52:50 -0500837// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700838// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700839func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800840 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700841}
842
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000843// DeviceProduct returns the current product target. There could be multiple of
844// these per device type.
845//
Chris Parsonsef615e52022-08-18 22:04:11 -0400846// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000847func (c *config) DeviceProduct() string {
848 return *c.productVariables.DeviceProduct
849}
850
Cole Faustb85d1a12022-11-08 18:14:01 -0800851// HasDeviceProduct returns if the build has a product. A build will not
852// necessarily have a product when --skip-config is passed to soong, like it is
853// in prebuilts/build-tools/build-prebuilts.sh
854func (c *config) HasDeviceProduct() bool {
855 return c.productVariables.DeviceProduct != nil
856}
857
Anton Hansson53c88442019-03-18 15:53:16 +0000858func (c *config) DeviceResourceOverlays() []string {
859 return c.productVariables.DeviceResourceOverlays
860}
861
862func (c *config) ProductResourceOverlays() []string {
863 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700864}
865
Colin Crossbfd347d2018-05-09 11:11:35 -0700866func (c *config) PlatformVersionName() string {
867 return String(c.productVariables.Platform_version_name)
868}
869
Dan Albert4f378d72020-07-23 17:32:15 -0700870func (c *config) PlatformSdkVersion() ApiLevel {
871 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700872}
873
Cole Faust37d27c42023-04-12 10:27:45 -0700874func (c *config) RawPlatformSdkVersion() *int {
875 return c.productVariables.Platform_sdk_version
876}
877
Mu-Le Lee5e047532022-07-27 02:32:03 +0000878func (c *config) PlatformSdkFinal() bool {
879 return Bool(c.productVariables.Platform_sdk_final)
880}
881
Colin Crossd09b0b62018-04-18 11:06:47 -0700882func (c *config) PlatformSdkCodename() string {
883 return String(c.productVariables.Platform_sdk_codename)
884}
885
Anton Hansson97d0bae2022-02-16 16:15:10 +0000886func (c *config) PlatformSdkExtensionVersion() int {
887 return *c.productVariables.Platform_sdk_extension_version
888}
889
890func (c *config) PlatformBaseSdkExtensionVersion() int {
891 return *c.productVariables.Platform_base_sdk_extension_version
892}
893
Colin Cross092c9da2019-04-02 22:56:43 -0700894func (c *config) PlatformSecurityPatch() string {
895 return String(c.productVariables.Platform_security_patch)
896}
897
898func (c *config) PlatformPreviewSdkVersion() string {
899 return String(c.productVariables.Platform_preview_sdk_version)
900}
901
902func (c *config) PlatformMinSupportedTargetSdkVersion() string {
903 return String(c.productVariables.Platform_min_supported_target_sdk_version)
904}
905
906func (c *config) PlatformBaseOS() string {
907 return String(c.productVariables.Platform_base_os)
908}
909
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900910func (c *config) PlatformVersionLastStable() string {
911 return String(c.productVariables.Platform_version_last_stable)
912}
913
Jiyong Park37073842022-06-21 10:13:42 +0900914func (c *config) PlatformVersionKnownCodenames() string {
915 return String(c.productVariables.Platform_version_known_codenames)
916}
917
Dan Albert1a246272020-07-06 14:49:35 -0700918func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000919 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700920}
921
922func (c *config) FinalApiLevels() []ApiLevel {
923 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700924 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700925 levels = append(levels, uncheckedFinalApiLevel(i))
926 }
927 return levels
928}
929
930func (c *config) PreviewApiLevels() []ApiLevel {
931 var levels []ApiLevel
932 for i, codename := range c.PlatformVersionActiveCodenames() {
933 levels = append(levels, ApiLevel{
934 value: codename,
935 number: i,
936 isPreview: true,
937 })
938 }
939 return levels
940}
941
satayevcca4ab72021-11-30 12:33:55 +0000942func (c *config) LatestPreviewApiLevel() ApiLevel {
943 level := NoneApiLevel
944 for _, l := range c.PreviewApiLevels() {
945 if l.GreaterThan(level) {
946 level = l
947 }
948 }
949 return level
950}
951
Dan Albert1a246272020-07-06 14:49:35 -0700952func (c *config) AllSupportedApiLevels() []ApiLevel {
953 var levels []ApiLevel
954 levels = append(levels, c.FinalApiLevels()...)
955 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700956}
957
Jingwen Chenc711fec2020-11-22 23:52:50 -0500958// DefaultAppTargetSdk returns the API level that platform apps are targeting.
959// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700960func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000961 // This logic is replicated in starlark, if changing logic here update starlark code too
962 // https://cs.android.com/android/platform/superproject/+/master:build/bazel/rules/common/api.bzl;l=72;drc=231c7e8c8038fd478a79eb68aa5b9f5c64e0e061
Colin Crossd09b0b62018-04-18 11:06:47 -0700963 if Bool(c.productVariables.Platform_sdk_final) {
964 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700965 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500966 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900967 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500968 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900969 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
970 // don't set platform sdk codename. Platform sdk codename makes sense only when we
971 // are building the platform. So we don't enforce the below panic for the host-only
972 // builds.
973 if hostOnlyBuild {
974 return NoneApiLevel
975 }
976 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500977 }
978 if codename == "REL" {
979 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
980 }
981 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700982}
983
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800984func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800985 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800986}
987
Dan Albert31384de2017-07-28 12:39:46 -0700988// Codenames that are active in the current lunch target.
989func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800990 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700991}
992
Dan Albert8c7a9942023-03-27 20:34:01 +0000993// All unreleased codenames.
994func (c *config) PlatformVersionAllPreviewCodenames() []string {
995 return c.productVariables.Platform_version_all_preview_codenames
996}
997
Colin Crossface4e42017-10-30 17:32:15 -0700998func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800999 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -07001000}
1001
Colin Crossface4e42017-10-30 17:32:15 -07001002func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001003 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -07001004}
1005
Colin Crossface4e42017-10-30 17:32:15 -07001006func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001007 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -07001008}
1009
1010func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001011 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -07001012}
1013
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001014func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001015 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001016 if defaultCert != "" {
1017 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -08001018 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001019 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -07001020}
1021
Colin Crosse1731a52017-12-14 11:22:55 -08001022func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001023 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001024 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -08001025 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -08001026 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001027 defaultDir := c.DefaultAppCertificateDir(ctx)
1028 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -07001029}
Colin Cross6ff51382015-12-17 16:39:19 -08001030
Jiyong Park9335a262018-12-24 11:31:58 +09001031func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
1032 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
1033 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -07001034 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +09001035 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
1036 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -08001037 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +09001038 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001039 // If not, APEX keys are under the specified directory
1040 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001041}
1042
Inseob Kim80fa7982022-08-12 21:36:25 +09001043// Certificate for the NetworkStack sepolicy context
1044func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1045 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1046 if cert != "" {
1047 return PathForSource(ctx, cert)
1048 }
1049 return c.DefaultAppCertificateDir(ctx)
1050}
1051
Jingwen Chenc711fec2020-11-22 23:52:50 -05001052// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1053// are configured to depend on non-existent modules. Note that this does not
1054// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001055func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001056 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001057}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001058
Jeongik Cha816a23a2020-07-08 01:09:23 +09001059// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001060func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001061 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001062}
1063
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001064// Returns true if building apps that aren't bundled with the platform.
1065// UnbundledBuild() is always true when this is true.
1066func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001067 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001068}
1069
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001070// Returns true if building image that aren't bundled with the platform.
1071// UnbundledBuild() is always true when this is true.
1072func (c *config) UnbundledBuildImage() bool {
1073 return Bool(c.productVariables.Unbundled_build_image)
1074}
1075
Jeongik Cha816a23a2020-07-08 01:09:23 +09001076// Returns true if building modules against prebuilt SDKs.
1077func (c *config) AlwaysUsePrebuiltSdks() bool {
1078 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001079}
1080
Colin Cross126a25c2017-10-31 13:55:34 -07001081func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001082 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001083}
1084
Colin Crossed064c02018-09-05 16:28:13 -07001085func (c *config) Debuggable() bool {
1086 return Bool(c.productVariables.Debuggable)
1087}
1088
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001089func (c *config) Eng() bool {
1090 return Bool(c.productVariables.Eng)
1091}
1092
Colin Crossc53c37f2021-12-08 15:42:22 -08001093// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1094// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001095func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001096 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1097 return androidTargets[0].Arch.ArchType
1098 }
1099 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001100}
1101
Colin Cross16b23492016-01-06 14:41:07 -08001102func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001103 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001104}
1105
1106func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001107 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001108}
1109
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001110func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001111 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001112}
1113
Colin Cross23ae82a2016-11-02 14:34:39 -07001114func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001115 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001116}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001117
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001118func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001119 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001120 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001121 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001122 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001123}
1124
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001125func (c *config) DisableScudo() bool {
1126 return Bool(c.productVariables.DisableScudo)
1127}
1128
Colin Crossa1ad8d12016-06-01 17:09:44 -07001129func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001130 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001131 if t.Arch.ArchType.Multilib == "lib64" {
1132 return true
1133 }
1134 }
1135
1136 return false
1137}
Colin Cross9272ade2016-08-17 15:24:12 -07001138
Colin Cross9d45bb72016-08-29 16:14:13 -07001139func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001140 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001141}
1142
Ramy Medhatbbf25672019-07-17 12:30:04 +00001143func (c *config) UseRBE() bool {
1144 return Bool(c.productVariables.UseRBE)
1145}
1146
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001147func (c *config) UseRBEJAVAC() bool {
1148 return Bool(c.productVariables.UseRBEJAVAC)
1149}
1150
1151func (c *config) UseRBER8() bool {
1152 return Bool(c.productVariables.UseRBER8)
1153}
1154
1155func (c *config) UseRBED8() bool {
1156 return Bool(c.productVariables.UseRBED8)
1157}
1158
Colin Cross8b8bec32019-11-15 13:18:43 -08001159func (c *config) UseRemoteBuild() bool {
1160 return c.UseGoma() || c.UseRBE()
1161}
1162
Colin Cross66548102018-06-19 22:47:35 -07001163func (c *config) RunErrorProne() bool {
1164 return c.IsEnvTrue("RUN_ERROR_PRONE")
1165}
1166
Jingwen Chenc711fec2020-11-22 23:52:50 -05001167// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001168func (c *config) XrefCorpusName() string {
1169 return c.Getenv("XREF_CORPUS")
1170}
1171
Jingwen Chenc711fec2020-11-22 23:52:50 -05001172// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1173// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001174func (c *config) XrefCuEncoding() string {
1175 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1176 return enc
1177 }
1178 return "json"
1179}
1180
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001181// XrefCuJavaSourceMax returns the maximum number of the Java source files
1182// in a single compilation unit
1183const xrefJavaSourceFileMaxDefault = "1000"
1184
1185func (c Config) XrefCuJavaSourceMax() string {
1186 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1187 if v == "" {
1188 return xrefJavaSourceFileMaxDefault
1189 }
1190 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1191 fmt.Fprintf(os.Stderr,
1192 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1193 err, xrefJavaSourceFileMaxDefault)
1194 return xrefJavaSourceFileMaxDefault
1195 }
1196 return v
1197
1198}
1199
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001200func (c *config) EmitXrefRules() bool {
1201 return c.XrefCorpusName() != ""
1202}
1203
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001204func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001205 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001206}
1207
1208func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001209 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001210 return ""
1211 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001212 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001213}
1214
Colin Cross0f4e0d62016-07-27 10:56:55 -07001215func (c *config) LibartImgHostBaseAddress() string {
1216 return "0x60000000"
1217}
1218
1219func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001220 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001221}
1222
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001223func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001224 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001225}
1226
Jingwen Chenc711fec2020-11-22 23:52:50 -05001227// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1228// but some modules still depend on it.
1229//
1230// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001231func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001232 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001233
Roland Levillainf6cc2612020-07-09 16:58:14 +01001234 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001235 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001236 return true
1237 }
Colin Crossa74ca042019-01-31 14:31:51 -08001238 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001239 }
1240 return false
1241}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001242func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001243 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001244 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001245 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001246 }
1247 return false
1248}
1249
1250func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001251 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001252}
1253
Sam Delmerico98a73292023-02-21 11:50:29 -05001254func (c *config) SourceRootDirs() []string {
1255 return c.productVariables.SourceRootDirs
1256}
1257
Spandan Dasc5763832022-11-08 18:42:16 +00001258func (c *config) IncludeTags() []string {
1259 return c.productVariables.IncludeTags
1260}
1261
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001262func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001263 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001264}
1265
Colin Cross5a0dcd52018-10-05 14:20:06 -07001266func (c *config) UncompressPrivAppDex() bool {
1267 return Bool(c.productVariables.UncompressPrivAppDex)
1268}
1269
1270func (c *config) ModulesLoadedByPrivilegedModules() []string {
1271 return c.productVariables.ModulesLoadedByPrivilegedModules
1272}
1273
Jingwen Chenc711fec2020-11-22 23:52:50 -05001274// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1275// the output directory, if it was created during the product configuration
1276// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001277func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001278 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001279 return OptionalPathForPath(nil)
1280 }
1281 return OptionalPathForPath(
1282 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1283}
1284
Jingwen Chenc711fec2020-11-22 23:52:50 -05001285// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1286// configuration. Since the configuration file was created by Kati during
1287// product configuration (externally of soong_build), it's not tracked, so we
1288// also manually add a Ninja file dependency on the configuration file to the
1289// rule that creates the main build.ninja file. This ensures that build.ninja is
1290// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001291func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1292 path := c.DexpreoptGlobalConfigPath(ctx)
1293 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001294 return nil, nil
1295 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001296 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001297 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001298}
1299
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001300func (c *deviceConfig) WithDexpreopt() bool {
1301 return c.config.productVariables.WithDexpreopt
1302}
1303
Colin Cross662d6142022-11-03 20:38:01 -07001304func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001305 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001306}
1307
Inseob Kimae553032019-05-14 18:52:49 +09001308func (c *config) VndkSnapshotBuildArtifacts() bool {
1309 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1310}
1311
Colin Cross3b19f5d2019-09-17 14:45:31 -07001312func (c *config) HasMultilibConflict(arch ArchType) bool {
1313 return c.multilibConflicts[arch]
1314}
1315
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001316func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001317 return String(c.productVariables.PrebuiltHiddenApiDir)
1318}
1319
MarkDacekd06db5d2022-11-29 00:47:59 +00001320func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1321 return c.bazelForceEnabledModules
1322}
1323
Colin Cross9272ade2016-08-17 15:24:12 -07001324func (c *deviceConfig) Arches() []Arch {
1325 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001326 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001327 arches = append(arches, target.Arch)
1328 }
1329 return arches
1330}
Dan Willemsend2ede872016-11-18 14:54:24 -08001331
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001332func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001333 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001334 if is32BitBinder != nil && *is32BitBinder {
1335 return "32"
1336 }
1337 return "64"
1338}
1339
Dan Willemsen4353bc42016-12-05 17:16:02 -08001340func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001341 if c.config.productVariables.VendorPath != nil {
1342 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001343 }
1344 return "vendor"
1345}
1346
Justin Yun71549282017-11-17 12:10:28 +09001347func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001348 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001349}
1350
Jose Galmes6f843bc2020-12-11 13:36:29 -08001351func (c *deviceConfig) RecoverySnapshotVersion() string {
1352 return String(c.config.productVariables.RecoverySnapshotVersion)
1353}
1354
Jeongik Cha219141c2020-08-06 23:00:37 +09001355func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1356 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1357}
1358
Justin Yun8fe12122017-12-07 17:18:15 +09001359func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001360 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001361}
1362
Justin Yun5f7f7e82019-11-18 19:52:14 +09001363func (c *deviceConfig) ProductVndkVersion() string {
1364 return String(c.config.productVariables.ProductVndkVersion)
1365}
1366
Justin Yun71549282017-11-17 12:10:28 +09001367func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001368 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001369}
Jack He8cc71432016-12-08 15:45:07 -08001370
Vic Yangefd249e2018-11-12 20:19:56 -08001371func (c *deviceConfig) VndkUseCoreVariant() bool {
1372 return Bool(c.config.productVariables.VndkUseCoreVariant)
1373}
1374
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001375func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001376 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001377}
1378
1379func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001380 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001381}
1382
Jiyong Park2db76922017-11-08 16:03:48 +09001383func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001384 if c.config.productVariables.OdmPath != nil {
1385 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001386 }
1387 return "odm"
1388}
1389
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001390func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001391 if c.config.productVariables.ProductPath != nil {
1392 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001393 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001394 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001395}
1396
Justin Yund5f6c822019-06-25 16:47:17 +09001397func (c *deviceConfig) SystemExtPath() string {
1398 if c.config.productVariables.SystemExtPath != nil {
1399 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001400 }
Justin Yund5f6c822019-06-25 16:47:17 +09001401 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001402}
1403
Jack He8cc71432016-12-08 15:45:07 -08001404func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001405 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001406}
Dan Willemsen581341d2017-02-09 16:16:31 -08001407
Jiyong Parkd773eb32017-07-03 13:18:12 +09001408func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001409 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001410}
1411
Roland Levillainada12702020-06-09 13:07:36 +01001412// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1413// path. Coverage is enabled by default when the product variable
1414// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1415// enabled for any path which is part of this variable (and not part of the
1416// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1417// represents any path.
1418func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1419 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001420 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001421 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1422 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1423 coverage = true
1424 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001425 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001426 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1427 coverage = false
1428 }
1429 }
1430 return coverage
1431}
1432
Colin Cross1a6acd42020-06-16 17:51:46 -07001433// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001434func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001435 return Bool(c.config.productVariables.GcovCoverage) ||
1436 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001437}
1438
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001439func (c *deviceConfig) ClangCoverageEnabled() bool {
1440 return Bool(c.config.productVariables.ClangCoverage)
1441}
1442
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001443func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1444 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1445}
1446
Colin Cross1a6acd42020-06-16 17:51:46 -07001447func (c *deviceConfig) GcovCoverageEnabled() bool {
1448 return Bool(c.config.productVariables.GcovCoverage)
1449}
1450
Roland Levillain4f5297b2020-06-09 12:44:06 +01001451// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1452// code coverage is enabled for path. By default, coverage is not enabled for a
1453// given path unless it is part of the NativeCoveragePaths product variable (and
1454// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1455// NativeCoveragePaths represents any path.
1456func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001457 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001458 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001459 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001460 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001461 }
1462 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001463 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001464 // Workaround coverage boot failure.
1465 // http://b/269981180
1466 if strings.HasPrefix(path, "external/protobuf") {
1467 coverage = false
1468 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001469 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001470 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001471 }
1472 }
1473 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001474}
Ivan Lozano5f595532017-07-13 14:46:05 -07001475
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001476func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001477 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001478}
1479
Vinh Tran44cb78c2023-03-09 22:07:19 -05001480// AfdoProfile returns fully qualified path associated to the given module name
1481func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1482 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1483 split := strings.Split(afdoProfile, ":")
1484 if len(split) != 3 {
1485 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1486 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1487 }
1488 if split[0] == name {
1489 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1490 }
1491 }
1492 return nil, nil
1493}
1494
Tri Vo35a51432018-03-25 20:00:00 -07001495func (c *deviceConfig) VendorSepolicyDirs() []string {
1496 return c.config.productVariables.BoardVendorSepolicyDirs
1497}
1498
1499func (c *deviceConfig) OdmSepolicyDirs() []string {
1500 return c.config.productVariables.BoardOdmSepolicyDirs
1501}
1502
Felixa20a8752020-05-17 18:28:35 +02001503func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1504 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001505}
1506
Felixa20a8752020-05-17 18:28:35 +02001507func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1508 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001509}
1510
Inseob Kim0866b002019-04-15 20:21:29 +09001511func (c *deviceConfig) SepolicyM4Defs() []string {
1512 return c.config.productVariables.BoardSepolicyM4Defs
1513}
1514
Jiyong Park7f67f482019-01-05 12:57:48 +09001515func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001516 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1517 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1518}
1519
1520func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001521 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001522 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1523}
1524
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001525func (c *deviceConfig) OverridePackageNameFor(name string) string {
1526 newName, overridden := findOverrideValue(
1527 c.config.productVariables.PackageNameOverrides,
1528 name,
1529 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1530 if overridden {
1531 return newName
1532 }
1533 return name
1534}
1535
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001536func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001537 if overrides == nil || len(overrides) == 0 {
1538 return "", false
1539 }
1540 for _, o := range overrides {
1541 split := strings.Split(o, ":")
1542 if len(split) != 2 {
1543 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001544 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001545 }
1546 if matchPattern(split[0], name) {
1547 return substPattern(split[0], split[1], name), true
1548 }
1549 }
1550 return "", false
1551}
1552
Albert Martineefabcf2022-03-21 20:11:16 +00001553func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1554 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1555}
1556
Ivan Lozano5f595532017-07-13 14:46:05 -07001557func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001558 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001559 return false
1560 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001561 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001562}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001563
1564func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001565 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001566 return false
1567 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001568 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001569}
1570
1571func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001572 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001573 return false
1574 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001575 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001576}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001577
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001578func (c *config) MemtagHeapDisabledForPath(path string) bool {
1579 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1580 return false
1581 }
1582 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1583}
1584
1585func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1586 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1587 return false
1588 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001589 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001590}
1591
1592func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1593 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1594 return false
1595 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001596 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001597}
1598
Hang Lua98aab92023-03-17 13:17:22 +08001599func (c *config) HWASanEnabledForPath(path string) bool {
1600 if len(c.productVariables.HWASanIncludePaths) == 0 {
1601 return false
1602 }
1603 return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths)
1604}
1605
Dan Willemsen0fe78662018-03-26 12:41:18 -07001606func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001607 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001608}
1609
Colin Cross395f2cf2018-10-24 16:10:32 -07001610func (c *config) NdkAbis() bool {
1611 return Bool(c.productVariables.Ndk_abis)
1612}
1613
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001614func (c *config) AmlAbis() bool {
1615 return Bool(c.productVariables.Aml_abis)
1616}
1617
Jiyong Park8fd61922018-11-08 02:50:25 +09001618func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001619 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001620}
1621
Jiyong Park4da07972021-01-05 21:01:11 +09001622func (c *config) ForceApexSymlinkOptimization() bool {
1623 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1624}
1625
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001626func (c *config) ApexCompressionEnabled() bool {
1627 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001628}
1629
Dennis Shene2ed70c2023-01-11 14:15:43 +00001630func (c *config) ApexTrimEnabled() bool {
1631 return Bool(c.productVariables.TrimmedApex)
1632}
1633
Jeongik Chac9464142019-01-07 12:07:27 +09001634func (c *config) EnforceSystemCertificate() bool {
1635 return Bool(c.productVariables.EnforceSystemCertificate)
1636}
1637
Colin Cross440e0d02020-06-11 11:32:11 -07001638func (c *config) EnforceSystemCertificateAllowList() []string {
1639 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001640}
1641
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001642func (c *config) EnforceProductPartitionInterface() bool {
1643 return Bool(c.productVariables.EnforceProductPartitionInterface)
1644}
1645
JaeMan Parkff715562020-10-19 17:25:58 +09001646func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1647 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1648}
1649
1650func (c *config) InterPartitionJavaLibraryAllowList() []string {
1651 return c.productVariables.InterPartitionJavaLibraryAllowList
1652}
1653
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001654func (c *config) InstallExtraFlattenedApexes() bool {
1655 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1656}
1657
Colin Crossf24a22a2019-01-31 14:12:44 -08001658func (c *config) ProductHiddenAPIStubs() []string {
1659 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001660}
1661
Colin Crossf24a22a2019-01-31 14:12:44 -08001662func (c *config) ProductHiddenAPIStubsSystem() []string {
1663 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001664}
1665
Colin Crossf24a22a2019-01-31 14:12:44 -08001666func (c *config) ProductHiddenAPIStubsTest() []string {
1667 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001668}
Dan Willemsen71c74602019-04-10 12:27:35 -07001669
Dan Willemsen54879d12019-04-18 10:08:46 -07001670func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001671 return c.config.productVariables.TargetFSConfigGen
1672}
Inseob Kim0866b002019-04-15 20:21:29 +09001673
1674func (c *config) ProductPublicSepolicyDirs() []string {
1675 return c.productVariables.ProductPublicSepolicyDirs
1676}
1677
1678func (c *config) ProductPrivateSepolicyDirs() []string {
1679 return c.productVariables.ProductPrivateSepolicyDirs
1680}
1681
Colin Cross50ddcc42019-05-16 12:28:22 -07001682func (c *config) MissingUsesLibraries() []string {
1683 return c.productVariables.MissingUsesLibraries
1684}
1685
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001686func (c *config) TargetMultitreeUpdateMeta() bool {
1687 return c.productVariables.MultitreeUpdateMeta
1688}
1689
Inseob Kim1f086e22019-05-09 13:29:15 +09001690func (c *deviceConfig) DeviceArch() string {
1691 return String(c.config.productVariables.DeviceArch)
1692}
1693
1694func (c *deviceConfig) DeviceArchVariant() string {
1695 return String(c.config.productVariables.DeviceArchVariant)
1696}
1697
1698func (c *deviceConfig) DeviceSecondaryArch() string {
1699 return String(c.config.productVariables.DeviceSecondaryArch)
1700}
1701
1702func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1703 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1704}
Yifan Hong82db7352020-01-21 16:12:26 -08001705
1706func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1707 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1708}
Yifan Hong97365ee2020-07-29 09:51:57 -07001709
1710func (c *deviceConfig) BoardKernelBinaries() []string {
1711 return c.config.productVariables.BoardKernelBinaries
1712}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001713
Yifan Hong42bef8d2020-08-05 14:36:09 -07001714func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1715 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1716}
1717
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001718func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1719 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1720}
1721
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001722func (c *deviceConfig) PlatformSepolicyVersion() string {
1723 return String(c.config.productVariables.PlatformSepolicyVersion)
1724}
1725
Inseob Kima10ef272021-09-15 03:04:53 +00001726func (c *deviceConfig) TotSepolicyVersion() string {
1727 return String(c.config.productVariables.TotSepolicyVersion)
1728}
1729
Inseob Kim843f6642022-01-07 09:11:23 +09001730func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1731 return c.config.productVariables.PlatformSepolicyCompatVersions
1732}
1733
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001734func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001735 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1736 return ver
1737 }
1738 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001739}
1740
Inseob Kim14178802021-12-08 22:53:31 +09001741func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1742 return c.config.productVariables.BoardPlatVendorPolicy
1743}
1744
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001745func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1746 return c.config.productVariables.BoardReqdMaskPolicy
1747}
1748
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001749func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1750 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1751}
1752
1753func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1754 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1755}
1756
1757func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1758 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1759}
1760
1761func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1762 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1763}
1764
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001765func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1766 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1767}
1768
1769func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1770 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1771}
1772
1773func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1774 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1775}
1776
Inseob Kim7cf14652021-01-06 23:06:52 +09001777func (c *deviceConfig) DirectedVendorSnapshot() bool {
1778 return c.config.productVariables.DirectedVendorSnapshot
1779}
1780
1781func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1782 return c.config.productVariables.VendorSnapshotModules
1783}
1784
Jose Galmes4c6895e2021-02-09 07:44:30 -08001785func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1786 return c.config.productVariables.DirectedRecoverySnapshot
1787}
1788
1789func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1790 return c.config.productVariables.RecoverySnapshotModules
1791}
1792
Justin DeMartino383bfb32021-02-24 10:49:43 -08001793func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1794 var ret = make(map[string]bool)
1795 for _, dir := range dirs {
1796 clean := filepath.Clean(dir)
1797 if previous[clean] || ret[clean] {
1798 return nil, fmt.Errorf("Duplicate entry %s", dir)
1799 }
1800 ret[clean] = true
1801 }
1802 return ret, nil
1803}
1804
1805func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1806 dirMap := c.Once(onceKey, func() interface{} {
1807 ret, err := createDirsMap(previous, dirs)
1808 if err != nil {
1809 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1810 }
1811 return ret
1812 })
1813 if dirMap == nil {
1814 return nil
1815 }
1816 return dirMap.(map[string]bool)
1817}
1818
1819var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1820
1821func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1822 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1823 c.config.productVariables.VendorSnapshotDirsExcluded)
1824}
1825
1826var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1827
1828func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1829 excludedMap := c.VendorSnapshotDirsExcludedMap()
1830 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1831 c.config.productVariables.VendorSnapshotDirsIncluded)
1832}
1833
1834var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1835
1836func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1837 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1838 c.config.productVariables.RecoverySnapshotDirsExcluded)
1839}
1840
1841var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1842
1843func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1844 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1845 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1846 c.config.productVariables.RecoverySnapshotDirsIncluded)
1847}
1848
Rob Seymour925aa092021-08-10 20:42:03 +00001849func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1850 return c.config.productVariables.HostFakeSnapshotEnabled
1851}
1852
Inseob Kim60c32f02020-12-21 22:53:05 +09001853func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1854 if c.config.productVariables.ShippingApiLevel == nil {
1855 return NoneApiLevel
1856 }
1857 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1858 return uncheckedFinalApiLevel(apiLevel)
1859}
1860
Alix Espinoef47e542022-09-14 19:10:51 +00001861func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1862 return c.config.productVariables.BuildBrokenClangAsFlags
1863}
1864
1865func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1866 return c.config.productVariables.BuildBrokenClangCFlags
1867}
1868
Alixb5f6d9e2022-04-20 23:00:58 +00001869func (c *deviceConfig) BuildBrokenClangProperty() bool {
1870 return c.config.productVariables.BuildBrokenClangProperty
1871}
1872
Inseob Kim67e5add192021-03-17 18:05:33 +09001873func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1874 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1875}
1876
1877func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1878 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1879}
1880
Cole Faustedc4c502022-09-09 19:39:25 -07001881func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1882 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1883}
1884
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001885func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1886 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1887}
1888
Inseob Kim0cac7b42021-02-03 18:16:46 +09001889func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1890 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1891}
1892
Liz Kammer619be462022-01-28 15:13:39 -05001893func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1894 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1895}
1896
Vinh Tran140d5882022-06-10 14:23:27 -04001897func (c *deviceConfig) BuildBrokenDepfile() bool {
1898 return Bool(c.config.productVariables.BuildBrokenDepfile)
1899}
1900
Inseob Kim67e5add192021-03-17 18:05:33 +09001901func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1902 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1903}
1904
1905func (c *config) SelinuxIgnoreNeverallows() bool {
1906 return c.productVariables.SelinuxIgnoreNeverallows
1907}
1908
1909func (c *deviceConfig) SepolicySplit() bool {
1910 return c.config.productVariables.SepolicySplit
1911}
1912
Inseob Kima10ef272021-09-15 03:04:53 +00001913func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1914 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1915}
1916
1917func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1918 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1919}
1920
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001921func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1922 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1923}
1924
Christopher Ferris98f10222022-07-13 23:16:52 -07001925func (c *config) IgnorePrefer32OnDevice() bool {
1926 return c.productVariables.IgnorePrefer32OnDevice
1927}
1928
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001929func (c *config) BootJars() []string {
1930 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001931 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001932 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001933 }).([]string)
1934}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001935
satayevd604b212021-07-21 14:23:52 +01001936func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001937 return c.productVariables.BootJars
1938}
1939
satayevd604b212021-07-21 14:23:52 +01001940func (c *config) ApexBootJars() ConfiguredJarList {
1941 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001942}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001943
1944func (c *config) RBEWrapper() string {
1945 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1946}
Colin Cross9b698b62021-12-22 09:55:32 -08001947
1948// UseHostMusl returns true if the host target has been configured to build against musl libc.
1949func (c *config) UseHostMusl() bool {
1950 return Bool(c.productVariables.HostMusl)
1951}
MarkDacekff851b82022-04-21 18:33:17 +00001952
MarkDacekf47e1422023-04-19 16:47:36 +00001953func (c *config) GetMixedBuildsEnabledModules() map[string]struct{} {
1954 return c.mixedBuildEnabledModules
1955}
1956
MarkDacek6f6b9622023-05-02 16:28:55 +00001957func (c *config) GetMixedBuildsDisabledModules() map[string]struct{} {
1958 return c.mixedBuildDisabledModules
1959}
1960
Chris Parsonsf874e462022-05-10 13:50:12 -04001961func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001962 moduleName := ctx.Module().Name()
1963 c.mixedBuildsLock.Lock()
1964 defer c.mixedBuildsLock.Unlock()
1965 if useBazel {
1966 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1967 } else {
1968 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1969 }
1970}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001971
1972// ApiSurfaces directory returns the source path inside the api_surfaces repo
1973// (relative to workspace root).
1974func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1975 return filepath.Join(
1976 "build",
1977 "bazel",
1978 "api_surfaces",
1979 s.String(),
1980 version)
1981}
Jihoon Kang1bff0342023-01-17 20:40:22 +00001982
1983func (c *config) BuildFromTextStub() bool {
1984 return c.buildFromTextStub
1985}
Spandan Das4deab282023-03-30 17:06:32 +00001986
1987func (c *config) SetBuildFromTextStub(b bool) {
1988 c.buildFromTextStub = b
1989}
MarkDacek9c094ca2023-03-16 19:15:19 +00001990func (c *config) AddForceEnabledModules(forceEnabled []string) {
1991 for _, forceEnabledModule := range forceEnabled {
1992 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
1993 }
1994}