blob: 9d530919ee0530df39e2e93bc5f95a2c61121175 [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
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800103}
104
Chris Parsonsad876012022-08-20 14:48:32 -0400105// Build modes that soong_build can run as.
106const (
107 // Don't use bazel at all during module analysis.
108 AnalysisNoBazel SoongBuildMode = iota
109
Lukacs T. Berkic541cd22022-10-26 07:26:50 +0000110 // Symlink fores mode: merge two directory trees into a symlink forest
111 SymlinkForest
112
Chris Parsonsad876012022-08-20 14:48:32 -0400113 // Bp2build mode: Generate BUILD files from blueprint files and exit.
114 Bp2build
115
116 // Generate BUILD files which faithfully represent the dependency graph of
117 // blueprint modules. Individual BUILD targets will not, however, faitfhully
118 // express build semantics.
119 GenerateQueryView
120
Spandan Das5af0bd32022-09-28 20:43:08 +0000121 // Generate BUILD files for API contributions to API surfaces
122 ApiBp2build
123
Chris Parsonsad876012022-08-20 14:48:32 -0400124 // Create a JSON representation of the module graph and exit.
125 GenerateModuleGraph
126
127 // Generate a documentation file for module type definitions and exit.
128 GenerateDocFile
129
130 // Use bazel during analysis of many allowlisted build modules. The allowlist
131 // is considered a "developer mode" allowlist, as some modules may be
132 // allowlisted on an experimental basis.
133 BazelDevMode
134
MarkDacekb78465d2022-10-18 20:10:16 +0000135 // Use bazel during analysis of a few allowlisted build modules. The allowlist
136 // is considered "staging, as these are modules being prepared to be released
137 // into prod mode shortly after.
138 BazelStagingMode
139
Chris Parsonsad876012022-08-20 14:48:32 -0400140 // Use bazel during analysis of build modules from an allowlist carefully
141 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400142 BazelProdMode
143)
144
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200145// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200146func (c Config) SoongOutDir() string {
147 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700148}
149
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200150func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200151 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100152}
153
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200154func (c Config) RunGoTests() bool {
155 return c.runGoTests
156}
157
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100158func (c Config) DebugCompilation() bool {
159 return false // Never compile Go code in the main build for debugging
160}
161
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200162func (c Config) Subninjas() []string {
163 return []string{}
164}
165
166func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
167 return []bootstrap.PrimaryBuilderInvocation{}
168}
169
Paul Duffin74135582022-10-06 11:01:59 +0100170// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
171func (c Config) RunningInsideUnitTest() bool {
172 return c.config.TestProductVariables != nil
173}
174
Jingwen Chenc711fec2020-11-22 23:52:50 -0500175// A DeviceConfig object represents the configuration for a particular device
176// being built. For now there will only be one of these, but in the future there
177// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700178type DeviceConfig struct {
179 *deviceConfig
180}
181
Jingwen Chenc711fec2020-11-22 23:52:50 -0500182// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800183type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700184
Jingwen Chenc711fec2020-11-22 23:52:50 -0500185// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500186// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700187type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500188 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800189 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800190
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700191 // Only available on configs created by TestConfig
192 TestProductVariables *productVariables
193
Jingwen Chenc711fec2020-11-22 23:52:50 -0500194 // A specialized context object for Bazel/Soong mixed builds and migration
195 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400196 BazelContext BazelContext
197
Dan Willemsen87b17d12015-07-14 00:39:06 -0700198 ProductVariablesFileName string
199
Colin Cross0c66bc62021-07-20 09:47:41 -0700200 // BuildOS stores the OsType for the OS that the build is running on.
201 BuildOS OsType
202
203 // BuildArch stores the ArchType for the CPU that the build is running on.
204 BuildArch ArchType
205
Jaewoong Jung642916f2020-10-09 17:25:15 -0700206 Targets map[OsType][]Target
207 BuildOSTarget Target // the Target for tools run on the build machine
208 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
209 AndroidCommonTarget Target // the Target for common modules for the Android device
210 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700211
Jingwen Chenc711fec2020-11-22 23:52:50 -0500212 // multilibConflicts for an ArchType is true if there is earlier configured
213 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700214 multilibConflicts map[ArchType]bool
215
Colin Cross9272ade2016-08-17 15:24:12 -0700216 deviceConfig *deviceConfig
217
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200218 outDir string // The output directory (usually out/)
219 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400220 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700221
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200222 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200223
Colin Cross6ccbc912017-10-10 23:07:38 -0700224 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700225 envLock sync.Mutex
226 envDeps map[string]string
227 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800228
Jingwen Chencda22c92020-11-23 00:22:30 -0500229 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
230 // runs standalone.
231 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700232
Colin Cross32616ed2017-09-05 21:56:44 -0700233 captureBuild bool // true for tests, saves build parameters for each module
234 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700235
Colin Cross98be1bb2019-12-13 20:41:13 -0800236 fs pathtools.FileSystem
237 mockBpList string
238
Chris Parsonsad876012022-08-20 14:48:32 -0400239 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700240 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000241 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500242
LaMont Jones52a72432023-03-09 18:19:35 +0000243 // If MultitreeBuild is true then this is one inner tree of a multitree
244 // build directed by the multitree orchestrator.
245 MultitreeBuild bool
246
Colin Cross5e6a7972020-06-07 16:56:32 -0700247 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
248 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000249 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700250
Jingwen Chenc711fec2020-11-22 23:52:50 -0500251 // The list of files that when changed, must invalidate soong_build to
252 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700253 ninjaFileDepsSet sync.Map
254
Colin Cross9272ade2016-08-17 15:24:12 -0700255 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000256
Chris Parsonsad876012022-08-20 14:48:32 -0400257 // These fields are only used for metrics collection. A module should be added
258 // to these maps only if its implementation supports Bazel handling in mixed
259 // builds. A module being in the "enabled" list indicates that there is a
260 // variant of that module for which bazel-handling actually took place.
261 // A module being in the "disabled" list indicates that there is a variant of
262 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000263 mixedBuildsLock sync.Mutex
264 mixedBuildEnabledModules map[string]struct{}
265 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000266
267 // These are modules to be built with Bazel beyond the allowlisted/build-mode
268 // specified modules. They are passed via the command-line flag
269 // "--bazel-force-enabled-modules"
270 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500271
272 // If true, for any requests to Bazel, communicate with a Bazel proxy using
273 // unix sockets, instead of spawning Bazel as a subprocess.
274 UseBazelProxy bool
Colin Cross9272ade2016-08-17 15:24:12 -0700275}
276
277type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700278 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700279 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800280}
281
Colin Cross485e5722015-08-27 13:28:01 -0700282type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700283 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700284}
Colin Cross3f40fa42015-01-30 17:27:36 -0800285
Colin Cross485e5722015-08-27 13:28:01 -0700286func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000287 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700288}
289
Jingwen Chenc711fec2020-11-22 23:52:50 -0500290// loadFromConfigFile loads and decodes configuration options from a JSON file
291// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400292func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800293 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700294 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800295 defer configFileReader.Close()
296 if os.IsNotExist(err) {
297 // Need to create a file, so that blueprint & ninja don't get in
298 // a dependency tracking loop.
299 // Make a file-configurable-options with defaults, write it out using
300 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700301 configurable.SetDefaultConfig()
302 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800303 if err != nil {
304 return err
305 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800306 } else if err != nil {
307 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800308 } else {
309 // Make a decoder for it
310 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700311 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800312 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800313 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800314 }
315 }
316
Liz Kammer09f947d2021-05-12 14:51:49 -0400317 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
318 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
319 }
320
321 configurable.Native_coverage = proptools.BoolPtr(
322 Bool(configurable.GcovCoverage) ||
323 Bool(configurable.ClangCoverage))
324
Yuntao Xu402e9b02021-08-09 15:44:44 -0700325 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
326 // if false (pre-released version, for example), use Platform_sdk_codename.
327 if Bool(configurable.Platform_sdk_final) {
328 if configurable.Platform_sdk_version != nil {
329 configurable.Platform_sdk_version_or_codename =
330 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
331 } else {
332 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
333 }
334 } else {
335 configurable.Platform_sdk_version_or_codename =
336 proptools.StringPtr(String(configurable.Platform_sdk_codename))
337 }
338
Liz Kammer09f947d2021-05-12 14:51:49 -0400339 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800340}
341
Colin Crossd8f20142016-11-03 09:43:26 -0700342// atomically writes the config file in case two copies of soong_build are running simultaneously
343// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400344func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800345 data, err := json.MarshalIndent(&config, "", " ")
346 if err != nil {
347 return fmt.Errorf("cannot marshal config data: %s", err.Error())
348 }
349
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800350 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800351 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500352 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800353 }
Colin Crossd8f20142016-11-03 09:43:26 -0700354 defer os.Remove(f.Name())
355 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800356
Colin Crossd8f20142016-11-03 09:43:26 -0700357 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800358 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700359 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
360 }
361
Colin Crossd8f20142016-11-03 09:43:26 -0700362 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700363 if err != nil {
364 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800365 }
366
Colin Crossd8f20142016-11-03 09:43:26 -0700367 f.Close()
368 os.Rename(f.Name(), filename)
369
Colin Cross3f40fa42015-01-30 17:27:36 -0800370 return nil
371}
372
Liz Kammer09f947d2021-05-12 14:51:49 -0400373func saveToBazelConfigFile(config *productVariables, outDir string) error {
374 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
375 err := createDirIfNonexistent(dir, os.ModePerm)
376 if err != nil {
377 return fmt.Errorf("Could not create dir %s: %s", dir, err)
378 }
379
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000380 nonArchVariantProductVariables := []string{}
381 archVariantProductVariables := []string{}
382 p := variableProperties{}
383 t := reflect.TypeOf(p.Product_variables)
384 for i := 0; i < t.NumField(); i++ {
385 f := t.Field(i)
386 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
387 if proptools.HasTag(f, "android", "arch_variant") {
388 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
389 }
390 }
391
Liz Kammer72beb342022-02-03 08:42:10 -0500392 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000393 if err != nil {
394 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
395 }
396
Liz Kammer72beb342022-02-03 08:42:10 -0500397 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000398 if err != nil {
399 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
400 }
401
402 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400403 if err != nil {
404 return fmt.Errorf("cannot marshal config data: %s", err.Error())
405 }
Cole Faust082c5f32022-08-04 15:49:20 -0700406 // The backslashes need to be escaped because this text is going to be put
407 // inside a Starlark string literal.
408 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400409
410 bzl := []string{
411 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000412 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
413 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
414 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
415 "\n", `
416product_vars = _product_vars
417product_var_constraints = _product_var_constraints
418arch_variant_product_var_constraints = _arch_variant_product_var_constraints
419`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400420 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500421 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
422 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400423 if err != nil {
424 return fmt.Errorf("Could not write .bzl config file %s", err)
425 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500426 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
427 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400428 if err != nil {
429 return fmt.Errorf("Could not write BUILD config file %s", err)
430 }
431
432 return nil
433}
434
Colin Cross988414c2020-01-11 01:11:46 +0000435// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
436// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200437func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000438 return Config{
439 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200440 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200441 soongOutDir: soongOutDir,
442 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000443 },
444 }
445}
446
Jingwen Chenc711fec2020-11-22 23:52:50 -0500447// NewConfig creates a new Config object. The srcDir argument specifies the path
448// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800449func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500450 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700451 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800452 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700453
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200454 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700455
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800456 outDir: cmdArgs.OutDir,
457 soongOutDir: cmdArgs.SoongOutDir,
458 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200459 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800460
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800461 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000462 fs: pathtools.NewOsFs(absSrcDir),
463 mixedBuildDisabledModules: make(map[string]struct{}),
464 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000465 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500466
LaMont Jones52a72432023-03-09 18:19:35 +0000467 MultitreeBuild: cmdArgs.MultitreeBuild,
468 UseBazelProxy: cmdArgs.UseBazelProxy,
Colin Cross68f55102015-03-25 14:43:57 -0700469 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800470
Dan Willemsen00269f22017-07-06 16:59:48 -0700471 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700472 config: config,
473 }
474
Liz Kammer7941b302020-07-28 13:27:34 -0700475 // Soundness check of the build and source directories. This won't catch strange
476 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800477 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700478 if err != nil {
479 return Config{}, err
480 }
481
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200482 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700483 if err != nil {
484 return Config{}, err
485 }
486
487 if strings.HasPrefix(absSrcDir, absBuildDir) {
488 return Config{}, fmt.Errorf("Build dir must not contain source directory")
489 }
490
Colin Cross3f40fa42015-01-30 17:27:36 -0800491 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700492 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800493 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700494 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800495 }
496
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800497 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500498 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
499 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800500 }
501
Colin Cross0c66bc62021-07-20 09:47:41 -0700502 determineBuildOS(config)
503
Jingwen Chenc711fec2020-11-22 23:52:50 -0500504 // Sets up the map of target OSes to the finer grained compilation targets
505 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700506 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700507 if err != nil {
508 return Config{}, err
509 }
510
Paul Duffin1356d8c2020-02-25 19:26:33 +0000511 // Make the CommonOS OsType available for all products.
512 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
513
Dan Albert4098deb2016-10-19 14:04:41 -0700514 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500515 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700516 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000517 } else if config.AmlAbis() {
518 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700519 }
520
521 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500522 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800523 if err != nil {
524 return Config{}, err
525 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700526 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800527 }
528
Colin Cross3b19f5d2019-09-17 14:45:31 -0700529 multilib := make(map[string]bool)
530 for _, target := range targets[Android] {
531 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
532 config.multilibConflicts[target.Arch.ArchType] = true
533 }
534 multilib[target.Arch.ArchType.Multilib] = true
535 }
536
Jingwen Chenc711fec2020-11-22 23:52:50 -0500537 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700538 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500539
540 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700541 config.BuildOSTarget = config.Targets[config.BuildOS][0]
542 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500543
544 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700545 if len(config.Targets[Android]) > 0 {
546 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000547 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700548 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700549
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500550 setBuildMode := func(arg string, mode SoongBuildMode) {
551 if arg != "" {
552 if config.BuildMode != AnalysisNoBazel {
553 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
554 os.Exit(1)
555 }
556 config.BuildMode = mode
557 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800558 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500559 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
560 if arg {
561 if config.BuildMode != AnalysisNoBazel {
562 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
563 os.Exit(1)
564 }
565 config.BuildMode = mode
566 }
567 }
568 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
569 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
570 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
571 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
572 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
573 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
574 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
575 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
576 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800577
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400578 config.BazelContext, err = NewBazelContext(config)
Cole Faust324a92e2022-08-23 15:29:05 -0700579 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
Colin Cross3f40fa42015-01-30 17:27:36 -0800580
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800581 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000582 config.bazelForceEnabledModules[module] = struct{}{}
583 }
584
Jingwen Chenc711fec2020-11-22 23:52:50 -0500585 return Config{config}, err
586}
Colin Cross988414c2020-01-11 01:11:46 +0000587
Colin Cross98be1bb2019-12-13 20:41:13 -0800588// mockFileSystem replaces all reads with accesses to the provided map of
589// filenames to contents stored as a byte slice.
590func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
591 mockFS := map[string][]byte{}
592
593 if _, exists := mockFS["Android.bp"]; !exists {
594 mockFS["Android.bp"] = []byte(bp)
595 }
596
597 for k, v := range fs {
598 mockFS[k] = v
599 }
600
601 // no module list file specified; find every file named Blueprints or Android.bp
602 pathsToParse := []string{}
603 for candidate := range mockFS {
604 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200605 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800606 pathsToParse = append(pathsToParse, candidate)
607 }
608 }
609 if len(pathsToParse) < 1 {
610 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
611 }
612 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
613
614 c.fs = pathtools.MockFs(mockFS)
615 c.mockBpList = blueprint.MockModuleListFile
616}
617
Jason Wuff1bb312022-12-21 09:57:26 -0500618// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
619// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400620// Returns true if "Bazel builds" is enabled. In this mode, part of build
621// analysis is handled by Bazel.
622func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500623 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
624 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500625 return false
626 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500627 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500628 return false
629 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500630 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500631 return false
632 }
633 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500634 return false
635 }
636 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500637 return false
638 }
639 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500640 return false
641 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500642 return true
643 }).(bool)
644
645 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
646 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400647}
648
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100649func (c *config) SetAllowMissingDependencies() {
650 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
651}
652
Jingwen Chenc711fec2020-11-22 23:52:50 -0500653// BlueprintToolLocation returns the directory containing build system tools
654// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200655func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700656 if c.KatiEnabled() {
657 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
658 } else {
659 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
660 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700661}
662
Dan Willemsen60e62f02018-11-16 21:05:32 -0800663func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700664 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
665 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800666}
667
Colin Cross790ef352021-10-25 19:15:55 -0700668func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000669 ext := ".so"
670 if runtime.GOOS == "darwin" {
671 ext = ".dylib"
672 }
Colin Cross790ef352021-10-25 19:15:55 -0700673 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
674 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000675}
676
Colin Crossae5330a2021-11-03 13:31:22 -0700677func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
678 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700679 return path
680}
681
Jingwen Chenc711fec2020-11-22 23:52:50 -0500682// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700683func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800684 switch runtime.GOOS {
685 case "linux":
686 return "linux-x86"
687 case "darwin":
688 return "darwin-x86"
689 default:
690 panic("Unknown GOOS")
691 }
692}
693
694// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700695func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200696 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800697}
698
Jingwen Chenc711fec2020-11-22 23:52:50 -0500699// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
700// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700701func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
702 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
703}
704
Jingwen Chenc711fec2020-11-22 23:52:50 -0500705// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
706// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700707func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700708 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800709 case "darwin":
710 return "-R"
711 case "linux":
712 return "-d"
713 default:
714 return ""
715 }
716}
Colin Cross68f55102015-03-25 14:43:57 -0700717
Colin Cross1332b002015-04-07 17:11:30 -0700718func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700719 var val string
720 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700721 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800722 defer c.envLock.Unlock()
723 if c.envDeps == nil {
724 c.envDeps = make(map[string]string)
725 }
Colin Cross68f55102015-03-25 14:43:57 -0700726 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700727 if c.envFrozen {
728 panic("Cannot access new environment variables after envdeps are frozen")
729 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700730 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700731 c.envDeps[key] = val
732 }
733 return val
734}
735
Colin Cross99d7c232016-11-23 16:52:04 -0800736func (c *config) GetenvWithDefault(key string, defaultValue string) string {
737 ret := c.Getenv(key)
738 if ret == "" {
739 return defaultValue
740 }
741 return ret
742}
743
744func (c *config) IsEnvTrue(key string) bool {
745 value := c.Getenv(key)
746 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
747}
748
749func (c *config) IsEnvFalse(key string) bool {
750 value := c.Getenv(key)
751 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
752}
753
Jingwen Chenc711fec2020-11-22 23:52:50 -0500754// EnvDeps returns the environment variables this build depends on. The first
755// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700756func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700757 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800758 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700759 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700760 return c.envDeps
761}
Colin Cross35cec122015-04-02 14:37:16 -0700762
Jingwen Chencda22c92020-11-23 00:22:30 -0500763func (c *config) KatiEnabled() bool {
764 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800765}
766
Nan Zhang581fd212018-01-10 16:06:12 -0800767func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800768 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800769}
770
Jingwen Chenc711fec2020-11-22 23:52:50 -0500771// BuildNumberFile returns the path to a text file containing metadata
772// representing the current build's number.
773//
774// Rules that want to reference the build number should read from this file
775// without depending on it. They will run whenever their other dependencies
776// require them to run and get the current build number. This ensures they don't
777// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800778func (c *config) BuildNumberFile(ctx PathContext) Path {
779 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800780}
781
Jingwen Chenc711fec2020-11-22 23:52:50 -0500782// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700783// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700784func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800785 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700786}
787
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000788// DeviceProduct returns the current product target. There could be multiple of
789// these per device type.
790//
Chris Parsonsef615e52022-08-18 22:04:11 -0400791// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000792func (c *config) DeviceProduct() string {
793 return *c.productVariables.DeviceProduct
794}
795
Cole Faustb85d1a12022-11-08 18:14:01 -0800796// HasDeviceProduct returns if the build has a product. A build will not
797// necessarily have a product when --skip-config is passed to soong, like it is
798// in prebuilts/build-tools/build-prebuilts.sh
799func (c *config) HasDeviceProduct() bool {
800 return c.productVariables.DeviceProduct != nil
801}
802
Anton Hansson53c88442019-03-18 15:53:16 +0000803func (c *config) DeviceResourceOverlays() []string {
804 return c.productVariables.DeviceResourceOverlays
805}
806
807func (c *config) ProductResourceOverlays() []string {
808 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700809}
810
Colin Crossbfd347d2018-05-09 11:11:35 -0700811func (c *config) PlatformVersionName() string {
812 return String(c.productVariables.Platform_version_name)
813}
814
Dan Albert4f378d72020-07-23 17:32:15 -0700815func (c *config) PlatformSdkVersion() ApiLevel {
816 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700817}
818
Mu-Le Lee5e047532022-07-27 02:32:03 +0000819func (c *config) PlatformSdkFinal() bool {
820 return Bool(c.productVariables.Platform_sdk_final)
821}
822
Colin Crossd09b0b62018-04-18 11:06:47 -0700823func (c *config) PlatformSdkCodename() string {
824 return String(c.productVariables.Platform_sdk_codename)
825}
826
Anton Hansson97d0bae2022-02-16 16:15:10 +0000827func (c *config) PlatformSdkExtensionVersion() int {
828 return *c.productVariables.Platform_sdk_extension_version
829}
830
831func (c *config) PlatformBaseSdkExtensionVersion() int {
832 return *c.productVariables.Platform_base_sdk_extension_version
833}
834
Colin Cross092c9da2019-04-02 22:56:43 -0700835func (c *config) PlatformSecurityPatch() string {
836 return String(c.productVariables.Platform_security_patch)
837}
838
839func (c *config) PlatformPreviewSdkVersion() string {
840 return String(c.productVariables.Platform_preview_sdk_version)
841}
842
843func (c *config) PlatformMinSupportedTargetSdkVersion() string {
844 return String(c.productVariables.Platform_min_supported_target_sdk_version)
845}
846
847func (c *config) PlatformBaseOS() string {
848 return String(c.productVariables.Platform_base_os)
849}
850
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900851func (c *config) PlatformVersionLastStable() string {
852 return String(c.productVariables.Platform_version_last_stable)
853}
854
Jiyong Park37073842022-06-21 10:13:42 +0900855func (c *config) PlatformVersionKnownCodenames() string {
856 return String(c.productVariables.Platform_version_known_codenames)
857}
858
Dan Albert1a246272020-07-06 14:49:35 -0700859func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000860 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700861}
862
863func (c *config) FinalApiLevels() []ApiLevel {
864 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700865 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700866 levels = append(levels, uncheckedFinalApiLevel(i))
867 }
868 return levels
869}
870
871func (c *config) PreviewApiLevels() []ApiLevel {
872 var levels []ApiLevel
873 for i, codename := range c.PlatformVersionActiveCodenames() {
874 levels = append(levels, ApiLevel{
875 value: codename,
876 number: i,
877 isPreview: true,
878 })
879 }
880 return levels
881}
882
satayevcca4ab72021-11-30 12:33:55 +0000883func (c *config) LatestPreviewApiLevel() ApiLevel {
884 level := NoneApiLevel
885 for _, l := range c.PreviewApiLevels() {
886 if l.GreaterThan(level) {
887 level = l
888 }
889 }
890 return level
891}
892
Dan Albert1a246272020-07-06 14:49:35 -0700893func (c *config) AllSupportedApiLevels() []ApiLevel {
894 var levels []ApiLevel
895 levels = append(levels, c.FinalApiLevels()...)
896 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700897}
898
Jingwen Chenc711fec2020-11-22 23:52:50 -0500899// DefaultAppTargetSdk returns the API level that platform apps are targeting.
900// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700901func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000902 // This logic is replicated in starlark, if changing logic here update starlark code too
903 // 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 -0700904 if Bool(c.productVariables.Platform_sdk_final) {
905 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700906 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500907 codename := c.PlatformSdkCodename()
908 if codename == "" {
909 return NoneApiLevel
910 }
911 if codename == "REL" {
912 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
913 }
914 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700915}
916
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800917func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800918 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800919}
920
Dan Albert31384de2017-07-28 12:39:46 -0700921// Codenames that are active in the current lunch target.
922func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800923 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700924}
925
Colin Crossface4e42017-10-30 17:32:15 -0700926func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800927 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700928}
929
Colin Crossface4e42017-10-30 17:32:15 -0700930func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800931 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700932}
933
Colin Crossface4e42017-10-30 17:32:15 -0700934func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800935 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700936}
937
938func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800939 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700940}
941
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700942func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800943 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800944 if defaultCert != "" {
945 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800946 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500947 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700948}
949
Colin Crosse1731a52017-12-14 11:22:55 -0800950func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800951 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800952 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800953 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800954 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500955 defaultDir := c.DefaultAppCertificateDir(ctx)
956 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700957}
Colin Cross6ff51382015-12-17 16:39:19 -0800958
Jiyong Park9335a262018-12-24 11:31:58 +0900959func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
960 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
961 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700962 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900963 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
964 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800965 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900966 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500967 // If not, APEX keys are under the specified directory
968 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900969}
970
Inseob Kim80fa7982022-08-12 21:36:25 +0900971// Certificate for the NetworkStack sepolicy context
972func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
973 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
974 if cert != "" {
975 return PathForSource(ctx, cert)
976 }
977 return c.DefaultAppCertificateDir(ctx)
978}
979
Jingwen Chenc711fec2020-11-22 23:52:50 -0500980// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
981// are configured to depend on non-existent modules. Note that this does not
982// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800983func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800984 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800985}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800986
Jeongik Cha816a23a2020-07-08 01:09:23 +0900987// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700988func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800989 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700990}
991
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100992// Returns true if building apps that aren't bundled with the platform.
993// UnbundledBuild() is always true when this is true.
994func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -0800995 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100996}
997
Jeongik Cha4b073cd2021-06-08 11:35:00 +0900998// Returns true if building image that aren't bundled with the platform.
999// UnbundledBuild() is always true when this is true.
1000func (c *config) UnbundledBuildImage() bool {
1001 return Bool(c.productVariables.Unbundled_build_image)
1002}
1003
Jeongik Cha816a23a2020-07-08 01:09:23 +09001004// Returns true if building modules against prebuilt SDKs.
1005func (c *config) AlwaysUsePrebuiltSdks() bool {
1006 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001007}
1008
Colin Cross126a25c2017-10-31 13:55:34 -07001009func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001010 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001011}
1012
Colin Crossed064c02018-09-05 16:28:13 -07001013func (c *config) Debuggable() bool {
1014 return Bool(c.productVariables.Debuggable)
1015}
1016
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001017func (c *config) Eng() bool {
1018 return Bool(c.productVariables.Eng)
1019}
1020
Colin Crossc53c37f2021-12-08 15:42:22 -08001021// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1022// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001023func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001024 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1025 return androidTargets[0].Arch.ArchType
1026 }
1027 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001028}
1029
Colin Cross16b23492016-01-06 14:41:07 -08001030func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001031 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001032}
1033
1034func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001035 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001036}
1037
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001038func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001039 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001040}
1041
Colin Cross23ae82a2016-11-02 14:34:39 -07001042func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001043 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001044}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001045
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001046func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001047 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001048 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001049 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001050 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001051}
1052
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001053func (c *config) DisableScudo() bool {
1054 return Bool(c.productVariables.DisableScudo)
1055}
1056
Colin Crossa1ad8d12016-06-01 17:09:44 -07001057func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001058 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001059 if t.Arch.ArchType.Multilib == "lib64" {
1060 return true
1061 }
1062 }
1063
1064 return false
1065}
Colin Cross9272ade2016-08-17 15:24:12 -07001066
Colin Cross9d45bb72016-08-29 16:14:13 -07001067func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001068 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001069}
1070
Ramy Medhatbbf25672019-07-17 12:30:04 +00001071func (c *config) UseRBE() bool {
1072 return Bool(c.productVariables.UseRBE)
1073}
1074
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001075func (c *config) UseRBEJAVAC() bool {
1076 return Bool(c.productVariables.UseRBEJAVAC)
1077}
1078
1079func (c *config) UseRBER8() bool {
1080 return Bool(c.productVariables.UseRBER8)
1081}
1082
1083func (c *config) UseRBED8() bool {
1084 return Bool(c.productVariables.UseRBED8)
1085}
1086
Colin Cross8b8bec32019-11-15 13:18:43 -08001087func (c *config) UseRemoteBuild() bool {
1088 return c.UseGoma() || c.UseRBE()
1089}
1090
Colin Cross66548102018-06-19 22:47:35 -07001091func (c *config) RunErrorProne() bool {
1092 return c.IsEnvTrue("RUN_ERROR_PRONE")
1093}
1094
Jingwen Chenc711fec2020-11-22 23:52:50 -05001095// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001096func (c *config) XrefCorpusName() string {
1097 return c.Getenv("XREF_CORPUS")
1098}
1099
Jingwen Chenc711fec2020-11-22 23:52:50 -05001100// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1101// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001102func (c *config) XrefCuEncoding() string {
1103 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1104 return enc
1105 }
1106 return "json"
1107}
1108
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001109// XrefCuJavaSourceMax returns the maximum number of the Java source files
1110// in a single compilation unit
1111const xrefJavaSourceFileMaxDefault = "1000"
1112
1113func (c Config) XrefCuJavaSourceMax() string {
1114 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1115 if v == "" {
1116 return xrefJavaSourceFileMaxDefault
1117 }
1118 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1119 fmt.Fprintf(os.Stderr,
1120 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1121 err, xrefJavaSourceFileMaxDefault)
1122 return xrefJavaSourceFileMaxDefault
1123 }
1124 return v
1125
1126}
1127
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001128func (c *config) EmitXrefRules() bool {
1129 return c.XrefCorpusName() != ""
1130}
1131
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001132func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001133 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001134}
1135
1136func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001137 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001138 return ""
1139 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001140 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001141}
1142
Colin Cross0f4e0d62016-07-27 10:56:55 -07001143func (c *config) LibartImgHostBaseAddress() string {
1144 return "0x60000000"
1145}
1146
1147func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001148 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001149}
1150
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001151func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001152 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001153}
1154
Jingwen Chenc711fec2020-11-22 23:52:50 -05001155// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1156// but some modules still depend on it.
1157//
1158// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001159func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001160 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001161
Roland Levillainf6cc2612020-07-09 16:58:14 +01001162 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001163 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001164 return true
1165 }
Colin Crossa74ca042019-01-31 14:31:51 -08001166 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001167 }
1168 return false
1169}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001170func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001171 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001172 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001173 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001174 }
1175 return false
1176}
1177
1178func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001179 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001180}
1181
Sam Delmerico98a73292023-02-21 11:50:29 -05001182func (c *config) SourceRootDirs() []string {
1183 return c.productVariables.SourceRootDirs
1184}
1185
Spandan Dasc5763832022-11-08 18:42:16 +00001186func (c *config) IncludeTags() []string {
1187 return c.productVariables.IncludeTags
1188}
1189
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001190func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001191 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001192}
1193
Colin Cross5a0dcd52018-10-05 14:20:06 -07001194func (c *config) UncompressPrivAppDex() bool {
1195 return Bool(c.productVariables.UncompressPrivAppDex)
1196}
1197
1198func (c *config) ModulesLoadedByPrivilegedModules() []string {
1199 return c.productVariables.ModulesLoadedByPrivilegedModules
1200}
1201
Jingwen Chenc711fec2020-11-22 23:52:50 -05001202// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1203// the output directory, if it was created during the product configuration
1204// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001205func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001206 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001207 return OptionalPathForPath(nil)
1208 }
1209 return OptionalPathForPath(
1210 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1211}
1212
Jingwen Chenc711fec2020-11-22 23:52:50 -05001213// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1214// configuration. Since the configuration file was created by Kati during
1215// product configuration (externally of soong_build), it's not tracked, so we
1216// also manually add a Ninja file dependency on the configuration file to the
1217// rule that creates the main build.ninja file. This ensures that build.ninja is
1218// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001219func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1220 path := c.DexpreoptGlobalConfigPath(ctx)
1221 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001222 return nil, nil
1223 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001224 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001225 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001226}
1227
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001228func (c *deviceConfig) WithDexpreopt() bool {
1229 return c.config.productVariables.WithDexpreopt
1230}
1231
Colin Cross662d6142022-11-03 20:38:01 -07001232func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001233 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001234}
1235
Inseob Kimae553032019-05-14 18:52:49 +09001236func (c *config) VndkSnapshotBuildArtifacts() bool {
1237 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1238}
1239
Colin Cross3b19f5d2019-09-17 14:45:31 -07001240func (c *config) HasMultilibConflict(arch ArchType) bool {
1241 return c.multilibConflicts[arch]
1242}
1243
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001244func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001245 return String(c.productVariables.PrebuiltHiddenApiDir)
1246}
1247
MarkDacekd06db5d2022-11-29 00:47:59 +00001248func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1249 return c.bazelForceEnabledModules
1250}
1251
Colin Cross9272ade2016-08-17 15:24:12 -07001252func (c *deviceConfig) Arches() []Arch {
1253 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001254 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001255 arches = append(arches, target.Arch)
1256 }
1257 return arches
1258}
Dan Willemsend2ede872016-11-18 14:54:24 -08001259
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001260func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001261 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001262 if is32BitBinder != nil && *is32BitBinder {
1263 return "32"
1264 }
1265 return "64"
1266}
1267
Dan Willemsen4353bc42016-12-05 17:16:02 -08001268func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001269 if c.config.productVariables.VendorPath != nil {
1270 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001271 }
1272 return "vendor"
1273}
1274
Justin Yun71549282017-11-17 12:10:28 +09001275func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001276 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001277}
1278
Jose Galmes6f843bc2020-12-11 13:36:29 -08001279func (c *deviceConfig) RecoverySnapshotVersion() string {
1280 return String(c.config.productVariables.RecoverySnapshotVersion)
1281}
1282
Jeongik Cha219141c2020-08-06 23:00:37 +09001283func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1284 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1285}
1286
Justin Yun8fe12122017-12-07 17:18:15 +09001287func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001288 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001289}
1290
Justin Yun5f7f7e82019-11-18 19:52:14 +09001291func (c *deviceConfig) ProductVndkVersion() string {
1292 return String(c.config.productVariables.ProductVndkVersion)
1293}
1294
Justin Yun71549282017-11-17 12:10:28 +09001295func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001296 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001297}
Jack He8cc71432016-12-08 15:45:07 -08001298
Vic Yangefd249e2018-11-12 20:19:56 -08001299func (c *deviceConfig) VndkUseCoreVariant() bool {
1300 return Bool(c.config.productVariables.VndkUseCoreVariant)
1301}
1302
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001303func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001304 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001305}
1306
1307func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001308 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001309}
1310
Jiyong Park2db76922017-11-08 16:03:48 +09001311func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001312 if c.config.productVariables.OdmPath != nil {
1313 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001314 }
1315 return "odm"
1316}
1317
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001318func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001319 if c.config.productVariables.ProductPath != nil {
1320 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001321 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001322 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001323}
1324
Justin Yund5f6c822019-06-25 16:47:17 +09001325func (c *deviceConfig) SystemExtPath() string {
1326 if c.config.productVariables.SystemExtPath != nil {
1327 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001328 }
Justin Yund5f6c822019-06-25 16:47:17 +09001329 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001330}
1331
Jack He8cc71432016-12-08 15:45:07 -08001332func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001333 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001334}
Dan Willemsen581341d2017-02-09 16:16:31 -08001335
Jiyong Parkd773eb32017-07-03 13:18:12 +09001336func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001337 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001338}
1339
Roland Levillainada12702020-06-09 13:07:36 +01001340// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1341// path. Coverage is enabled by default when the product variable
1342// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1343// enabled for any path which is part of this variable (and not part of the
1344// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1345// represents any path.
1346func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1347 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001348 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001349 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1350 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1351 coverage = true
1352 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001353 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001354 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1355 coverage = false
1356 }
1357 }
1358 return coverage
1359}
1360
Colin Cross1a6acd42020-06-16 17:51:46 -07001361// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001362func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001363 return Bool(c.config.productVariables.GcovCoverage) ||
1364 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001365}
1366
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001367func (c *deviceConfig) ClangCoverageEnabled() bool {
1368 return Bool(c.config.productVariables.ClangCoverage)
1369}
1370
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001371func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1372 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1373}
1374
Colin Cross1a6acd42020-06-16 17:51:46 -07001375func (c *deviceConfig) GcovCoverageEnabled() bool {
1376 return Bool(c.config.productVariables.GcovCoverage)
1377}
1378
Roland Levillain4f5297b2020-06-09 12:44:06 +01001379// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1380// code coverage is enabled for path. By default, coverage is not enabled for a
1381// given path unless it is part of the NativeCoveragePaths product variable (and
1382// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1383// NativeCoveragePaths represents any path.
1384func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001385 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001386 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001387 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001388 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001389 }
1390 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001391 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001392 // Workaround coverage boot failure.
1393 // http://b/269981180
1394 if strings.HasPrefix(path, "external/protobuf") {
1395 coverage = false
1396 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001397 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001398 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001399 }
1400 }
1401 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001402}
Ivan Lozano5f595532017-07-13 14:46:05 -07001403
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001404func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001405 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001406}
1407
Tri Vo35a51432018-03-25 20:00:00 -07001408func (c *deviceConfig) VendorSepolicyDirs() []string {
1409 return c.config.productVariables.BoardVendorSepolicyDirs
1410}
1411
1412func (c *deviceConfig) OdmSepolicyDirs() []string {
1413 return c.config.productVariables.BoardOdmSepolicyDirs
1414}
1415
Felixa20a8752020-05-17 18:28:35 +02001416func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1417 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001418}
1419
Felixa20a8752020-05-17 18:28:35 +02001420func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1421 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001422}
1423
Inseob Kim0866b002019-04-15 20:21:29 +09001424func (c *deviceConfig) SepolicyM4Defs() []string {
1425 return c.config.productVariables.BoardSepolicyM4Defs
1426}
1427
Jiyong Park7f67f482019-01-05 12:57:48 +09001428func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001429 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1430 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1431}
1432
1433func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001434 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001435 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1436}
1437
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001438func (c *deviceConfig) OverridePackageNameFor(name string) string {
1439 newName, overridden := findOverrideValue(
1440 c.config.productVariables.PackageNameOverrides,
1441 name,
1442 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1443 if overridden {
1444 return newName
1445 }
1446 return name
1447}
1448
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001449func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001450 if overrides == nil || len(overrides) == 0 {
1451 return "", false
1452 }
1453 for _, o := range overrides {
1454 split := strings.Split(o, ":")
1455 if len(split) != 2 {
1456 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001457 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001458 }
1459 if matchPattern(split[0], name) {
1460 return substPattern(split[0], split[1], name), true
1461 }
1462 }
1463 return "", false
1464}
1465
Albert Martineefabcf2022-03-21 20:11:16 +00001466func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1467 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1468}
1469
Ivan Lozano5f595532017-07-13 14:46:05 -07001470func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001471 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001472 return false
1473 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001474 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001475}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001476
1477func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001478 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001479 return false
1480 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001481 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001482}
1483
1484func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001485 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001486 return false
1487 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001488 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001489}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001490
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001491func (c *config) MemtagHeapDisabledForPath(path string) bool {
1492 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1493 return false
1494 }
1495 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1496}
1497
1498func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1499 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1500 return false
1501 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001502 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001503}
1504
1505func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1506 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1507 return false
1508 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001509 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001510}
1511
Dan Willemsen0fe78662018-03-26 12:41:18 -07001512func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001513 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001514}
1515
Colin Cross395f2cf2018-10-24 16:10:32 -07001516func (c *config) NdkAbis() bool {
1517 return Bool(c.productVariables.Ndk_abis)
1518}
1519
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001520func (c *config) AmlAbis() bool {
1521 return Bool(c.productVariables.Aml_abis)
1522}
1523
Jiyong Park8fd61922018-11-08 02:50:25 +09001524func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001525 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001526}
1527
Jiyong Park4da07972021-01-05 21:01:11 +09001528func (c *config) ForceApexSymlinkOptimization() bool {
1529 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1530}
1531
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001532func (c *config) ApexCompressionEnabled() bool {
1533 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001534}
1535
Dennis Shene2ed70c2023-01-11 14:15:43 +00001536func (c *config) ApexTrimEnabled() bool {
1537 return Bool(c.productVariables.TrimmedApex)
1538}
1539
Jeongik Chac9464142019-01-07 12:07:27 +09001540func (c *config) EnforceSystemCertificate() bool {
1541 return Bool(c.productVariables.EnforceSystemCertificate)
1542}
1543
Colin Cross440e0d02020-06-11 11:32:11 -07001544func (c *config) EnforceSystemCertificateAllowList() []string {
1545 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001546}
1547
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001548func (c *config) EnforceProductPartitionInterface() bool {
1549 return Bool(c.productVariables.EnforceProductPartitionInterface)
1550}
1551
JaeMan Parkff715562020-10-19 17:25:58 +09001552func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1553 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1554}
1555
1556func (c *config) InterPartitionJavaLibraryAllowList() []string {
1557 return c.productVariables.InterPartitionJavaLibraryAllowList
1558}
1559
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001560func (c *config) InstallExtraFlattenedApexes() bool {
1561 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1562}
1563
Colin Crossf24a22a2019-01-31 14:12:44 -08001564func (c *config) ProductHiddenAPIStubs() []string {
1565 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001566}
1567
Colin Crossf24a22a2019-01-31 14:12:44 -08001568func (c *config) ProductHiddenAPIStubsSystem() []string {
1569 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001570}
1571
Colin Crossf24a22a2019-01-31 14:12:44 -08001572func (c *config) ProductHiddenAPIStubsTest() []string {
1573 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001574}
Dan Willemsen71c74602019-04-10 12:27:35 -07001575
Dan Willemsen54879d12019-04-18 10:08:46 -07001576func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001577 return c.config.productVariables.TargetFSConfigGen
1578}
Inseob Kim0866b002019-04-15 20:21:29 +09001579
1580func (c *config) ProductPublicSepolicyDirs() []string {
1581 return c.productVariables.ProductPublicSepolicyDirs
1582}
1583
1584func (c *config) ProductPrivateSepolicyDirs() []string {
1585 return c.productVariables.ProductPrivateSepolicyDirs
1586}
1587
Colin Cross50ddcc42019-05-16 12:28:22 -07001588func (c *config) MissingUsesLibraries() []string {
1589 return c.productVariables.MissingUsesLibraries
1590}
1591
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001592func (c *config) TargetMultitreeUpdateMeta() bool {
1593 return c.productVariables.MultitreeUpdateMeta
1594}
1595
Inseob Kim1f086e22019-05-09 13:29:15 +09001596func (c *deviceConfig) DeviceArch() string {
1597 return String(c.config.productVariables.DeviceArch)
1598}
1599
1600func (c *deviceConfig) DeviceArchVariant() string {
1601 return String(c.config.productVariables.DeviceArchVariant)
1602}
1603
1604func (c *deviceConfig) DeviceSecondaryArch() string {
1605 return String(c.config.productVariables.DeviceSecondaryArch)
1606}
1607
1608func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1609 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1610}
Yifan Hong82db7352020-01-21 16:12:26 -08001611
1612func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1613 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1614}
Yifan Hong97365ee2020-07-29 09:51:57 -07001615
1616func (c *deviceConfig) BoardKernelBinaries() []string {
1617 return c.config.productVariables.BoardKernelBinaries
1618}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001619
Yifan Hong42bef8d2020-08-05 14:36:09 -07001620func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1621 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1622}
1623
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001624func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1625 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1626}
1627
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001628func (c *deviceConfig) PlatformSepolicyVersion() string {
1629 return String(c.config.productVariables.PlatformSepolicyVersion)
1630}
1631
Inseob Kima10ef272021-09-15 03:04:53 +00001632func (c *deviceConfig) TotSepolicyVersion() string {
1633 return String(c.config.productVariables.TotSepolicyVersion)
1634}
1635
Inseob Kim843f6642022-01-07 09:11:23 +09001636func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1637 return c.config.productVariables.PlatformSepolicyCompatVersions
1638}
1639
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001640func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001641 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1642 return ver
1643 }
1644 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001645}
1646
Inseob Kim14178802021-12-08 22:53:31 +09001647func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1648 return c.config.productVariables.BoardPlatVendorPolicy
1649}
1650
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001651func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1652 return c.config.productVariables.BoardReqdMaskPolicy
1653}
1654
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001655func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1656 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1657}
1658
1659func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1660 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1661}
1662
1663func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1664 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1665}
1666
1667func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1668 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1669}
1670
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001671func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1672 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1673}
1674
1675func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1676 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1677}
1678
1679func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1680 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1681}
1682
Inseob Kim7cf14652021-01-06 23:06:52 +09001683func (c *deviceConfig) DirectedVendorSnapshot() bool {
1684 return c.config.productVariables.DirectedVendorSnapshot
1685}
1686
1687func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1688 return c.config.productVariables.VendorSnapshotModules
1689}
1690
Jose Galmes4c6895e2021-02-09 07:44:30 -08001691func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1692 return c.config.productVariables.DirectedRecoverySnapshot
1693}
1694
1695func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1696 return c.config.productVariables.RecoverySnapshotModules
1697}
1698
Justin DeMartino383bfb32021-02-24 10:49:43 -08001699func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1700 var ret = make(map[string]bool)
1701 for _, dir := range dirs {
1702 clean := filepath.Clean(dir)
1703 if previous[clean] || ret[clean] {
1704 return nil, fmt.Errorf("Duplicate entry %s", dir)
1705 }
1706 ret[clean] = true
1707 }
1708 return ret, nil
1709}
1710
1711func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1712 dirMap := c.Once(onceKey, func() interface{} {
1713 ret, err := createDirsMap(previous, dirs)
1714 if err != nil {
1715 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1716 }
1717 return ret
1718 })
1719 if dirMap == nil {
1720 return nil
1721 }
1722 return dirMap.(map[string]bool)
1723}
1724
1725var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1726
1727func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1728 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1729 c.config.productVariables.VendorSnapshotDirsExcluded)
1730}
1731
1732var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1733
1734func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1735 excludedMap := c.VendorSnapshotDirsExcludedMap()
1736 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1737 c.config.productVariables.VendorSnapshotDirsIncluded)
1738}
1739
1740var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1741
1742func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1743 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1744 c.config.productVariables.RecoverySnapshotDirsExcluded)
1745}
1746
1747var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1748
1749func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1750 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1751 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1752 c.config.productVariables.RecoverySnapshotDirsIncluded)
1753}
1754
Rob Seymour925aa092021-08-10 20:42:03 +00001755func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1756 return c.config.productVariables.HostFakeSnapshotEnabled
1757}
1758
Inseob Kim60c32f02020-12-21 22:53:05 +09001759func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1760 if c.config.productVariables.ShippingApiLevel == nil {
1761 return NoneApiLevel
1762 }
1763 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1764 return uncheckedFinalApiLevel(apiLevel)
1765}
1766
Alix Espinoef47e542022-09-14 19:10:51 +00001767func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1768 return c.config.productVariables.BuildBrokenClangAsFlags
1769}
1770
1771func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1772 return c.config.productVariables.BuildBrokenClangCFlags
1773}
1774
Alixb5f6d9e2022-04-20 23:00:58 +00001775func (c *deviceConfig) BuildBrokenClangProperty() bool {
1776 return c.config.productVariables.BuildBrokenClangProperty
1777}
1778
Inseob Kim67e5add2021-03-17 18:05:33 +09001779func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1780 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1781}
1782
1783func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1784 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1785}
1786
Cole Faustedc4c502022-09-09 19:39:25 -07001787func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1788 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1789}
1790
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001791func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1792 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1793}
1794
Inseob Kim0cac7b42021-02-03 18:16:46 +09001795func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1796 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1797}
1798
Liz Kammer619be462022-01-28 15:13:39 -05001799func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1800 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1801}
1802
Vinh Tran140d5882022-06-10 14:23:27 -04001803func (c *deviceConfig) BuildBrokenDepfile() bool {
1804 return Bool(c.config.productVariables.BuildBrokenDepfile)
1805}
1806
Inseob Kim67e5add2021-03-17 18:05:33 +09001807func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1808 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1809}
1810
1811func (c *config) SelinuxIgnoreNeverallows() bool {
1812 return c.productVariables.SelinuxIgnoreNeverallows
1813}
1814
1815func (c *deviceConfig) SepolicySplit() bool {
1816 return c.config.productVariables.SepolicySplit
1817}
1818
Inseob Kima10ef272021-09-15 03:04:53 +00001819func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1820 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1821}
1822
1823func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1824 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1825}
1826
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001827func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1828 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1829}
1830
Christopher Ferris98f10222022-07-13 23:16:52 -07001831func (c *config) IgnorePrefer32OnDevice() bool {
1832 return c.productVariables.IgnorePrefer32OnDevice
1833}
1834
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001835func (c *config) BootJars() []string {
1836 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001837 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001838 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001839 }).([]string)
1840}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001841
satayevd604b212021-07-21 14:23:52 +01001842func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001843 return c.productVariables.BootJars
1844}
1845
satayevd604b212021-07-21 14:23:52 +01001846func (c *config) ApexBootJars() ConfiguredJarList {
1847 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001848}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001849
1850func (c *config) RBEWrapper() string {
1851 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1852}
Colin Cross9b698b62021-12-22 09:55:32 -08001853
1854// UseHostMusl returns true if the host target has been configured to build against musl libc.
1855func (c *config) UseHostMusl() bool {
1856 return Bool(c.productVariables.HostMusl)
1857}
MarkDacekff851b82022-04-21 18:33:17 +00001858
Chris Parsonsf874e462022-05-10 13:50:12 -04001859func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001860 moduleName := ctx.Module().Name()
1861 c.mixedBuildsLock.Lock()
1862 defer c.mixedBuildsLock.Unlock()
1863 if useBazel {
1864 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1865 } else {
1866 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1867 }
1868}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001869
1870// ApiSurfaces directory returns the source path inside the api_surfaces repo
1871// (relative to workspace root).
1872func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1873 return filepath.Join(
1874 "build",
1875 "bazel",
1876 "api_surfaces",
1877 s.String(),
1878 version)
1879}