blob: 666e72115b5701e5e874e66fd0bce0baf56753b9 [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()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900908 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500909 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900910 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
911 // don't set platform sdk codename. Platform sdk codename makes sense only when we
912 // are building the platform. So we don't enforce the below panic for the host-only
913 // builds.
914 if hostOnlyBuild {
915 return NoneApiLevel
916 }
917 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500918 }
919 if codename == "REL" {
920 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
921 }
922 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700923}
924
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800925func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800926 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800927}
928
Dan Albert31384de2017-07-28 12:39:46 -0700929// Codenames that are active in the current lunch target.
930func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800931 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700932}
933
Colin Crossface4e42017-10-30 17:32:15 -0700934func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800935 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700936}
937
Colin Crossface4e42017-10-30 17:32:15 -0700938func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800939 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700940}
941
Colin Crossface4e42017-10-30 17:32:15 -0700942func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800943 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700944}
945
946func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800947 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700948}
949
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700950func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800951 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800952 if defaultCert != "" {
953 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800954 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500955 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700956}
957
Colin Crosse1731a52017-12-14 11:22:55 -0800958func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800959 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800960 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800961 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800962 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500963 defaultDir := c.DefaultAppCertificateDir(ctx)
964 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700965}
Colin Cross6ff51382015-12-17 16:39:19 -0800966
Jiyong Park9335a262018-12-24 11:31:58 +0900967func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
968 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
969 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700970 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900971 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
972 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800973 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900974 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500975 // If not, APEX keys are under the specified directory
976 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900977}
978
Inseob Kim80fa7982022-08-12 21:36:25 +0900979// Certificate for the NetworkStack sepolicy context
980func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
981 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
982 if cert != "" {
983 return PathForSource(ctx, cert)
984 }
985 return c.DefaultAppCertificateDir(ctx)
986}
987
Jingwen Chenc711fec2020-11-22 23:52:50 -0500988// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
989// are configured to depend on non-existent modules. Note that this does not
990// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800991func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800992 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800993}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800994
Jeongik Cha816a23a2020-07-08 01:09:23 +0900995// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700996func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800997 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700998}
999
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001000// Returns true if building apps that aren't bundled with the platform.
1001// UnbundledBuild() is always true when this is true.
1002func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001003 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001004}
1005
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001006// Returns true if building image that aren't bundled with the platform.
1007// UnbundledBuild() is always true when this is true.
1008func (c *config) UnbundledBuildImage() bool {
1009 return Bool(c.productVariables.Unbundled_build_image)
1010}
1011
Jeongik Cha816a23a2020-07-08 01:09:23 +09001012// Returns true if building modules against prebuilt SDKs.
1013func (c *config) AlwaysUsePrebuiltSdks() bool {
1014 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001015}
1016
Colin Cross126a25c2017-10-31 13:55:34 -07001017func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001018 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001019}
1020
Colin Crossed064c02018-09-05 16:28:13 -07001021func (c *config) Debuggable() bool {
1022 return Bool(c.productVariables.Debuggable)
1023}
1024
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001025func (c *config) Eng() bool {
1026 return Bool(c.productVariables.Eng)
1027}
1028
Colin Crossc53c37f2021-12-08 15:42:22 -08001029// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1030// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001031func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001032 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1033 return androidTargets[0].Arch.ArchType
1034 }
1035 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001036}
1037
Colin Cross16b23492016-01-06 14:41:07 -08001038func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001039 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001040}
1041
1042func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001043 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001044}
1045
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001046func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001047 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001048}
1049
Colin Cross23ae82a2016-11-02 14:34:39 -07001050func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001051 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001052}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001053
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001054func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001055 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001056 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001057 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001058 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001059}
1060
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001061func (c *config) DisableScudo() bool {
1062 return Bool(c.productVariables.DisableScudo)
1063}
1064
Colin Crossa1ad8d12016-06-01 17:09:44 -07001065func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001066 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001067 if t.Arch.ArchType.Multilib == "lib64" {
1068 return true
1069 }
1070 }
1071
1072 return false
1073}
Colin Cross9272ade2016-08-17 15:24:12 -07001074
Colin Cross9d45bb72016-08-29 16:14:13 -07001075func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001076 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001077}
1078
Ramy Medhatbbf25672019-07-17 12:30:04 +00001079func (c *config) UseRBE() bool {
1080 return Bool(c.productVariables.UseRBE)
1081}
1082
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001083func (c *config) UseRBEJAVAC() bool {
1084 return Bool(c.productVariables.UseRBEJAVAC)
1085}
1086
1087func (c *config) UseRBER8() bool {
1088 return Bool(c.productVariables.UseRBER8)
1089}
1090
1091func (c *config) UseRBED8() bool {
1092 return Bool(c.productVariables.UseRBED8)
1093}
1094
Colin Cross8b8bec32019-11-15 13:18:43 -08001095func (c *config) UseRemoteBuild() bool {
1096 return c.UseGoma() || c.UseRBE()
1097}
1098
Colin Cross66548102018-06-19 22:47:35 -07001099func (c *config) RunErrorProne() bool {
1100 return c.IsEnvTrue("RUN_ERROR_PRONE")
1101}
1102
Jingwen Chenc711fec2020-11-22 23:52:50 -05001103// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001104func (c *config) XrefCorpusName() string {
1105 return c.Getenv("XREF_CORPUS")
1106}
1107
Jingwen Chenc711fec2020-11-22 23:52:50 -05001108// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1109// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001110func (c *config) XrefCuEncoding() string {
1111 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1112 return enc
1113 }
1114 return "json"
1115}
1116
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001117// XrefCuJavaSourceMax returns the maximum number of the Java source files
1118// in a single compilation unit
1119const xrefJavaSourceFileMaxDefault = "1000"
1120
1121func (c Config) XrefCuJavaSourceMax() string {
1122 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1123 if v == "" {
1124 return xrefJavaSourceFileMaxDefault
1125 }
1126 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1127 fmt.Fprintf(os.Stderr,
1128 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1129 err, xrefJavaSourceFileMaxDefault)
1130 return xrefJavaSourceFileMaxDefault
1131 }
1132 return v
1133
1134}
1135
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001136func (c *config) EmitXrefRules() bool {
1137 return c.XrefCorpusName() != ""
1138}
1139
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001140func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001141 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001142}
1143
1144func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001145 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001146 return ""
1147 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001148 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001149}
1150
Colin Cross0f4e0d62016-07-27 10:56:55 -07001151func (c *config) LibartImgHostBaseAddress() string {
1152 return "0x60000000"
1153}
1154
1155func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001156 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001157}
1158
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001159func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001160 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001161}
1162
Jingwen Chenc711fec2020-11-22 23:52:50 -05001163// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1164// but some modules still depend on it.
1165//
1166// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001167func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001168 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001169
Roland Levillainf6cc2612020-07-09 16:58:14 +01001170 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001171 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001172 return true
1173 }
Colin Crossa74ca042019-01-31 14:31:51 -08001174 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001175 }
1176 return false
1177}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001178func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001179 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001180 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001181 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001182 }
1183 return false
1184}
1185
1186func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001187 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001188}
1189
Spandan Dasc5763832022-11-08 18:42:16 +00001190func (c *config) IncludeTags() []string {
1191 return c.productVariables.IncludeTags
1192}
1193
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001194func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001195 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001196}
1197
Colin Cross5a0dcd52018-10-05 14:20:06 -07001198func (c *config) UncompressPrivAppDex() bool {
1199 return Bool(c.productVariables.UncompressPrivAppDex)
1200}
1201
1202func (c *config) ModulesLoadedByPrivilegedModules() []string {
1203 return c.productVariables.ModulesLoadedByPrivilegedModules
1204}
1205
Jingwen Chenc711fec2020-11-22 23:52:50 -05001206// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1207// the output directory, if it was created during the product configuration
1208// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001209func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001210 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001211 return OptionalPathForPath(nil)
1212 }
1213 return OptionalPathForPath(
1214 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1215}
1216
Jingwen Chenc711fec2020-11-22 23:52:50 -05001217// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1218// configuration. Since the configuration file was created by Kati during
1219// product configuration (externally of soong_build), it's not tracked, so we
1220// also manually add a Ninja file dependency on the configuration file to the
1221// rule that creates the main build.ninja file. This ensures that build.ninja is
1222// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001223func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1224 path := c.DexpreoptGlobalConfigPath(ctx)
1225 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001226 return nil, nil
1227 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001228 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001229 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001230}
1231
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001232func (c *deviceConfig) WithDexpreopt() bool {
1233 return c.config.productVariables.WithDexpreopt
1234}
1235
Colin Cross662d6142022-11-03 20:38:01 -07001236func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001237 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001238}
1239
Inseob Kimae553032019-05-14 18:52:49 +09001240func (c *config) VndkSnapshotBuildArtifacts() bool {
1241 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1242}
1243
Colin Cross3b19f5d2019-09-17 14:45:31 -07001244func (c *config) HasMultilibConflict(arch ArchType) bool {
1245 return c.multilibConflicts[arch]
1246}
1247
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001248func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001249 return String(c.productVariables.PrebuiltHiddenApiDir)
1250}
1251
MarkDacekd06db5d2022-11-29 00:47:59 +00001252func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1253 return c.bazelForceEnabledModules
1254}
1255
Colin Cross9272ade2016-08-17 15:24:12 -07001256func (c *deviceConfig) Arches() []Arch {
1257 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001258 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001259 arches = append(arches, target.Arch)
1260 }
1261 return arches
1262}
Dan Willemsend2ede872016-11-18 14:54:24 -08001263
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001264func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001265 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001266 if is32BitBinder != nil && *is32BitBinder {
1267 return "32"
1268 }
1269 return "64"
1270}
1271
Dan Willemsen4353bc42016-12-05 17:16:02 -08001272func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001273 if c.config.productVariables.VendorPath != nil {
1274 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001275 }
1276 return "vendor"
1277}
1278
Justin Yun71549282017-11-17 12:10:28 +09001279func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001280 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001281}
1282
Jose Galmes6f843bc2020-12-11 13:36:29 -08001283func (c *deviceConfig) RecoverySnapshotVersion() string {
1284 return String(c.config.productVariables.RecoverySnapshotVersion)
1285}
1286
Jeongik Cha219141c2020-08-06 23:00:37 +09001287func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1288 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1289}
1290
Justin Yun8fe12122017-12-07 17:18:15 +09001291func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001292 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001293}
1294
Justin Yun5f7f7e82019-11-18 19:52:14 +09001295func (c *deviceConfig) ProductVndkVersion() string {
1296 return String(c.config.productVariables.ProductVndkVersion)
1297}
1298
Justin Yun71549282017-11-17 12:10:28 +09001299func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001300 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001301}
Jack He8cc71432016-12-08 15:45:07 -08001302
Vic Yangefd249e2018-11-12 20:19:56 -08001303func (c *deviceConfig) VndkUseCoreVariant() bool {
1304 return Bool(c.config.productVariables.VndkUseCoreVariant)
1305}
1306
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001307func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001308 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001309}
1310
1311func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001312 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001313}
1314
Jiyong Park2db76922017-11-08 16:03:48 +09001315func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001316 if c.config.productVariables.OdmPath != nil {
1317 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001318 }
1319 return "odm"
1320}
1321
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001322func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001323 if c.config.productVariables.ProductPath != nil {
1324 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001325 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001326 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001327}
1328
Justin Yund5f6c822019-06-25 16:47:17 +09001329func (c *deviceConfig) SystemExtPath() string {
1330 if c.config.productVariables.SystemExtPath != nil {
1331 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001332 }
Justin Yund5f6c822019-06-25 16:47:17 +09001333 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001334}
1335
Jack He8cc71432016-12-08 15:45:07 -08001336func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001337 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001338}
Dan Willemsen581341d2017-02-09 16:16:31 -08001339
Jiyong Parkd773eb32017-07-03 13:18:12 +09001340func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001341 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001342}
1343
Roland Levillainada12702020-06-09 13:07:36 +01001344// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1345// path. Coverage is enabled by default when the product variable
1346// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1347// enabled for any path which is part of this variable (and not part of the
1348// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1349// represents any path.
1350func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1351 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001352 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001353 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1354 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1355 coverage = true
1356 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001357 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001358 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1359 coverage = false
1360 }
1361 }
1362 return coverage
1363}
1364
Colin Cross1a6acd42020-06-16 17:51:46 -07001365// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001366func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001367 return Bool(c.config.productVariables.GcovCoverage) ||
1368 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001369}
1370
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001371func (c *deviceConfig) ClangCoverageEnabled() bool {
1372 return Bool(c.config.productVariables.ClangCoverage)
1373}
1374
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001375func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1376 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1377}
1378
Colin Cross1a6acd42020-06-16 17:51:46 -07001379func (c *deviceConfig) GcovCoverageEnabled() bool {
1380 return Bool(c.config.productVariables.GcovCoverage)
1381}
1382
Roland Levillain4f5297b2020-06-09 12:44:06 +01001383// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1384// code coverage is enabled for path. By default, coverage is not enabled for a
1385// given path unless it is part of the NativeCoveragePaths product variable (and
1386// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1387// NativeCoveragePaths represents any path.
1388func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001389 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001390 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001391 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001392 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001393 }
1394 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001395 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001396 // Workaround coverage boot failure.
1397 // http://b/269981180
1398 if strings.HasPrefix(path, "external/protobuf") {
1399 coverage = false
1400 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001401 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001402 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001403 }
1404 }
1405 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001406}
Ivan Lozano5f595532017-07-13 14:46:05 -07001407
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001408func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001409 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001410}
1411
Tri Vo35a51432018-03-25 20:00:00 -07001412func (c *deviceConfig) VendorSepolicyDirs() []string {
1413 return c.config.productVariables.BoardVendorSepolicyDirs
1414}
1415
1416func (c *deviceConfig) OdmSepolicyDirs() []string {
1417 return c.config.productVariables.BoardOdmSepolicyDirs
1418}
1419
Felixa20a8752020-05-17 18:28:35 +02001420func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1421 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001422}
1423
Felixa20a8752020-05-17 18:28:35 +02001424func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1425 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001426}
1427
Inseob Kim0866b002019-04-15 20:21:29 +09001428func (c *deviceConfig) SepolicyM4Defs() []string {
1429 return c.config.productVariables.BoardSepolicyM4Defs
1430}
1431
Jiyong Park7f67f482019-01-05 12:57:48 +09001432func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001433 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1434 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1435}
1436
1437func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001438 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001439 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1440}
1441
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001442func (c *deviceConfig) OverridePackageNameFor(name string) string {
1443 newName, overridden := findOverrideValue(
1444 c.config.productVariables.PackageNameOverrides,
1445 name,
1446 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1447 if overridden {
1448 return newName
1449 }
1450 return name
1451}
1452
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001453func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001454 if overrides == nil || len(overrides) == 0 {
1455 return "", false
1456 }
1457 for _, o := range overrides {
1458 split := strings.Split(o, ":")
1459 if len(split) != 2 {
1460 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001461 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001462 }
1463 if matchPattern(split[0], name) {
1464 return substPattern(split[0], split[1], name), true
1465 }
1466 }
1467 return "", false
1468}
1469
Albert Martineefabcf2022-03-21 20:11:16 +00001470func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1471 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1472}
1473
Ivan Lozano5f595532017-07-13 14:46:05 -07001474func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001475 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001476 return false
1477 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001478 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001479}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001480
1481func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001482 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001483 return false
1484 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001485 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001486}
1487
1488func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001489 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001490 return false
1491 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001492 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001493}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001494
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001495func (c *config) MemtagHeapDisabledForPath(path string) bool {
1496 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1497 return false
1498 }
1499 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1500}
1501
1502func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1503 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1504 return false
1505 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001506 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001507}
1508
1509func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1510 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1511 return false
1512 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001513 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001514}
1515
Dan Willemsen0fe78662018-03-26 12:41:18 -07001516func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001517 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001518}
1519
Colin Cross395f2cf2018-10-24 16:10:32 -07001520func (c *config) NdkAbis() bool {
1521 return Bool(c.productVariables.Ndk_abis)
1522}
1523
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001524func (c *config) AmlAbis() bool {
1525 return Bool(c.productVariables.Aml_abis)
1526}
1527
Jiyong Park8fd61922018-11-08 02:50:25 +09001528func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001529 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001530}
1531
Jiyong Park4da07972021-01-05 21:01:11 +09001532func (c *config) ForceApexSymlinkOptimization() bool {
1533 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1534}
1535
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001536func (c *config) ApexCompressionEnabled() bool {
1537 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001538}
1539
Dennis Shene2ed70c2023-01-11 14:15:43 +00001540func (c *config) ApexTrimEnabled() bool {
1541 return Bool(c.productVariables.TrimmedApex)
1542}
1543
Jeongik Chac9464142019-01-07 12:07:27 +09001544func (c *config) EnforceSystemCertificate() bool {
1545 return Bool(c.productVariables.EnforceSystemCertificate)
1546}
1547
Colin Cross440e0d02020-06-11 11:32:11 -07001548func (c *config) EnforceSystemCertificateAllowList() []string {
1549 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001550}
1551
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001552func (c *config) EnforceProductPartitionInterface() bool {
1553 return Bool(c.productVariables.EnforceProductPartitionInterface)
1554}
1555
JaeMan Parkff715562020-10-19 17:25:58 +09001556func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1557 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1558}
1559
1560func (c *config) InterPartitionJavaLibraryAllowList() []string {
1561 return c.productVariables.InterPartitionJavaLibraryAllowList
1562}
1563
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001564func (c *config) InstallExtraFlattenedApexes() bool {
1565 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1566}
1567
Colin Crossf24a22a2019-01-31 14:12:44 -08001568func (c *config) ProductHiddenAPIStubs() []string {
1569 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001570}
1571
Colin Crossf24a22a2019-01-31 14:12:44 -08001572func (c *config) ProductHiddenAPIStubsSystem() []string {
1573 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001574}
1575
Colin Crossf24a22a2019-01-31 14:12:44 -08001576func (c *config) ProductHiddenAPIStubsTest() []string {
1577 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001578}
Dan Willemsen71c74602019-04-10 12:27:35 -07001579
Dan Willemsen54879d12019-04-18 10:08:46 -07001580func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001581 return c.config.productVariables.TargetFSConfigGen
1582}
Inseob Kim0866b002019-04-15 20:21:29 +09001583
1584func (c *config) ProductPublicSepolicyDirs() []string {
1585 return c.productVariables.ProductPublicSepolicyDirs
1586}
1587
1588func (c *config) ProductPrivateSepolicyDirs() []string {
1589 return c.productVariables.ProductPrivateSepolicyDirs
1590}
1591
Colin Cross50ddcc42019-05-16 12:28:22 -07001592func (c *config) MissingUsesLibraries() []string {
1593 return c.productVariables.MissingUsesLibraries
1594}
1595
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001596func (c *config) TargetMultitreeUpdateMeta() bool {
1597 return c.productVariables.MultitreeUpdateMeta
1598}
1599
Inseob Kim1f086e22019-05-09 13:29:15 +09001600func (c *deviceConfig) DeviceArch() string {
1601 return String(c.config.productVariables.DeviceArch)
1602}
1603
1604func (c *deviceConfig) DeviceArchVariant() string {
1605 return String(c.config.productVariables.DeviceArchVariant)
1606}
1607
1608func (c *deviceConfig) DeviceSecondaryArch() string {
1609 return String(c.config.productVariables.DeviceSecondaryArch)
1610}
1611
1612func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1613 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1614}
Yifan Hong82db7352020-01-21 16:12:26 -08001615
1616func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1617 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1618}
Yifan Hong97365ee2020-07-29 09:51:57 -07001619
1620func (c *deviceConfig) BoardKernelBinaries() []string {
1621 return c.config.productVariables.BoardKernelBinaries
1622}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001623
Yifan Hong42bef8d2020-08-05 14:36:09 -07001624func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1625 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1626}
1627
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001628func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1629 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1630}
1631
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001632func (c *deviceConfig) PlatformSepolicyVersion() string {
1633 return String(c.config.productVariables.PlatformSepolicyVersion)
1634}
1635
Inseob Kima10ef272021-09-15 03:04:53 +00001636func (c *deviceConfig) TotSepolicyVersion() string {
1637 return String(c.config.productVariables.TotSepolicyVersion)
1638}
1639
Inseob Kim843f6642022-01-07 09:11:23 +09001640func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1641 return c.config.productVariables.PlatformSepolicyCompatVersions
1642}
1643
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001644func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001645 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1646 return ver
1647 }
1648 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001649}
1650
Inseob Kim14178802021-12-08 22:53:31 +09001651func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1652 return c.config.productVariables.BoardPlatVendorPolicy
1653}
1654
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001655func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1656 return c.config.productVariables.BoardReqdMaskPolicy
1657}
1658
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001659func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1660 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1661}
1662
1663func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1664 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1665}
1666
1667func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1668 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1669}
1670
1671func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1672 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1673}
1674
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001675func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1676 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1677}
1678
1679func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1680 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1681}
1682
1683func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1684 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1685}
1686
Inseob Kim7cf14652021-01-06 23:06:52 +09001687func (c *deviceConfig) DirectedVendorSnapshot() bool {
1688 return c.config.productVariables.DirectedVendorSnapshot
1689}
1690
1691func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1692 return c.config.productVariables.VendorSnapshotModules
1693}
1694
Jose Galmes4c6895e2021-02-09 07:44:30 -08001695func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1696 return c.config.productVariables.DirectedRecoverySnapshot
1697}
1698
1699func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1700 return c.config.productVariables.RecoverySnapshotModules
1701}
1702
Justin DeMartino383bfb32021-02-24 10:49:43 -08001703func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1704 var ret = make(map[string]bool)
1705 for _, dir := range dirs {
1706 clean := filepath.Clean(dir)
1707 if previous[clean] || ret[clean] {
1708 return nil, fmt.Errorf("Duplicate entry %s", dir)
1709 }
1710 ret[clean] = true
1711 }
1712 return ret, nil
1713}
1714
1715func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1716 dirMap := c.Once(onceKey, func() interface{} {
1717 ret, err := createDirsMap(previous, dirs)
1718 if err != nil {
1719 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1720 }
1721 return ret
1722 })
1723 if dirMap == nil {
1724 return nil
1725 }
1726 return dirMap.(map[string]bool)
1727}
1728
1729var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1730
1731func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1732 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1733 c.config.productVariables.VendorSnapshotDirsExcluded)
1734}
1735
1736var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1737
1738func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1739 excludedMap := c.VendorSnapshotDirsExcludedMap()
1740 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1741 c.config.productVariables.VendorSnapshotDirsIncluded)
1742}
1743
1744var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1745
1746func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1747 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1748 c.config.productVariables.RecoverySnapshotDirsExcluded)
1749}
1750
1751var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1752
1753func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1754 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1755 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1756 c.config.productVariables.RecoverySnapshotDirsIncluded)
1757}
1758
Rob Seymour925aa092021-08-10 20:42:03 +00001759func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1760 return c.config.productVariables.HostFakeSnapshotEnabled
1761}
1762
Inseob Kim60c32f02020-12-21 22:53:05 +09001763func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1764 if c.config.productVariables.ShippingApiLevel == nil {
1765 return NoneApiLevel
1766 }
1767 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1768 return uncheckedFinalApiLevel(apiLevel)
1769}
1770
Alix Espinoef47e542022-09-14 19:10:51 +00001771func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1772 return c.config.productVariables.BuildBrokenClangAsFlags
1773}
1774
1775func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1776 return c.config.productVariables.BuildBrokenClangCFlags
1777}
1778
Alixb5f6d9e2022-04-20 23:00:58 +00001779func (c *deviceConfig) BuildBrokenClangProperty() bool {
1780 return c.config.productVariables.BuildBrokenClangProperty
1781}
1782
Inseob Kim67e5add192021-03-17 18:05:33 +09001783func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1784 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1785}
1786
1787func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1788 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1789}
1790
Cole Faustedc4c502022-09-09 19:39:25 -07001791func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1792 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1793}
1794
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001795func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1796 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1797}
1798
Inseob Kim0cac7b42021-02-03 18:16:46 +09001799func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1800 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1801}
1802
Liz Kammer619be462022-01-28 15:13:39 -05001803func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1804 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1805}
1806
Vinh Tran140d5882022-06-10 14:23:27 -04001807func (c *deviceConfig) BuildBrokenDepfile() bool {
1808 return Bool(c.config.productVariables.BuildBrokenDepfile)
1809}
1810
Inseob Kim67e5add192021-03-17 18:05:33 +09001811func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1812 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1813}
1814
1815func (c *config) SelinuxIgnoreNeverallows() bool {
1816 return c.productVariables.SelinuxIgnoreNeverallows
1817}
1818
1819func (c *deviceConfig) SepolicySplit() bool {
1820 return c.config.productVariables.SepolicySplit
1821}
1822
Inseob Kima10ef272021-09-15 03:04:53 +00001823func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1824 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1825}
1826
1827func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1828 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1829}
1830
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001831func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1832 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1833}
1834
Christopher Ferris98f10222022-07-13 23:16:52 -07001835func (c *config) IgnorePrefer32OnDevice() bool {
1836 return c.productVariables.IgnorePrefer32OnDevice
1837}
1838
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001839func (c *config) BootJars() []string {
1840 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001841 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001842 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001843 }).([]string)
1844}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001845
satayevd604b212021-07-21 14:23:52 +01001846func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001847 return c.productVariables.BootJars
1848}
1849
satayevd604b212021-07-21 14:23:52 +01001850func (c *config) ApexBootJars() ConfiguredJarList {
1851 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001852}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001853
1854func (c *config) RBEWrapper() string {
1855 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1856}
Colin Cross9b698b62021-12-22 09:55:32 -08001857
1858// UseHostMusl returns true if the host target has been configured to build against musl libc.
1859func (c *config) UseHostMusl() bool {
1860 return Bool(c.productVariables.HostMusl)
1861}
MarkDacekff851b82022-04-21 18:33:17 +00001862
Chris Parsonsf874e462022-05-10 13:50:12 -04001863func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001864 moduleName := ctx.Module().Name()
1865 c.mixedBuildsLock.Lock()
1866 defer c.mixedBuildsLock.Unlock()
1867 if useBazel {
1868 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1869 } else {
1870 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1871 }
1872}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001873
1874// ApiSurfaces directory returns the source path inside the api_surfaces repo
1875// (relative to workspace root).
1876func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1877 return filepath.Join(
1878 "build",
1879 "bazel",
1880 "api_surfaces",
1881 s.String(),
1882 version)
1883}