blob: acadb3ff331e47e261016e054527409bc279549d [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
Jingwen Chenc711fec2020-11-22 23:52:50 -0500729// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700730func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800731 switch runtime.GOOS {
732 case "linux":
733 return "linux-x86"
734 case "darwin":
735 return "darwin-x86"
736 default:
737 panic("Unknown GOOS")
738 }
739}
740
741// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700742func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200743 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800744}
745
Jingwen Chenc711fec2020-11-22 23:52:50 -0500746// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
747// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700748func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
749 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
750}
751
Jingwen Chenc711fec2020-11-22 23:52:50 -0500752// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
753// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700754func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700755 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800756 case "darwin":
757 return "-R"
758 case "linux":
759 return "-d"
760 default:
761 return ""
762 }
763}
Colin Cross68f55102015-03-25 14:43:57 -0700764
Colin Cross1332b002015-04-07 17:11:30 -0700765func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700766 var val string
767 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700768 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800769 defer c.envLock.Unlock()
770 if c.envDeps == nil {
771 c.envDeps = make(map[string]string)
772 }
Colin Cross68f55102015-03-25 14:43:57 -0700773 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700774 if c.envFrozen {
775 panic("Cannot access new environment variables after envdeps are frozen")
776 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700777 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700778 c.envDeps[key] = val
779 }
780 return val
781}
782
Colin Cross99d7c232016-11-23 16:52:04 -0800783func (c *config) GetenvWithDefault(key string, defaultValue string) string {
784 ret := c.Getenv(key)
785 if ret == "" {
786 return defaultValue
787 }
788 return ret
789}
790
791func (c *config) IsEnvTrue(key string) bool {
792 value := c.Getenv(key)
793 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
794}
795
796func (c *config) IsEnvFalse(key string) bool {
797 value := c.Getenv(key)
798 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
799}
800
Jingwen Chenc711fec2020-11-22 23:52:50 -0500801// EnvDeps returns the environment variables this build depends on. The first
802// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700803func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700804 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800805 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700806 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700807 return c.envDeps
808}
Colin Cross35cec122015-04-02 14:37:16 -0700809
Jingwen Chencda22c92020-11-23 00:22:30 -0500810func (c *config) KatiEnabled() bool {
811 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800812}
813
Nan Zhang581fd212018-01-10 16:06:12 -0800814func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800815 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800816}
817
Jingwen Chenc711fec2020-11-22 23:52:50 -0500818// BuildNumberFile returns the path to a text file containing metadata
819// representing the current build's number.
820//
821// Rules that want to reference the build number should read from this file
822// without depending on it. They will run whenever their other dependencies
823// require them to run and get the current build number. This ensures they don't
824// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800825func (c *config) BuildNumberFile(ctx PathContext) Path {
826 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800827}
828
Jingwen Chenc711fec2020-11-22 23:52:50 -0500829// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700830// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700831func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800832 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700833}
834
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000835// DeviceProduct returns the current product target. There could be multiple of
836// these per device type.
837//
Chris Parsonsef615e52022-08-18 22:04:11 -0400838// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000839func (c *config) DeviceProduct() string {
840 return *c.productVariables.DeviceProduct
841}
842
Cole Faustb85d1a12022-11-08 18:14:01 -0800843// HasDeviceProduct returns if the build has a product. A build will not
844// necessarily have a product when --skip-config is passed to soong, like it is
845// in prebuilts/build-tools/build-prebuilts.sh
846func (c *config) HasDeviceProduct() bool {
847 return c.productVariables.DeviceProduct != nil
848}
849
Anton Hansson53c88442019-03-18 15:53:16 +0000850func (c *config) DeviceResourceOverlays() []string {
851 return c.productVariables.DeviceResourceOverlays
852}
853
854func (c *config) ProductResourceOverlays() []string {
855 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700856}
857
Colin Crossbfd347d2018-05-09 11:11:35 -0700858func (c *config) PlatformVersionName() string {
859 return String(c.productVariables.Platform_version_name)
860}
861
Dan Albert4f378d72020-07-23 17:32:15 -0700862func (c *config) PlatformSdkVersion() ApiLevel {
863 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700864}
865
Cole Faust37d27c42023-04-12 10:27:45 -0700866func (c *config) RawPlatformSdkVersion() *int {
867 return c.productVariables.Platform_sdk_version
868}
869
Mu-Le Lee5e047532022-07-27 02:32:03 +0000870func (c *config) PlatformSdkFinal() bool {
871 return Bool(c.productVariables.Platform_sdk_final)
872}
873
Colin Crossd09b0b62018-04-18 11:06:47 -0700874func (c *config) PlatformSdkCodename() string {
875 return String(c.productVariables.Platform_sdk_codename)
876}
877
Anton Hansson97d0bae2022-02-16 16:15:10 +0000878func (c *config) PlatformSdkExtensionVersion() int {
879 return *c.productVariables.Platform_sdk_extension_version
880}
881
882func (c *config) PlatformBaseSdkExtensionVersion() int {
883 return *c.productVariables.Platform_base_sdk_extension_version
884}
885
Colin Cross092c9da2019-04-02 22:56:43 -0700886func (c *config) PlatformSecurityPatch() string {
887 return String(c.productVariables.Platform_security_patch)
888}
889
890func (c *config) PlatformPreviewSdkVersion() string {
891 return String(c.productVariables.Platform_preview_sdk_version)
892}
893
894func (c *config) PlatformMinSupportedTargetSdkVersion() string {
895 return String(c.productVariables.Platform_min_supported_target_sdk_version)
896}
897
898func (c *config) PlatformBaseOS() string {
899 return String(c.productVariables.Platform_base_os)
900}
901
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900902func (c *config) PlatformVersionLastStable() string {
903 return String(c.productVariables.Platform_version_last_stable)
904}
905
Jiyong Park37073842022-06-21 10:13:42 +0900906func (c *config) PlatformVersionKnownCodenames() string {
907 return String(c.productVariables.Platform_version_known_codenames)
908}
909
Dan Albert1a246272020-07-06 14:49:35 -0700910func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000911 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700912}
913
914func (c *config) FinalApiLevels() []ApiLevel {
915 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700916 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700917 levels = append(levels, uncheckedFinalApiLevel(i))
918 }
919 return levels
920}
921
922func (c *config) PreviewApiLevels() []ApiLevel {
923 var levels []ApiLevel
924 for i, codename := range c.PlatformVersionActiveCodenames() {
925 levels = append(levels, ApiLevel{
926 value: codename,
927 number: i,
928 isPreview: true,
929 })
930 }
931 return levels
932}
933
satayevcca4ab72021-11-30 12:33:55 +0000934func (c *config) LatestPreviewApiLevel() ApiLevel {
935 level := NoneApiLevel
936 for _, l := range c.PreviewApiLevels() {
937 if l.GreaterThan(level) {
938 level = l
939 }
940 }
941 return level
942}
943
Dan Albert1a246272020-07-06 14:49:35 -0700944func (c *config) AllSupportedApiLevels() []ApiLevel {
945 var levels []ApiLevel
946 levels = append(levels, c.FinalApiLevels()...)
947 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700948}
949
Jingwen Chenc711fec2020-11-22 23:52:50 -0500950// DefaultAppTargetSdk returns the API level that platform apps are targeting.
951// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700952func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000953 // This logic is replicated in starlark, if changing logic here update starlark code too
954 // 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 -0700955 if Bool(c.productVariables.Platform_sdk_final) {
956 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700957 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500958 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900959 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500960 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900961 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
962 // don't set platform sdk codename. Platform sdk codename makes sense only when we
963 // are building the platform. So we don't enforce the below panic for the host-only
964 // builds.
965 if hostOnlyBuild {
966 return NoneApiLevel
967 }
968 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500969 }
970 if codename == "REL" {
971 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
972 }
973 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700974}
975
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800976func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800977 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800978}
979
Dan Albert31384de2017-07-28 12:39:46 -0700980// Codenames that are active in the current lunch target.
981func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800982 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700983}
984
Dan Albert8c7a9942023-03-27 20:34:01 +0000985// All unreleased codenames.
986func (c *config) PlatformVersionAllPreviewCodenames() []string {
987 return c.productVariables.Platform_version_all_preview_codenames
988}
989
Colin Crossface4e42017-10-30 17:32:15 -0700990func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800991 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700992}
993
Colin Crossface4e42017-10-30 17:32:15 -0700994func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800995 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700996}
997
Colin Crossface4e42017-10-30 17:32:15 -0700998func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800999 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -07001000}
1001
1002func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001003 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -07001004}
1005
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001006func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001007 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001008 if defaultCert != "" {
1009 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -08001010 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001011 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -07001012}
1013
Colin Crosse1731a52017-12-14 11:22:55 -08001014func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001015 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001016 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -08001017 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -08001018 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001019 defaultDir := c.DefaultAppCertificateDir(ctx)
1020 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -07001021}
Colin Cross6ff51382015-12-17 16:39:19 -08001022
Jiyong Park9335a262018-12-24 11:31:58 +09001023func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
1024 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
1025 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -07001026 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +09001027 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
1028 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -08001029 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +09001030 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001031 // If not, APEX keys are under the specified directory
1032 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001033}
1034
Inseob Kim80fa7982022-08-12 21:36:25 +09001035// Certificate for the NetworkStack sepolicy context
1036func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1037 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1038 if cert != "" {
1039 return PathForSource(ctx, cert)
1040 }
1041 return c.DefaultAppCertificateDir(ctx)
1042}
1043
Jingwen Chenc711fec2020-11-22 23:52:50 -05001044// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1045// are configured to depend on non-existent modules. Note that this does not
1046// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001047func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001048 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001049}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001050
Jeongik Cha816a23a2020-07-08 01:09:23 +09001051// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001052func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001053 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001054}
1055
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001056// Returns true if building apps that aren't bundled with the platform.
1057// UnbundledBuild() is always true when this is true.
1058func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001059 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001060}
1061
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001062// Returns true if building image that aren't bundled with the platform.
1063// UnbundledBuild() is always true when this is true.
1064func (c *config) UnbundledBuildImage() bool {
1065 return Bool(c.productVariables.Unbundled_build_image)
1066}
1067
Jeongik Cha816a23a2020-07-08 01:09:23 +09001068// Returns true if building modules against prebuilt SDKs.
1069func (c *config) AlwaysUsePrebuiltSdks() bool {
1070 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001071}
1072
Colin Cross126a25c2017-10-31 13:55:34 -07001073func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001074 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001075}
1076
Colin Crossed064c02018-09-05 16:28:13 -07001077func (c *config) Debuggable() bool {
1078 return Bool(c.productVariables.Debuggable)
1079}
1080
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001081func (c *config) Eng() bool {
1082 return Bool(c.productVariables.Eng)
1083}
1084
Colin Crossc53c37f2021-12-08 15:42:22 -08001085// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1086// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001087func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001088 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1089 return androidTargets[0].Arch.ArchType
1090 }
1091 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001092}
1093
Colin Cross16b23492016-01-06 14:41:07 -08001094func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001095 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001096}
1097
1098func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001099 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001100}
1101
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001102func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001103 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001104}
1105
Colin Cross23ae82a2016-11-02 14:34:39 -07001106func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001107 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001108}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001109
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001110func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001111 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001112 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001113 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001114 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001115}
1116
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001117func (c *config) DisableScudo() bool {
1118 return Bool(c.productVariables.DisableScudo)
1119}
1120
Colin Crossa1ad8d12016-06-01 17:09:44 -07001121func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001122 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001123 if t.Arch.ArchType.Multilib == "lib64" {
1124 return true
1125 }
1126 }
1127
1128 return false
1129}
Colin Cross9272ade2016-08-17 15:24:12 -07001130
Colin Cross9d45bb72016-08-29 16:14:13 -07001131func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001132 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001133}
1134
Ramy Medhatbbf25672019-07-17 12:30:04 +00001135func (c *config) UseRBE() bool {
1136 return Bool(c.productVariables.UseRBE)
1137}
1138
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001139func (c *config) UseRBEJAVAC() bool {
1140 return Bool(c.productVariables.UseRBEJAVAC)
1141}
1142
1143func (c *config) UseRBER8() bool {
1144 return Bool(c.productVariables.UseRBER8)
1145}
1146
1147func (c *config) UseRBED8() bool {
1148 return Bool(c.productVariables.UseRBED8)
1149}
1150
Colin Cross8b8bec32019-11-15 13:18:43 -08001151func (c *config) UseRemoteBuild() bool {
1152 return c.UseGoma() || c.UseRBE()
1153}
1154
Colin Cross66548102018-06-19 22:47:35 -07001155func (c *config) RunErrorProne() bool {
1156 return c.IsEnvTrue("RUN_ERROR_PRONE")
1157}
1158
Jingwen Chenc711fec2020-11-22 23:52:50 -05001159// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001160func (c *config) XrefCorpusName() string {
1161 return c.Getenv("XREF_CORPUS")
1162}
1163
Jingwen Chenc711fec2020-11-22 23:52:50 -05001164// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1165// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001166func (c *config) XrefCuEncoding() string {
1167 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1168 return enc
1169 }
1170 return "json"
1171}
1172
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001173// XrefCuJavaSourceMax returns the maximum number of the Java source files
1174// in a single compilation unit
1175const xrefJavaSourceFileMaxDefault = "1000"
1176
1177func (c Config) XrefCuJavaSourceMax() string {
1178 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1179 if v == "" {
1180 return xrefJavaSourceFileMaxDefault
1181 }
1182 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1183 fmt.Fprintf(os.Stderr,
1184 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1185 err, xrefJavaSourceFileMaxDefault)
1186 return xrefJavaSourceFileMaxDefault
1187 }
1188 return v
1189
1190}
1191
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001192func (c *config) EmitXrefRules() bool {
1193 return c.XrefCorpusName() != ""
1194}
1195
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001196func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001197 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001198}
1199
1200func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001201 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001202 return ""
1203 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001204 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001205}
1206
Colin Cross0f4e0d62016-07-27 10:56:55 -07001207func (c *config) LibartImgHostBaseAddress() string {
1208 return "0x60000000"
1209}
1210
1211func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001212 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001213}
1214
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001215func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001216 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001217}
1218
Jingwen Chenc711fec2020-11-22 23:52:50 -05001219// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1220// but some modules still depend on it.
1221//
1222// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001223func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001224 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001225
Roland Levillainf6cc2612020-07-09 16:58:14 +01001226 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001227 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001228 return true
1229 }
Colin Crossa74ca042019-01-31 14:31:51 -08001230 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001231 }
1232 return false
1233}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001234func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001235 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001236 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001237 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001238 }
1239 return false
1240}
1241
1242func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001243 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001244}
1245
Sam Delmerico98a73292023-02-21 11:50:29 -05001246func (c *config) SourceRootDirs() []string {
1247 return c.productVariables.SourceRootDirs
1248}
1249
Spandan Dasc5763832022-11-08 18:42:16 +00001250func (c *config) IncludeTags() []string {
1251 return c.productVariables.IncludeTags
1252}
1253
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001254func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001255 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001256}
1257
Colin Cross5a0dcd52018-10-05 14:20:06 -07001258func (c *config) UncompressPrivAppDex() bool {
1259 return Bool(c.productVariables.UncompressPrivAppDex)
1260}
1261
1262func (c *config) ModulesLoadedByPrivilegedModules() []string {
1263 return c.productVariables.ModulesLoadedByPrivilegedModules
1264}
1265
Jingwen Chenc711fec2020-11-22 23:52:50 -05001266// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1267// the output directory, if it was created during the product configuration
1268// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001269func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001270 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001271 return OptionalPathForPath(nil)
1272 }
1273 return OptionalPathForPath(
1274 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1275}
1276
Jingwen Chenc711fec2020-11-22 23:52:50 -05001277// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1278// configuration. Since the configuration file was created by Kati during
1279// product configuration (externally of soong_build), it's not tracked, so we
1280// also manually add a Ninja file dependency on the configuration file to the
1281// rule that creates the main build.ninja file. This ensures that build.ninja is
1282// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001283func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1284 path := c.DexpreoptGlobalConfigPath(ctx)
1285 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001286 return nil, nil
1287 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001288 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001289 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001290}
1291
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001292func (c *deviceConfig) WithDexpreopt() bool {
1293 return c.config.productVariables.WithDexpreopt
1294}
1295
Colin Cross662d6142022-11-03 20:38:01 -07001296func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001297 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001298}
1299
Inseob Kimae553032019-05-14 18:52:49 +09001300func (c *config) VndkSnapshotBuildArtifacts() bool {
1301 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1302}
1303
Colin Cross3b19f5d2019-09-17 14:45:31 -07001304func (c *config) HasMultilibConflict(arch ArchType) bool {
1305 return c.multilibConflicts[arch]
1306}
1307
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001308func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001309 return String(c.productVariables.PrebuiltHiddenApiDir)
1310}
1311
MarkDacekd06db5d2022-11-29 00:47:59 +00001312func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1313 return c.bazelForceEnabledModules
1314}
1315
Colin Cross9272ade2016-08-17 15:24:12 -07001316func (c *deviceConfig) Arches() []Arch {
1317 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001318 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001319 arches = append(arches, target.Arch)
1320 }
1321 return arches
1322}
Dan Willemsend2ede872016-11-18 14:54:24 -08001323
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001324func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001325 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001326 if is32BitBinder != nil && *is32BitBinder {
1327 return "32"
1328 }
1329 return "64"
1330}
1331
Dan Willemsen4353bc42016-12-05 17:16:02 -08001332func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001333 if c.config.productVariables.VendorPath != nil {
1334 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001335 }
1336 return "vendor"
1337}
1338
Justin Yun71549282017-11-17 12:10:28 +09001339func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001340 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001341}
1342
Jose Galmes6f843bc2020-12-11 13:36:29 -08001343func (c *deviceConfig) RecoverySnapshotVersion() string {
1344 return String(c.config.productVariables.RecoverySnapshotVersion)
1345}
1346
Jeongik Cha219141c2020-08-06 23:00:37 +09001347func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1348 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1349}
1350
Justin Yun8fe12122017-12-07 17:18:15 +09001351func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001352 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001353}
1354
Justin Yun5f7f7e82019-11-18 19:52:14 +09001355func (c *deviceConfig) ProductVndkVersion() string {
1356 return String(c.config.productVariables.ProductVndkVersion)
1357}
1358
Justin Yun71549282017-11-17 12:10:28 +09001359func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001360 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001361}
Jack He8cc71432016-12-08 15:45:07 -08001362
Vic Yangefd249e2018-11-12 20:19:56 -08001363func (c *deviceConfig) VndkUseCoreVariant() bool {
1364 return Bool(c.config.productVariables.VndkUseCoreVariant)
1365}
1366
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001367func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001368 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001369}
1370
1371func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001372 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001373}
1374
Jiyong Park2db76922017-11-08 16:03:48 +09001375func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001376 if c.config.productVariables.OdmPath != nil {
1377 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001378 }
1379 return "odm"
1380}
1381
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001382func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001383 if c.config.productVariables.ProductPath != nil {
1384 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001385 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001386 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001387}
1388
Justin Yund5f6c822019-06-25 16:47:17 +09001389func (c *deviceConfig) SystemExtPath() string {
1390 if c.config.productVariables.SystemExtPath != nil {
1391 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001392 }
Justin Yund5f6c822019-06-25 16:47:17 +09001393 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001394}
1395
Jack He8cc71432016-12-08 15:45:07 -08001396func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001397 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001398}
Dan Willemsen581341d2017-02-09 16:16:31 -08001399
Jiyong Parkd773eb32017-07-03 13:18:12 +09001400func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001401 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001402}
1403
Roland Levillainada12702020-06-09 13:07:36 +01001404// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1405// path. Coverage is enabled by default when the product variable
1406// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1407// enabled for any path which is part of this variable (and not part of the
1408// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1409// represents any path.
1410func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1411 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001412 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001413 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1414 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1415 coverage = true
1416 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001417 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001418 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1419 coverage = false
1420 }
1421 }
1422 return coverage
1423}
1424
Colin Cross1a6acd42020-06-16 17:51:46 -07001425// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001426func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001427 return Bool(c.config.productVariables.GcovCoverage) ||
1428 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001429}
1430
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001431func (c *deviceConfig) ClangCoverageEnabled() bool {
1432 return Bool(c.config.productVariables.ClangCoverage)
1433}
1434
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001435func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1436 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1437}
1438
Colin Cross1a6acd42020-06-16 17:51:46 -07001439func (c *deviceConfig) GcovCoverageEnabled() bool {
1440 return Bool(c.config.productVariables.GcovCoverage)
1441}
1442
Roland Levillain4f5297b2020-06-09 12:44:06 +01001443// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1444// code coverage is enabled for path. By default, coverage is not enabled for a
1445// given path unless it is part of the NativeCoveragePaths product variable (and
1446// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1447// NativeCoveragePaths represents any path.
1448func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001449 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001450 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001451 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001452 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001453 }
1454 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001455 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001456 // Workaround coverage boot failure.
1457 // http://b/269981180
1458 if strings.HasPrefix(path, "external/protobuf") {
1459 coverage = false
1460 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001461 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001462 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001463 }
1464 }
1465 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001466}
Ivan Lozano5f595532017-07-13 14:46:05 -07001467
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001468func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001469 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001470}
1471
Vinh Tran44cb78c2023-03-09 22:07:19 -05001472// AfdoProfile returns fully qualified path associated to the given module name
1473func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1474 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1475 split := strings.Split(afdoProfile, ":")
1476 if len(split) != 3 {
1477 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1478 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1479 }
1480 if split[0] == name {
1481 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1482 }
1483 }
1484 return nil, nil
1485}
1486
Tri Vo35a51432018-03-25 20:00:00 -07001487func (c *deviceConfig) VendorSepolicyDirs() []string {
1488 return c.config.productVariables.BoardVendorSepolicyDirs
1489}
1490
1491func (c *deviceConfig) OdmSepolicyDirs() []string {
1492 return c.config.productVariables.BoardOdmSepolicyDirs
1493}
1494
Felixa20a8752020-05-17 18:28:35 +02001495func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1496 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001497}
1498
Felixa20a8752020-05-17 18:28:35 +02001499func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1500 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001501}
1502
Inseob Kim0866b002019-04-15 20:21:29 +09001503func (c *deviceConfig) SepolicyM4Defs() []string {
1504 return c.config.productVariables.BoardSepolicyM4Defs
1505}
1506
Jiyong Park7f67f482019-01-05 12:57:48 +09001507func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001508 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1509 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1510}
1511
1512func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001513 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001514 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1515}
1516
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001517func (c *deviceConfig) OverridePackageNameFor(name string) string {
1518 newName, overridden := findOverrideValue(
1519 c.config.productVariables.PackageNameOverrides,
1520 name,
1521 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1522 if overridden {
1523 return newName
1524 }
1525 return name
1526}
1527
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001528func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001529 if overrides == nil || len(overrides) == 0 {
1530 return "", false
1531 }
1532 for _, o := range overrides {
1533 split := strings.Split(o, ":")
1534 if len(split) != 2 {
1535 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001536 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001537 }
1538 if matchPattern(split[0], name) {
1539 return substPattern(split[0], split[1], name), true
1540 }
1541 }
1542 return "", false
1543}
1544
Albert Martineefabcf2022-03-21 20:11:16 +00001545func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1546 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1547}
1548
Ivan Lozano5f595532017-07-13 14:46:05 -07001549func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001550 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001551 return false
1552 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001553 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001554}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001555
1556func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001557 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001558 return false
1559 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001560 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001561}
1562
1563func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001564 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001565 return false
1566 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001567 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001568}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001569
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001570func (c *config) MemtagHeapDisabledForPath(path string) bool {
1571 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1572 return false
1573 }
1574 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1575}
1576
1577func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1578 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1579 return false
1580 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001581 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001582}
1583
1584func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1585 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1586 return false
1587 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001588 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001589}
1590
Hang Lua98aab92023-03-17 13:17:22 +08001591func (c *config) HWASanEnabledForPath(path string) bool {
1592 if len(c.productVariables.HWASanIncludePaths) == 0 {
1593 return false
1594 }
1595 return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths)
1596}
1597
Dan Willemsen0fe78662018-03-26 12:41:18 -07001598func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001599 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001600}
1601
Colin Cross395f2cf2018-10-24 16:10:32 -07001602func (c *config) NdkAbis() bool {
1603 return Bool(c.productVariables.Ndk_abis)
1604}
1605
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001606func (c *config) AmlAbis() bool {
1607 return Bool(c.productVariables.Aml_abis)
1608}
1609
Jiyong Park8fd61922018-11-08 02:50:25 +09001610func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001611 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001612}
1613
Jiyong Park4da07972021-01-05 21:01:11 +09001614func (c *config) ForceApexSymlinkOptimization() bool {
1615 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1616}
1617
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001618func (c *config) ApexCompressionEnabled() bool {
1619 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001620}
1621
Dennis Shene2ed70c2023-01-11 14:15:43 +00001622func (c *config) ApexTrimEnabled() bool {
1623 return Bool(c.productVariables.TrimmedApex)
1624}
1625
Jeongik Chac9464142019-01-07 12:07:27 +09001626func (c *config) EnforceSystemCertificate() bool {
1627 return Bool(c.productVariables.EnforceSystemCertificate)
1628}
1629
Colin Cross440e0d02020-06-11 11:32:11 -07001630func (c *config) EnforceSystemCertificateAllowList() []string {
1631 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001632}
1633
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001634func (c *config) EnforceProductPartitionInterface() bool {
1635 return Bool(c.productVariables.EnforceProductPartitionInterface)
1636}
1637
JaeMan Parkff715562020-10-19 17:25:58 +09001638func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1639 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1640}
1641
1642func (c *config) InterPartitionJavaLibraryAllowList() []string {
1643 return c.productVariables.InterPartitionJavaLibraryAllowList
1644}
1645
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001646func (c *config) InstallExtraFlattenedApexes() bool {
1647 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1648}
1649
Colin Crossf24a22a2019-01-31 14:12:44 -08001650func (c *config) ProductHiddenAPIStubs() []string {
1651 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001652}
1653
Colin Crossf24a22a2019-01-31 14:12:44 -08001654func (c *config) ProductHiddenAPIStubsSystem() []string {
1655 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001656}
1657
Colin Crossf24a22a2019-01-31 14:12:44 -08001658func (c *config) ProductHiddenAPIStubsTest() []string {
1659 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001660}
Dan Willemsen71c74602019-04-10 12:27:35 -07001661
Dan Willemsen54879d12019-04-18 10:08:46 -07001662func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001663 return c.config.productVariables.TargetFSConfigGen
1664}
Inseob Kim0866b002019-04-15 20:21:29 +09001665
1666func (c *config) ProductPublicSepolicyDirs() []string {
1667 return c.productVariables.ProductPublicSepolicyDirs
1668}
1669
1670func (c *config) ProductPrivateSepolicyDirs() []string {
1671 return c.productVariables.ProductPrivateSepolicyDirs
1672}
1673
Colin Cross50ddcc42019-05-16 12:28:22 -07001674func (c *config) MissingUsesLibraries() []string {
1675 return c.productVariables.MissingUsesLibraries
1676}
1677
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001678func (c *config) TargetMultitreeUpdateMeta() bool {
1679 return c.productVariables.MultitreeUpdateMeta
1680}
1681
Inseob Kim1f086e22019-05-09 13:29:15 +09001682func (c *deviceConfig) DeviceArch() string {
1683 return String(c.config.productVariables.DeviceArch)
1684}
1685
1686func (c *deviceConfig) DeviceArchVariant() string {
1687 return String(c.config.productVariables.DeviceArchVariant)
1688}
1689
1690func (c *deviceConfig) DeviceSecondaryArch() string {
1691 return String(c.config.productVariables.DeviceSecondaryArch)
1692}
1693
1694func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1695 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1696}
Yifan Hong82db7352020-01-21 16:12:26 -08001697
1698func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1699 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1700}
Yifan Hong97365ee2020-07-29 09:51:57 -07001701
1702func (c *deviceConfig) BoardKernelBinaries() []string {
1703 return c.config.productVariables.BoardKernelBinaries
1704}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001705
Yifan Hong42bef8d2020-08-05 14:36:09 -07001706func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1707 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1708}
1709
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001710func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1711 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1712}
1713
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001714func (c *deviceConfig) PlatformSepolicyVersion() string {
1715 return String(c.config.productVariables.PlatformSepolicyVersion)
1716}
1717
Inseob Kima10ef272021-09-15 03:04:53 +00001718func (c *deviceConfig) TotSepolicyVersion() string {
1719 return String(c.config.productVariables.TotSepolicyVersion)
1720}
1721
Inseob Kim843f6642022-01-07 09:11:23 +09001722func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1723 return c.config.productVariables.PlatformSepolicyCompatVersions
1724}
1725
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001726func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001727 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1728 return ver
1729 }
1730 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001731}
1732
Inseob Kim14178802021-12-08 22:53:31 +09001733func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1734 return c.config.productVariables.BoardPlatVendorPolicy
1735}
1736
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001737func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1738 return c.config.productVariables.BoardReqdMaskPolicy
1739}
1740
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001741func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1742 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1743}
1744
1745func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1746 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1747}
1748
1749func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1750 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1751}
1752
1753func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1754 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1755}
1756
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001757func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1758 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1759}
1760
1761func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1762 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1763}
1764
1765func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1766 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1767}
1768
Inseob Kim7cf14652021-01-06 23:06:52 +09001769func (c *deviceConfig) DirectedVendorSnapshot() bool {
1770 return c.config.productVariables.DirectedVendorSnapshot
1771}
1772
1773func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1774 return c.config.productVariables.VendorSnapshotModules
1775}
1776
Jose Galmes4c6895e2021-02-09 07:44:30 -08001777func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1778 return c.config.productVariables.DirectedRecoverySnapshot
1779}
1780
1781func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1782 return c.config.productVariables.RecoverySnapshotModules
1783}
1784
Justin DeMartino383bfb32021-02-24 10:49:43 -08001785func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1786 var ret = make(map[string]bool)
1787 for _, dir := range dirs {
1788 clean := filepath.Clean(dir)
1789 if previous[clean] || ret[clean] {
1790 return nil, fmt.Errorf("Duplicate entry %s", dir)
1791 }
1792 ret[clean] = true
1793 }
1794 return ret, nil
1795}
1796
1797func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1798 dirMap := c.Once(onceKey, func() interface{} {
1799 ret, err := createDirsMap(previous, dirs)
1800 if err != nil {
1801 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1802 }
1803 return ret
1804 })
1805 if dirMap == nil {
1806 return nil
1807 }
1808 return dirMap.(map[string]bool)
1809}
1810
1811var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1812
1813func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1814 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1815 c.config.productVariables.VendorSnapshotDirsExcluded)
1816}
1817
1818var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1819
1820func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1821 excludedMap := c.VendorSnapshotDirsExcludedMap()
1822 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1823 c.config.productVariables.VendorSnapshotDirsIncluded)
1824}
1825
1826var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1827
1828func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1829 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1830 c.config.productVariables.RecoverySnapshotDirsExcluded)
1831}
1832
1833var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1834
1835func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1836 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1837 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1838 c.config.productVariables.RecoverySnapshotDirsIncluded)
1839}
1840
Rob Seymour925aa092021-08-10 20:42:03 +00001841func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1842 return c.config.productVariables.HostFakeSnapshotEnabled
1843}
1844
Inseob Kim60c32f02020-12-21 22:53:05 +09001845func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1846 if c.config.productVariables.ShippingApiLevel == nil {
1847 return NoneApiLevel
1848 }
1849 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1850 return uncheckedFinalApiLevel(apiLevel)
1851}
1852
Alix Espinoef47e542022-09-14 19:10:51 +00001853func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1854 return c.config.productVariables.BuildBrokenClangAsFlags
1855}
1856
1857func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1858 return c.config.productVariables.BuildBrokenClangCFlags
1859}
1860
Alixb5f6d9e2022-04-20 23:00:58 +00001861func (c *deviceConfig) BuildBrokenClangProperty() bool {
1862 return c.config.productVariables.BuildBrokenClangProperty
1863}
1864
Inseob Kim67e5add192021-03-17 18:05:33 +09001865func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1866 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1867}
1868
1869func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1870 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1871}
1872
Cole Faustedc4c502022-09-09 19:39:25 -07001873func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1874 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1875}
1876
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001877func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1878 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1879}
1880
Inseob Kim0cac7b42021-02-03 18:16:46 +09001881func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1882 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1883}
1884
Liz Kammer619be462022-01-28 15:13:39 -05001885func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1886 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1887}
1888
Vinh Tran140d5882022-06-10 14:23:27 -04001889func (c *deviceConfig) BuildBrokenDepfile() bool {
1890 return Bool(c.config.productVariables.BuildBrokenDepfile)
1891}
1892
Inseob Kim67e5add192021-03-17 18:05:33 +09001893func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1894 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1895}
1896
1897func (c *config) SelinuxIgnoreNeverallows() bool {
1898 return c.productVariables.SelinuxIgnoreNeverallows
1899}
1900
1901func (c *deviceConfig) SepolicySplit() bool {
1902 return c.config.productVariables.SepolicySplit
1903}
1904
Inseob Kima10ef272021-09-15 03:04:53 +00001905func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1906 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1907}
1908
1909func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1910 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1911}
1912
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001913func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1914 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1915}
1916
Christopher Ferris98f10222022-07-13 23:16:52 -07001917func (c *config) IgnorePrefer32OnDevice() bool {
1918 return c.productVariables.IgnorePrefer32OnDevice
1919}
1920
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001921func (c *config) BootJars() []string {
1922 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001923 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001924 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001925 }).([]string)
1926}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001927
satayevd604b212021-07-21 14:23:52 +01001928func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001929 return c.productVariables.BootJars
1930}
1931
satayevd604b212021-07-21 14:23:52 +01001932func (c *config) ApexBootJars() ConfiguredJarList {
1933 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001934}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001935
1936func (c *config) RBEWrapper() string {
1937 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1938}
Colin Cross9b698b62021-12-22 09:55:32 -08001939
1940// UseHostMusl returns true if the host target has been configured to build against musl libc.
1941func (c *config) UseHostMusl() bool {
1942 return Bool(c.productVariables.HostMusl)
1943}
MarkDacekff851b82022-04-21 18:33:17 +00001944
MarkDacekf47e1422023-04-19 16:47:36 +00001945func (c *config) GetMixedBuildsEnabledModules() map[string]struct{} {
1946 return c.mixedBuildEnabledModules
1947}
1948
MarkDacek6f6b9622023-05-02 16:28:55 +00001949func (c *config) GetMixedBuildsDisabledModules() map[string]struct{} {
1950 return c.mixedBuildDisabledModules
1951}
1952
Chris Parsonsf874e462022-05-10 13:50:12 -04001953func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001954 moduleName := ctx.Module().Name()
1955 c.mixedBuildsLock.Lock()
1956 defer c.mixedBuildsLock.Unlock()
1957 if useBazel {
1958 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1959 } else {
1960 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1961 }
1962}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001963
1964// ApiSurfaces directory returns the source path inside the api_surfaces repo
1965// (relative to workspace root).
1966func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1967 return filepath.Join(
1968 "build",
1969 "bazel",
1970 "api_surfaces",
1971 s.String(),
1972 version)
1973}
Jihoon Kang1bff0342023-01-17 20:40:22 +00001974
1975func (c *config) BuildFromTextStub() bool {
1976 return c.buildFromTextStub
1977}
Spandan Das4deab282023-03-30 17:06:32 +00001978
1979func (c *config) SetBuildFromTextStub(b bool) {
1980 c.buildFromTextStub = b
1981}
MarkDacek9c094ca2023-03-16 19:15:19 +00001982func (c *config) AddForceEnabledModules(forceEnabled []string) {
1983 for _, forceEnabledModule := range forceEnabled {
1984 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
1985 }
1986}