blob: 1f90ad7bd64e6e02d2178be015a172a0363c5031 [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
Jingwen Chenc711fec2020-11-22 23:52:50 -050055// FutureApiLevel represents unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070056var FutureApiLevel = ApiLevel{
57 value: "current",
58 number: FutureApiLevelInt,
59 isPreview: true,
60}
Colin Cross6ff51382015-12-17 16:39:19 -080061
Jingwen Chenc4d91bc2020-11-24 22:59:26 -050062// The product variables file name, containing product config from Kati.
Dan Willemsen87b17d12015-07-14 00:39:06 -070063const productVariablesFileName = "soong.variables"
Colin Cross3f40fa42015-01-30 17:27:36 -080064
Colin Cross9272ade2016-08-17 15:24:12 -070065// A Config object represents the entire build configuration for Android.
Colin Crossc3c0a492015-04-10 15:43:55 -070066type Config struct {
67 *config
68}
69
Chris Parsonsad876012022-08-20 14:48:32 -040070type SoongBuildMode int
71
Sasha Smundakaf5ca922022-12-12 21:23:34 -080072type CmdArgs struct {
73 bootstrap.Args
74 RunGoTests bool
75 OutDir string
76 SoongOutDir string
77
78 SymlinkForestMarker string
79 Bp2buildMarker string
80 BazelQueryViewDir string
81 BazelApiBp2buildDir string
82 ModuleGraphFile string
83 ModuleActionsFile string
84 DocFile string
85
86 BazelMode bool
87 BazelModeDev bool
88 BazelModeStaging bool
89 BazelForceEnabledModules string
Chris Parsons9402ca82023-02-23 17:28:06 -050090
91 UseBazelProxy bool
Sasha Smundakaf5ca922022-12-12 21:23:34 -080092}
93
Chris Parsonsad876012022-08-20 14:48:32 -040094// Build modes that soong_build can run as.
95const (
96 // Don't use bazel at all during module analysis.
97 AnalysisNoBazel SoongBuildMode = iota
98
Lukacs T. Berkic541cd22022-10-26 07:26:50 +000099 // Symlink fores mode: merge two directory trees into a symlink forest
100 SymlinkForest
101
Chris Parsonsad876012022-08-20 14:48:32 -0400102 // Bp2build mode: Generate BUILD files from blueprint files and exit.
103 Bp2build
104
105 // Generate BUILD files which faithfully represent the dependency graph of
106 // blueprint modules. Individual BUILD targets will not, however, faitfhully
107 // express build semantics.
108 GenerateQueryView
109
Spandan Das5af0bd32022-09-28 20:43:08 +0000110 // Generate BUILD files for API contributions to API surfaces
111 ApiBp2build
112
Chris Parsonsad876012022-08-20 14:48:32 -0400113 // Create a JSON representation of the module graph and exit.
114 GenerateModuleGraph
115
116 // Generate a documentation file for module type definitions and exit.
117 GenerateDocFile
118
119 // Use bazel during analysis of many allowlisted build modules. The allowlist
120 // is considered a "developer mode" allowlist, as some modules may be
121 // allowlisted on an experimental basis.
122 BazelDevMode
123
MarkDacekb78465d2022-10-18 20:10:16 +0000124 // Use bazel during analysis of a few allowlisted build modules. The allowlist
125 // is considered "staging, as these are modules being prepared to be released
126 // into prod mode shortly after.
127 BazelStagingMode
128
Chris Parsonsad876012022-08-20 14:48:32 -0400129 // Use bazel during analysis of build modules from an allowlist carefully
130 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400131 BazelProdMode
132)
133
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200134// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200135func (c Config) SoongOutDir() string {
136 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700137}
138
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200139func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200140 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100141}
142
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200143func (c Config) RunGoTests() bool {
144 return c.runGoTests
145}
146
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100147func (c Config) DebugCompilation() bool {
148 return false // Never compile Go code in the main build for debugging
149}
150
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200151func (c Config) Subninjas() []string {
152 return []string{}
153}
154
155func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
156 return []bootstrap.PrimaryBuilderInvocation{}
157}
158
Paul Duffin74135582022-10-06 11:01:59 +0100159// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
160func (c Config) RunningInsideUnitTest() bool {
161 return c.config.TestProductVariables != nil
162}
163
Jingwen Chenc711fec2020-11-22 23:52:50 -0500164// A DeviceConfig object represents the configuration for a particular device
165// being built. For now there will only be one of these, but in the future there
166// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700167type DeviceConfig struct {
168 *deviceConfig
169}
170
Jingwen Chenc711fec2020-11-22 23:52:50 -0500171// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800172type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700173
Jingwen Chenc711fec2020-11-22 23:52:50 -0500174// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500175// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700176type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500177 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800178 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800179
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700180 // Only available on configs created by TestConfig
181 TestProductVariables *productVariables
182
Jingwen Chenc711fec2020-11-22 23:52:50 -0500183 // A specialized context object for Bazel/Soong mixed builds and migration
184 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400185 BazelContext BazelContext
186
Dan Willemsen87b17d12015-07-14 00:39:06 -0700187 ProductVariablesFileName string
188
Colin Cross0c66bc62021-07-20 09:47:41 -0700189 // BuildOS stores the OsType for the OS that the build is running on.
190 BuildOS OsType
191
192 // BuildArch stores the ArchType for the CPU that the build is running on.
193 BuildArch ArchType
194
Jaewoong Jung642916f2020-10-09 17:25:15 -0700195 Targets map[OsType][]Target
196 BuildOSTarget Target // the Target for tools run on the build machine
197 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
198 AndroidCommonTarget Target // the Target for common modules for the Android device
199 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700200
Jingwen Chenc711fec2020-11-22 23:52:50 -0500201 // multilibConflicts for an ArchType is true if there is earlier configured
202 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700203 multilibConflicts map[ArchType]bool
204
Colin Cross9272ade2016-08-17 15:24:12 -0700205 deviceConfig *deviceConfig
206
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200207 outDir string // The output directory (usually out/)
208 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400209 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700210
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200211 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200212
Colin Cross6ccbc912017-10-10 23:07:38 -0700213 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700214 envLock sync.Mutex
215 envDeps map[string]string
216 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800217
Jingwen Chencda22c92020-11-23 00:22:30 -0500218 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
219 // runs standalone.
220 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700221
Colin Cross32616ed2017-09-05 21:56:44 -0700222 captureBuild bool // true for tests, saves build parameters for each module
223 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700224
Colin Cross98be1bb2019-12-13 20:41:13 -0800225 fs pathtools.FileSystem
226 mockBpList string
227
Chris Parsonsad876012022-08-20 14:48:32 -0400228 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700229 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000230 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500231
Colin Cross5e6a7972020-06-07 16:56:32 -0700232 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
233 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000234 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700235
Jingwen Chenc711fec2020-11-22 23:52:50 -0500236 // The list of files that when changed, must invalidate soong_build to
237 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700238 ninjaFileDepsSet sync.Map
239
Colin Cross9272ade2016-08-17 15:24:12 -0700240 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000241
Chris Parsonsad876012022-08-20 14:48:32 -0400242 // These fields are only used for metrics collection. A module should be added
243 // to these maps only if its implementation supports Bazel handling in mixed
244 // builds. A module being in the "enabled" list indicates that there is a
245 // variant of that module for which bazel-handling actually took place.
246 // A module being in the "disabled" list indicates that there is a variant of
247 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000248 mixedBuildsLock sync.Mutex
249 mixedBuildEnabledModules map[string]struct{}
250 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000251
252 // These are modules to be built with Bazel beyond the allowlisted/build-mode
253 // specified modules. They are passed via the command-line flag
254 // "--bazel-force-enabled-modules"
255 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500256
257 // If true, for any requests to Bazel, communicate with a Bazel proxy using
258 // unix sockets, instead of spawning Bazel as a subprocess.
259 UseBazelProxy bool
Colin Cross9272ade2016-08-17 15:24:12 -0700260}
261
262type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700263 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700264 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800265}
266
Colin Cross485e5722015-08-27 13:28:01 -0700267type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700268 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700269}
Colin Cross3f40fa42015-01-30 17:27:36 -0800270
Colin Cross485e5722015-08-27 13:28:01 -0700271func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000272 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700273}
274
Jingwen Chenc711fec2020-11-22 23:52:50 -0500275// loadFromConfigFile loads and decodes configuration options from a JSON file
276// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400277func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800278 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700279 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800280 defer configFileReader.Close()
281 if os.IsNotExist(err) {
282 // Need to create a file, so that blueprint & ninja don't get in
283 // a dependency tracking loop.
284 // Make a file-configurable-options with defaults, write it out using
285 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700286 configurable.SetDefaultConfig()
287 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800288 if err != nil {
289 return err
290 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800291 } else if err != nil {
292 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800293 } else {
294 // Make a decoder for it
295 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700296 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800297 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800298 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800299 }
300 }
301
Liz Kammer09f947d2021-05-12 14:51:49 -0400302 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
303 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
304 }
305
306 configurable.Native_coverage = proptools.BoolPtr(
307 Bool(configurable.GcovCoverage) ||
308 Bool(configurable.ClangCoverage))
309
Yuntao Xu402e9b02021-08-09 15:44:44 -0700310 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
311 // if false (pre-released version, for example), use Platform_sdk_codename.
312 if Bool(configurable.Platform_sdk_final) {
313 if configurable.Platform_sdk_version != nil {
314 configurable.Platform_sdk_version_or_codename =
315 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
316 } else {
317 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
318 }
319 } else {
320 configurable.Platform_sdk_version_or_codename =
321 proptools.StringPtr(String(configurable.Platform_sdk_codename))
322 }
323
Liz Kammer09f947d2021-05-12 14:51:49 -0400324 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800325}
326
Colin Crossd8f20142016-11-03 09:43:26 -0700327// atomically writes the config file in case two copies of soong_build are running simultaneously
328// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400329func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800330 data, err := json.MarshalIndent(&config, "", " ")
331 if err != nil {
332 return fmt.Errorf("cannot marshal config data: %s", err.Error())
333 }
334
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800335 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800336 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500337 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800338 }
Colin Crossd8f20142016-11-03 09:43:26 -0700339 defer os.Remove(f.Name())
340 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800341
Colin Crossd8f20142016-11-03 09:43:26 -0700342 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800343 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700344 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
345 }
346
Colin Crossd8f20142016-11-03 09:43:26 -0700347 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700348 if err != nil {
349 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800350 }
351
Colin Crossd8f20142016-11-03 09:43:26 -0700352 f.Close()
353 os.Rename(f.Name(), filename)
354
Colin Cross3f40fa42015-01-30 17:27:36 -0800355 return nil
356}
357
Liz Kammer09f947d2021-05-12 14:51:49 -0400358func saveToBazelConfigFile(config *productVariables, outDir string) error {
359 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
360 err := createDirIfNonexistent(dir, os.ModePerm)
361 if err != nil {
362 return fmt.Errorf("Could not create dir %s: %s", dir, err)
363 }
364
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000365 nonArchVariantProductVariables := []string{}
366 archVariantProductVariables := []string{}
367 p := variableProperties{}
368 t := reflect.TypeOf(p.Product_variables)
369 for i := 0; i < t.NumField(); i++ {
370 f := t.Field(i)
371 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
372 if proptools.HasTag(f, "android", "arch_variant") {
373 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
374 }
375 }
376
Liz Kammer72beb342022-02-03 08:42:10 -0500377 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000378 if err != nil {
379 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
380 }
381
Liz Kammer72beb342022-02-03 08:42:10 -0500382 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000383 if err != nil {
384 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
385 }
386
387 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400388 if err != nil {
389 return fmt.Errorf("cannot marshal config data: %s", err.Error())
390 }
Cole Faust082c5f32022-08-04 15:49:20 -0700391 // The backslashes need to be escaped because this text is going to be put
392 // inside a Starlark string literal.
393 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400394
395 bzl := []string{
396 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000397 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
398 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
399 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
400 "\n", `
401product_vars = _product_vars
402product_var_constraints = _product_var_constraints
403arch_variant_product_var_constraints = _arch_variant_product_var_constraints
404`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400405 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500406 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
407 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400408 if err != nil {
409 return fmt.Errorf("Could not write .bzl config file %s", err)
410 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500411 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
412 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400413 if err != nil {
414 return fmt.Errorf("Could not write BUILD config file %s", err)
415 }
416
417 return nil
418}
419
Colin Cross988414c2020-01-11 01:11:46 +0000420// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
421// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200422func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000423 return Config{
424 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200425 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200426 soongOutDir: soongOutDir,
427 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000428 },
429 }
430}
431
Jingwen Chenc711fec2020-11-22 23:52:50 -0500432// NewConfig creates a new Config object. The srcDir argument specifies the path
433// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800434func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500435 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700436 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800437 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700438
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200439 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700440
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800441 outDir: cmdArgs.OutDir,
442 soongOutDir: cmdArgs.SoongOutDir,
443 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200444 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800445
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800446 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000447 fs: pathtools.NewOsFs(absSrcDir),
448 mixedBuildDisabledModules: make(map[string]struct{}),
449 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000450 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500451
452 UseBazelProxy: cmdArgs.UseBazelProxy,
Colin Cross68f55102015-03-25 14:43:57 -0700453 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800454
Dan Willemsen00269f22017-07-06 16:59:48 -0700455 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700456 config: config,
457 }
458
Liz Kammer7941b302020-07-28 13:27:34 -0700459 // Soundness check of the build and source directories. This won't catch strange
460 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800461 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700462 if err != nil {
463 return Config{}, err
464 }
465
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200466 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700467 if err != nil {
468 return Config{}, err
469 }
470
471 if strings.HasPrefix(absSrcDir, absBuildDir) {
472 return Config{}, fmt.Errorf("Build dir must not contain source directory")
473 }
474
Colin Cross3f40fa42015-01-30 17:27:36 -0800475 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700476 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800477 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700478 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800479 }
480
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800481 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500482 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
483 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800484 }
485
Colin Cross0c66bc62021-07-20 09:47:41 -0700486 determineBuildOS(config)
487
Jingwen Chenc711fec2020-11-22 23:52:50 -0500488 // Sets up the map of target OSes to the finer grained compilation targets
489 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700490 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700491 if err != nil {
492 return Config{}, err
493 }
494
Paul Duffin1356d8c2020-02-25 19:26:33 +0000495 // Make the CommonOS OsType available for all products.
496 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
497
Dan Albert4098deb2016-10-19 14:04:41 -0700498 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500499 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700500 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000501 } else if config.AmlAbis() {
502 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700503 }
504
505 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500506 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800507 if err != nil {
508 return Config{}, err
509 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700510 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800511 }
512
Colin Cross3b19f5d2019-09-17 14:45:31 -0700513 multilib := make(map[string]bool)
514 for _, target := range targets[Android] {
515 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
516 config.multilibConflicts[target.Arch.ArchType] = true
517 }
518 multilib[target.Arch.ArchType.Multilib] = true
519 }
520
Jingwen Chenc711fec2020-11-22 23:52:50 -0500521 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700522 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500523
524 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700525 config.BuildOSTarget = config.Targets[config.BuildOS][0]
526 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500527
528 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700529 if len(config.Targets[Android]) > 0 {
530 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000531 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700532 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700533
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500534 setBuildMode := func(arg string, mode SoongBuildMode) {
535 if arg != "" {
536 if config.BuildMode != AnalysisNoBazel {
537 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
538 os.Exit(1)
539 }
540 config.BuildMode = mode
541 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800542 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500543 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
544 if arg {
545 if config.BuildMode != AnalysisNoBazel {
546 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
547 os.Exit(1)
548 }
549 config.BuildMode = mode
550 }
551 }
552 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
553 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
554 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
555 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
556 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
557 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
558 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
559 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
560 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800561
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400562 config.BazelContext, err = NewBazelContext(config)
Cole Faust324a92e2022-08-23 15:29:05 -0700563 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
Colin Cross3f40fa42015-01-30 17:27:36 -0800564
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800565 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000566 config.bazelForceEnabledModules[module] = struct{}{}
567 }
568
Jingwen Chenc711fec2020-11-22 23:52:50 -0500569 return Config{config}, err
570}
Colin Cross988414c2020-01-11 01:11:46 +0000571
Colin Cross98be1bb2019-12-13 20:41:13 -0800572// mockFileSystem replaces all reads with accesses to the provided map of
573// filenames to contents stored as a byte slice.
574func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
575 mockFS := map[string][]byte{}
576
577 if _, exists := mockFS["Android.bp"]; !exists {
578 mockFS["Android.bp"] = []byte(bp)
579 }
580
581 for k, v := range fs {
582 mockFS[k] = v
583 }
584
585 // no module list file specified; find every file named Blueprints or Android.bp
586 pathsToParse := []string{}
587 for candidate := range mockFS {
588 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200589 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800590 pathsToParse = append(pathsToParse, candidate)
591 }
592 }
593 if len(pathsToParse) < 1 {
594 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
595 }
596 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
597
598 c.fs = pathtools.MockFs(mockFS)
599 c.mockBpList = blueprint.MockModuleListFile
600}
601
Jason Wuff1bb312022-12-21 09:57:26 -0500602// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
603// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400604// Returns true if "Bazel builds" is enabled. In this mode, part of build
605// analysis is handled by Bazel.
606func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500607 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
608 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500609 return false
610 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500611 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500612 return false
613 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500614 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500615 return false
616 }
617 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500618 return false
619 }
620 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500621 return false
622 }
623 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500624 return false
625 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500626 return true
627 }).(bool)
628
629 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
630 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400631}
632
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100633func (c *config) SetAllowMissingDependencies() {
634 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
635}
636
Jingwen Chenc711fec2020-11-22 23:52:50 -0500637// BlueprintToolLocation returns the directory containing build system tools
638// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200639func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700640 if c.KatiEnabled() {
641 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
642 } else {
643 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
644 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700645}
646
Dan Willemsen60e62f02018-11-16 21:05:32 -0800647func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700648 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
649 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800650}
651
Colin Cross790ef352021-10-25 19:15:55 -0700652func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000653 ext := ".so"
654 if runtime.GOOS == "darwin" {
655 ext = ".dylib"
656 }
Colin Cross790ef352021-10-25 19:15:55 -0700657 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
658 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000659}
660
Colin Crossae5330a2021-11-03 13:31:22 -0700661func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
662 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700663 return path
664}
665
Jingwen Chenc711fec2020-11-22 23:52:50 -0500666// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700667func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 switch runtime.GOOS {
669 case "linux":
670 return "linux-x86"
671 case "darwin":
672 return "darwin-x86"
673 default:
674 panic("Unknown GOOS")
675 }
676}
677
678// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700679func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200680 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800681}
682
Jingwen Chenc711fec2020-11-22 23:52:50 -0500683// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
684// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700685func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
686 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
687}
688
Jingwen Chenc711fec2020-11-22 23:52:50 -0500689// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
690// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700691func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700692 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800693 case "darwin":
694 return "-R"
695 case "linux":
696 return "-d"
697 default:
698 return ""
699 }
700}
Colin Cross68f55102015-03-25 14:43:57 -0700701
Colin Cross1332b002015-04-07 17:11:30 -0700702func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700703 var val string
704 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700705 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800706 defer c.envLock.Unlock()
707 if c.envDeps == nil {
708 c.envDeps = make(map[string]string)
709 }
Colin Cross68f55102015-03-25 14:43:57 -0700710 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700711 if c.envFrozen {
712 panic("Cannot access new environment variables after envdeps are frozen")
713 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700714 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700715 c.envDeps[key] = val
716 }
717 return val
718}
719
Colin Cross99d7c232016-11-23 16:52:04 -0800720func (c *config) GetenvWithDefault(key string, defaultValue string) string {
721 ret := c.Getenv(key)
722 if ret == "" {
723 return defaultValue
724 }
725 return ret
726}
727
728func (c *config) IsEnvTrue(key string) bool {
729 value := c.Getenv(key)
730 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
731}
732
733func (c *config) IsEnvFalse(key string) bool {
734 value := c.Getenv(key)
735 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
736}
737
Julien Desprez91ba6c72023-02-14 20:26:31 +0000738func (c *config) TargetsJava17() bool {
739 return c.IsEnvTrue("EXPERIMENTAL_TARGET_JAVA_VERSION_17")
740}
741
Jingwen Chenc711fec2020-11-22 23:52:50 -0500742// EnvDeps returns the environment variables this build depends on. The first
743// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700744func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700745 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800746 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700747 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700748 return c.envDeps
749}
Colin Cross35cec122015-04-02 14:37:16 -0700750
Jingwen Chencda22c92020-11-23 00:22:30 -0500751func (c *config) KatiEnabled() bool {
752 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800753}
754
Nan Zhang581fd212018-01-10 16:06:12 -0800755func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800756 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800757}
758
Jingwen Chenc711fec2020-11-22 23:52:50 -0500759// BuildNumberFile returns the path to a text file containing metadata
760// representing the current build's number.
761//
762// Rules that want to reference the build number should read from this file
763// without depending on it. They will run whenever their other dependencies
764// require them to run and get the current build number. This ensures they don't
765// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800766func (c *config) BuildNumberFile(ctx PathContext) Path {
767 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800768}
769
Jingwen Chenc711fec2020-11-22 23:52:50 -0500770// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700771// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700772func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800773 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700774}
775
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000776// DeviceProduct returns the current product target. There could be multiple of
777// these per device type.
778//
Chris Parsonsef615e52022-08-18 22:04:11 -0400779// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000780func (c *config) DeviceProduct() string {
781 return *c.productVariables.DeviceProduct
782}
783
Cole Faustb85d1a12022-11-08 18:14:01 -0800784// HasDeviceProduct returns if the build has a product. A build will not
785// necessarily have a product when --skip-config is passed to soong, like it is
786// in prebuilts/build-tools/build-prebuilts.sh
787func (c *config) HasDeviceProduct() bool {
788 return c.productVariables.DeviceProduct != nil
789}
790
Anton Hansson53c88442019-03-18 15:53:16 +0000791func (c *config) DeviceResourceOverlays() []string {
792 return c.productVariables.DeviceResourceOverlays
793}
794
795func (c *config) ProductResourceOverlays() []string {
796 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700797}
798
Colin Crossbfd347d2018-05-09 11:11:35 -0700799func (c *config) PlatformVersionName() string {
800 return String(c.productVariables.Platform_version_name)
801}
802
Dan Albert4f378d72020-07-23 17:32:15 -0700803func (c *config) PlatformSdkVersion() ApiLevel {
804 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700805}
806
Mu-Le Lee5e047532022-07-27 02:32:03 +0000807func (c *config) PlatformSdkFinal() bool {
808 return Bool(c.productVariables.Platform_sdk_final)
809}
810
Colin Crossd09b0b62018-04-18 11:06:47 -0700811func (c *config) PlatformSdkCodename() string {
812 return String(c.productVariables.Platform_sdk_codename)
813}
814
Anton Hansson97d0bae2022-02-16 16:15:10 +0000815func (c *config) PlatformSdkExtensionVersion() int {
816 return *c.productVariables.Platform_sdk_extension_version
817}
818
819func (c *config) PlatformBaseSdkExtensionVersion() int {
820 return *c.productVariables.Platform_base_sdk_extension_version
821}
822
Colin Cross092c9da2019-04-02 22:56:43 -0700823func (c *config) PlatformSecurityPatch() string {
824 return String(c.productVariables.Platform_security_patch)
825}
826
827func (c *config) PlatformPreviewSdkVersion() string {
828 return String(c.productVariables.Platform_preview_sdk_version)
829}
830
831func (c *config) PlatformMinSupportedTargetSdkVersion() string {
832 return String(c.productVariables.Platform_min_supported_target_sdk_version)
833}
834
835func (c *config) PlatformBaseOS() string {
836 return String(c.productVariables.Platform_base_os)
837}
838
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900839func (c *config) PlatformVersionLastStable() string {
840 return String(c.productVariables.Platform_version_last_stable)
841}
842
Jiyong Park37073842022-06-21 10:13:42 +0900843func (c *config) PlatformVersionKnownCodenames() string {
844 return String(c.productVariables.Platform_version_known_codenames)
845}
846
Dan Albert1a246272020-07-06 14:49:35 -0700847func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000848 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700849}
850
851func (c *config) FinalApiLevels() []ApiLevel {
852 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700853 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700854 levels = append(levels, uncheckedFinalApiLevel(i))
855 }
856 return levels
857}
858
859func (c *config) PreviewApiLevels() []ApiLevel {
860 var levels []ApiLevel
861 for i, codename := range c.PlatformVersionActiveCodenames() {
862 levels = append(levels, ApiLevel{
863 value: codename,
864 number: i,
865 isPreview: true,
866 })
867 }
868 return levels
869}
870
satayevcca4ab72021-11-30 12:33:55 +0000871func (c *config) LatestPreviewApiLevel() ApiLevel {
872 level := NoneApiLevel
873 for _, l := range c.PreviewApiLevels() {
874 if l.GreaterThan(level) {
875 level = l
876 }
877 }
878 return level
879}
880
Dan Albert1a246272020-07-06 14:49:35 -0700881func (c *config) AllSupportedApiLevels() []ApiLevel {
882 var levels []ApiLevel
883 levels = append(levels, c.FinalApiLevels()...)
884 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700885}
886
Jingwen Chenc711fec2020-11-22 23:52:50 -0500887// DefaultAppTargetSdk returns the API level that platform apps are targeting.
888// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700889func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Colin Crossd09b0b62018-04-18 11:06:47 -0700890 if Bool(c.productVariables.Platform_sdk_final) {
891 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700892 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500893 codename := c.PlatformSdkCodename()
894 if codename == "" {
895 return NoneApiLevel
896 }
897 if codename == "REL" {
898 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
899 }
900 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700901}
902
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800903func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800904 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800905}
906
Dan Albert31384de2017-07-28 12:39:46 -0700907// Codenames that are active in the current lunch target.
908func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800909 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700910}
911
Colin Crossface4e42017-10-30 17:32:15 -0700912func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800913 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700914}
915
Colin Crossface4e42017-10-30 17:32:15 -0700916func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800917 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700918}
919
Colin Crossface4e42017-10-30 17:32:15 -0700920func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800921 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700922}
923
924func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800925 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700926}
927
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700928func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800929 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800930 if defaultCert != "" {
931 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800932 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500933 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700934}
935
Colin Crosse1731a52017-12-14 11:22:55 -0800936func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800937 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800938 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800939 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800940 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500941 defaultDir := c.DefaultAppCertificateDir(ctx)
942 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700943}
Colin Cross6ff51382015-12-17 16:39:19 -0800944
Jiyong Park9335a262018-12-24 11:31:58 +0900945func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
946 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
947 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700948 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900949 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
950 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800951 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900952 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500953 // If not, APEX keys are under the specified directory
954 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900955}
956
Inseob Kim80fa7982022-08-12 21:36:25 +0900957// Certificate for the NetworkStack sepolicy context
958func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
959 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
960 if cert != "" {
961 return PathForSource(ctx, cert)
962 }
963 return c.DefaultAppCertificateDir(ctx)
964}
965
Jingwen Chenc711fec2020-11-22 23:52:50 -0500966// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
967// are configured to depend on non-existent modules. Note that this does not
968// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800969func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800970 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800971}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800972
Jeongik Cha816a23a2020-07-08 01:09:23 +0900973// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700974func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800975 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700976}
977
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100978// Returns true if building apps that aren't bundled with the platform.
979// UnbundledBuild() is always true when this is true.
980func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -0800981 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100982}
983
Jeongik Cha4b073cd2021-06-08 11:35:00 +0900984// Returns true if building image that aren't bundled with the platform.
985// UnbundledBuild() is always true when this is true.
986func (c *config) UnbundledBuildImage() bool {
987 return Bool(c.productVariables.Unbundled_build_image)
988}
989
Jeongik Cha816a23a2020-07-08 01:09:23 +0900990// Returns true if building modules against prebuilt SDKs.
991func (c *config) AlwaysUsePrebuiltSdks() bool {
992 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -0800993}
994
Colin Cross126a25c2017-10-31 13:55:34 -0700995func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800996 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -0700997}
998
Colin Crossed064c02018-09-05 16:28:13 -0700999func (c *config) Debuggable() bool {
1000 return Bool(c.productVariables.Debuggable)
1001}
1002
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001003func (c *config) Eng() bool {
1004 return Bool(c.productVariables.Eng)
1005}
1006
Colin Crossc53c37f2021-12-08 15:42:22 -08001007// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1008// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001009func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001010 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1011 return androidTargets[0].Arch.ArchType
1012 }
1013 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001014}
1015
Colin Cross16b23492016-01-06 14:41:07 -08001016func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001017 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001018}
1019
1020func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001021 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001022}
1023
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001024func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001025 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001026}
1027
Colin Cross23ae82a2016-11-02 14:34:39 -07001028func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001029 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001030}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001031
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001032func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001033 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001034 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001035 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001036 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001037}
1038
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001039func (c *config) DisableScudo() bool {
1040 return Bool(c.productVariables.DisableScudo)
1041}
1042
Colin Crossa1ad8d12016-06-01 17:09:44 -07001043func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001044 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001045 if t.Arch.ArchType.Multilib == "lib64" {
1046 return true
1047 }
1048 }
1049
1050 return false
1051}
Colin Cross9272ade2016-08-17 15:24:12 -07001052
Colin Cross9d45bb72016-08-29 16:14:13 -07001053func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001054 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001055}
1056
Ramy Medhatbbf25672019-07-17 12:30:04 +00001057func (c *config) UseRBE() bool {
1058 return Bool(c.productVariables.UseRBE)
1059}
1060
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001061func (c *config) UseRBEJAVAC() bool {
1062 return Bool(c.productVariables.UseRBEJAVAC)
1063}
1064
1065func (c *config) UseRBER8() bool {
1066 return Bool(c.productVariables.UseRBER8)
1067}
1068
1069func (c *config) UseRBED8() bool {
1070 return Bool(c.productVariables.UseRBED8)
1071}
1072
Colin Cross8b8bec32019-11-15 13:18:43 -08001073func (c *config) UseRemoteBuild() bool {
1074 return c.UseGoma() || c.UseRBE()
1075}
1076
Colin Cross66548102018-06-19 22:47:35 -07001077func (c *config) RunErrorProne() bool {
1078 return c.IsEnvTrue("RUN_ERROR_PRONE")
1079}
1080
Jingwen Chenc711fec2020-11-22 23:52:50 -05001081// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001082func (c *config) XrefCorpusName() string {
1083 return c.Getenv("XREF_CORPUS")
1084}
1085
Jingwen Chenc711fec2020-11-22 23:52:50 -05001086// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1087// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001088func (c *config) XrefCuEncoding() string {
1089 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1090 return enc
1091 }
1092 return "json"
1093}
1094
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001095// XrefCuJavaSourceMax returns the maximum number of the Java source files
1096// in a single compilation unit
1097const xrefJavaSourceFileMaxDefault = "1000"
1098
1099func (c Config) XrefCuJavaSourceMax() string {
1100 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1101 if v == "" {
1102 return xrefJavaSourceFileMaxDefault
1103 }
1104 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1105 fmt.Fprintf(os.Stderr,
1106 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1107 err, xrefJavaSourceFileMaxDefault)
1108 return xrefJavaSourceFileMaxDefault
1109 }
1110 return v
1111
1112}
1113
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001114func (c *config) EmitXrefRules() bool {
1115 return c.XrefCorpusName() != ""
1116}
1117
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001118func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001119 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001120}
1121
1122func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001123 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001124 return ""
1125 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001126 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001127}
1128
Colin Cross0f4e0d62016-07-27 10:56:55 -07001129func (c *config) LibartImgHostBaseAddress() string {
1130 return "0x60000000"
1131}
1132
1133func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001134 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001135}
1136
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001137func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001138 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001139}
1140
Jingwen Chenc711fec2020-11-22 23:52:50 -05001141// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1142// but some modules still depend on it.
1143//
1144// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001145func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001146 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001147
Roland Levillainf6cc2612020-07-09 16:58:14 +01001148 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001149 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001150 return true
1151 }
Colin Crossa74ca042019-01-31 14:31:51 -08001152 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001153 }
1154 return false
1155}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001156func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001157 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001158 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001159 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001160 }
1161 return false
1162}
1163
1164func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001165 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001166}
1167
Spandan Dasc5763832022-11-08 18:42:16 +00001168func (c *config) IncludeTags() []string {
1169 return c.productVariables.IncludeTags
1170}
1171
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001172func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001173 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001174}
1175
Colin Cross5a0dcd52018-10-05 14:20:06 -07001176func (c *config) UncompressPrivAppDex() bool {
1177 return Bool(c.productVariables.UncompressPrivAppDex)
1178}
1179
1180func (c *config) ModulesLoadedByPrivilegedModules() []string {
1181 return c.productVariables.ModulesLoadedByPrivilegedModules
1182}
1183
Jingwen Chenc711fec2020-11-22 23:52:50 -05001184// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1185// the output directory, if it was created during the product configuration
1186// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001187func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001188 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001189 return OptionalPathForPath(nil)
1190 }
1191 return OptionalPathForPath(
1192 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1193}
1194
Jingwen Chenc711fec2020-11-22 23:52:50 -05001195// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1196// configuration. Since the configuration file was created by Kati during
1197// product configuration (externally of soong_build), it's not tracked, so we
1198// also manually add a Ninja file dependency on the configuration file to the
1199// rule that creates the main build.ninja file. This ensures that build.ninja is
1200// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001201func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1202 path := c.DexpreoptGlobalConfigPath(ctx)
1203 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001204 return nil, nil
1205 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001206 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001207 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001208}
1209
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001210func (c *deviceConfig) WithDexpreopt() bool {
1211 return c.config.productVariables.WithDexpreopt
1212}
1213
Colin Cross662d6142022-11-03 20:38:01 -07001214func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001215 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001216}
1217
Inseob Kimae553032019-05-14 18:52:49 +09001218func (c *config) VndkSnapshotBuildArtifacts() bool {
1219 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1220}
1221
Colin Cross3b19f5d2019-09-17 14:45:31 -07001222func (c *config) HasMultilibConflict(arch ArchType) bool {
1223 return c.multilibConflicts[arch]
1224}
1225
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001226func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001227 return String(c.productVariables.PrebuiltHiddenApiDir)
1228}
1229
MarkDacekd06db5d2022-11-29 00:47:59 +00001230func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1231 return c.bazelForceEnabledModules
1232}
1233
Colin Cross9272ade2016-08-17 15:24:12 -07001234func (c *deviceConfig) Arches() []Arch {
1235 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001236 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001237 arches = append(arches, target.Arch)
1238 }
1239 return arches
1240}
Dan Willemsend2ede872016-11-18 14:54:24 -08001241
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001242func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001243 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001244 if is32BitBinder != nil && *is32BitBinder {
1245 return "32"
1246 }
1247 return "64"
1248}
1249
Dan Willemsen4353bc42016-12-05 17:16:02 -08001250func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001251 if c.config.productVariables.VendorPath != nil {
1252 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001253 }
1254 return "vendor"
1255}
1256
Justin Yun71549282017-11-17 12:10:28 +09001257func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001258 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001259}
1260
Jose Galmes6f843bc2020-12-11 13:36:29 -08001261func (c *deviceConfig) RecoverySnapshotVersion() string {
1262 return String(c.config.productVariables.RecoverySnapshotVersion)
1263}
1264
Jeongik Cha219141c2020-08-06 23:00:37 +09001265func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1266 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1267}
1268
Justin Yun8fe12122017-12-07 17:18:15 +09001269func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001270 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001271}
1272
Justin Yun5f7f7e82019-11-18 19:52:14 +09001273func (c *deviceConfig) ProductVndkVersion() string {
1274 return String(c.config.productVariables.ProductVndkVersion)
1275}
1276
Justin Yun71549282017-11-17 12:10:28 +09001277func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001278 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001279}
Jack He8cc71432016-12-08 15:45:07 -08001280
Vic Yangefd249e2018-11-12 20:19:56 -08001281func (c *deviceConfig) VndkUseCoreVariant() bool {
1282 return Bool(c.config.productVariables.VndkUseCoreVariant)
1283}
1284
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001285func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001286 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001287}
1288
1289func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001290 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001291}
1292
Jiyong Park2db76922017-11-08 16:03:48 +09001293func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001294 if c.config.productVariables.OdmPath != nil {
1295 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001296 }
1297 return "odm"
1298}
1299
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001300func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001301 if c.config.productVariables.ProductPath != nil {
1302 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001303 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001304 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001305}
1306
Justin Yund5f6c822019-06-25 16:47:17 +09001307func (c *deviceConfig) SystemExtPath() string {
1308 if c.config.productVariables.SystemExtPath != nil {
1309 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001310 }
Justin Yund5f6c822019-06-25 16:47:17 +09001311 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001312}
1313
Jack He8cc71432016-12-08 15:45:07 -08001314func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001315 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001316}
Dan Willemsen581341d2017-02-09 16:16:31 -08001317
Jiyong Parkd773eb32017-07-03 13:18:12 +09001318func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001319 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001320}
1321
Roland Levillainada12702020-06-09 13:07:36 +01001322// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1323// path. Coverage is enabled by default when the product variable
1324// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1325// enabled for any path which is part of this variable (and not part of the
1326// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1327// represents any path.
1328func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1329 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001330 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001331 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1332 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1333 coverage = true
1334 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001335 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001336 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1337 coverage = false
1338 }
1339 }
1340 return coverage
1341}
1342
Colin Cross1a6acd42020-06-16 17:51:46 -07001343// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001344func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001345 return Bool(c.config.productVariables.GcovCoverage) ||
1346 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001347}
1348
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001349func (c *deviceConfig) ClangCoverageEnabled() bool {
1350 return Bool(c.config.productVariables.ClangCoverage)
1351}
1352
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001353func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1354 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1355}
1356
Colin Cross1a6acd42020-06-16 17:51:46 -07001357func (c *deviceConfig) GcovCoverageEnabled() bool {
1358 return Bool(c.config.productVariables.GcovCoverage)
1359}
1360
Roland Levillain4f5297b2020-06-09 12:44:06 +01001361// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1362// code coverage is enabled for path. By default, coverage is not enabled for a
1363// given path unless it is part of the NativeCoveragePaths product variable (and
1364// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1365// NativeCoveragePaths represents any path.
1366func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001367 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001368 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001369 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001370 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001371 }
1372 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001373 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001374 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001375 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001376 }
1377 }
1378 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001379}
Ivan Lozano5f595532017-07-13 14:46:05 -07001380
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001381func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001382 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001383}
1384
Tri Vo35a51432018-03-25 20:00:00 -07001385func (c *deviceConfig) VendorSepolicyDirs() []string {
1386 return c.config.productVariables.BoardVendorSepolicyDirs
1387}
1388
1389func (c *deviceConfig) OdmSepolicyDirs() []string {
1390 return c.config.productVariables.BoardOdmSepolicyDirs
1391}
1392
Felixa20a8752020-05-17 18:28:35 +02001393func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1394 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001395}
1396
Felixa20a8752020-05-17 18:28:35 +02001397func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1398 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001399}
1400
Inseob Kim0866b002019-04-15 20:21:29 +09001401func (c *deviceConfig) SepolicyM4Defs() []string {
1402 return c.config.productVariables.BoardSepolicyM4Defs
1403}
1404
Jiyong Park7f67f482019-01-05 12:57:48 +09001405func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001406 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1407 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1408}
1409
1410func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001411 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001412 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1413}
1414
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001415func (c *deviceConfig) OverridePackageNameFor(name string) string {
1416 newName, overridden := findOverrideValue(
1417 c.config.productVariables.PackageNameOverrides,
1418 name,
1419 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1420 if overridden {
1421 return newName
1422 }
1423 return name
1424}
1425
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001426func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001427 if overrides == nil || len(overrides) == 0 {
1428 return "", false
1429 }
1430 for _, o := range overrides {
1431 split := strings.Split(o, ":")
1432 if len(split) != 2 {
1433 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001434 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001435 }
1436 if matchPattern(split[0], name) {
1437 return substPattern(split[0], split[1], name), true
1438 }
1439 }
1440 return "", false
1441}
1442
Albert Martineefabcf2022-03-21 20:11:16 +00001443func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1444 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1445}
1446
Ivan Lozano5f595532017-07-13 14:46:05 -07001447func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001448 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001449 return false
1450 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001451 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001452}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001453
1454func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001455 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001456 return false
1457 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001458 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001459}
1460
1461func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001462 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001463 return false
1464 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001465 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001466}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001467
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001468func (c *config) MemtagHeapDisabledForPath(path string) bool {
1469 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1470 return false
1471 }
1472 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1473}
1474
1475func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1476 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1477 return false
1478 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001479 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001480}
1481
1482func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1483 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1484 return false
1485 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001486 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001487}
1488
Dan Willemsen0fe78662018-03-26 12:41:18 -07001489func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001490 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001491}
1492
Colin Cross395f2cf2018-10-24 16:10:32 -07001493func (c *config) NdkAbis() bool {
1494 return Bool(c.productVariables.Ndk_abis)
1495}
1496
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001497func (c *config) AmlAbis() bool {
1498 return Bool(c.productVariables.Aml_abis)
1499}
1500
Jiyong Park8fd61922018-11-08 02:50:25 +09001501func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001502 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001503}
1504
Jiyong Park4da07972021-01-05 21:01:11 +09001505func (c *config) ForceApexSymlinkOptimization() bool {
1506 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1507}
1508
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001509func (c *config) ApexCompressionEnabled() bool {
1510 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001511}
1512
Dennis Shene2ed70c2023-01-11 14:15:43 +00001513func (c *config) ApexTrimEnabled() bool {
1514 return Bool(c.productVariables.TrimmedApex)
1515}
1516
Jeongik Chac9464142019-01-07 12:07:27 +09001517func (c *config) EnforceSystemCertificate() bool {
1518 return Bool(c.productVariables.EnforceSystemCertificate)
1519}
1520
Colin Cross440e0d02020-06-11 11:32:11 -07001521func (c *config) EnforceSystemCertificateAllowList() []string {
1522 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001523}
1524
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001525func (c *config) EnforceProductPartitionInterface() bool {
1526 return Bool(c.productVariables.EnforceProductPartitionInterface)
1527}
1528
JaeMan Parkff715562020-10-19 17:25:58 +09001529func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1530 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1531}
1532
1533func (c *config) InterPartitionJavaLibraryAllowList() []string {
1534 return c.productVariables.InterPartitionJavaLibraryAllowList
1535}
1536
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001537func (c *config) InstallExtraFlattenedApexes() bool {
1538 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1539}
1540
Colin Crossf24a22a2019-01-31 14:12:44 -08001541func (c *config) ProductHiddenAPIStubs() []string {
1542 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001543}
1544
Colin Crossf24a22a2019-01-31 14:12:44 -08001545func (c *config) ProductHiddenAPIStubsSystem() []string {
1546 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001547}
1548
Colin Crossf24a22a2019-01-31 14:12:44 -08001549func (c *config) ProductHiddenAPIStubsTest() []string {
1550 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001551}
Dan Willemsen71c74602019-04-10 12:27:35 -07001552
Dan Willemsen54879d12019-04-18 10:08:46 -07001553func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001554 return c.config.productVariables.TargetFSConfigGen
1555}
Inseob Kim0866b002019-04-15 20:21:29 +09001556
1557func (c *config) ProductPublicSepolicyDirs() []string {
1558 return c.productVariables.ProductPublicSepolicyDirs
1559}
1560
1561func (c *config) ProductPrivateSepolicyDirs() []string {
1562 return c.productVariables.ProductPrivateSepolicyDirs
1563}
1564
Colin Cross50ddcc42019-05-16 12:28:22 -07001565func (c *config) MissingUsesLibraries() []string {
1566 return c.productVariables.MissingUsesLibraries
1567}
1568
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001569func (c *config) TargetMultitreeUpdateMeta() bool {
1570 return c.productVariables.MultitreeUpdateMeta
1571}
1572
Inseob Kim1f086e22019-05-09 13:29:15 +09001573func (c *deviceConfig) DeviceArch() string {
1574 return String(c.config.productVariables.DeviceArch)
1575}
1576
1577func (c *deviceConfig) DeviceArchVariant() string {
1578 return String(c.config.productVariables.DeviceArchVariant)
1579}
1580
1581func (c *deviceConfig) DeviceSecondaryArch() string {
1582 return String(c.config.productVariables.DeviceSecondaryArch)
1583}
1584
1585func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1586 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1587}
Yifan Hong82db7352020-01-21 16:12:26 -08001588
1589func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1590 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1591}
Yifan Hong97365ee2020-07-29 09:51:57 -07001592
1593func (c *deviceConfig) BoardKernelBinaries() []string {
1594 return c.config.productVariables.BoardKernelBinaries
1595}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001596
Yifan Hong42bef8d2020-08-05 14:36:09 -07001597func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1598 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1599}
1600
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001601func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1602 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1603}
1604
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001605func (c *deviceConfig) PlatformSepolicyVersion() string {
1606 return String(c.config.productVariables.PlatformSepolicyVersion)
1607}
1608
Inseob Kima10ef272021-09-15 03:04:53 +00001609func (c *deviceConfig) TotSepolicyVersion() string {
1610 return String(c.config.productVariables.TotSepolicyVersion)
1611}
1612
Inseob Kim843f6642022-01-07 09:11:23 +09001613func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1614 return c.config.productVariables.PlatformSepolicyCompatVersions
1615}
1616
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001617func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001618 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1619 return ver
1620 }
1621 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001622}
1623
Inseob Kim14178802021-12-08 22:53:31 +09001624func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1625 return c.config.productVariables.BoardPlatVendorPolicy
1626}
1627
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001628func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1629 return c.config.productVariables.BoardReqdMaskPolicy
1630}
1631
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001632func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1633 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1634}
1635
1636func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1637 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1638}
1639
1640func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1641 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1642}
1643
1644func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1645 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1646}
1647
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001648func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1649 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1650}
1651
1652func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1653 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1654}
1655
1656func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1657 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1658}
1659
Inseob Kim7cf14652021-01-06 23:06:52 +09001660func (c *deviceConfig) DirectedVendorSnapshot() bool {
1661 return c.config.productVariables.DirectedVendorSnapshot
1662}
1663
1664func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1665 return c.config.productVariables.VendorSnapshotModules
1666}
1667
Jose Galmes4c6895e2021-02-09 07:44:30 -08001668func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1669 return c.config.productVariables.DirectedRecoverySnapshot
1670}
1671
1672func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1673 return c.config.productVariables.RecoverySnapshotModules
1674}
1675
Justin DeMartino383bfb32021-02-24 10:49:43 -08001676func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1677 var ret = make(map[string]bool)
1678 for _, dir := range dirs {
1679 clean := filepath.Clean(dir)
1680 if previous[clean] || ret[clean] {
1681 return nil, fmt.Errorf("Duplicate entry %s", dir)
1682 }
1683 ret[clean] = true
1684 }
1685 return ret, nil
1686}
1687
1688func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1689 dirMap := c.Once(onceKey, func() interface{} {
1690 ret, err := createDirsMap(previous, dirs)
1691 if err != nil {
1692 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1693 }
1694 return ret
1695 })
1696 if dirMap == nil {
1697 return nil
1698 }
1699 return dirMap.(map[string]bool)
1700}
1701
1702var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1703
1704func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1705 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1706 c.config.productVariables.VendorSnapshotDirsExcluded)
1707}
1708
1709var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1710
1711func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1712 excludedMap := c.VendorSnapshotDirsExcludedMap()
1713 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1714 c.config.productVariables.VendorSnapshotDirsIncluded)
1715}
1716
1717var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1718
1719func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1720 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1721 c.config.productVariables.RecoverySnapshotDirsExcluded)
1722}
1723
1724var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1725
1726func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1727 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1728 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1729 c.config.productVariables.RecoverySnapshotDirsIncluded)
1730}
1731
Rob Seymour925aa092021-08-10 20:42:03 +00001732func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1733 return c.config.productVariables.HostFakeSnapshotEnabled
1734}
1735
Inseob Kim60c32f02020-12-21 22:53:05 +09001736func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1737 if c.config.productVariables.ShippingApiLevel == nil {
1738 return NoneApiLevel
1739 }
1740 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1741 return uncheckedFinalApiLevel(apiLevel)
1742}
1743
Alix Espinoef47e542022-09-14 19:10:51 +00001744func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1745 return c.config.productVariables.BuildBrokenClangAsFlags
1746}
1747
1748func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1749 return c.config.productVariables.BuildBrokenClangCFlags
1750}
1751
Alixb5f6d9e2022-04-20 23:00:58 +00001752func (c *deviceConfig) BuildBrokenClangProperty() bool {
1753 return c.config.productVariables.BuildBrokenClangProperty
1754}
1755
Inseob Kim67e5add192021-03-17 18:05:33 +09001756func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1757 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1758}
1759
1760func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1761 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1762}
1763
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001764func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1765 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1766}
1767
Inseob Kim0cac7b42021-02-03 18:16:46 +09001768func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1769 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1770}
1771
Liz Kammer619be462022-01-28 15:13:39 -05001772func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1773 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1774}
1775
Vinh Tran140d5882022-06-10 14:23:27 -04001776func (c *deviceConfig) BuildBrokenDepfile() bool {
1777 return Bool(c.config.productVariables.BuildBrokenDepfile)
1778}
1779
Inseob Kim67e5add192021-03-17 18:05:33 +09001780func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1781 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1782}
1783
1784func (c *config) SelinuxIgnoreNeverallows() bool {
1785 return c.productVariables.SelinuxIgnoreNeverallows
1786}
1787
1788func (c *deviceConfig) SepolicySplit() bool {
1789 return c.config.productVariables.SepolicySplit
1790}
1791
Inseob Kima10ef272021-09-15 03:04:53 +00001792func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1793 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1794}
1795
1796func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1797 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1798}
1799
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001800func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1801 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1802}
1803
Christopher Ferris98f10222022-07-13 23:16:52 -07001804func (c *config) IgnorePrefer32OnDevice() bool {
1805 return c.productVariables.IgnorePrefer32OnDevice
1806}
1807
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001808func (c *config) BootJars() []string {
1809 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001810 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001811 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001812 }).([]string)
1813}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001814
satayevd604b212021-07-21 14:23:52 +01001815func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001816 return c.productVariables.BootJars
1817}
1818
satayevd604b212021-07-21 14:23:52 +01001819func (c *config) ApexBootJars() ConfiguredJarList {
1820 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001821}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001822
1823func (c *config) RBEWrapper() string {
1824 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1825}
Colin Cross9b698b62021-12-22 09:55:32 -08001826
1827// UseHostMusl returns true if the host target has been configured to build against musl libc.
1828func (c *config) UseHostMusl() bool {
1829 return Bool(c.productVariables.HostMusl)
1830}
MarkDacekff851b82022-04-21 18:33:17 +00001831
Chris Parsonsf874e462022-05-10 13:50:12 -04001832func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001833 moduleName := ctx.Module().Name()
1834 c.mixedBuildsLock.Lock()
1835 defer c.mixedBuildsLock.Unlock()
1836 if useBazel {
1837 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1838 } else {
1839 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1840 }
1841}