blob: a6485d259fab632dff60be07b67299adaa9aba35 [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
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800609 for _, module := range strings.Split(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
Colin Cross98be1bb2019-12-13 20:41:13 -0800618// mockFileSystem replaces all reads with accesses to the provided map of
619// filenames to contents stored as a byte slice.
620func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
621 mockFS := map[string][]byte{}
622
623 if _, exists := mockFS["Android.bp"]; !exists {
624 mockFS["Android.bp"] = []byte(bp)
625 }
626
627 for k, v := range fs {
628 mockFS[k] = v
629 }
630
631 // no module list file specified; find every file named Blueprints or Android.bp
632 pathsToParse := []string{}
633 for candidate := range mockFS {
634 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200635 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800636 pathsToParse = append(pathsToParse, candidate)
637 }
638 }
639 if len(pathsToParse) < 1 {
640 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
641 }
642 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
643
644 c.fs = pathtools.MockFs(mockFS)
645 c.mockBpList = blueprint.MockModuleListFile
646}
647
Jason Wuff1bb312022-12-21 09:57:26 -0500648// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
649// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400650// Returns true if "Bazel builds" is enabled. In this mode, part of build
651// analysis is handled by Bazel.
652func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500653 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
654 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500655 return false
656 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500657 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500658 return false
659 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500660 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500661 return false
662 }
663 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500664 return false
665 }
666 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500667 return false
668 }
669 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500670 return false
671 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500672 return true
673 }).(bool)
674
675 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
676 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400677}
678
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100679func (c *config) SetAllowMissingDependencies() {
680 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
681}
682
Jingwen Chenc711fec2020-11-22 23:52:50 -0500683// BlueprintToolLocation returns the directory containing build system tools
684// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200685func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700686 if c.KatiEnabled() {
687 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
688 } else {
689 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
690 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700691}
692
Dan Willemsen60e62f02018-11-16 21:05:32 -0800693func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700694 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
695 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800696}
697
Colin Cross790ef352021-10-25 19:15:55 -0700698func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000699 ext := ".so"
700 if runtime.GOOS == "darwin" {
701 ext = ".dylib"
702 }
Colin Cross790ef352021-10-25 19:15:55 -0700703 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
704 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000705}
706
Colin Crossae5330a2021-11-03 13:31:22 -0700707func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
708 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700709 return path
710}
711
Jingwen Chenc711fec2020-11-22 23:52:50 -0500712// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700713func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800714 switch runtime.GOOS {
715 case "linux":
716 return "linux-x86"
717 case "darwin":
718 return "darwin-x86"
719 default:
720 panic("Unknown GOOS")
721 }
722}
723
724// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700725func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200726 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800727}
728
Jingwen Chenc711fec2020-11-22 23:52:50 -0500729// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
730// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700731func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
732 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
733}
734
Jingwen Chenc711fec2020-11-22 23:52:50 -0500735// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
736// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700737func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700738 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800739 case "darwin":
740 return "-R"
741 case "linux":
742 return "-d"
743 default:
744 return ""
745 }
746}
Colin Cross68f55102015-03-25 14:43:57 -0700747
Colin Cross1332b002015-04-07 17:11:30 -0700748func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700749 var val string
750 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700751 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800752 defer c.envLock.Unlock()
753 if c.envDeps == nil {
754 c.envDeps = make(map[string]string)
755 }
Colin Cross68f55102015-03-25 14:43:57 -0700756 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700757 if c.envFrozen {
758 panic("Cannot access new environment variables after envdeps are frozen")
759 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700760 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700761 c.envDeps[key] = val
762 }
763 return val
764}
765
Colin Cross99d7c232016-11-23 16:52:04 -0800766func (c *config) GetenvWithDefault(key string, defaultValue string) string {
767 ret := c.Getenv(key)
768 if ret == "" {
769 return defaultValue
770 }
771 return ret
772}
773
774func (c *config) IsEnvTrue(key string) bool {
775 value := c.Getenv(key)
776 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
777}
778
779func (c *config) IsEnvFalse(key string) bool {
780 value := c.Getenv(key)
781 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
782}
783
Jingwen Chenc711fec2020-11-22 23:52:50 -0500784// EnvDeps returns the environment variables this build depends on. The first
785// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700786func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700787 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800788 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700789 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700790 return c.envDeps
791}
Colin Cross35cec122015-04-02 14:37:16 -0700792
Jingwen Chencda22c92020-11-23 00:22:30 -0500793func (c *config) KatiEnabled() bool {
794 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800795}
796
Nan Zhang581fd212018-01-10 16:06:12 -0800797func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800798 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800799}
800
Jingwen Chenc711fec2020-11-22 23:52:50 -0500801// BuildNumberFile returns the path to a text file containing metadata
802// representing the current build's number.
803//
804// Rules that want to reference the build number should read from this file
805// without depending on it. They will run whenever their other dependencies
806// require them to run and get the current build number. This ensures they don't
807// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800808func (c *config) BuildNumberFile(ctx PathContext) Path {
809 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800810}
811
Jingwen Chenc711fec2020-11-22 23:52:50 -0500812// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700813// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700814func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800815 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700816}
817
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000818// DeviceProduct returns the current product target. There could be multiple of
819// these per device type.
820//
Chris Parsonsef615e52022-08-18 22:04:11 -0400821// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000822func (c *config) DeviceProduct() string {
823 return *c.productVariables.DeviceProduct
824}
825
Cole Faustb85d1a12022-11-08 18:14:01 -0800826// HasDeviceProduct returns if the build has a product. A build will not
827// necessarily have a product when --skip-config is passed to soong, like it is
828// in prebuilts/build-tools/build-prebuilts.sh
829func (c *config) HasDeviceProduct() bool {
830 return c.productVariables.DeviceProduct != nil
831}
832
Anton Hansson53c88442019-03-18 15:53:16 +0000833func (c *config) DeviceResourceOverlays() []string {
834 return c.productVariables.DeviceResourceOverlays
835}
836
837func (c *config) ProductResourceOverlays() []string {
838 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700839}
840
Colin Crossbfd347d2018-05-09 11:11:35 -0700841func (c *config) PlatformVersionName() string {
842 return String(c.productVariables.Platform_version_name)
843}
844
Dan Albert4f378d72020-07-23 17:32:15 -0700845func (c *config) PlatformSdkVersion() ApiLevel {
846 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700847}
848
Cole Faust37d27c42023-04-12 10:27:45 -0700849func (c *config) RawPlatformSdkVersion() *int {
850 return c.productVariables.Platform_sdk_version
851}
852
Mu-Le Lee5e047532022-07-27 02:32:03 +0000853func (c *config) PlatformSdkFinal() bool {
854 return Bool(c.productVariables.Platform_sdk_final)
855}
856
Colin Crossd09b0b62018-04-18 11:06:47 -0700857func (c *config) PlatformSdkCodename() string {
858 return String(c.productVariables.Platform_sdk_codename)
859}
860
Anton Hansson97d0bae2022-02-16 16:15:10 +0000861func (c *config) PlatformSdkExtensionVersion() int {
862 return *c.productVariables.Platform_sdk_extension_version
863}
864
865func (c *config) PlatformBaseSdkExtensionVersion() int {
866 return *c.productVariables.Platform_base_sdk_extension_version
867}
868
Colin Cross092c9da2019-04-02 22:56:43 -0700869func (c *config) PlatformSecurityPatch() string {
870 return String(c.productVariables.Platform_security_patch)
871}
872
873func (c *config) PlatformPreviewSdkVersion() string {
874 return String(c.productVariables.Platform_preview_sdk_version)
875}
876
877func (c *config) PlatformMinSupportedTargetSdkVersion() string {
878 return String(c.productVariables.Platform_min_supported_target_sdk_version)
879}
880
881func (c *config) PlatformBaseOS() string {
882 return String(c.productVariables.Platform_base_os)
883}
884
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900885func (c *config) PlatformVersionLastStable() string {
886 return String(c.productVariables.Platform_version_last_stable)
887}
888
Jiyong Park37073842022-06-21 10:13:42 +0900889func (c *config) PlatformVersionKnownCodenames() string {
890 return String(c.productVariables.Platform_version_known_codenames)
891}
892
Dan Albert1a246272020-07-06 14:49:35 -0700893func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000894 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700895}
896
897func (c *config) FinalApiLevels() []ApiLevel {
898 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700899 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700900 levels = append(levels, uncheckedFinalApiLevel(i))
901 }
902 return levels
903}
904
905func (c *config) PreviewApiLevels() []ApiLevel {
906 var levels []ApiLevel
907 for i, codename := range c.PlatformVersionActiveCodenames() {
908 levels = append(levels, ApiLevel{
909 value: codename,
910 number: i,
911 isPreview: true,
912 })
913 }
914 return levels
915}
916
satayevcca4ab72021-11-30 12:33:55 +0000917func (c *config) LatestPreviewApiLevel() ApiLevel {
918 level := NoneApiLevel
919 for _, l := range c.PreviewApiLevels() {
920 if l.GreaterThan(level) {
921 level = l
922 }
923 }
924 return level
925}
926
Dan Albert1a246272020-07-06 14:49:35 -0700927func (c *config) AllSupportedApiLevels() []ApiLevel {
928 var levels []ApiLevel
929 levels = append(levels, c.FinalApiLevels()...)
930 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700931}
932
Jingwen Chenc711fec2020-11-22 23:52:50 -0500933// DefaultAppTargetSdk returns the API level that platform apps are targeting.
934// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700935func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000936 // This logic is replicated in starlark, if changing logic here update starlark code too
937 // 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 -0700938 if Bool(c.productVariables.Platform_sdk_final) {
939 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700940 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500941 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900942 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500943 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900944 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
945 // don't set platform sdk codename. Platform sdk codename makes sense only when we
946 // are building the platform. So we don't enforce the below panic for the host-only
947 // builds.
948 if hostOnlyBuild {
949 return NoneApiLevel
950 }
951 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500952 }
953 if codename == "REL" {
954 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
955 }
956 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700957}
958
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800959func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800960 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800961}
962
Dan Albert31384de2017-07-28 12:39:46 -0700963// Codenames that are active in the current lunch target.
964func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800965 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700966}
967
Dan Albert8c7a9942023-03-27 20:34:01 +0000968// All unreleased codenames.
969func (c *config) PlatformVersionAllPreviewCodenames() []string {
970 return c.productVariables.Platform_version_all_preview_codenames
971}
972
Colin Crossface4e42017-10-30 17:32:15 -0700973func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800974 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700975}
976
Colin Crossface4e42017-10-30 17:32:15 -0700977func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800978 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700979}
980
Colin Crossface4e42017-10-30 17:32:15 -0700981func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800982 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700983}
984
985func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800986 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700987}
988
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700989func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800990 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800991 if defaultCert != "" {
992 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800993 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500994 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700995}
996
Colin Crosse1731a52017-12-14 11:22:55 -0800997func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800998 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800999 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -08001000 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -08001001 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001002 defaultDir := c.DefaultAppCertificateDir(ctx)
1003 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -07001004}
Colin Cross6ff51382015-12-17 16:39:19 -08001005
Jiyong Park9335a262018-12-24 11:31:58 +09001006func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
1007 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
1008 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -07001009 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +09001010 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
1011 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -08001012 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +09001013 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001014 // If not, APEX keys are under the specified directory
1015 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001016}
1017
Inseob Kim80fa7982022-08-12 21:36:25 +09001018// Certificate for the NetworkStack sepolicy context
1019func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1020 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1021 if cert != "" {
1022 return PathForSource(ctx, cert)
1023 }
1024 return c.DefaultAppCertificateDir(ctx)
1025}
1026
Jingwen Chenc711fec2020-11-22 23:52:50 -05001027// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1028// are configured to depend on non-existent modules. Note that this does not
1029// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001030func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001031 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001032}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001033
Jeongik Cha816a23a2020-07-08 01:09:23 +09001034// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001035func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001036 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001037}
1038
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001039// Returns true if building apps that aren't bundled with the platform.
1040// UnbundledBuild() is always true when this is true.
1041func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001042 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001043}
1044
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001045// Returns true if building image that aren't bundled with the platform.
1046// UnbundledBuild() is always true when this is true.
1047func (c *config) UnbundledBuildImage() bool {
1048 return Bool(c.productVariables.Unbundled_build_image)
1049}
1050
Jeongik Cha816a23a2020-07-08 01:09:23 +09001051// Returns true if building modules against prebuilt SDKs.
1052func (c *config) AlwaysUsePrebuiltSdks() bool {
1053 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001054}
1055
Colin Cross126a25c2017-10-31 13:55:34 -07001056func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001057 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001058}
1059
Colin Crossed064c02018-09-05 16:28:13 -07001060func (c *config) Debuggable() bool {
1061 return Bool(c.productVariables.Debuggable)
1062}
1063
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001064func (c *config) Eng() bool {
1065 return Bool(c.productVariables.Eng)
1066}
1067
Colin Crossc53c37f2021-12-08 15:42:22 -08001068// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1069// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001070func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001071 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1072 return androidTargets[0].Arch.ArchType
1073 }
1074 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001075}
1076
Colin Cross16b23492016-01-06 14:41:07 -08001077func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001078 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001079}
1080
1081func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001082 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001083}
1084
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001085func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001086 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001087}
1088
Colin Cross23ae82a2016-11-02 14:34:39 -07001089func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001090 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001091}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001092
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001093func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001094 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001095 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001096 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001097 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001098}
1099
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001100func (c *config) DisableScudo() bool {
1101 return Bool(c.productVariables.DisableScudo)
1102}
1103
Colin Crossa1ad8d12016-06-01 17:09:44 -07001104func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001105 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001106 if t.Arch.ArchType.Multilib == "lib64" {
1107 return true
1108 }
1109 }
1110
1111 return false
1112}
Colin Cross9272ade2016-08-17 15:24:12 -07001113
Colin Cross9d45bb72016-08-29 16:14:13 -07001114func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001115 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001116}
1117
Ramy Medhatbbf25672019-07-17 12:30:04 +00001118func (c *config) UseRBE() bool {
1119 return Bool(c.productVariables.UseRBE)
1120}
1121
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001122func (c *config) UseRBEJAVAC() bool {
1123 return Bool(c.productVariables.UseRBEJAVAC)
1124}
1125
1126func (c *config) UseRBER8() bool {
1127 return Bool(c.productVariables.UseRBER8)
1128}
1129
1130func (c *config) UseRBED8() bool {
1131 return Bool(c.productVariables.UseRBED8)
1132}
1133
Colin Cross8b8bec32019-11-15 13:18:43 -08001134func (c *config) UseRemoteBuild() bool {
1135 return c.UseGoma() || c.UseRBE()
1136}
1137
Colin Cross66548102018-06-19 22:47:35 -07001138func (c *config) RunErrorProne() bool {
1139 return c.IsEnvTrue("RUN_ERROR_PRONE")
1140}
1141
Jingwen Chenc711fec2020-11-22 23:52:50 -05001142// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001143func (c *config) XrefCorpusName() string {
1144 return c.Getenv("XREF_CORPUS")
1145}
1146
Jingwen Chenc711fec2020-11-22 23:52:50 -05001147// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1148// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001149func (c *config) XrefCuEncoding() string {
1150 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1151 return enc
1152 }
1153 return "json"
1154}
1155
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001156// XrefCuJavaSourceMax returns the maximum number of the Java source files
1157// in a single compilation unit
1158const xrefJavaSourceFileMaxDefault = "1000"
1159
1160func (c Config) XrefCuJavaSourceMax() string {
1161 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1162 if v == "" {
1163 return xrefJavaSourceFileMaxDefault
1164 }
1165 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1166 fmt.Fprintf(os.Stderr,
1167 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1168 err, xrefJavaSourceFileMaxDefault)
1169 return xrefJavaSourceFileMaxDefault
1170 }
1171 return v
1172
1173}
1174
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001175func (c *config) EmitXrefRules() bool {
1176 return c.XrefCorpusName() != ""
1177}
1178
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001179func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001180 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001181}
1182
1183func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001184 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001185 return ""
1186 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001187 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001188}
1189
Colin Cross0f4e0d62016-07-27 10:56:55 -07001190func (c *config) LibartImgHostBaseAddress() string {
1191 return "0x60000000"
1192}
1193
1194func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001195 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001196}
1197
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001198func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001199 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001200}
1201
Jingwen Chenc711fec2020-11-22 23:52:50 -05001202// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1203// but some modules still depend on it.
1204//
1205// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001206func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001207 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001208
Roland Levillainf6cc2612020-07-09 16:58:14 +01001209 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001210 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001211 return true
1212 }
Colin Crossa74ca042019-01-31 14:31:51 -08001213 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001214 }
1215 return false
1216}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001217func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001218 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001219 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001220 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001221 }
1222 return false
1223}
1224
1225func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001226 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001227}
1228
Sam Delmerico98a73292023-02-21 11:50:29 -05001229func (c *config) SourceRootDirs() []string {
1230 return c.productVariables.SourceRootDirs
1231}
1232
Spandan Dasc5763832022-11-08 18:42:16 +00001233func (c *config) IncludeTags() []string {
1234 return c.productVariables.IncludeTags
1235}
1236
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001237func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001238 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001239}
1240
Colin Cross5a0dcd52018-10-05 14:20:06 -07001241func (c *config) UncompressPrivAppDex() bool {
1242 return Bool(c.productVariables.UncompressPrivAppDex)
1243}
1244
1245func (c *config) ModulesLoadedByPrivilegedModules() []string {
1246 return c.productVariables.ModulesLoadedByPrivilegedModules
1247}
1248
Jingwen Chenc711fec2020-11-22 23:52:50 -05001249// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1250// the output directory, if it was created during the product configuration
1251// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001252func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001253 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001254 return OptionalPathForPath(nil)
1255 }
1256 return OptionalPathForPath(
1257 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1258}
1259
Jingwen Chenc711fec2020-11-22 23:52:50 -05001260// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1261// configuration. Since the configuration file was created by Kati during
1262// product configuration (externally of soong_build), it's not tracked, so we
1263// also manually add a Ninja file dependency on the configuration file to the
1264// rule that creates the main build.ninja file. This ensures that build.ninja is
1265// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001266func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1267 path := c.DexpreoptGlobalConfigPath(ctx)
1268 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001269 return nil, nil
1270 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001271 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001272 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001273}
1274
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001275func (c *deviceConfig) WithDexpreopt() bool {
1276 return c.config.productVariables.WithDexpreopt
1277}
1278
Colin Cross662d6142022-11-03 20:38:01 -07001279func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001280 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001281}
1282
Inseob Kimae553032019-05-14 18:52:49 +09001283func (c *config) VndkSnapshotBuildArtifacts() bool {
1284 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1285}
1286
Colin Cross3b19f5d2019-09-17 14:45:31 -07001287func (c *config) HasMultilibConflict(arch ArchType) bool {
1288 return c.multilibConflicts[arch]
1289}
1290
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001291func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001292 return String(c.productVariables.PrebuiltHiddenApiDir)
1293}
1294
MarkDacekd06db5d2022-11-29 00:47:59 +00001295func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1296 return c.bazelForceEnabledModules
1297}
1298
Colin Cross9272ade2016-08-17 15:24:12 -07001299func (c *deviceConfig) Arches() []Arch {
1300 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001301 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001302 arches = append(arches, target.Arch)
1303 }
1304 return arches
1305}
Dan Willemsend2ede872016-11-18 14:54:24 -08001306
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001307func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001308 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001309 if is32BitBinder != nil && *is32BitBinder {
1310 return "32"
1311 }
1312 return "64"
1313}
1314
Dan Willemsen4353bc42016-12-05 17:16:02 -08001315func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001316 if c.config.productVariables.VendorPath != nil {
1317 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001318 }
1319 return "vendor"
1320}
1321
Justin Yun71549282017-11-17 12:10:28 +09001322func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001323 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001324}
1325
Jose Galmes6f843bc2020-12-11 13:36:29 -08001326func (c *deviceConfig) RecoverySnapshotVersion() string {
1327 return String(c.config.productVariables.RecoverySnapshotVersion)
1328}
1329
Jeongik Cha219141c2020-08-06 23:00:37 +09001330func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1331 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1332}
1333
Justin Yun8fe12122017-12-07 17:18:15 +09001334func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001335 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001336}
1337
Justin Yun5f7f7e82019-11-18 19:52:14 +09001338func (c *deviceConfig) ProductVndkVersion() string {
1339 return String(c.config.productVariables.ProductVndkVersion)
1340}
1341
Justin Yun71549282017-11-17 12:10:28 +09001342func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001343 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001344}
Jack He8cc71432016-12-08 15:45:07 -08001345
Vic Yangefd249e2018-11-12 20:19:56 -08001346func (c *deviceConfig) VndkUseCoreVariant() bool {
1347 return Bool(c.config.productVariables.VndkUseCoreVariant)
1348}
1349
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001350func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001351 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001352}
1353
1354func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001355 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001356}
1357
Jiyong Park2db76922017-11-08 16:03:48 +09001358func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001359 if c.config.productVariables.OdmPath != nil {
1360 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001361 }
1362 return "odm"
1363}
1364
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001365func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001366 if c.config.productVariables.ProductPath != nil {
1367 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001368 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001369 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001370}
1371
Justin Yund5f6c822019-06-25 16:47:17 +09001372func (c *deviceConfig) SystemExtPath() string {
1373 if c.config.productVariables.SystemExtPath != nil {
1374 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001375 }
Justin Yund5f6c822019-06-25 16:47:17 +09001376 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001377}
1378
Jack He8cc71432016-12-08 15:45:07 -08001379func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001380 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001381}
Dan Willemsen581341d2017-02-09 16:16:31 -08001382
Jiyong Parkd773eb32017-07-03 13:18:12 +09001383func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001384 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001385}
1386
Roland Levillainada12702020-06-09 13:07:36 +01001387// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1388// path. Coverage is enabled by default when the product variable
1389// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1390// enabled for any path which is part of this variable (and not part of the
1391// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1392// represents any path.
1393func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1394 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001395 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001396 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1397 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1398 coverage = true
1399 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001400 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001401 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1402 coverage = false
1403 }
1404 }
1405 return coverage
1406}
1407
Colin Cross1a6acd42020-06-16 17:51:46 -07001408// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001409func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001410 return Bool(c.config.productVariables.GcovCoverage) ||
1411 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001412}
1413
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001414func (c *deviceConfig) ClangCoverageEnabled() bool {
1415 return Bool(c.config.productVariables.ClangCoverage)
1416}
1417
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001418func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1419 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1420}
1421
Colin Cross1a6acd42020-06-16 17:51:46 -07001422func (c *deviceConfig) GcovCoverageEnabled() bool {
1423 return Bool(c.config.productVariables.GcovCoverage)
1424}
1425
Roland Levillain4f5297b2020-06-09 12:44:06 +01001426// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1427// code coverage is enabled for path. By default, coverage is not enabled for a
1428// given path unless it is part of the NativeCoveragePaths product variable (and
1429// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1430// NativeCoveragePaths represents any path.
1431func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001432 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001433 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001434 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001435 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001436 }
1437 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001438 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001439 // Workaround coverage boot failure.
1440 // http://b/269981180
1441 if strings.HasPrefix(path, "external/protobuf") {
1442 coverage = false
1443 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001444 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001445 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001446 }
1447 }
1448 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001449}
Ivan Lozano5f595532017-07-13 14:46:05 -07001450
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001451func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001452 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001453}
1454
Vinh Tran44cb78c2023-03-09 22:07:19 -05001455// AfdoProfile returns fully qualified path associated to the given module name
1456func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1457 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1458 split := strings.Split(afdoProfile, ":")
1459 if len(split) != 3 {
1460 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1461 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1462 }
1463 if split[0] == name {
1464 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1465 }
1466 }
1467 return nil, nil
1468}
1469
Tri Vo35a51432018-03-25 20:00:00 -07001470func (c *deviceConfig) VendorSepolicyDirs() []string {
1471 return c.config.productVariables.BoardVendorSepolicyDirs
1472}
1473
1474func (c *deviceConfig) OdmSepolicyDirs() []string {
1475 return c.config.productVariables.BoardOdmSepolicyDirs
1476}
1477
Felixa20a8752020-05-17 18:28:35 +02001478func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1479 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001480}
1481
Felixa20a8752020-05-17 18:28:35 +02001482func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1483 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001484}
1485
Inseob Kim0866b002019-04-15 20:21:29 +09001486func (c *deviceConfig) SepolicyM4Defs() []string {
1487 return c.config.productVariables.BoardSepolicyM4Defs
1488}
1489
Jiyong Park7f67f482019-01-05 12:57:48 +09001490func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001491 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1492 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1493}
1494
1495func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001496 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001497 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1498}
1499
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001500func (c *deviceConfig) OverridePackageNameFor(name string) string {
1501 newName, overridden := findOverrideValue(
1502 c.config.productVariables.PackageNameOverrides,
1503 name,
1504 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1505 if overridden {
1506 return newName
1507 }
1508 return name
1509}
1510
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001511func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001512 if overrides == nil || len(overrides) == 0 {
1513 return "", false
1514 }
1515 for _, o := range overrides {
1516 split := strings.Split(o, ":")
1517 if len(split) != 2 {
1518 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001519 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001520 }
1521 if matchPattern(split[0], name) {
1522 return substPattern(split[0], split[1], name), true
1523 }
1524 }
1525 return "", false
1526}
1527
Albert Martineefabcf2022-03-21 20:11:16 +00001528func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1529 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1530}
1531
Ivan Lozano5f595532017-07-13 14:46:05 -07001532func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001533 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001534 return false
1535 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001536 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001537}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001538
1539func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001540 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001541 return false
1542 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001543 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001544}
1545
1546func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001547 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001548 return false
1549 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001550 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001551}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001552
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001553func (c *config) MemtagHeapDisabledForPath(path string) bool {
1554 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1555 return false
1556 }
1557 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1558}
1559
1560func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1561 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1562 return false
1563 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001564 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001565}
1566
1567func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1568 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1569 return false
1570 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001571 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001572}
1573
Dan Willemsen0fe78662018-03-26 12:41:18 -07001574func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001575 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001576}
1577
Colin Cross395f2cf2018-10-24 16:10:32 -07001578func (c *config) NdkAbis() bool {
1579 return Bool(c.productVariables.Ndk_abis)
1580}
1581
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001582func (c *config) AmlAbis() bool {
1583 return Bool(c.productVariables.Aml_abis)
1584}
1585
Jiyong Park8fd61922018-11-08 02:50:25 +09001586func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001587 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001588}
1589
Jiyong Park4da07972021-01-05 21:01:11 +09001590func (c *config) ForceApexSymlinkOptimization() bool {
1591 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1592}
1593
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001594func (c *config) ApexCompressionEnabled() bool {
1595 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001596}
1597
Dennis Shene2ed70c2023-01-11 14:15:43 +00001598func (c *config) ApexTrimEnabled() bool {
1599 return Bool(c.productVariables.TrimmedApex)
1600}
1601
Jeongik Chac9464142019-01-07 12:07:27 +09001602func (c *config) EnforceSystemCertificate() bool {
1603 return Bool(c.productVariables.EnforceSystemCertificate)
1604}
1605
Colin Cross440e0d02020-06-11 11:32:11 -07001606func (c *config) EnforceSystemCertificateAllowList() []string {
1607 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001608}
1609
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001610func (c *config) EnforceProductPartitionInterface() bool {
1611 return Bool(c.productVariables.EnforceProductPartitionInterface)
1612}
1613
JaeMan Parkff715562020-10-19 17:25:58 +09001614func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1615 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1616}
1617
1618func (c *config) InterPartitionJavaLibraryAllowList() []string {
1619 return c.productVariables.InterPartitionJavaLibraryAllowList
1620}
1621
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001622func (c *config) InstallExtraFlattenedApexes() bool {
1623 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1624}
1625
Colin Crossf24a22a2019-01-31 14:12:44 -08001626func (c *config) ProductHiddenAPIStubs() []string {
1627 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001628}
1629
Colin Crossf24a22a2019-01-31 14:12:44 -08001630func (c *config) ProductHiddenAPIStubsSystem() []string {
1631 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001632}
1633
Colin Crossf24a22a2019-01-31 14:12:44 -08001634func (c *config) ProductHiddenAPIStubsTest() []string {
1635 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001636}
Dan Willemsen71c74602019-04-10 12:27:35 -07001637
Dan Willemsen54879d12019-04-18 10:08:46 -07001638func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001639 return c.config.productVariables.TargetFSConfigGen
1640}
Inseob Kim0866b002019-04-15 20:21:29 +09001641
1642func (c *config) ProductPublicSepolicyDirs() []string {
1643 return c.productVariables.ProductPublicSepolicyDirs
1644}
1645
1646func (c *config) ProductPrivateSepolicyDirs() []string {
1647 return c.productVariables.ProductPrivateSepolicyDirs
1648}
1649
Colin Cross50ddcc42019-05-16 12:28:22 -07001650func (c *config) MissingUsesLibraries() []string {
1651 return c.productVariables.MissingUsesLibraries
1652}
1653
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001654func (c *config) TargetMultitreeUpdateMeta() bool {
1655 return c.productVariables.MultitreeUpdateMeta
1656}
1657
Inseob Kim1f086e22019-05-09 13:29:15 +09001658func (c *deviceConfig) DeviceArch() string {
1659 return String(c.config.productVariables.DeviceArch)
1660}
1661
1662func (c *deviceConfig) DeviceArchVariant() string {
1663 return String(c.config.productVariables.DeviceArchVariant)
1664}
1665
1666func (c *deviceConfig) DeviceSecondaryArch() string {
1667 return String(c.config.productVariables.DeviceSecondaryArch)
1668}
1669
1670func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1671 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1672}
Yifan Hong82db7352020-01-21 16:12:26 -08001673
1674func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1675 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1676}
Yifan Hong97365ee2020-07-29 09:51:57 -07001677
1678func (c *deviceConfig) BoardKernelBinaries() []string {
1679 return c.config.productVariables.BoardKernelBinaries
1680}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001681
Yifan Hong42bef8d2020-08-05 14:36:09 -07001682func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1683 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1684}
1685
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001686func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1687 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1688}
1689
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001690func (c *deviceConfig) PlatformSepolicyVersion() string {
1691 return String(c.config.productVariables.PlatformSepolicyVersion)
1692}
1693
Inseob Kima10ef272021-09-15 03:04:53 +00001694func (c *deviceConfig) TotSepolicyVersion() string {
1695 return String(c.config.productVariables.TotSepolicyVersion)
1696}
1697
Inseob Kim843f6642022-01-07 09:11:23 +09001698func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1699 return c.config.productVariables.PlatformSepolicyCompatVersions
1700}
1701
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001702func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001703 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1704 return ver
1705 }
1706 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001707}
1708
Inseob Kim14178802021-12-08 22:53:31 +09001709func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1710 return c.config.productVariables.BoardPlatVendorPolicy
1711}
1712
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001713func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1714 return c.config.productVariables.BoardReqdMaskPolicy
1715}
1716
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001717func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1718 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1719}
1720
1721func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1722 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1723}
1724
1725func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1726 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1727}
1728
1729func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1730 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1731}
1732
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001733func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1734 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1735}
1736
1737func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1738 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1739}
1740
1741func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1742 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1743}
1744
Inseob Kim7cf14652021-01-06 23:06:52 +09001745func (c *deviceConfig) DirectedVendorSnapshot() bool {
1746 return c.config.productVariables.DirectedVendorSnapshot
1747}
1748
1749func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1750 return c.config.productVariables.VendorSnapshotModules
1751}
1752
Jose Galmes4c6895e2021-02-09 07:44:30 -08001753func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1754 return c.config.productVariables.DirectedRecoverySnapshot
1755}
1756
1757func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1758 return c.config.productVariables.RecoverySnapshotModules
1759}
1760
Justin DeMartino383bfb32021-02-24 10:49:43 -08001761func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1762 var ret = make(map[string]bool)
1763 for _, dir := range dirs {
1764 clean := filepath.Clean(dir)
1765 if previous[clean] || ret[clean] {
1766 return nil, fmt.Errorf("Duplicate entry %s", dir)
1767 }
1768 ret[clean] = true
1769 }
1770 return ret, nil
1771}
1772
1773func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1774 dirMap := c.Once(onceKey, func() interface{} {
1775 ret, err := createDirsMap(previous, dirs)
1776 if err != nil {
1777 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1778 }
1779 return ret
1780 })
1781 if dirMap == nil {
1782 return nil
1783 }
1784 return dirMap.(map[string]bool)
1785}
1786
1787var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1788
1789func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1790 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1791 c.config.productVariables.VendorSnapshotDirsExcluded)
1792}
1793
1794var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1795
1796func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1797 excludedMap := c.VendorSnapshotDirsExcludedMap()
1798 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1799 c.config.productVariables.VendorSnapshotDirsIncluded)
1800}
1801
1802var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1803
1804func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1805 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1806 c.config.productVariables.RecoverySnapshotDirsExcluded)
1807}
1808
1809var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1810
1811func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1812 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1813 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1814 c.config.productVariables.RecoverySnapshotDirsIncluded)
1815}
1816
Rob Seymour925aa092021-08-10 20:42:03 +00001817func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1818 return c.config.productVariables.HostFakeSnapshotEnabled
1819}
1820
Inseob Kim60c32f02020-12-21 22:53:05 +09001821func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1822 if c.config.productVariables.ShippingApiLevel == nil {
1823 return NoneApiLevel
1824 }
1825 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1826 return uncheckedFinalApiLevel(apiLevel)
1827}
1828
Alix Espinoef47e542022-09-14 19:10:51 +00001829func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1830 return c.config.productVariables.BuildBrokenClangAsFlags
1831}
1832
1833func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1834 return c.config.productVariables.BuildBrokenClangCFlags
1835}
1836
Alixb5f6d9e2022-04-20 23:00:58 +00001837func (c *deviceConfig) BuildBrokenClangProperty() bool {
1838 return c.config.productVariables.BuildBrokenClangProperty
1839}
1840
Inseob Kim67e5add192021-03-17 18:05:33 +09001841func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1842 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1843}
1844
1845func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1846 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1847}
1848
Cole Faustedc4c502022-09-09 19:39:25 -07001849func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1850 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1851}
1852
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001853func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1854 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1855}
1856
Inseob Kim0cac7b42021-02-03 18:16:46 +09001857func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1858 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1859}
1860
Liz Kammer619be462022-01-28 15:13:39 -05001861func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1862 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1863}
1864
Vinh Tran140d5882022-06-10 14:23:27 -04001865func (c *deviceConfig) BuildBrokenDepfile() bool {
1866 return Bool(c.config.productVariables.BuildBrokenDepfile)
1867}
1868
Inseob Kim67e5add192021-03-17 18:05:33 +09001869func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1870 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1871}
1872
1873func (c *config) SelinuxIgnoreNeverallows() bool {
1874 return c.productVariables.SelinuxIgnoreNeverallows
1875}
1876
1877func (c *deviceConfig) SepolicySplit() bool {
1878 return c.config.productVariables.SepolicySplit
1879}
1880
Inseob Kima10ef272021-09-15 03:04:53 +00001881func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1882 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1883}
1884
1885func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1886 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1887}
1888
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001889func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1890 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1891}
1892
Christopher Ferris98f10222022-07-13 23:16:52 -07001893func (c *config) IgnorePrefer32OnDevice() bool {
1894 return c.productVariables.IgnorePrefer32OnDevice
1895}
1896
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001897func (c *config) BootJars() []string {
1898 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001899 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001900 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001901 }).([]string)
1902}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001903
satayevd604b212021-07-21 14:23:52 +01001904func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001905 return c.productVariables.BootJars
1906}
1907
satayevd604b212021-07-21 14:23:52 +01001908func (c *config) ApexBootJars() ConfiguredJarList {
1909 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001910}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001911
1912func (c *config) RBEWrapper() string {
1913 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1914}
Colin Cross9b698b62021-12-22 09:55:32 -08001915
1916// UseHostMusl returns true if the host target has been configured to build against musl libc.
1917func (c *config) UseHostMusl() bool {
1918 return Bool(c.productVariables.HostMusl)
1919}
MarkDacekff851b82022-04-21 18:33:17 +00001920
MarkDacekf47e1422023-04-19 16:47:36 +00001921func (c *config) GetMixedBuildsEnabledModules() map[string]struct{} {
1922 return c.mixedBuildEnabledModules
1923}
1924
Chris Parsonsf874e462022-05-10 13:50:12 -04001925func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001926 moduleName := ctx.Module().Name()
1927 c.mixedBuildsLock.Lock()
1928 defer c.mixedBuildsLock.Unlock()
1929 if useBazel {
1930 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1931 } else {
1932 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1933 }
1934}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001935
1936// ApiSurfaces directory returns the source path inside the api_surfaces repo
1937// (relative to workspace root).
1938func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1939 return filepath.Join(
1940 "build",
1941 "bazel",
1942 "api_surfaces",
1943 s.String(),
1944 version)
1945}
Jihoon Kang1bff0342023-01-17 20:40:22 +00001946
1947func (c *config) BuildFromTextStub() bool {
1948 return c.buildFromTextStub
1949}
Spandan Das4deab282023-03-30 17:06:32 +00001950
1951func (c *config) SetBuildFromTextStub(b bool) {
1952 c.buildFromTextStub = b
1953}
MarkDacek9c094ca2023-03-16 19:15:19 +00001954func (c *config) AddForceEnabledModules(forceEnabled []string) {
1955 for _, forceEnabledModule := range forceEnabled {
1956 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
1957 }
1958}