blob: 593812c5fc53ba855ff297f09c7fc7f2ceeba218 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
Jingwen Chenc711fec2020-11-22 23:52:50 -050017// This is the primary location to write and read all configuration values and
18// product variables necessary for soong_build's operation.
19
Colin Cross3f40fa42015-01-30 17:27:36 -080020import (
Cole Faust082c5f32022-08-04 15:49:20 -070021 "bytes"
Colin Cross3f40fa42015-01-30 17:27:36 -080022 "encoding/json"
23 "fmt"
24 "os"
Colin Cross35cec122015-04-02 14:37:16 -070025 "path/filepath"
Sam Delmerico5c32bbf2022-01-20 20:15:02 +000026 "reflect"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "runtime"
Inseob Kim60c32f02020-12-21 22:53:05 +090028 "strconv"
Dan Willemsen34cc69e2015-09-23 15:26:20 -070029 "strings"
Colin Crossc1e86a32015-04-15 12:33:28 -070030 "sync"
Colin Cross6ff51382015-12-17 16:39:19 -080031
Colin Cross98be1bb2019-12-13 20:41:13 -080032 "github.com/google/blueprint"
Colin Crosse87040b2017-12-11 15:52:26 -080033 "github.com/google/blueprint/bootstrap"
Colin Cross98be1bb2019-12-13 20:41:13 -080034 "github.com/google/blueprint/pathtools"
Colin Cross6ff51382015-12-17 16:39:19 -080035 "github.com/google/blueprint/proptools"
Colin Cross9d34f352019-11-22 16:03:51 -080036
37 "android/soong/android/soongconfig"
Liz Kammer09f947d2021-05-12 14:51:49 -040038 "android/soong/bazel"
Colin Cross77cdcfd2021-03-12 11:28:25 -080039 "android/soong/remoteexec"
Liz Kammer72beb342022-02-03 08:42:10 -050040 "android/soong/starlark_fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080041)
42
Jingwen Chenc711fec2020-11-22 23:52:50 -050043// Bool re-exports proptools.Bool for the android package.
Colin Cross6ff51382015-12-17 16:39:19 -080044var Bool = proptools.Bool
Jingwen Chenc711fec2020-11-22 23:52:50 -050045
46// String re-exports proptools.String for the android package.
Jack He8cc71432016-12-08 15:45:07 -080047var String = proptools.String
Jingwen Chenc711fec2020-11-22 23:52:50 -050048
49// StringDefault re-exports proptools.StringDefault for the android package.
Jeongik Cha219141c2020-08-06 23:00:37 +090050var StringDefault = proptools.StringDefault
Jiyong Park6a927c42020-01-21 02:03:43 +090051
Jingwen Chenc711fec2020-11-22 23:52:50 -050052// FutureApiLevelInt is a placeholder constant for unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070053const FutureApiLevelInt = 10000
54
Spandan Das15da5882023-03-02 23:36:39 +000055// PrivateApiLevel represents the api level of SdkSpecPrivate (sdk_version: "")
56// This api_level exists to differentiate user-provided "" from "current" sdk_version
57// The differentiation is necessary to enable different validation rules for these two possible values.
58var PrivateApiLevel = ApiLevel{
59 value: "current", // The value is current since aidl expects `current` as the default (TestAidlFlagsWithMinSdkVersion)
60 number: FutureApiLevelInt + 1, // This is used to differentiate it from FutureApiLevel
61 isPreview: true,
62}
63
Jingwen Chenc711fec2020-11-22 23:52:50 -050064// FutureApiLevel represents unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070065var FutureApiLevel = ApiLevel{
66 value: "current",
67 number: FutureApiLevelInt,
68 isPreview: true,
69}
Colin Cross6ff51382015-12-17 16:39:19 -080070
Jingwen Chenc4d91bc2020-11-24 22:59:26 -050071// The product variables file name, containing product config from Kati.
Dan Willemsen87b17d12015-07-14 00:39:06 -070072const productVariablesFileName = "soong.variables"
Colin Cross3f40fa42015-01-30 17:27:36 -080073
Colin Cross9272ade2016-08-17 15:24:12 -070074// A Config object represents the entire build configuration for Android.
Colin Crossc3c0a492015-04-10 15:43:55 -070075type Config struct {
76 *config
77}
78
Chris Parsonsad876012022-08-20 14:48:32 -040079type SoongBuildMode int
80
Sasha Smundakaf5ca922022-12-12 21:23:34 -080081type CmdArgs struct {
82 bootstrap.Args
83 RunGoTests bool
84 OutDir string
85 SoongOutDir string
86
87 SymlinkForestMarker string
88 Bp2buildMarker string
89 BazelQueryViewDir string
90 BazelApiBp2buildDir string
91 ModuleGraphFile string
92 ModuleActionsFile string
93 DocFile string
94
LaMont Jones52a72432023-03-09 18:19:35 +000095 MultitreeBuild bool
96
Sasha Smundakaf5ca922022-12-12 21:23:34 -080097 BazelMode bool
98 BazelModeDev bool
99 BazelModeStaging bool
100 BazelForceEnabledModules string
Chris Parsons9402ca82023-02-23 17:28:06 -0500101
102 UseBazelProxy bool
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800103}
104
Chris Parsonsad876012022-08-20 14:48:32 -0400105// Build modes that soong_build can run as.
106const (
107 // Don't use bazel at all during module analysis.
108 AnalysisNoBazel SoongBuildMode = iota
109
Lukacs T. Berkic541cd22022-10-26 07:26:50 +0000110 // Symlink fores mode: merge two directory trees into a symlink forest
111 SymlinkForest
112
Chris Parsonsad876012022-08-20 14:48:32 -0400113 // Bp2build mode: Generate BUILD files from blueprint files and exit.
114 Bp2build
115
116 // Generate BUILD files which faithfully represent the dependency graph of
117 // blueprint modules. Individual BUILD targets will not, however, faitfhully
118 // express build semantics.
119 GenerateQueryView
120
Spandan Das5af0bd32022-09-28 20:43:08 +0000121 // Generate BUILD files for API contributions to API surfaces
122 ApiBp2build
123
Chris Parsonsad876012022-08-20 14:48:32 -0400124 // Create a JSON representation of the module graph and exit.
125 GenerateModuleGraph
126
127 // Generate a documentation file for module type definitions and exit.
128 GenerateDocFile
129
130 // Use bazel during analysis of many allowlisted build modules. The allowlist
131 // is considered a "developer mode" allowlist, as some modules may be
132 // allowlisted on an experimental basis.
133 BazelDevMode
134
MarkDacekb78465d2022-10-18 20:10:16 +0000135 // Use bazel during analysis of a few allowlisted build modules. The allowlist
136 // is considered "staging, as these are modules being prepared to be released
137 // into prod mode shortly after.
138 BazelStagingMode
139
Chris Parsonsad876012022-08-20 14:48:32 -0400140 // Use bazel during analysis of build modules from an allowlist carefully
141 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400142 BazelProdMode
143)
144
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200145// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200146func (c Config) SoongOutDir() string {
147 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700148}
149
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200150func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200151 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100152}
153
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200154func (c Config) RunGoTests() bool {
155 return c.runGoTests
156}
157
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100158func (c Config) DebugCompilation() bool {
159 return false // Never compile Go code in the main build for debugging
160}
161
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200162func (c Config) Subninjas() []string {
163 return []string{}
164}
165
166func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
167 return []bootstrap.PrimaryBuilderInvocation{}
168}
169
Paul Duffin74135582022-10-06 11:01:59 +0100170// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
171func (c Config) RunningInsideUnitTest() bool {
172 return c.config.TestProductVariables != nil
173}
174
Jingwen Chenc711fec2020-11-22 23:52:50 -0500175// A DeviceConfig object represents the configuration for a particular device
176// being built. For now there will only be one of these, but in the future there
177// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700178type DeviceConfig struct {
179 *deviceConfig
180}
181
Jingwen Chenc711fec2020-11-22 23:52:50 -0500182// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800183type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700184
Jingwen Chenc711fec2020-11-22 23:52:50 -0500185// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500186// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700187type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500188 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800189 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800190
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700191 // Only available on configs created by TestConfig
192 TestProductVariables *productVariables
193
Jingwen Chenc711fec2020-11-22 23:52:50 -0500194 // A specialized context object for Bazel/Soong mixed builds and migration
195 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400196 BazelContext BazelContext
197
Dan Willemsen87b17d12015-07-14 00:39:06 -0700198 ProductVariablesFileName string
199
Colin Cross0c66bc62021-07-20 09:47:41 -0700200 // BuildOS stores the OsType for the OS that the build is running on.
201 BuildOS OsType
202
203 // BuildArch stores the ArchType for the CPU that the build is running on.
204 BuildArch ArchType
205
Jaewoong Jung642916f2020-10-09 17:25:15 -0700206 Targets map[OsType][]Target
207 BuildOSTarget Target // the Target for tools run on the build machine
208 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
209 AndroidCommonTarget Target // the Target for common modules for the Android device
210 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700211
Jingwen Chenc711fec2020-11-22 23:52:50 -0500212 // multilibConflicts for an ArchType is true if there is earlier configured
213 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700214 multilibConflicts map[ArchType]bool
215
Colin Cross9272ade2016-08-17 15:24:12 -0700216 deviceConfig *deviceConfig
217
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200218 outDir string // The output directory (usually out/)
219 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400220 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700221
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200222 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200223
Colin Cross6ccbc912017-10-10 23:07:38 -0700224 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700225 envLock sync.Mutex
226 envDeps map[string]string
227 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800228
Jingwen Chencda22c92020-11-23 00:22:30 -0500229 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
230 // runs standalone.
231 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700232
Colin Cross32616ed2017-09-05 21:56:44 -0700233 captureBuild bool // true for tests, saves build parameters for each module
234 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700235
Colin Cross98be1bb2019-12-13 20:41:13 -0800236 fs pathtools.FileSystem
237 mockBpList string
238
Chris Parsonsad876012022-08-20 14:48:32 -0400239 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700240 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000241 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500242
LaMont Jones52a72432023-03-09 18:19:35 +0000243 // If MultitreeBuild is true then this is one inner tree of a multitree
244 // build directed by the multitree orchestrator.
245 MultitreeBuild bool
246
Colin Cross5e6a7972020-06-07 16:56:32 -0700247 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
248 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000249 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700250
Jingwen Chenc711fec2020-11-22 23:52:50 -0500251 // The list of files that when changed, must invalidate soong_build to
252 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700253 ninjaFileDepsSet sync.Map
254
Colin Cross9272ade2016-08-17 15:24:12 -0700255 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000256
Chris Parsonsad876012022-08-20 14:48:32 -0400257 // These fields are only used for metrics collection. A module should be added
258 // to these maps only if its implementation supports Bazel handling in mixed
259 // builds. A module being in the "enabled" list indicates that there is a
260 // variant of that module for which bazel-handling actually took place.
261 // A module being in the "disabled" list indicates that there is a variant of
262 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000263 mixedBuildsLock sync.Mutex
264 mixedBuildEnabledModules map[string]struct{}
265 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000266
267 // These are modules to be built with Bazel beyond the allowlisted/build-mode
268 // specified modules. They are passed via the command-line flag
269 // "--bazel-force-enabled-modules"
270 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500271
272 // If true, for any requests to Bazel, communicate with a Bazel proxy using
273 // unix sockets, instead of spawning Bazel as a subprocess.
274 UseBazelProxy bool
Colin Cross9272ade2016-08-17 15:24:12 -0700275}
276
277type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700278 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700279 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800280}
281
Colin Cross485e5722015-08-27 13:28:01 -0700282type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700283 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700284}
Colin Cross3f40fa42015-01-30 17:27:36 -0800285
Colin Cross485e5722015-08-27 13:28:01 -0700286func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000287 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700288}
289
Jingwen Chenc711fec2020-11-22 23:52:50 -0500290// loadFromConfigFile loads and decodes configuration options from a JSON file
291// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400292func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800293 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700294 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800295 defer configFileReader.Close()
296 if os.IsNotExist(err) {
297 // Need to create a file, so that blueprint & ninja don't get in
298 // a dependency tracking loop.
299 // Make a file-configurable-options with defaults, write it out using
300 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700301 configurable.SetDefaultConfig()
302 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800303 if err != nil {
304 return err
305 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800306 } else if err != nil {
307 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800308 } else {
309 // Make a decoder for it
310 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700311 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800312 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800313 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800314 }
315 }
316
Liz Kammer09f947d2021-05-12 14:51:49 -0400317 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
318 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
319 }
320
321 configurable.Native_coverage = proptools.BoolPtr(
322 Bool(configurable.GcovCoverage) ||
323 Bool(configurable.ClangCoverage))
324
Yuntao Xu402e9b02021-08-09 15:44:44 -0700325 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
326 // if false (pre-released version, for example), use Platform_sdk_codename.
327 if Bool(configurable.Platform_sdk_final) {
328 if configurable.Platform_sdk_version != nil {
329 configurable.Platform_sdk_version_or_codename =
330 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
331 } else {
332 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
333 }
334 } else {
335 configurable.Platform_sdk_version_or_codename =
336 proptools.StringPtr(String(configurable.Platform_sdk_codename))
337 }
338
Liz Kammer09f947d2021-05-12 14:51:49 -0400339 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800340}
341
Colin Crossd8f20142016-11-03 09:43:26 -0700342// atomically writes the config file in case two copies of soong_build are running simultaneously
343// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400344func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800345 data, err := json.MarshalIndent(&config, "", " ")
346 if err != nil {
347 return fmt.Errorf("cannot marshal config data: %s", err.Error())
348 }
349
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800350 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800351 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500352 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800353 }
Colin Crossd8f20142016-11-03 09:43:26 -0700354 defer os.Remove(f.Name())
355 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800356
Colin Crossd8f20142016-11-03 09:43:26 -0700357 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800358 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700359 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
360 }
361
Colin Crossd8f20142016-11-03 09:43:26 -0700362 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700363 if err != nil {
364 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800365 }
366
Colin Crossd8f20142016-11-03 09:43:26 -0700367 f.Close()
368 os.Rename(f.Name(), filename)
369
Colin Cross3f40fa42015-01-30 17:27:36 -0800370 return nil
371}
372
Liz Kammer09f947d2021-05-12 14:51:49 -0400373func saveToBazelConfigFile(config *productVariables, outDir string) error {
374 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
375 err := createDirIfNonexistent(dir, os.ModePerm)
376 if err != nil {
377 return fmt.Errorf("Could not create dir %s: %s", dir, err)
378 }
379
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000380 nonArchVariantProductVariables := []string{}
381 archVariantProductVariables := []string{}
382 p := variableProperties{}
383 t := reflect.TypeOf(p.Product_variables)
384 for i := 0; i < t.NumField(); i++ {
385 f := t.Field(i)
386 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
387 if proptools.HasTag(f, "android", "arch_variant") {
388 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
389 }
390 }
391
Liz Kammer72beb342022-02-03 08:42:10 -0500392 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000393 if err != nil {
394 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
395 }
396
Liz Kammer72beb342022-02-03 08:42:10 -0500397 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000398 if err != nil {
399 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
400 }
401
402 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400403 if err != nil {
404 return fmt.Errorf("cannot marshal config data: %s", err.Error())
405 }
Cole Faust082c5f32022-08-04 15:49:20 -0700406 // The backslashes need to be escaped because this text is going to be put
407 // inside a Starlark string literal.
408 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400409
410 bzl := []string{
411 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000412 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
413 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
414 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
415 "\n", `
416product_vars = _product_vars
417product_var_constraints = _product_var_constraints
418arch_variant_product_var_constraints = _arch_variant_product_var_constraints
419`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400420 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500421 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
422 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400423 if err != nil {
424 return fmt.Errorf("Could not write .bzl config file %s", err)
425 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500426 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
427 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400428 if err != nil {
429 return fmt.Errorf("Could not write BUILD config file %s", err)
430 }
431
432 return nil
433}
434
Colin Cross988414c2020-01-11 01:11:46 +0000435// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
436// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200437func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000438 return Config{
439 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200440 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200441 soongOutDir: soongOutDir,
442 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000443 },
444 }
445}
446
Jingwen Chenc711fec2020-11-22 23:52:50 -0500447// NewConfig creates a new Config object. The srcDir argument specifies the path
448// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800449func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500450 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700451 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800452 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700453
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200454 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700455
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800456 outDir: cmdArgs.OutDir,
457 soongOutDir: cmdArgs.SoongOutDir,
458 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200459 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800460
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800461 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000462 fs: pathtools.NewOsFs(absSrcDir),
463 mixedBuildDisabledModules: make(map[string]struct{}),
464 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000465 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500466
LaMont Jones52a72432023-03-09 18:19:35 +0000467 MultitreeBuild: cmdArgs.MultitreeBuild,
468 UseBazelProxy: cmdArgs.UseBazelProxy,
Colin Cross68f55102015-03-25 14:43:57 -0700469 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800470
Dan Willemsen00269f22017-07-06 16:59:48 -0700471 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700472 config: config,
473 }
474
Liz Kammer7941b302020-07-28 13:27:34 -0700475 // Soundness check of the build and source directories. This won't catch strange
476 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800477 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700478 if err != nil {
479 return Config{}, err
480 }
481
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200482 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700483 if err != nil {
484 return Config{}, err
485 }
486
487 if strings.HasPrefix(absSrcDir, absBuildDir) {
488 return Config{}, fmt.Errorf("Build dir must not contain source directory")
489 }
490
Colin Cross3f40fa42015-01-30 17:27:36 -0800491 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700492 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800493 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700494 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800495 }
496
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800497 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500498 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
499 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800500 }
501
Colin Cross0c66bc62021-07-20 09:47:41 -0700502 determineBuildOS(config)
503
Jingwen Chenc711fec2020-11-22 23:52:50 -0500504 // Sets up the map of target OSes to the finer grained compilation targets
505 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700506 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700507 if err != nil {
508 return Config{}, err
509 }
510
Paul Duffin1356d8c2020-02-25 19:26:33 +0000511 // Make the CommonOS OsType available for all products.
512 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
513
Dan Albert4098deb2016-10-19 14:04:41 -0700514 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500515 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700516 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000517 } else if config.AmlAbis() {
518 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700519 }
520
521 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500522 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800523 if err != nil {
524 return Config{}, err
525 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700526 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800527 }
528
Colin Cross3b19f5d2019-09-17 14:45:31 -0700529 multilib := make(map[string]bool)
530 for _, target := range targets[Android] {
531 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
532 config.multilibConflicts[target.Arch.ArchType] = true
533 }
534 multilib[target.Arch.ArchType.Multilib] = true
535 }
536
Jingwen Chenc711fec2020-11-22 23:52:50 -0500537 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700538 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500539
540 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700541 config.BuildOSTarget = config.Targets[config.BuildOS][0]
542 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500543
544 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700545 if len(config.Targets[Android]) > 0 {
546 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000547 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700548 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700549
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500550 setBuildMode := func(arg string, mode SoongBuildMode) {
551 if arg != "" {
552 if config.BuildMode != AnalysisNoBazel {
553 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
554 os.Exit(1)
555 }
556 config.BuildMode = mode
557 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800558 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500559 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
560 if arg {
561 if config.BuildMode != AnalysisNoBazel {
562 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
563 os.Exit(1)
564 }
565 config.BuildMode = mode
566 }
567 }
568 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
569 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
570 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
571 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
572 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
573 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
574 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
575 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
576 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800577
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400578 config.BazelContext, err = NewBazelContext(config)
Cole Faust324a92e2022-08-23 15:29:05 -0700579 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
Colin Cross3f40fa42015-01-30 17:27:36 -0800580
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800581 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000582 config.bazelForceEnabledModules[module] = struct{}{}
583 }
584
Jingwen Chenc711fec2020-11-22 23:52:50 -0500585 return Config{config}, err
586}
Colin Cross988414c2020-01-11 01:11:46 +0000587
Colin Cross98be1bb2019-12-13 20:41:13 -0800588// mockFileSystem replaces all reads with accesses to the provided map of
589// filenames to contents stored as a byte slice.
590func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
591 mockFS := map[string][]byte{}
592
593 if _, exists := mockFS["Android.bp"]; !exists {
594 mockFS["Android.bp"] = []byte(bp)
595 }
596
597 for k, v := range fs {
598 mockFS[k] = v
599 }
600
601 // no module list file specified; find every file named Blueprints or Android.bp
602 pathsToParse := []string{}
603 for candidate := range mockFS {
604 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200605 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800606 pathsToParse = append(pathsToParse, candidate)
607 }
608 }
609 if len(pathsToParse) < 1 {
610 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
611 }
612 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
613
614 c.fs = pathtools.MockFs(mockFS)
615 c.mockBpList = blueprint.MockModuleListFile
616}
617
Jason Wuff1bb312022-12-21 09:57:26 -0500618// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
619// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400620// Returns true if "Bazel builds" is enabled. In this mode, part of build
621// analysis is handled by Bazel.
622func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500623 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
624 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500625 return false
626 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500627 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500628 return false
629 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500630 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500631 return false
632 }
633 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500634 return false
635 }
636 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500637 return false
638 }
639 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500640 return false
641 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500642 return true
643 }).(bool)
644
645 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
646 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400647}
648
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100649func (c *config) SetAllowMissingDependencies() {
650 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
651}
652
Jingwen Chenc711fec2020-11-22 23:52:50 -0500653// BlueprintToolLocation returns the directory containing build system tools
654// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200655func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700656 if c.KatiEnabled() {
657 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
658 } else {
659 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
660 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700661}
662
Dan Willemsen60e62f02018-11-16 21:05:32 -0800663func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700664 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
665 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800666}
667
Colin Cross790ef352021-10-25 19:15:55 -0700668func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000669 ext := ".so"
670 if runtime.GOOS == "darwin" {
671 ext = ".dylib"
672 }
Colin Cross790ef352021-10-25 19:15:55 -0700673 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
674 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000675}
676
Colin Crossae5330a2021-11-03 13:31:22 -0700677func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
678 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700679 return path
680}
681
Jingwen Chenc711fec2020-11-22 23:52:50 -0500682// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700683func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800684 switch runtime.GOOS {
685 case "linux":
686 return "linux-x86"
687 case "darwin":
688 return "darwin-x86"
689 default:
690 panic("Unknown GOOS")
691 }
692}
693
694// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700695func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200696 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800697}
698
Jingwen Chenc711fec2020-11-22 23:52:50 -0500699// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
700// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700701func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
702 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
703}
704
Jingwen Chenc711fec2020-11-22 23:52:50 -0500705// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
706// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700707func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700708 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800709 case "darwin":
710 return "-R"
711 case "linux":
712 return "-d"
713 default:
714 return ""
715 }
716}
Colin Cross68f55102015-03-25 14:43:57 -0700717
Colin Cross1332b002015-04-07 17:11:30 -0700718func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700719 var val string
720 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700721 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800722 defer c.envLock.Unlock()
723 if c.envDeps == nil {
724 c.envDeps = make(map[string]string)
725 }
Colin Cross68f55102015-03-25 14:43:57 -0700726 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700727 if c.envFrozen {
728 panic("Cannot access new environment variables after envdeps are frozen")
729 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700730 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700731 c.envDeps[key] = val
732 }
733 return val
734}
735
Colin Cross99d7c232016-11-23 16:52:04 -0800736func (c *config) GetenvWithDefault(key string, defaultValue string) string {
737 ret := c.Getenv(key)
738 if ret == "" {
739 return defaultValue
740 }
741 return ret
742}
743
744func (c *config) IsEnvTrue(key string) bool {
745 value := c.Getenv(key)
746 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
747}
748
749func (c *config) IsEnvFalse(key string) bool {
750 value := c.Getenv(key)
751 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
752}
753
Jingwen Chenc711fec2020-11-22 23:52:50 -0500754// EnvDeps returns the environment variables this build depends on. The first
755// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700756func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700757 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800758 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700759 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700760 return c.envDeps
761}
Colin Cross35cec122015-04-02 14:37:16 -0700762
Jingwen Chencda22c92020-11-23 00:22:30 -0500763func (c *config) KatiEnabled() bool {
764 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800765}
766
Nan Zhang581fd212018-01-10 16:06:12 -0800767func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800768 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800769}
770
Jingwen Chenc711fec2020-11-22 23:52:50 -0500771// BuildNumberFile returns the path to a text file containing metadata
772// representing the current build's number.
773//
774// Rules that want to reference the build number should read from this file
775// without depending on it. They will run whenever their other dependencies
776// require them to run and get the current build number. This ensures they don't
777// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800778func (c *config) BuildNumberFile(ctx PathContext) Path {
779 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800780}
781
Jingwen Chenc711fec2020-11-22 23:52:50 -0500782// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700783// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700784func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800785 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700786}
787
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000788// DeviceProduct returns the current product target. There could be multiple of
789// these per device type.
790//
Chris Parsonsef615e52022-08-18 22:04:11 -0400791// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000792func (c *config) DeviceProduct() string {
793 return *c.productVariables.DeviceProduct
794}
795
Cole Faustb85d1a12022-11-08 18:14:01 -0800796// HasDeviceProduct returns if the build has a product. A build will not
797// necessarily have a product when --skip-config is passed to soong, like it is
798// in prebuilts/build-tools/build-prebuilts.sh
799func (c *config) HasDeviceProduct() bool {
800 return c.productVariables.DeviceProduct != nil
801}
802
Anton Hansson53c88442019-03-18 15:53:16 +0000803func (c *config) DeviceResourceOverlays() []string {
804 return c.productVariables.DeviceResourceOverlays
805}
806
807func (c *config) ProductResourceOverlays() []string {
808 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700809}
810
Colin Crossbfd347d2018-05-09 11:11:35 -0700811func (c *config) PlatformVersionName() string {
812 return String(c.productVariables.Platform_version_name)
813}
814
Dan Albert4f378d72020-07-23 17:32:15 -0700815func (c *config) PlatformSdkVersion() ApiLevel {
816 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700817}
818
Mu-Le Lee5e047532022-07-27 02:32:03 +0000819func (c *config) PlatformSdkFinal() bool {
820 return Bool(c.productVariables.Platform_sdk_final)
821}
822
Colin Crossd09b0b62018-04-18 11:06:47 -0700823func (c *config) PlatformSdkCodename() string {
824 return String(c.productVariables.Platform_sdk_codename)
825}
826
Anton Hansson97d0bae2022-02-16 16:15:10 +0000827func (c *config) PlatformSdkExtensionVersion() int {
828 return *c.productVariables.Platform_sdk_extension_version
829}
830
831func (c *config) PlatformBaseSdkExtensionVersion() int {
832 return *c.productVariables.Platform_base_sdk_extension_version
833}
834
Colin Cross092c9da2019-04-02 22:56:43 -0700835func (c *config) PlatformSecurityPatch() string {
836 return String(c.productVariables.Platform_security_patch)
837}
838
839func (c *config) PlatformPreviewSdkVersion() string {
840 return String(c.productVariables.Platform_preview_sdk_version)
841}
842
843func (c *config) PlatformMinSupportedTargetSdkVersion() string {
844 return String(c.productVariables.Platform_min_supported_target_sdk_version)
845}
846
847func (c *config) PlatformBaseOS() string {
848 return String(c.productVariables.Platform_base_os)
849}
850
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900851func (c *config) PlatformVersionLastStable() string {
852 return String(c.productVariables.Platform_version_last_stable)
853}
854
Jiyong Park37073842022-06-21 10:13:42 +0900855func (c *config) PlatformVersionKnownCodenames() string {
856 return String(c.productVariables.Platform_version_known_codenames)
857}
858
Dan Albert1a246272020-07-06 14:49:35 -0700859func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000860 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700861}
862
863func (c *config) FinalApiLevels() []ApiLevel {
864 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700865 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700866 levels = append(levels, uncheckedFinalApiLevel(i))
867 }
868 return levels
869}
870
871func (c *config) PreviewApiLevels() []ApiLevel {
872 var levels []ApiLevel
873 for i, codename := range c.PlatformVersionActiveCodenames() {
874 levels = append(levels, ApiLevel{
875 value: codename,
876 number: i,
877 isPreview: true,
878 })
879 }
880 return levels
881}
882
satayevcca4ab72021-11-30 12:33:55 +0000883func (c *config) LatestPreviewApiLevel() ApiLevel {
884 level := NoneApiLevel
885 for _, l := range c.PreviewApiLevels() {
886 if l.GreaterThan(level) {
887 level = l
888 }
889 }
890 return level
891}
892
Dan Albert1a246272020-07-06 14:49:35 -0700893func (c *config) AllSupportedApiLevels() []ApiLevel {
894 var levels []ApiLevel
895 levels = append(levels, c.FinalApiLevels()...)
896 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700897}
898
Jingwen Chenc711fec2020-11-22 23:52:50 -0500899// DefaultAppTargetSdk returns the API level that platform apps are targeting.
900// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700901func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000902 // This logic is replicated in starlark, if changing logic here update starlark code too
903 // https://cs.android.com/android/platform/superproject/+/master:build/bazel/rules/common/api.bzl;l=72;drc=231c7e8c8038fd478a79eb68aa5b9f5c64e0e061
Colin Crossd09b0b62018-04-18 11:06:47 -0700904 if Bool(c.productVariables.Platform_sdk_final) {
905 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700906 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500907 codename := c.PlatformSdkCodename()
908 if codename == "" {
909 return NoneApiLevel
910 }
911 if codename == "REL" {
912 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
913 }
914 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700915}
916
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800917func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800918 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800919}
920
Dan Albert31384de2017-07-28 12:39:46 -0700921// Codenames that are active in the current lunch target.
922func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800923 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700924}
925
Colin Crossface4e42017-10-30 17:32:15 -0700926func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800927 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700928}
929
Colin Crossface4e42017-10-30 17:32:15 -0700930func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800931 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700932}
933
Colin Crossface4e42017-10-30 17:32:15 -0700934func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800935 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700936}
937
938func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800939 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700940}
941
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700942func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800943 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800944 if defaultCert != "" {
945 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800946 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500947 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700948}
949
Colin Crosse1731a52017-12-14 11:22:55 -0800950func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800951 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800952 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800953 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800954 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500955 defaultDir := c.DefaultAppCertificateDir(ctx)
956 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700957}
Colin Cross6ff51382015-12-17 16:39:19 -0800958
Jiyong Park9335a262018-12-24 11:31:58 +0900959func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
960 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
961 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700962 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900963 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
964 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800965 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900966 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500967 // If not, APEX keys are under the specified directory
968 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900969}
970
Inseob Kim80fa7982022-08-12 21:36:25 +0900971// Certificate for the NetworkStack sepolicy context
972func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
973 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
974 if cert != "" {
975 return PathForSource(ctx, cert)
976 }
977 return c.DefaultAppCertificateDir(ctx)
978}
979
Jingwen Chenc711fec2020-11-22 23:52:50 -0500980// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
981// are configured to depend on non-existent modules. Note that this does not
982// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800983func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800984 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800985}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800986
Jeongik Cha816a23a2020-07-08 01:09:23 +0900987// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700988func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800989 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700990}
991
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100992// Returns true if building apps that aren't bundled with the platform.
993// UnbundledBuild() is always true when this is true.
994func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -0800995 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100996}
997
Jeongik Cha4b073cd2021-06-08 11:35:00 +0900998// Returns true if building image that aren't bundled with the platform.
999// UnbundledBuild() is always true when this is true.
1000func (c *config) UnbundledBuildImage() bool {
1001 return Bool(c.productVariables.Unbundled_build_image)
1002}
1003
Jeongik Cha816a23a2020-07-08 01:09:23 +09001004// Returns true if building modules against prebuilt SDKs.
1005func (c *config) AlwaysUsePrebuiltSdks() bool {
1006 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001007}
1008
Colin Cross126a25c2017-10-31 13:55:34 -07001009func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001010 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001011}
1012
Colin Crossed064c02018-09-05 16:28:13 -07001013func (c *config) Debuggable() bool {
1014 return Bool(c.productVariables.Debuggable)
1015}
1016
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001017func (c *config) Eng() bool {
1018 return Bool(c.productVariables.Eng)
1019}
1020
Colin Crossc53c37f2021-12-08 15:42:22 -08001021// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1022// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001023func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001024 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1025 return androidTargets[0].Arch.ArchType
1026 }
1027 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001028}
1029
Colin Cross16b23492016-01-06 14:41:07 -08001030func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001031 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001032}
1033
1034func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001035 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001036}
1037
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001038func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001039 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001040}
1041
Colin Cross23ae82a2016-11-02 14:34:39 -07001042func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001043 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001044}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001045
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001046func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001047 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001048 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001049 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001050 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001051}
1052
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001053func (c *config) DisableScudo() bool {
1054 return Bool(c.productVariables.DisableScudo)
1055}
1056
Colin Crossa1ad8d12016-06-01 17:09:44 -07001057func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001058 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001059 if t.Arch.ArchType.Multilib == "lib64" {
1060 return true
1061 }
1062 }
1063
1064 return false
1065}
Colin Cross9272ade2016-08-17 15:24:12 -07001066
Colin Cross9d45bb72016-08-29 16:14:13 -07001067func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001068 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001069}
1070
Ramy Medhatbbf25672019-07-17 12:30:04 +00001071func (c *config) UseRBE() bool {
1072 return Bool(c.productVariables.UseRBE)
1073}
1074
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001075func (c *config) UseRBEJAVAC() bool {
1076 return Bool(c.productVariables.UseRBEJAVAC)
1077}
1078
1079func (c *config) UseRBER8() bool {
1080 return Bool(c.productVariables.UseRBER8)
1081}
1082
1083func (c *config) UseRBED8() bool {
1084 return Bool(c.productVariables.UseRBED8)
1085}
1086
Colin Cross8b8bec32019-11-15 13:18:43 -08001087func (c *config) UseRemoteBuild() bool {
1088 return c.UseGoma() || c.UseRBE()
1089}
1090
Colin Cross66548102018-06-19 22:47:35 -07001091func (c *config) RunErrorProne() bool {
1092 return c.IsEnvTrue("RUN_ERROR_PRONE")
1093}
1094
Jingwen Chenc711fec2020-11-22 23:52:50 -05001095// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001096func (c *config) XrefCorpusName() string {
1097 return c.Getenv("XREF_CORPUS")
1098}
1099
Jingwen Chenc711fec2020-11-22 23:52:50 -05001100// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1101// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001102func (c *config) XrefCuEncoding() string {
1103 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1104 return enc
1105 }
1106 return "json"
1107}
1108
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001109// XrefCuJavaSourceMax returns the maximum number of the Java source files
1110// in a single compilation unit
1111const xrefJavaSourceFileMaxDefault = "1000"
1112
1113func (c Config) XrefCuJavaSourceMax() string {
1114 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1115 if v == "" {
1116 return xrefJavaSourceFileMaxDefault
1117 }
1118 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1119 fmt.Fprintf(os.Stderr,
1120 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1121 err, xrefJavaSourceFileMaxDefault)
1122 return xrefJavaSourceFileMaxDefault
1123 }
1124 return v
1125
1126}
1127
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001128func (c *config) EmitXrefRules() bool {
1129 return c.XrefCorpusName() != ""
1130}
1131
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001132func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001133 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001134}
1135
1136func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001137 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001138 return ""
1139 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001140 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001141}
1142
Colin Cross0f4e0d62016-07-27 10:56:55 -07001143func (c *config) LibartImgHostBaseAddress() string {
1144 return "0x60000000"
1145}
1146
1147func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001148 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001149}
1150
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001151func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001152 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001153}
1154
Jingwen Chenc711fec2020-11-22 23:52:50 -05001155// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1156// but some modules still depend on it.
1157//
1158// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001159func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001160 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001161
Roland Levillainf6cc2612020-07-09 16:58:14 +01001162 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001163 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001164 return true
1165 }
Colin Crossa74ca042019-01-31 14:31:51 -08001166 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001167 }
1168 return false
1169}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001170func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001171 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001172 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001173 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001174 }
1175 return false
1176}
1177
1178func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001179 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001180}
1181
Spandan Dasc5763832022-11-08 18:42:16 +00001182func (c *config) IncludeTags() []string {
1183 return c.productVariables.IncludeTags
1184}
1185
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001186func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001187 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001188}
1189
Colin Cross5a0dcd52018-10-05 14:20:06 -07001190func (c *config) UncompressPrivAppDex() bool {
1191 return Bool(c.productVariables.UncompressPrivAppDex)
1192}
1193
1194func (c *config) ModulesLoadedByPrivilegedModules() []string {
1195 return c.productVariables.ModulesLoadedByPrivilegedModules
1196}
1197
Jingwen Chenc711fec2020-11-22 23:52:50 -05001198// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1199// the output directory, if it was created during the product configuration
1200// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001201func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001202 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001203 return OptionalPathForPath(nil)
1204 }
1205 return OptionalPathForPath(
1206 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1207}
1208
Jingwen Chenc711fec2020-11-22 23:52:50 -05001209// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1210// configuration. Since the configuration file was created by Kati during
1211// product configuration (externally of soong_build), it's not tracked, so we
1212// also manually add a Ninja file dependency on the configuration file to the
1213// rule that creates the main build.ninja file. This ensures that build.ninja is
1214// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001215func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1216 path := c.DexpreoptGlobalConfigPath(ctx)
1217 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001218 return nil, nil
1219 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001220 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001221 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001222}
1223
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001224func (c *deviceConfig) WithDexpreopt() bool {
1225 return c.config.productVariables.WithDexpreopt
1226}
1227
Colin Cross662d6142022-11-03 20:38:01 -07001228func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001229 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001230}
1231
Inseob Kimae553032019-05-14 18:52:49 +09001232func (c *config) VndkSnapshotBuildArtifacts() bool {
1233 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1234}
1235
Colin Cross3b19f5d2019-09-17 14:45:31 -07001236func (c *config) HasMultilibConflict(arch ArchType) bool {
1237 return c.multilibConflicts[arch]
1238}
1239
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001240func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001241 return String(c.productVariables.PrebuiltHiddenApiDir)
1242}
1243
MarkDacekd06db5d2022-11-29 00:47:59 +00001244func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1245 return c.bazelForceEnabledModules
1246}
1247
Colin Cross9272ade2016-08-17 15:24:12 -07001248func (c *deviceConfig) Arches() []Arch {
1249 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001250 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001251 arches = append(arches, target.Arch)
1252 }
1253 return arches
1254}
Dan Willemsend2ede872016-11-18 14:54:24 -08001255
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001256func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001257 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001258 if is32BitBinder != nil && *is32BitBinder {
1259 return "32"
1260 }
1261 return "64"
1262}
1263
Dan Willemsen4353bc42016-12-05 17:16:02 -08001264func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001265 if c.config.productVariables.VendorPath != nil {
1266 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001267 }
1268 return "vendor"
1269}
1270
Justin Yun71549282017-11-17 12:10:28 +09001271func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001272 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001273}
1274
Jose Galmes6f843bc2020-12-11 13:36:29 -08001275func (c *deviceConfig) RecoverySnapshotVersion() string {
1276 return String(c.config.productVariables.RecoverySnapshotVersion)
1277}
1278
Jeongik Cha219141c2020-08-06 23:00:37 +09001279func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1280 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1281}
1282
Justin Yun8fe12122017-12-07 17:18:15 +09001283func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001284 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001285}
1286
Justin Yun5f7f7e82019-11-18 19:52:14 +09001287func (c *deviceConfig) ProductVndkVersion() string {
1288 return String(c.config.productVariables.ProductVndkVersion)
1289}
1290
Justin Yun71549282017-11-17 12:10:28 +09001291func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001292 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001293}
Jack He8cc71432016-12-08 15:45:07 -08001294
Vic Yangefd249e2018-11-12 20:19:56 -08001295func (c *deviceConfig) VndkUseCoreVariant() bool {
1296 return Bool(c.config.productVariables.VndkUseCoreVariant)
1297}
1298
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001299func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001300 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001301}
1302
1303func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001304 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001305}
1306
Jiyong Park2db76922017-11-08 16:03:48 +09001307func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001308 if c.config.productVariables.OdmPath != nil {
1309 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001310 }
1311 return "odm"
1312}
1313
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001314func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001315 if c.config.productVariables.ProductPath != nil {
1316 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001317 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001318 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001319}
1320
Justin Yund5f6c822019-06-25 16:47:17 +09001321func (c *deviceConfig) SystemExtPath() string {
1322 if c.config.productVariables.SystemExtPath != nil {
1323 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001324 }
Justin Yund5f6c822019-06-25 16:47:17 +09001325 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001326}
1327
Jack He8cc71432016-12-08 15:45:07 -08001328func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001329 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001330}
Dan Willemsen581341d2017-02-09 16:16:31 -08001331
Jiyong Parkd773eb32017-07-03 13:18:12 +09001332func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001333 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001334}
1335
Roland Levillainada12702020-06-09 13:07:36 +01001336// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1337// path. Coverage is enabled by default when the product variable
1338// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1339// enabled for any path which is part of this variable (and not part of the
1340// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1341// represents any path.
1342func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1343 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001344 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001345 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1346 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1347 coverage = true
1348 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001349 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001350 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1351 coverage = false
1352 }
1353 }
1354 return coverage
1355}
1356
Colin Cross1a6acd42020-06-16 17:51:46 -07001357// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001358func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001359 return Bool(c.config.productVariables.GcovCoverage) ||
1360 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001361}
1362
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001363func (c *deviceConfig) ClangCoverageEnabled() bool {
1364 return Bool(c.config.productVariables.ClangCoverage)
1365}
1366
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001367func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1368 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1369}
1370
Colin Cross1a6acd42020-06-16 17:51:46 -07001371func (c *deviceConfig) GcovCoverageEnabled() bool {
1372 return Bool(c.config.productVariables.GcovCoverage)
1373}
1374
Roland Levillain4f5297b2020-06-09 12:44:06 +01001375// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1376// code coverage is enabled for path. By default, coverage is not enabled for a
1377// given path unless it is part of the NativeCoveragePaths product variable (and
1378// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1379// NativeCoveragePaths represents any path.
1380func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001381 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001382 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001383 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001384 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001385 }
1386 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001387 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001388 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001389 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001390 }
1391 }
1392 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001393}
Ivan Lozano5f595532017-07-13 14:46:05 -07001394
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001395func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001396 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001397}
1398
Tri Vo35a51432018-03-25 20:00:00 -07001399func (c *deviceConfig) VendorSepolicyDirs() []string {
1400 return c.config.productVariables.BoardVendorSepolicyDirs
1401}
1402
1403func (c *deviceConfig) OdmSepolicyDirs() []string {
1404 return c.config.productVariables.BoardOdmSepolicyDirs
1405}
1406
Felixa20a8752020-05-17 18:28:35 +02001407func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1408 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001409}
1410
Felixa20a8752020-05-17 18:28:35 +02001411func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1412 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001413}
1414
Inseob Kim0866b002019-04-15 20:21:29 +09001415func (c *deviceConfig) SepolicyM4Defs() []string {
1416 return c.config.productVariables.BoardSepolicyM4Defs
1417}
1418
Jiyong Park7f67f482019-01-05 12:57:48 +09001419func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001420 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1421 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1422}
1423
1424func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001425 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001426 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1427}
1428
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001429func (c *deviceConfig) OverridePackageNameFor(name string) string {
1430 newName, overridden := findOverrideValue(
1431 c.config.productVariables.PackageNameOverrides,
1432 name,
1433 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1434 if overridden {
1435 return newName
1436 }
1437 return name
1438}
1439
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001440func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001441 if overrides == nil || len(overrides) == 0 {
1442 return "", false
1443 }
1444 for _, o := range overrides {
1445 split := strings.Split(o, ":")
1446 if len(split) != 2 {
1447 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001448 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001449 }
1450 if matchPattern(split[0], name) {
1451 return substPattern(split[0], split[1], name), true
1452 }
1453 }
1454 return "", false
1455}
1456
Albert Martineefabcf2022-03-21 20:11:16 +00001457func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1458 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1459}
1460
Ivan Lozano5f595532017-07-13 14:46:05 -07001461func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001462 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001463 return false
1464 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001465 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001466}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001467
1468func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001469 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001470 return false
1471 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001472 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001473}
1474
1475func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001476 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001477 return false
1478 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001479 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001480}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001481
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001482func (c *config) MemtagHeapDisabledForPath(path string) bool {
1483 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1484 return false
1485 }
1486 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1487}
1488
1489func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1490 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1491 return false
1492 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001493 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001494}
1495
1496func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1497 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1498 return false
1499 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001500 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001501}
1502
Dan Willemsen0fe78662018-03-26 12:41:18 -07001503func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001504 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001505}
1506
Colin Cross395f2cf2018-10-24 16:10:32 -07001507func (c *config) NdkAbis() bool {
1508 return Bool(c.productVariables.Ndk_abis)
1509}
1510
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001511func (c *config) AmlAbis() bool {
1512 return Bool(c.productVariables.Aml_abis)
1513}
1514
Jiyong Park8fd61922018-11-08 02:50:25 +09001515func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001516 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001517}
1518
Jiyong Park4da07972021-01-05 21:01:11 +09001519func (c *config) ForceApexSymlinkOptimization() bool {
1520 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1521}
1522
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001523func (c *config) ApexCompressionEnabled() bool {
1524 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001525}
1526
Dennis Shene2ed70c2023-01-11 14:15:43 +00001527func (c *config) ApexTrimEnabled() bool {
1528 return Bool(c.productVariables.TrimmedApex)
1529}
1530
Jeongik Chac9464142019-01-07 12:07:27 +09001531func (c *config) EnforceSystemCertificate() bool {
1532 return Bool(c.productVariables.EnforceSystemCertificate)
1533}
1534
Colin Cross440e0d02020-06-11 11:32:11 -07001535func (c *config) EnforceSystemCertificateAllowList() []string {
1536 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001537}
1538
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001539func (c *config) EnforceProductPartitionInterface() bool {
1540 return Bool(c.productVariables.EnforceProductPartitionInterface)
1541}
1542
JaeMan Parkff715562020-10-19 17:25:58 +09001543func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1544 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1545}
1546
1547func (c *config) InterPartitionJavaLibraryAllowList() []string {
1548 return c.productVariables.InterPartitionJavaLibraryAllowList
1549}
1550
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001551func (c *config) InstallExtraFlattenedApexes() bool {
1552 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1553}
1554
Colin Crossf24a22a2019-01-31 14:12:44 -08001555func (c *config) ProductHiddenAPIStubs() []string {
1556 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001557}
1558
Colin Crossf24a22a2019-01-31 14:12:44 -08001559func (c *config) ProductHiddenAPIStubsSystem() []string {
1560 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001561}
1562
Colin Crossf24a22a2019-01-31 14:12:44 -08001563func (c *config) ProductHiddenAPIStubsTest() []string {
1564 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001565}
Dan Willemsen71c74602019-04-10 12:27:35 -07001566
Dan Willemsen54879d12019-04-18 10:08:46 -07001567func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001568 return c.config.productVariables.TargetFSConfigGen
1569}
Inseob Kim0866b002019-04-15 20:21:29 +09001570
1571func (c *config) ProductPublicSepolicyDirs() []string {
1572 return c.productVariables.ProductPublicSepolicyDirs
1573}
1574
1575func (c *config) ProductPrivateSepolicyDirs() []string {
1576 return c.productVariables.ProductPrivateSepolicyDirs
1577}
1578
Colin Cross50ddcc42019-05-16 12:28:22 -07001579func (c *config) MissingUsesLibraries() []string {
1580 return c.productVariables.MissingUsesLibraries
1581}
1582
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001583func (c *config) TargetMultitreeUpdateMeta() bool {
1584 return c.productVariables.MultitreeUpdateMeta
1585}
1586
Inseob Kim1f086e22019-05-09 13:29:15 +09001587func (c *deviceConfig) DeviceArch() string {
1588 return String(c.config.productVariables.DeviceArch)
1589}
1590
1591func (c *deviceConfig) DeviceArchVariant() string {
1592 return String(c.config.productVariables.DeviceArchVariant)
1593}
1594
1595func (c *deviceConfig) DeviceSecondaryArch() string {
1596 return String(c.config.productVariables.DeviceSecondaryArch)
1597}
1598
1599func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1600 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1601}
Yifan Hong82db7352020-01-21 16:12:26 -08001602
1603func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1604 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1605}
Yifan Hong97365ee2020-07-29 09:51:57 -07001606
1607func (c *deviceConfig) BoardKernelBinaries() []string {
1608 return c.config.productVariables.BoardKernelBinaries
1609}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001610
Yifan Hong42bef8d2020-08-05 14:36:09 -07001611func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1612 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1613}
1614
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001615func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1616 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1617}
1618
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001619func (c *deviceConfig) PlatformSepolicyVersion() string {
1620 return String(c.config.productVariables.PlatformSepolicyVersion)
1621}
1622
Inseob Kima10ef272021-09-15 03:04:53 +00001623func (c *deviceConfig) TotSepolicyVersion() string {
1624 return String(c.config.productVariables.TotSepolicyVersion)
1625}
1626
Inseob Kim843f6642022-01-07 09:11:23 +09001627func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1628 return c.config.productVariables.PlatformSepolicyCompatVersions
1629}
1630
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001631func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001632 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1633 return ver
1634 }
1635 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001636}
1637
Inseob Kim14178802021-12-08 22:53:31 +09001638func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1639 return c.config.productVariables.BoardPlatVendorPolicy
1640}
1641
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001642func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1643 return c.config.productVariables.BoardReqdMaskPolicy
1644}
1645
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001646func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1647 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1648}
1649
1650func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1651 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1652}
1653
1654func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1655 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1656}
1657
1658func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1659 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1660}
1661
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001662func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1663 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1664}
1665
1666func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1667 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1668}
1669
1670func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1671 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1672}
1673
Inseob Kim7cf14652021-01-06 23:06:52 +09001674func (c *deviceConfig) DirectedVendorSnapshot() bool {
1675 return c.config.productVariables.DirectedVendorSnapshot
1676}
1677
1678func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1679 return c.config.productVariables.VendorSnapshotModules
1680}
1681
Jose Galmes4c6895e2021-02-09 07:44:30 -08001682func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1683 return c.config.productVariables.DirectedRecoverySnapshot
1684}
1685
1686func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1687 return c.config.productVariables.RecoverySnapshotModules
1688}
1689
Justin DeMartino383bfb32021-02-24 10:49:43 -08001690func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1691 var ret = make(map[string]bool)
1692 for _, dir := range dirs {
1693 clean := filepath.Clean(dir)
1694 if previous[clean] || ret[clean] {
1695 return nil, fmt.Errorf("Duplicate entry %s", dir)
1696 }
1697 ret[clean] = true
1698 }
1699 return ret, nil
1700}
1701
1702func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1703 dirMap := c.Once(onceKey, func() interface{} {
1704 ret, err := createDirsMap(previous, dirs)
1705 if err != nil {
1706 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1707 }
1708 return ret
1709 })
1710 if dirMap == nil {
1711 return nil
1712 }
1713 return dirMap.(map[string]bool)
1714}
1715
1716var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1717
1718func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1719 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1720 c.config.productVariables.VendorSnapshotDirsExcluded)
1721}
1722
1723var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1724
1725func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1726 excludedMap := c.VendorSnapshotDirsExcludedMap()
1727 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1728 c.config.productVariables.VendorSnapshotDirsIncluded)
1729}
1730
1731var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1732
1733func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1734 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1735 c.config.productVariables.RecoverySnapshotDirsExcluded)
1736}
1737
1738var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1739
1740func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1741 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1742 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1743 c.config.productVariables.RecoverySnapshotDirsIncluded)
1744}
1745
Rob Seymour925aa092021-08-10 20:42:03 +00001746func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1747 return c.config.productVariables.HostFakeSnapshotEnabled
1748}
1749
Inseob Kim60c32f02020-12-21 22:53:05 +09001750func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1751 if c.config.productVariables.ShippingApiLevel == nil {
1752 return NoneApiLevel
1753 }
1754 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1755 return uncheckedFinalApiLevel(apiLevel)
1756}
1757
Alix Espinoef47e542022-09-14 19:10:51 +00001758func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1759 return c.config.productVariables.BuildBrokenClangAsFlags
1760}
1761
1762func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1763 return c.config.productVariables.BuildBrokenClangCFlags
1764}
1765
Alixb5f6d9e2022-04-20 23:00:58 +00001766func (c *deviceConfig) BuildBrokenClangProperty() bool {
1767 return c.config.productVariables.BuildBrokenClangProperty
1768}
1769
Inseob Kim67e5add192021-03-17 18:05:33 +09001770func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1771 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1772}
1773
1774func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1775 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1776}
1777
Cole Faustedc4c502022-09-09 19:39:25 -07001778func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1779 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1780}
1781
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001782func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1783 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1784}
1785
Inseob Kim0cac7b42021-02-03 18:16:46 +09001786func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1787 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1788}
1789
Liz Kammer619be462022-01-28 15:13:39 -05001790func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1791 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1792}
1793
Vinh Tran140d5882022-06-10 14:23:27 -04001794func (c *deviceConfig) BuildBrokenDepfile() bool {
1795 return Bool(c.config.productVariables.BuildBrokenDepfile)
1796}
1797
Inseob Kim67e5add192021-03-17 18:05:33 +09001798func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1799 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1800}
1801
1802func (c *config) SelinuxIgnoreNeverallows() bool {
1803 return c.productVariables.SelinuxIgnoreNeverallows
1804}
1805
1806func (c *deviceConfig) SepolicySplit() bool {
1807 return c.config.productVariables.SepolicySplit
1808}
1809
Inseob Kima10ef272021-09-15 03:04:53 +00001810func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1811 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1812}
1813
1814func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1815 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1816}
1817
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001818func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1819 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1820}
1821
Christopher Ferris98f10222022-07-13 23:16:52 -07001822func (c *config) IgnorePrefer32OnDevice() bool {
1823 return c.productVariables.IgnorePrefer32OnDevice
1824}
1825
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001826func (c *config) BootJars() []string {
1827 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001828 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001829 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001830 }).([]string)
1831}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001832
satayevd604b212021-07-21 14:23:52 +01001833func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001834 return c.productVariables.BootJars
1835}
1836
satayevd604b212021-07-21 14:23:52 +01001837func (c *config) ApexBootJars() ConfiguredJarList {
1838 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001839}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001840
1841func (c *config) RBEWrapper() string {
1842 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1843}
Colin Cross9b698b62021-12-22 09:55:32 -08001844
1845// UseHostMusl returns true if the host target has been configured to build against musl libc.
1846func (c *config) UseHostMusl() bool {
1847 return Bool(c.productVariables.HostMusl)
1848}
MarkDacekff851b82022-04-21 18:33:17 +00001849
Chris Parsonsf874e462022-05-10 13:50:12 -04001850func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001851 moduleName := ctx.Module().Name()
1852 c.mixedBuildsLock.Lock()
1853 defer c.mixedBuildsLock.Unlock()
1854 if useBazel {
1855 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1856 } else {
1857 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1858 }
1859}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001860
1861// ApiSurfaces directory returns the source path inside the api_surfaces repo
1862// (relative to workspace root).
1863func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1864 return filepath.Join(
1865 "build",
1866 "bazel",
1867 "api_surfaces",
1868 s.String(),
1869 version)
1870}