blob: 9e94e05177eb55ef4fe73dfe5a3ab354d2d221b8 [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
Jingwen Chenc711fec2020-11-22 23:52:50 -0500186// A DeviceConfig object represents the configuration for a particular device
187// being built. For now there will only be one of these, but in the future there
188// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700189type DeviceConfig struct {
190 *deviceConfig
191}
192
Jingwen Chenc711fec2020-11-22 23:52:50 -0500193// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800194type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700195
Jingwen Chenc711fec2020-11-22 23:52:50 -0500196// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500197// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700198type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500199 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800200 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800201
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700202 // Only available on configs created by TestConfig
203 TestProductVariables *productVariables
204
Jingwen Chenc711fec2020-11-22 23:52:50 -0500205 // A specialized context object for Bazel/Soong mixed builds and migration
206 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400207 BazelContext BazelContext
208
Dan Willemsen87b17d12015-07-14 00:39:06 -0700209 ProductVariablesFileName string
210
Colin Cross0c66bc62021-07-20 09:47:41 -0700211 // BuildOS stores the OsType for the OS that the build is running on.
212 BuildOS OsType
213
214 // BuildArch stores the ArchType for the CPU that the build is running on.
215 BuildArch ArchType
216
Jaewoong Jung642916f2020-10-09 17:25:15 -0700217 Targets map[OsType][]Target
218 BuildOSTarget Target // the Target for tools run on the build machine
219 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
220 AndroidCommonTarget Target // the Target for common modules for the Android device
221 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700222
Jingwen Chenc711fec2020-11-22 23:52:50 -0500223 // multilibConflicts for an ArchType is true if there is earlier configured
224 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700225 multilibConflicts map[ArchType]bool
226
Colin Cross9272ade2016-08-17 15:24:12 -0700227 deviceConfig *deviceConfig
228
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200229 outDir string // The output directory (usually out/)
230 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400231 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700232
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200233 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200234
Colin Cross6ccbc912017-10-10 23:07:38 -0700235 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700236 envLock sync.Mutex
237 envDeps map[string]string
238 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800239
Jingwen Chencda22c92020-11-23 00:22:30 -0500240 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
241 // runs standalone.
242 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700243
Colin Cross32616ed2017-09-05 21:56:44 -0700244 captureBuild bool // true for tests, saves build parameters for each module
245 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700246
Colin Cross98be1bb2019-12-13 20:41:13 -0800247 fs pathtools.FileSystem
248 mockBpList string
249
Chris Parsonsad876012022-08-20 14:48:32 -0400250 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700251 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000252 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500253
LaMont Jones52a72432023-03-09 18:19:35 +0000254 // If MultitreeBuild is true then this is one inner tree of a multitree
255 // build directed by the multitree orchestrator.
256 MultitreeBuild bool
257
Colin Cross5e6a7972020-06-07 16:56:32 -0700258 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
259 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000260 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700261
Jingwen Chenc711fec2020-11-22 23:52:50 -0500262 // The list of files that when changed, must invalidate soong_build to
263 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700264 ninjaFileDepsSet sync.Map
265
Colin Cross9272ade2016-08-17 15:24:12 -0700266 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000267
Chris Parsonsad876012022-08-20 14:48:32 -0400268 // These fields are only used for metrics collection. A module should be added
269 // to these maps only if its implementation supports Bazel handling in mixed
270 // builds. A module being in the "enabled" list indicates that there is a
271 // variant of that module for which bazel-handling actually took place.
272 // A module being in the "disabled" list indicates that there is a variant of
273 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000274 mixedBuildsLock sync.Mutex
275 mixedBuildEnabledModules map[string]struct{}
276 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000277
278 // These are modules to be built with Bazel beyond the allowlisted/build-mode
279 // specified modules. They are passed via the command-line flag
280 // "--bazel-force-enabled-modules"
281 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500282
283 // If true, for any requests to Bazel, communicate with a Bazel proxy using
284 // unix sockets, instead of spawning Bazel as a subprocess.
285 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000286
287 // If buildFromTextStub is true then the Java API stubs are
288 // built from the signature text files, not the source Java files.
289 buildFromTextStub bool
MarkDacekf47e1422023-04-19 16:47:36 +0000290
291 // If ensureAllowlistIntegrity is true, then the presence of any allowlisted
292 // modules that aren't mixed-built for at least one variant will cause a build
293 // failure
294 ensureAllowlistIntegrity bool
Colin Cross9272ade2016-08-17 15:24:12 -0700295}
296
297type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700298 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700299 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800300}
301
Colin Cross485e5722015-08-27 13:28:01 -0700302type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700303 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700304}
Colin Cross3f40fa42015-01-30 17:27:36 -0800305
Colin Cross485e5722015-08-27 13:28:01 -0700306func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000307 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700308}
309
Jingwen Chenc711fec2020-11-22 23:52:50 -0500310// loadFromConfigFile loads and decodes configuration options from a JSON file
311// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400312func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800313 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700314 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800315 defer configFileReader.Close()
316 if os.IsNotExist(err) {
317 // Need to create a file, so that blueprint & ninja don't get in
318 // a dependency tracking loop.
319 // Make a file-configurable-options with defaults, write it out using
320 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700321 configurable.SetDefaultConfig()
322 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800323 if err != nil {
324 return err
325 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800326 } else if err != nil {
327 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800328 } else {
329 // Make a decoder for it
330 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700331 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800332 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800333 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800334 }
335 }
336
Liz Kammer09f947d2021-05-12 14:51:49 -0400337 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
338 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
339 }
340
341 configurable.Native_coverage = proptools.BoolPtr(
342 Bool(configurable.GcovCoverage) ||
343 Bool(configurable.ClangCoverage))
344
Yuntao Xu402e9b02021-08-09 15:44:44 -0700345 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
346 // if false (pre-released version, for example), use Platform_sdk_codename.
347 if Bool(configurable.Platform_sdk_final) {
348 if configurable.Platform_sdk_version != nil {
349 configurable.Platform_sdk_version_or_codename =
350 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
351 } else {
352 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
353 }
354 } else {
355 configurable.Platform_sdk_version_or_codename =
356 proptools.StringPtr(String(configurable.Platform_sdk_codename))
357 }
358
Liz Kammer09f947d2021-05-12 14:51:49 -0400359 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800360}
361
Colin Crossd8f20142016-11-03 09:43:26 -0700362// atomically writes the config file in case two copies of soong_build are running simultaneously
363// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400364func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800365 data, err := json.MarshalIndent(&config, "", " ")
366 if err != nil {
367 return fmt.Errorf("cannot marshal config data: %s", err.Error())
368 }
369
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800370 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800371 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500372 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800373 }
Colin Crossd8f20142016-11-03 09:43:26 -0700374 defer os.Remove(f.Name())
375 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800376
Colin Crossd8f20142016-11-03 09:43:26 -0700377 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700379 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
380 }
381
Colin Crossd8f20142016-11-03 09:43:26 -0700382 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700383 if err != nil {
384 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800385 }
386
Colin Crossd8f20142016-11-03 09:43:26 -0700387 f.Close()
388 os.Rename(f.Name(), filename)
389
Colin Cross3f40fa42015-01-30 17:27:36 -0800390 return nil
391}
392
Liz Kammer09f947d2021-05-12 14:51:49 -0400393func saveToBazelConfigFile(config *productVariables, outDir string) error {
394 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
395 err := createDirIfNonexistent(dir, os.ModePerm)
396 if err != nil {
397 return fmt.Errorf("Could not create dir %s: %s", dir, err)
398 }
399
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000400 nonArchVariantProductVariables := []string{}
401 archVariantProductVariables := []string{}
402 p := variableProperties{}
403 t := reflect.TypeOf(p.Product_variables)
404 for i := 0; i < t.NumField(); i++ {
405 f := t.Field(i)
406 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
407 if proptools.HasTag(f, "android", "arch_variant") {
408 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
409 }
410 }
411
Liz Kammer72beb342022-02-03 08:42:10 -0500412 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000413 if err != nil {
414 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
415 }
416
Liz Kammer72beb342022-02-03 08:42:10 -0500417 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000418 if err != nil {
419 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
420 }
421
422 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400423 if err != nil {
424 return fmt.Errorf("cannot marshal config data: %s", err.Error())
425 }
Cole Faust082c5f32022-08-04 15:49:20 -0700426 // The backslashes need to be escaped because this text is going to be put
427 // inside a Starlark string literal.
428 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400429
430 bzl := []string{
431 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000432 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
433 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
434 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
435 "\n", `
436product_vars = _product_vars
Cole Fausteb644cf2023-04-11 13:48:17 -0700437
438# TODO(b/269577299) Remove these when everything switches over to loading them from product_variable_constants.bzl
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000439product_var_constraints = _product_var_constraints
440arch_variant_product_var_constraints = _arch_variant_product_var_constraints
441`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400442 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500443 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
444 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400445 if err != nil {
446 return fmt.Errorf("Could not write .bzl config file %s", err)
447 }
Cole Fausteb644cf2023-04-11 13:48:17 -0700448 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variable_constants.bzl"), []byte(fmt.Sprintf(`
449product_var_constraints = %s
450arch_variant_product_var_constraints = %s
451`, nonArchVariantProductVariablesJson, archVariantProductVariablesJson)), 0644)
452 if err != nil {
453 return fmt.Errorf("Could not write .bzl config file %s", err)
454 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500455 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
456 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400457 if err != nil {
458 return fmt.Errorf("Could not write BUILD config file %s", err)
459 }
460
461 return nil
462}
463
Colin Cross988414c2020-01-11 01:11:46 +0000464// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
465// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200466func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000467 return Config{
468 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200469 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200470 soongOutDir: soongOutDir,
471 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000472 },
473 }
474}
475
Jingwen Chenc711fec2020-11-22 23:52:50 -0500476// NewConfig creates a new Config object. The srcDir argument specifies the path
477// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800478func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500479 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700480 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800481 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700482
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200483 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700484
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800485 outDir: cmdArgs.OutDir,
486 soongOutDir: cmdArgs.SoongOutDir,
487 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200488 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800489
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800490 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000491 fs: pathtools.NewOsFs(absSrcDir),
492 mixedBuildDisabledModules: make(map[string]struct{}),
493 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000494 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500495
LaMont Jones52a72432023-03-09 18:19:35 +0000496 MultitreeBuild: cmdArgs.MultitreeBuild,
497 UseBazelProxy: cmdArgs.UseBazelProxy,
Jihoon Kang1bff0342023-01-17 20:40:22 +0000498
499 buildFromTextStub: cmdArgs.BuildFromTextStub,
Colin Cross68f55102015-03-25 14:43:57 -0700500 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800501
Dan Willemsen00269f22017-07-06 16:59:48 -0700502 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700503 config: config,
504 }
505
Liz Kammer7941b302020-07-28 13:27:34 -0700506 // Soundness check of the build and source directories. This won't catch strange
507 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800508 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700509 if err != nil {
510 return Config{}, err
511 }
512
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200513 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700514 if err != nil {
515 return Config{}, err
516 }
517
518 if strings.HasPrefix(absSrcDir, absBuildDir) {
519 return Config{}, fmt.Errorf("Build dir must not contain source directory")
520 }
521
Colin Cross3f40fa42015-01-30 17:27:36 -0800522 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700523 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800524 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700525 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800526 }
527
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800528 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500529 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
530 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800531 }
532
Colin Cross0c66bc62021-07-20 09:47:41 -0700533 determineBuildOS(config)
534
Jingwen Chenc711fec2020-11-22 23:52:50 -0500535 // Sets up the map of target OSes to the finer grained compilation targets
536 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700537 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700538 if err != nil {
539 return Config{}, err
540 }
541
Paul Duffin1356d8c2020-02-25 19:26:33 +0000542 // Make the CommonOS OsType available for all products.
543 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
544
Dan Albert4098deb2016-10-19 14:04:41 -0700545 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500546 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700547 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000548 } else if config.AmlAbis() {
549 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700550 }
551
552 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500553 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800554 if err != nil {
555 return Config{}, err
556 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700557 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800558 }
559
Colin Cross3b19f5d2019-09-17 14:45:31 -0700560 multilib := make(map[string]bool)
561 for _, target := range targets[Android] {
562 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
563 config.multilibConflicts[target.Arch.ArchType] = true
564 }
565 multilib[target.Arch.ArchType.Multilib] = true
566 }
567
Jingwen Chenc711fec2020-11-22 23:52:50 -0500568 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700569 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500570
571 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700572 config.BuildOSTarget = config.Targets[config.BuildOS][0]
573 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500574
575 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700576 if len(config.Targets[Android]) > 0 {
577 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000578 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700579 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700580
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500581 setBuildMode := func(arg string, mode SoongBuildMode) {
582 if arg != "" {
583 if config.BuildMode != AnalysisNoBazel {
584 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
585 os.Exit(1)
586 }
587 config.BuildMode = mode
588 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800589 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500590 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
591 if arg {
592 if config.BuildMode != AnalysisNoBazel {
593 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
594 os.Exit(1)
595 }
596 config.BuildMode = mode
597 }
598 }
599 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
600 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
601 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
602 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
603 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
604 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
605 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
606 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
607 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800608
MarkDacek1de78f32023-05-02 21:00:48 +0000609 for _, module := range getForceEnabledModulesFromFlag(cmdArgs.BazelForceEnabledModules) {
MarkDacekd06db5d2022-11-29 00:47:59 +0000610 config.bazelForceEnabledModules[module] = struct{}{}
611 }
MarkDacek9c094ca2023-03-16 19:15:19 +0000612 config.BazelContext, err = NewBazelContext(config)
613 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
MarkDacekd06db5d2022-11-29 00:47:59 +0000614
Jingwen Chenc711fec2020-11-22 23:52:50 -0500615 return Config{config}, err
616}
Colin Cross988414c2020-01-11 01:11:46 +0000617
MarkDacek1de78f32023-05-02 21:00:48 +0000618func getForceEnabledModulesFromFlag(forceEnabledFlag string) []string {
619 if forceEnabledFlag == "" {
620 return []string{}
621 }
622 return strings.Split(forceEnabledFlag, ",")
623}
624
Colin Cross98be1bb2019-12-13 20:41:13 -0800625// mockFileSystem replaces all reads with accesses to the provided map of
626// filenames to contents stored as a byte slice.
627func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
628 mockFS := map[string][]byte{}
629
630 if _, exists := mockFS["Android.bp"]; !exists {
631 mockFS["Android.bp"] = []byte(bp)
632 }
633
634 for k, v := range fs {
635 mockFS[k] = v
636 }
637
638 // no module list file specified; find every file named Blueprints or Android.bp
639 pathsToParse := []string{}
640 for candidate := range mockFS {
641 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200642 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800643 pathsToParse = append(pathsToParse, candidate)
644 }
645 }
646 if len(pathsToParse) < 1 {
647 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
648 }
649 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
650
651 c.fs = pathtools.MockFs(mockFS)
652 c.mockBpList = blueprint.MockModuleListFile
653}
654
Jason Wuff1bb312022-12-21 09:57:26 -0500655// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
656// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400657// Returns true if "Bazel builds" is enabled. In this mode, part of build
658// analysis is handled by Bazel.
659func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500660 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
661 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500662 return false
663 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500664 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500665 return false
666 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500667 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500668 return false
669 }
670 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500671 return false
672 }
673 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500674 return false
675 }
676 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500677 return false
678 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500679 return true
680 }).(bool)
681
682 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
683 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400684}
685
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100686func (c *config) SetAllowMissingDependencies() {
687 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
688}
689
Jingwen Chenc711fec2020-11-22 23:52:50 -0500690// BlueprintToolLocation returns the directory containing build system tools
691// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200692func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700693 if c.KatiEnabled() {
694 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
695 } else {
696 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
697 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700698}
699
Dan Willemsen60e62f02018-11-16 21:05:32 -0800700func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700701 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
702 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800703}
704
Colin Cross790ef352021-10-25 19:15:55 -0700705func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000706 ext := ".so"
707 if runtime.GOOS == "darwin" {
708 ext = ".dylib"
709 }
Colin Cross790ef352021-10-25 19:15:55 -0700710 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
711 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000712}
713
Colin Crossae5330a2021-11-03 13:31:22 -0700714func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
715 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700716 return path
717}
718
Jingwen Chenc711fec2020-11-22 23:52:50 -0500719// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700720func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800721 switch runtime.GOOS {
722 case "linux":
723 return "linux-x86"
724 case "darwin":
725 return "darwin-x86"
726 default:
727 panic("Unknown GOOS")
728 }
729}
730
731// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700732func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200733 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800734}
735
Jingwen Chenc711fec2020-11-22 23:52:50 -0500736// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
737// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700738func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
739 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
740}
741
Jingwen Chenc711fec2020-11-22 23:52:50 -0500742// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
743// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700744func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700745 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800746 case "darwin":
747 return "-R"
748 case "linux":
749 return "-d"
750 default:
751 return ""
752 }
753}
Colin Cross68f55102015-03-25 14:43:57 -0700754
Colin Cross1332b002015-04-07 17:11:30 -0700755func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700756 var val string
757 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700758 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800759 defer c.envLock.Unlock()
760 if c.envDeps == nil {
761 c.envDeps = make(map[string]string)
762 }
Colin Cross68f55102015-03-25 14:43:57 -0700763 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700764 if c.envFrozen {
765 panic("Cannot access new environment variables after envdeps are frozen")
766 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700767 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700768 c.envDeps[key] = val
769 }
770 return val
771}
772
Colin Cross99d7c232016-11-23 16:52:04 -0800773func (c *config) GetenvWithDefault(key string, defaultValue string) string {
774 ret := c.Getenv(key)
775 if ret == "" {
776 return defaultValue
777 }
778 return ret
779}
780
781func (c *config) IsEnvTrue(key string) bool {
782 value := c.Getenv(key)
783 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
784}
785
786func (c *config) IsEnvFalse(key string) bool {
787 value := c.Getenv(key)
788 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
789}
790
Jingwen Chenc711fec2020-11-22 23:52:50 -0500791// EnvDeps returns the environment variables this build depends on. The first
792// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700793func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700794 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800795 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700796 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700797 return c.envDeps
798}
Colin Cross35cec122015-04-02 14:37:16 -0700799
Jingwen Chencda22c92020-11-23 00:22:30 -0500800func (c *config) KatiEnabled() bool {
801 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800802}
803
Nan Zhang581fd212018-01-10 16:06:12 -0800804func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800805 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800806}
807
Jingwen Chenc711fec2020-11-22 23:52:50 -0500808// BuildNumberFile returns the path to a text file containing metadata
809// representing the current build's number.
810//
811// Rules that want to reference the build number should read from this file
812// without depending on it. They will run whenever their other dependencies
813// require them to run and get the current build number. This ensures they don't
814// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800815func (c *config) BuildNumberFile(ctx PathContext) Path {
816 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800817}
818
Jingwen Chenc711fec2020-11-22 23:52:50 -0500819// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700820// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700821func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800822 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700823}
824
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000825// DeviceProduct returns the current product target. There could be multiple of
826// these per device type.
827//
Chris Parsonsef615e52022-08-18 22:04:11 -0400828// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000829func (c *config) DeviceProduct() string {
830 return *c.productVariables.DeviceProduct
831}
832
Cole Faustb85d1a12022-11-08 18:14:01 -0800833// HasDeviceProduct returns if the build has a product. A build will not
834// necessarily have a product when --skip-config is passed to soong, like it is
835// in prebuilts/build-tools/build-prebuilts.sh
836func (c *config) HasDeviceProduct() bool {
837 return c.productVariables.DeviceProduct != nil
838}
839
Anton Hansson53c88442019-03-18 15:53:16 +0000840func (c *config) DeviceResourceOverlays() []string {
841 return c.productVariables.DeviceResourceOverlays
842}
843
844func (c *config) ProductResourceOverlays() []string {
845 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700846}
847
Colin Crossbfd347d2018-05-09 11:11:35 -0700848func (c *config) PlatformVersionName() string {
849 return String(c.productVariables.Platform_version_name)
850}
851
Dan Albert4f378d72020-07-23 17:32:15 -0700852func (c *config) PlatformSdkVersion() ApiLevel {
853 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700854}
855
Cole Faust37d27c42023-04-12 10:27:45 -0700856func (c *config) RawPlatformSdkVersion() *int {
857 return c.productVariables.Platform_sdk_version
858}
859
Mu-Le Lee5e047532022-07-27 02:32:03 +0000860func (c *config) PlatformSdkFinal() bool {
861 return Bool(c.productVariables.Platform_sdk_final)
862}
863
Colin Crossd09b0b62018-04-18 11:06:47 -0700864func (c *config) PlatformSdkCodename() string {
865 return String(c.productVariables.Platform_sdk_codename)
866}
867
Anton Hansson97d0bae2022-02-16 16:15:10 +0000868func (c *config) PlatformSdkExtensionVersion() int {
869 return *c.productVariables.Platform_sdk_extension_version
870}
871
872func (c *config) PlatformBaseSdkExtensionVersion() int {
873 return *c.productVariables.Platform_base_sdk_extension_version
874}
875
Colin Cross092c9da2019-04-02 22:56:43 -0700876func (c *config) PlatformSecurityPatch() string {
877 return String(c.productVariables.Platform_security_patch)
878}
879
880func (c *config) PlatformPreviewSdkVersion() string {
881 return String(c.productVariables.Platform_preview_sdk_version)
882}
883
884func (c *config) PlatformMinSupportedTargetSdkVersion() string {
885 return String(c.productVariables.Platform_min_supported_target_sdk_version)
886}
887
888func (c *config) PlatformBaseOS() string {
889 return String(c.productVariables.Platform_base_os)
890}
891
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900892func (c *config) PlatformVersionLastStable() string {
893 return String(c.productVariables.Platform_version_last_stable)
894}
895
Jiyong Park37073842022-06-21 10:13:42 +0900896func (c *config) PlatformVersionKnownCodenames() string {
897 return String(c.productVariables.Platform_version_known_codenames)
898}
899
Dan Albert1a246272020-07-06 14:49:35 -0700900func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000901 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700902}
903
904func (c *config) FinalApiLevels() []ApiLevel {
905 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700906 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700907 levels = append(levels, uncheckedFinalApiLevel(i))
908 }
909 return levels
910}
911
912func (c *config) PreviewApiLevels() []ApiLevel {
913 var levels []ApiLevel
914 for i, codename := range c.PlatformVersionActiveCodenames() {
915 levels = append(levels, ApiLevel{
916 value: codename,
917 number: i,
918 isPreview: true,
919 })
920 }
921 return levels
922}
923
satayevcca4ab72021-11-30 12:33:55 +0000924func (c *config) LatestPreviewApiLevel() ApiLevel {
925 level := NoneApiLevel
926 for _, l := range c.PreviewApiLevels() {
927 if l.GreaterThan(level) {
928 level = l
929 }
930 }
931 return level
932}
933
Dan Albert1a246272020-07-06 14:49:35 -0700934func (c *config) AllSupportedApiLevels() []ApiLevel {
935 var levels []ApiLevel
936 levels = append(levels, c.FinalApiLevels()...)
937 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700938}
939
Jingwen Chenc711fec2020-11-22 23:52:50 -0500940// DefaultAppTargetSdk returns the API level that platform apps are targeting.
941// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700942func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000943 // This logic is replicated in starlark, if changing logic here update starlark code too
944 // 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 -0700945 if Bool(c.productVariables.Platform_sdk_final) {
946 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700947 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500948 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900949 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500950 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900951 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
952 // don't set platform sdk codename. Platform sdk codename makes sense only when we
953 // are building the platform. So we don't enforce the below panic for the host-only
954 // builds.
955 if hostOnlyBuild {
956 return NoneApiLevel
957 }
958 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500959 }
960 if codename == "REL" {
961 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
962 }
963 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700964}
965
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800966func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800967 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800968}
969
Dan Albert31384de2017-07-28 12:39:46 -0700970// Codenames that are active in the current lunch target.
971func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800972 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700973}
974
Dan Albert8c7a9942023-03-27 20:34:01 +0000975// All unreleased codenames.
976func (c *config) PlatformVersionAllPreviewCodenames() []string {
977 return c.productVariables.Platform_version_all_preview_codenames
978}
979
Colin Crossface4e42017-10-30 17:32:15 -0700980func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800981 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700982}
983
Colin Crossface4e42017-10-30 17:32:15 -0700984func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800985 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700986}
987
Colin Crossface4e42017-10-30 17:32:15 -0700988func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800989 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700990}
991
992func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800993 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700994}
995
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700996func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800997 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800998 if defaultCert != "" {
999 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -08001000 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001001 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -07001002}
1003
Colin Crosse1731a52017-12-14 11:22:55 -08001004func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001005 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001006 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -08001007 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -08001008 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001009 defaultDir := c.DefaultAppCertificateDir(ctx)
1010 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -07001011}
Colin Cross6ff51382015-12-17 16:39:19 -08001012
Jiyong Park9335a262018-12-24 11:31:58 +09001013func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
1014 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
1015 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -07001016 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +09001017 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
1018 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -08001019 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +09001020 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001021 // If not, APEX keys are under the specified directory
1022 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001023}
1024
Inseob Kim80fa7982022-08-12 21:36:25 +09001025// Certificate for the NetworkStack sepolicy context
1026func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1027 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1028 if cert != "" {
1029 return PathForSource(ctx, cert)
1030 }
1031 return c.DefaultAppCertificateDir(ctx)
1032}
1033
Jingwen Chenc711fec2020-11-22 23:52:50 -05001034// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1035// are configured to depend on non-existent modules. Note that this does not
1036// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001037func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001038 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001039}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001040
Jeongik Cha816a23a2020-07-08 01:09:23 +09001041// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001042func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001043 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001044}
1045
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001046// Returns true if building apps that aren't bundled with the platform.
1047// UnbundledBuild() is always true when this is true.
1048func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001049 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001050}
1051
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001052// Returns true if building image that aren't bundled with the platform.
1053// UnbundledBuild() is always true when this is true.
1054func (c *config) UnbundledBuildImage() bool {
1055 return Bool(c.productVariables.Unbundled_build_image)
1056}
1057
Jeongik Cha816a23a2020-07-08 01:09:23 +09001058// Returns true if building modules against prebuilt SDKs.
1059func (c *config) AlwaysUsePrebuiltSdks() bool {
1060 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001061}
1062
Colin Cross126a25c2017-10-31 13:55:34 -07001063func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001064 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001065}
1066
Colin Crossed064c02018-09-05 16:28:13 -07001067func (c *config) Debuggable() bool {
1068 return Bool(c.productVariables.Debuggable)
1069}
1070
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001071func (c *config) Eng() bool {
1072 return Bool(c.productVariables.Eng)
1073}
1074
Colin Crossc53c37f2021-12-08 15:42:22 -08001075// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1076// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001077func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001078 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1079 return androidTargets[0].Arch.ArchType
1080 }
1081 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001082}
1083
Colin Cross16b23492016-01-06 14:41:07 -08001084func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001085 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001086}
1087
1088func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001089 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001090}
1091
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001092func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001093 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001094}
1095
Colin Cross23ae82a2016-11-02 14:34:39 -07001096func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001097 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001098}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001099
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001100func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001101 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001102 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001103 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001104 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001105}
1106
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001107func (c *config) DisableScudo() bool {
1108 return Bool(c.productVariables.DisableScudo)
1109}
1110
Colin Crossa1ad8d12016-06-01 17:09:44 -07001111func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001112 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001113 if t.Arch.ArchType.Multilib == "lib64" {
1114 return true
1115 }
1116 }
1117
1118 return false
1119}
Colin Cross9272ade2016-08-17 15:24:12 -07001120
Colin Cross9d45bb72016-08-29 16:14:13 -07001121func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001122 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001123}
1124
Ramy Medhatbbf25672019-07-17 12:30:04 +00001125func (c *config) UseRBE() bool {
1126 return Bool(c.productVariables.UseRBE)
1127}
1128
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001129func (c *config) UseRBEJAVAC() bool {
1130 return Bool(c.productVariables.UseRBEJAVAC)
1131}
1132
1133func (c *config) UseRBER8() bool {
1134 return Bool(c.productVariables.UseRBER8)
1135}
1136
1137func (c *config) UseRBED8() bool {
1138 return Bool(c.productVariables.UseRBED8)
1139}
1140
Colin Cross8b8bec32019-11-15 13:18:43 -08001141func (c *config) UseRemoteBuild() bool {
1142 return c.UseGoma() || c.UseRBE()
1143}
1144
Colin Cross66548102018-06-19 22:47:35 -07001145func (c *config) RunErrorProne() bool {
1146 return c.IsEnvTrue("RUN_ERROR_PRONE")
1147}
1148
Jingwen Chenc711fec2020-11-22 23:52:50 -05001149// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001150func (c *config) XrefCorpusName() string {
1151 return c.Getenv("XREF_CORPUS")
1152}
1153
Jingwen Chenc711fec2020-11-22 23:52:50 -05001154// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1155// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001156func (c *config) XrefCuEncoding() string {
1157 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1158 return enc
1159 }
1160 return "json"
1161}
1162
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001163// XrefCuJavaSourceMax returns the maximum number of the Java source files
1164// in a single compilation unit
1165const xrefJavaSourceFileMaxDefault = "1000"
1166
1167func (c Config) XrefCuJavaSourceMax() string {
1168 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1169 if v == "" {
1170 return xrefJavaSourceFileMaxDefault
1171 }
1172 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1173 fmt.Fprintf(os.Stderr,
1174 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1175 err, xrefJavaSourceFileMaxDefault)
1176 return xrefJavaSourceFileMaxDefault
1177 }
1178 return v
1179
1180}
1181
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001182func (c *config) EmitXrefRules() bool {
1183 return c.XrefCorpusName() != ""
1184}
1185
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001186func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001187 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001188}
1189
1190func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001191 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001192 return ""
1193 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001194 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001195}
1196
Colin Cross0f4e0d62016-07-27 10:56:55 -07001197func (c *config) LibartImgHostBaseAddress() string {
1198 return "0x60000000"
1199}
1200
1201func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001202 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001203}
1204
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001205func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001206 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001207}
1208
Jingwen Chenc711fec2020-11-22 23:52:50 -05001209// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1210// but some modules still depend on it.
1211//
1212// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001213func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001214 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001215
Roland Levillainf6cc2612020-07-09 16:58:14 +01001216 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001217 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001218 return true
1219 }
Colin Crossa74ca042019-01-31 14:31:51 -08001220 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001221 }
1222 return false
1223}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001224func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001225 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001226 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001227 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001228 }
1229 return false
1230}
1231
1232func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001233 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001234}
1235
Sam Delmerico98a73292023-02-21 11:50:29 -05001236func (c *config) SourceRootDirs() []string {
1237 return c.productVariables.SourceRootDirs
1238}
1239
Spandan Dasc5763832022-11-08 18:42:16 +00001240func (c *config) IncludeTags() []string {
1241 return c.productVariables.IncludeTags
1242}
1243
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001244func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001245 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001246}
1247
Colin Cross5a0dcd52018-10-05 14:20:06 -07001248func (c *config) UncompressPrivAppDex() bool {
1249 return Bool(c.productVariables.UncompressPrivAppDex)
1250}
1251
1252func (c *config) ModulesLoadedByPrivilegedModules() []string {
1253 return c.productVariables.ModulesLoadedByPrivilegedModules
1254}
1255
Jingwen Chenc711fec2020-11-22 23:52:50 -05001256// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1257// the output directory, if it was created during the product configuration
1258// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001259func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001260 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001261 return OptionalPathForPath(nil)
1262 }
1263 return OptionalPathForPath(
1264 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1265}
1266
Jingwen Chenc711fec2020-11-22 23:52:50 -05001267// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1268// configuration. Since the configuration file was created by Kati during
1269// product configuration (externally of soong_build), it's not tracked, so we
1270// also manually add a Ninja file dependency on the configuration file to the
1271// rule that creates the main build.ninja file. This ensures that build.ninja is
1272// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001273func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1274 path := c.DexpreoptGlobalConfigPath(ctx)
1275 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001276 return nil, nil
1277 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001278 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001279 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001280}
1281
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001282func (c *deviceConfig) WithDexpreopt() bool {
1283 return c.config.productVariables.WithDexpreopt
1284}
1285
Colin Cross662d6142022-11-03 20:38:01 -07001286func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001287 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001288}
1289
Inseob Kimae553032019-05-14 18:52:49 +09001290func (c *config) VndkSnapshotBuildArtifacts() bool {
1291 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1292}
1293
Colin Cross3b19f5d2019-09-17 14:45:31 -07001294func (c *config) HasMultilibConflict(arch ArchType) bool {
1295 return c.multilibConflicts[arch]
1296}
1297
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001298func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001299 return String(c.productVariables.PrebuiltHiddenApiDir)
1300}
1301
MarkDacekd06db5d2022-11-29 00:47:59 +00001302func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1303 return c.bazelForceEnabledModules
1304}
1305
Colin Cross9272ade2016-08-17 15:24:12 -07001306func (c *deviceConfig) Arches() []Arch {
1307 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001308 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001309 arches = append(arches, target.Arch)
1310 }
1311 return arches
1312}
Dan Willemsend2ede872016-11-18 14:54:24 -08001313
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001314func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001315 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001316 if is32BitBinder != nil && *is32BitBinder {
1317 return "32"
1318 }
1319 return "64"
1320}
1321
Dan Willemsen4353bc42016-12-05 17:16:02 -08001322func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001323 if c.config.productVariables.VendorPath != nil {
1324 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001325 }
1326 return "vendor"
1327}
1328
Justin Yun71549282017-11-17 12:10:28 +09001329func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001330 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001331}
1332
Jose Galmes6f843bc2020-12-11 13:36:29 -08001333func (c *deviceConfig) RecoverySnapshotVersion() string {
1334 return String(c.config.productVariables.RecoverySnapshotVersion)
1335}
1336
Jeongik Cha219141c2020-08-06 23:00:37 +09001337func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1338 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1339}
1340
Justin Yun8fe12122017-12-07 17:18:15 +09001341func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001342 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001343}
1344
Justin Yun5f7f7e82019-11-18 19:52:14 +09001345func (c *deviceConfig) ProductVndkVersion() string {
1346 return String(c.config.productVariables.ProductVndkVersion)
1347}
1348
Justin Yun71549282017-11-17 12:10:28 +09001349func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001350 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001351}
Jack He8cc71432016-12-08 15:45:07 -08001352
Vic Yangefd249e2018-11-12 20:19:56 -08001353func (c *deviceConfig) VndkUseCoreVariant() bool {
1354 return Bool(c.config.productVariables.VndkUseCoreVariant)
1355}
1356
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001357func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001358 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001359}
1360
1361func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001362 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001363}
1364
Jiyong Park2db76922017-11-08 16:03:48 +09001365func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001366 if c.config.productVariables.OdmPath != nil {
1367 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001368 }
1369 return "odm"
1370}
1371
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001372func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001373 if c.config.productVariables.ProductPath != nil {
1374 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001375 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001376 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001377}
1378
Justin Yund5f6c822019-06-25 16:47:17 +09001379func (c *deviceConfig) SystemExtPath() string {
1380 if c.config.productVariables.SystemExtPath != nil {
1381 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001382 }
Justin Yund5f6c822019-06-25 16:47:17 +09001383 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001384}
1385
Jack He8cc71432016-12-08 15:45:07 -08001386func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001387 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001388}
Dan Willemsen581341d2017-02-09 16:16:31 -08001389
Jiyong Parkd773eb32017-07-03 13:18:12 +09001390func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001391 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001392}
1393
Roland Levillainada12702020-06-09 13:07:36 +01001394// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1395// path. Coverage is enabled by default when the product variable
1396// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1397// enabled for any path which is part of this variable (and not part of the
1398// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1399// represents any path.
1400func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1401 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001402 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001403 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1404 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1405 coverage = true
1406 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001407 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001408 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1409 coverage = false
1410 }
1411 }
1412 return coverage
1413}
1414
Colin Cross1a6acd42020-06-16 17:51:46 -07001415// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001416func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001417 return Bool(c.config.productVariables.GcovCoverage) ||
1418 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001419}
1420
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001421func (c *deviceConfig) ClangCoverageEnabled() bool {
1422 return Bool(c.config.productVariables.ClangCoverage)
1423}
1424
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001425func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1426 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1427}
1428
Colin Cross1a6acd42020-06-16 17:51:46 -07001429func (c *deviceConfig) GcovCoverageEnabled() bool {
1430 return Bool(c.config.productVariables.GcovCoverage)
1431}
1432
Roland Levillain4f5297b2020-06-09 12:44:06 +01001433// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1434// code coverage is enabled for path. By default, coverage is not enabled for a
1435// given path unless it is part of the NativeCoveragePaths product variable (and
1436// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1437// NativeCoveragePaths represents any path.
1438func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001439 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001440 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001441 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001442 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001443 }
1444 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001445 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001446 // Workaround coverage boot failure.
1447 // http://b/269981180
1448 if strings.HasPrefix(path, "external/protobuf") {
1449 coverage = false
1450 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001451 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001452 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001453 }
1454 }
1455 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001456}
Ivan Lozano5f595532017-07-13 14:46:05 -07001457
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001458func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001459 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001460}
1461
Vinh Tran44cb78c2023-03-09 22:07:19 -05001462// AfdoProfile returns fully qualified path associated to the given module name
1463func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1464 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1465 split := strings.Split(afdoProfile, ":")
1466 if len(split) != 3 {
1467 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1468 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1469 }
1470 if split[0] == name {
1471 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1472 }
1473 }
1474 return nil, nil
1475}
1476
Tri Vo35a51432018-03-25 20:00:00 -07001477func (c *deviceConfig) VendorSepolicyDirs() []string {
1478 return c.config.productVariables.BoardVendorSepolicyDirs
1479}
1480
1481func (c *deviceConfig) OdmSepolicyDirs() []string {
1482 return c.config.productVariables.BoardOdmSepolicyDirs
1483}
1484
Felixa20a8752020-05-17 18:28:35 +02001485func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1486 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001487}
1488
Felixa20a8752020-05-17 18:28:35 +02001489func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1490 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001491}
1492
Inseob Kim0866b002019-04-15 20:21:29 +09001493func (c *deviceConfig) SepolicyM4Defs() []string {
1494 return c.config.productVariables.BoardSepolicyM4Defs
1495}
1496
Jiyong Park7f67f482019-01-05 12:57:48 +09001497func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001498 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1499 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1500}
1501
1502func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001503 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001504 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1505}
1506
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001507func (c *deviceConfig) OverridePackageNameFor(name string) string {
1508 newName, overridden := findOverrideValue(
1509 c.config.productVariables.PackageNameOverrides,
1510 name,
1511 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1512 if overridden {
1513 return newName
1514 }
1515 return name
1516}
1517
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001518func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001519 if overrides == nil || len(overrides) == 0 {
1520 return "", false
1521 }
1522 for _, o := range overrides {
1523 split := strings.Split(o, ":")
1524 if len(split) != 2 {
1525 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001526 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001527 }
1528 if matchPattern(split[0], name) {
1529 return substPattern(split[0], split[1], name), true
1530 }
1531 }
1532 return "", false
1533}
1534
Albert Martineefabcf2022-03-21 20:11:16 +00001535func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1536 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1537}
1538
Ivan Lozano5f595532017-07-13 14:46:05 -07001539func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001540 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001541 return false
1542 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001543 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001544}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001545
1546func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001547 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001548 return false
1549 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001550 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001551}
1552
1553func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001554 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001555 return false
1556 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001557 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001558}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001559
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001560func (c *config) MemtagHeapDisabledForPath(path string) bool {
1561 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1562 return false
1563 }
1564 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1565}
1566
1567func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1568 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1569 return false
1570 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001571 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001572}
1573
1574func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1575 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1576 return false
1577 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001578 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001579}
1580
Hang Lua98aab92023-03-17 13:17:22 +08001581func (c *config) HWASanEnabledForPath(path string) bool {
1582 if len(c.productVariables.HWASanIncludePaths) == 0 {
1583 return false
1584 }
1585 return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths)
1586}
1587
Dan Willemsen0fe78662018-03-26 12:41:18 -07001588func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001589 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001590}
1591
Colin Cross395f2cf2018-10-24 16:10:32 -07001592func (c *config) NdkAbis() bool {
1593 return Bool(c.productVariables.Ndk_abis)
1594}
1595
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001596func (c *config) AmlAbis() bool {
1597 return Bool(c.productVariables.Aml_abis)
1598}
1599
Jiyong Park8fd61922018-11-08 02:50:25 +09001600func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001601 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001602}
1603
Jiyong Park4da07972021-01-05 21:01:11 +09001604func (c *config) ForceApexSymlinkOptimization() bool {
1605 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1606}
1607
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001608func (c *config) ApexCompressionEnabled() bool {
1609 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001610}
1611
Dennis Shene2ed70c2023-01-11 14:15:43 +00001612func (c *config) ApexTrimEnabled() bool {
1613 return Bool(c.productVariables.TrimmedApex)
1614}
1615
Jeongik Chac9464142019-01-07 12:07:27 +09001616func (c *config) EnforceSystemCertificate() bool {
1617 return Bool(c.productVariables.EnforceSystemCertificate)
1618}
1619
Colin Cross440e0d02020-06-11 11:32:11 -07001620func (c *config) EnforceSystemCertificateAllowList() []string {
1621 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001622}
1623
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001624func (c *config) EnforceProductPartitionInterface() bool {
1625 return Bool(c.productVariables.EnforceProductPartitionInterface)
1626}
1627
JaeMan Parkff715562020-10-19 17:25:58 +09001628func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1629 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1630}
1631
1632func (c *config) InterPartitionJavaLibraryAllowList() []string {
1633 return c.productVariables.InterPartitionJavaLibraryAllowList
1634}
1635
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001636func (c *config) InstallExtraFlattenedApexes() bool {
1637 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1638}
1639
Colin Crossf24a22a2019-01-31 14:12:44 -08001640func (c *config) ProductHiddenAPIStubs() []string {
1641 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001642}
1643
Colin Crossf24a22a2019-01-31 14:12:44 -08001644func (c *config) ProductHiddenAPIStubsSystem() []string {
1645 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001646}
1647
Colin Crossf24a22a2019-01-31 14:12:44 -08001648func (c *config) ProductHiddenAPIStubsTest() []string {
1649 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001650}
Dan Willemsen71c74602019-04-10 12:27:35 -07001651
Dan Willemsen54879d12019-04-18 10:08:46 -07001652func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001653 return c.config.productVariables.TargetFSConfigGen
1654}
Inseob Kim0866b002019-04-15 20:21:29 +09001655
1656func (c *config) ProductPublicSepolicyDirs() []string {
1657 return c.productVariables.ProductPublicSepolicyDirs
1658}
1659
1660func (c *config) ProductPrivateSepolicyDirs() []string {
1661 return c.productVariables.ProductPrivateSepolicyDirs
1662}
1663
Colin Cross50ddcc42019-05-16 12:28:22 -07001664func (c *config) MissingUsesLibraries() []string {
1665 return c.productVariables.MissingUsesLibraries
1666}
1667
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001668func (c *config) TargetMultitreeUpdateMeta() bool {
1669 return c.productVariables.MultitreeUpdateMeta
1670}
1671
Inseob Kim1f086e22019-05-09 13:29:15 +09001672func (c *deviceConfig) DeviceArch() string {
1673 return String(c.config.productVariables.DeviceArch)
1674}
1675
1676func (c *deviceConfig) DeviceArchVariant() string {
1677 return String(c.config.productVariables.DeviceArchVariant)
1678}
1679
1680func (c *deviceConfig) DeviceSecondaryArch() string {
1681 return String(c.config.productVariables.DeviceSecondaryArch)
1682}
1683
1684func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1685 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1686}
Yifan Hong82db7352020-01-21 16:12:26 -08001687
1688func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1689 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1690}
Yifan Hong97365ee2020-07-29 09:51:57 -07001691
1692func (c *deviceConfig) BoardKernelBinaries() []string {
1693 return c.config.productVariables.BoardKernelBinaries
1694}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001695
Yifan Hong42bef8d2020-08-05 14:36:09 -07001696func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1697 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1698}
1699
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001700func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1701 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1702}
1703
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001704func (c *deviceConfig) PlatformSepolicyVersion() string {
1705 return String(c.config.productVariables.PlatformSepolicyVersion)
1706}
1707
Inseob Kima10ef272021-09-15 03:04:53 +00001708func (c *deviceConfig) TotSepolicyVersion() string {
1709 return String(c.config.productVariables.TotSepolicyVersion)
1710}
1711
Inseob Kim843f6642022-01-07 09:11:23 +09001712func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1713 return c.config.productVariables.PlatformSepolicyCompatVersions
1714}
1715
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001716func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001717 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1718 return ver
1719 }
1720 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001721}
1722
Inseob Kim14178802021-12-08 22:53:31 +09001723func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1724 return c.config.productVariables.BoardPlatVendorPolicy
1725}
1726
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001727func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1728 return c.config.productVariables.BoardReqdMaskPolicy
1729}
1730
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001731func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1732 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1733}
1734
1735func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1736 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1737}
1738
1739func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1740 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1741}
1742
1743func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1744 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1745}
1746
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001747func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1748 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1749}
1750
1751func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1752 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1753}
1754
1755func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1756 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1757}
1758
Inseob Kim7cf14652021-01-06 23:06:52 +09001759func (c *deviceConfig) DirectedVendorSnapshot() bool {
1760 return c.config.productVariables.DirectedVendorSnapshot
1761}
1762
1763func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1764 return c.config.productVariables.VendorSnapshotModules
1765}
1766
Jose Galmes4c6895e2021-02-09 07:44:30 -08001767func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1768 return c.config.productVariables.DirectedRecoverySnapshot
1769}
1770
1771func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1772 return c.config.productVariables.RecoverySnapshotModules
1773}
1774
Justin DeMartino383bfb32021-02-24 10:49:43 -08001775func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1776 var ret = make(map[string]bool)
1777 for _, dir := range dirs {
1778 clean := filepath.Clean(dir)
1779 if previous[clean] || ret[clean] {
1780 return nil, fmt.Errorf("Duplicate entry %s", dir)
1781 }
1782 ret[clean] = true
1783 }
1784 return ret, nil
1785}
1786
1787func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1788 dirMap := c.Once(onceKey, func() interface{} {
1789 ret, err := createDirsMap(previous, dirs)
1790 if err != nil {
1791 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1792 }
1793 return ret
1794 })
1795 if dirMap == nil {
1796 return nil
1797 }
1798 return dirMap.(map[string]bool)
1799}
1800
1801var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1802
1803func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1804 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1805 c.config.productVariables.VendorSnapshotDirsExcluded)
1806}
1807
1808var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1809
1810func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1811 excludedMap := c.VendorSnapshotDirsExcludedMap()
1812 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1813 c.config.productVariables.VendorSnapshotDirsIncluded)
1814}
1815
1816var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1817
1818func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1819 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1820 c.config.productVariables.RecoverySnapshotDirsExcluded)
1821}
1822
1823var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1824
1825func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1826 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1827 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1828 c.config.productVariables.RecoverySnapshotDirsIncluded)
1829}
1830
Rob Seymour925aa092021-08-10 20:42:03 +00001831func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1832 return c.config.productVariables.HostFakeSnapshotEnabled
1833}
1834
Inseob Kim60c32f02020-12-21 22:53:05 +09001835func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1836 if c.config.productVariables.ShippingApiLevel == nil {
1837 return NoneApiLevel
1838 }
1839 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1840 return uncheckedFinalApiLevel(apiLevel)
1841}
1842
Alix Espinoef47e542022-09-14 19:10:51 +00001843func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1844 return c.config.productVariables.BuildBrokenClangAsFlags
1845}
1846
1847func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1848 return c.config.productVariables.BuildBrokenClangCFlags
1849}
1850
Alixb5f6d9e2022-04-20 23:00:58 +00001851func (c *deviceConfig) BuildBrokenClangProperty() bool {
1852 return c.config.productVariables.BuildBrokenClangProperty
1853}
1854
Inseob Kim67e5add192021-03-17 18:05:33 +09001855func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1856 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1857}
1858
1859func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1860 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1861}
1862
Cole Faustedc4c502022-09-09 19:39:25 -07001863func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1864 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1865}
1866
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001867func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1868 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1869}
1870
Inseob Kim0cac7b42021-02-03 18:16:46 +09001871func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1872 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1873}
1874
Liz Kammer619be462022-01-28 15:13:39 -05001875func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1876 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1877}
1878
Vinh Tran140d5882022-06-10 14:23:27 -04001879func (c *deviceConfig) BuildBrokenDepfile() bool {
1880 return Bool(c.config.productVariables.BuildBrokenDepfile)
1881}
1882
Inseob Kim67e5add192021-03-17 18:05:33 +09001883func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1884 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1885}
1886
1887func (c *config) SelinuxIgnoreNeverallows() bool {
1888 return c.productVariables.SelinuxIgnoreNeverallows
1889}
1890
1891func (c *deviceConfig) SepolicySplit() bool {
1892 return c.config.productVariables.SepolicySplit
1893}
1894
Inseob Kima10ef272021-09-15 03:04:53 +00001895func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1896 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1897}
1898
1899func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1900 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1901}
1902
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001903func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1904 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1905}
1906
Christopher Ferris98f10222022-07-13 23:16:52 -07001907func (c *config) IgnorePrefer32OnDevice() bool {
1908 return c.productVariables.IgnorePrefer32OnDevice
1909}
1910
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001911func (c *config) BootJars() []string {
1912 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001913 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001914 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001915 }).([]string)
1916}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001917
satayevd604b212021-07-21 14:23:52 +01001918func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001919 return c.productVariables.BootJars
1920}
1921
satayevd604b212021-07-21 14:23:52 +01001922func (c *config) ApexBootJars() ConfiguredJarList {
1923 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001924}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001925
1926func (c *config) RBEWrapper() string {
1927 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1928}
Colin Cross9b698b62021-12-22 09:55:32 -08001929
1930// UseHostMusl returns true if the host target has been configured to build against musl libc.
1931func (c *config) UseHostMusl() bool {
1932 return Bool(c.productVariables.HostMusl)
1933}
MarkDacekff851b82022-04-21 18:33:17 +00001934
MarkDacekf47e1422023-04-19 16:47:36 +00001935func (c *config) GetMixedBuildsEnabledModules() map[string]struct{} {
1936 return c.mixedBuildEnabledModules
1937}
1938
MarkDacek6f6b9622023-05-02 16:28:55 +00001939func (c *config) GetMixedBuildsDisabledModules() map[string]struct{} {
1940 return c.mixedBuildDisabledModules
1941}
1942
Chris Parsonsf874e462022-05-10 13:50:12 -04001943func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001944 moduleName := ctx.Module().Name()
1945 c.mixedBuildsLock.Lock()
1946 defer c.mixedBuildsLock.Unlock()
1947 if useBazel {
1948 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1949 } else {
1950 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1951 }
1952}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001953
1954// ApiSurfaces directory returns the source path inside the api_surfaces repo
1955// (relative to workspace root).
1956func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1957 return filepath.Join(
1958 "build",
1959 "bazel",
1960 "api_surfaces",
1961 s.String(),
1962 version)
1963}
Jihoon Kang1bff0342023-01-17 20:40:22 +00001964
1965func (c *config) BuildFromTextStub() bool {
1966 return c.buildFromTextStub
1967}
Spandan Das4deab282023-03-30 17:06:32 +00001968
1969func (c *config) SetBuildFromTextStub(b bool) {
1970 c.buildFromTextStub = b
1971}
MarkDacek9c094ca2023-03-16 19:15:19 +00001972func (c *config) AddForceEnabledModules(forceEnabled []string) {
1973 for _, forceEnabledModule := range forceEnabled {
1974 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
1975 }
1976}