blob: 849462650e76e15c79f0cadf3922ab06d21ca078 [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
Jingwen Chenc711fec2020-11-22 23:52:50 -0500738// EnvDeps returns the environment variables this build depends on. The first
739// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700740func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700741 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800742 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700743 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700744 return c.envDeps
745}
Colin Cross35cec122015-04-02 14:37:16 -0700746
Jingwen Chencda22c92020-11-23 00:22:30 -0500747func (c *config) KatiEnabled() bool {
748 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800749}
750
Nan Zhang581fd212018-01-10 16:06:12 -0800751func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800752 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800753}
754
Jingwen Chenc711fec2020-11-22 23:52:50 -0500755// BuildNumberFile returns the path to a text file containing metadata
756// representing the current build's number.
757//
758// Rules that want to reference the build number should read from this file
759// without depending on it. They will run whenever their other dependencies
760// require them to run and get the current build number. This ensures they don't
761// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800762func (c *config) BuildNumberFile(ctx PathContext) Path {
763 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800764}
765
Jingwen Chenc711fec2020-11-22 23:52:50 -0500766// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700767// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700768func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800769 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700770}
771
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000772// DeviceProduct returns the current product target. There could be multiple of
773// these per device type.
774//
Chris Parsonsef615e52022-08-18 22:04:11 -0400775// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000776func (c *config) DeviceProduct() string {
777 return *c.productVariables.DeviceProduct
778}
779
Cole Faustb85d1a12022-11-08 18:14:01 -0800780// HasDeviceProduct returns if the build has a product. A build will not
781// necessarily have a product when --skip-config is passed to soong, like it is
782// in prebuilts/build-tools/build-prebuilts.sh
783func (c *config) HasDeviceProduct() bool {
784 return c.productVariables.DeviceProduct != nil
785}
786
Anton Hansson53c88442019-03-18 15:53:16 +0000787func (c *config) DeviceResourceOverlays() []string {
788 return c.productVariables.DeviceResourceOverlays
789}
790
791func (c *config) ProductResourceOverlays() []string {
792 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700793}
794
Colin Crossbfd347d2018-05-09 11:11:35 -0700795func (c *config) PlatformVersionName() string {
796 return String(c.productVariables.Platform_version_name)
797}
798
Dan Albert4f378d72020-07-23 17:32:15 -0700799func (c *config) PlatformSdkVersion() ApiLevel {
800 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700801}
802
Mu-Le Lee5e047532022-07-27 02:32:03 +0000803func (c *config) PlatformSdkFinal() bool {
804 return Bool(c.productVariables.Platform_sdk_final)
805}
806
Colin Crossd09b0b62018-04-18 11:06:47 -0700807func (c *config) PlatformSdkCodename() string {
808 return String(c.productVariables.Platform_sdk_codename)
809}
810
Anton Hansson97d0bae2022-02-16 16:15:10 +0000811func (c *config) PlatformSdkExtensionVersion() int {
812 return *c.productVariables.Platform_sdk_extension_version
813}
814
815func (c *config) PlatformBaseSdkExtensionVersion() int {
816 return *c.productVariables.Platform_base_sdk_extension_version
817}
818
Colin Cross092c9da2019-04-02 22:56:43 -0700819func (c *config) PlatformSecurityPatch() string {
820 return String(c.productVariables.Platform_security_patch)
821}
822
823func (c *config) PlatformPreviewSdkVersion() string {
824 return String(c.productVariables.Platform_preview_sdk_version)
825}
826
827func (c *config) PlatformMinSupportedTargetSdkVersion() string {
828 return String(c.productVariables.Platform_min_supported_target_sdk_version)
829}
830
831func (c *config) PlatformBaseOS() string {
832 return String(c.productVariables.Platform_base_os)
833}
834
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900835func (c *config) PlatformVersionLastStable() string {
836 return String(c.productVariables.Platform_version_last_stable)
837}
838
Jiyong Park37073842022-06-21 10:13:42 +0900839func (c *config) PlatformVersionKnownCodenames() string {
840 return String(c.productVariables.Platform_version_known_codenames)
841}
842
Dan Albert1a246272020-07-06 14:49:35 -0700843func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000844 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700845}
846
847func (c *config) FinalApiLevels() []ApiLevel {
848 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700849 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700850 levels = append(levels, uncheckedFinalApiLevel(i))
851 }
852 return levels
853}
854
855func (c *config) PreviewApiLevels() []ApiLevel {
856 var levels []ApiLevel
857 for i, codename := range c.PlatformVersionActiveCodenames() {
858 levels = append(levels, ApiLevel{
859 value: codename,
860 number: i,
861 isPreview: true,
862 })
863 }
864 return levels
865}
866
satayevcca4ab72021-11-30 12:33:55 +0000867func (c *config) LatestPreviewApiLevel() ApiLevel {
868 level := NoneApiLevel
869 for _, l := range c.PreviewApiLevels() {
870 if l.GreaterThan(level) {
871 level = l
872 }
873 }
874 return level
875}
876
Dan Albert1a246272020-07-06 14:49:35 -0700877func (c *config) AllSupportedApiLevels() []ApiLevel {
878 var levels []ApiLevel
879 levels = append(levels, c.FinalApiLevels()...)
880 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700881}
882
Jingwen Chenc711fec2020-11-22 23:52:50 -0500883// DefaultAppTargetSdk returns the API level that platform apps are targeting.
884// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700885func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000886 // This logic is replicated in starlark, if changing logic here update starlark code too
887 // https://cs.android.com/android/platform/superproject/+/master:build/bazel/rules/common/api.bzl;l=72;drc=231c7e8c8038fd478a79eb68aa5b9f5c64e0e061
Colin Crossd09b0b62018-04-18 11:06:47 -0700888 if Bool(c.productVariables.Platform_sdk_final) {
889 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700890 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500891 codename := c.PlatformSdkCodename()
892 if codename == "" {
893 return NoneApiLevel
894 }
895 if codename == "REL" {
896 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
897 }
898 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700899}
900
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800901func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800902 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800903}
904
Dan Albert31384de2017-07-28 12:39:46 -0700905// Codenames that are active in the current lunch target.
906func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800907 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700908}
909
Colin Crossface4e42017-10-30 17:32:15 -0700910func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800911 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700912}
913
Colin Crossface4e42017-10-30 17:32:15 -0700914func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800915 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700916}
917
Colin Crossface4e42017-10-30 17:32:15 -0700918func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800919 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700920}
921
922func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800923 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700924}
925
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700926func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800927 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800928 if defaultCert != "" {
929 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800930 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500931 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700932}
933
Colin Crosse1731a52017-12-14 11:22:55 -0800934func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800935 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800936 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800937 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800938 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500939 defaultDir := c.DefaultAppCertificateDir(ctx)
940 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700941}
Colin Cross6ff51382015-12-17 16:39:19 -0800942
Jiyong Park9335a262018-12-24 11:31:58 +0900943func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
944 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
945 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700946 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900947 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
948 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800949 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900950 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500951 // If not, APEX keys are under the specified directory
952 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900953}
954
Inseob Kim80fa7982022-08-12 21:36:25 +0900955// Certificate for the NetworkStack sepolicy context
956func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
957 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
958 if cert != "" {
959 return PathForSource(ctx, cert)
960 }
961 return c.DefaultAppCertificateDir(ctx)
962}
963
Jingwen Chenc711fec2020-11-22 23:52:50 -0500964// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
965// are configured to depend on non-existent modules. Note that this does not
966// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800967func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800968 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800969}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800970
Jeongik Cha816a23a2020-07-08 01:09:23 +0900971// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700972func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800973 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700974}
975
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100976// Returns true if building apps that aren't bundled with the platform.
977// UnbundledBuild() is always true when this is true.
978func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -0800979 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100980}
981
Jeongik Cha4b073cd2021-06-08 11:35:00 +0900982// Returns true if building image that aren't bundled with the platform.
983// UnbundledBuild() is always true when this is true.
984func (c *config) UnbundledBuildImage() bool {
985 return Bool(c.productVariables.Unbundled_build_image)
986}
987
Jeongik Cha816a23a2020-07-08 01:09:23 +0900988// Returns true if building modules against prebuilt SDKs.
989func (c *config) AlwaysUsePrebuiltSdks() bool {
990 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -0800991}
992
Colin Cross126a25c2017-10-31 13:55:34 -0700993func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800994 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -0700995}
996
Colin Crossed064c02018-09-05 16:28:13 -0700997func (c *config) Debuggable() bool {
998 return Bool(c.productVariables.Debuggable)
999}
1000
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001001func (c *config) Eng() bool {
1002 return Bool(c.productVariables.Eng)
1003}
1004
Colin Crossc53c37f2021-12-08 15:42:22 -08001005// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1006// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001007func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001008 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1009 return androidTargets[0].Arch.ArchType
1010 }
1011 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001012}
1013
Colin Cross16b23492016-01-06 14:41:07 -08001014func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001015 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001016}
1017
1018func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001019 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001020}
1021
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001022func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001023 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001024}
1025
Colin Cross23ae82a2016-11-02 14:34:39 -07001026func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001027 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001028}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001029
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001030func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001031 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001032 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001033 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001034 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001035}
1036
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001037func (c *config) DisableScudo() bool {
1038 return Bool(c.productVariables.DisableScudo)
1039}
1040
Colin Crossa1ad8d12016-06-01 17:09:44 -07001041func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001042 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001043 if t.Arch.ArchType.Multilib == "lib64" {
1044 return true
1045 }
1046 }
1047
1048 return false
1049}
Colin Cross9272ade2016-08-17 15:24:12 -07001050
Colin Cross9d45bb72016-08-29 16:14:13 -07001051func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001052 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001053}
1054
Ramy Medhatbbf25672019-07-17 12:30:04 +00001055func (c *config) UseRBE() bool {
1056 return Bool(c.productVariables.UseRBE)
1057}
1058
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001059func (c *config) UseRBEJAVAC() bool {
1060 return Bool(c.productVariables.UseRBEJAVAC)
1061}
1062
1063func (c *config) UseRBER8() bool {
1064 return Bool(c.productVariables.UseRBER8)
1065}
1066
1067func (c *config) UseRBED8() bool {
1068 return Bool(c.productVariables.UseRBED8)
1069}
1070
Colin Cross8b8bec32019-11-15 13:18:43 -08001071func (c *config) UseRemoteBuild() bool {
1072 return c.UseGoma() || c.UseRBE()
1073}
1074
Colin Cross66548102018-06-19 22:47:35 -07001075func (c *config) RunErrorProne() bool {
1076 return c.IsEnvTrue("RUN_ERROR_PRONE")
1077}
1078
Jingwen Chenc711fec2020-11-22 23:52:50 -05001079// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001080func (c *config) XrefCorpusName() string {
1081 return c.Getenv("XREF_CORPUS")
1082}
1083
Jingwen Chenc711fec2020-11-22 23:52:50 -05001084// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1085// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001086func (c *config) XrefCuEncoding() string {
1087 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1088 return enc
1089 }
1090 return "json"
1091}
1092
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001093// XrefCuJavaSourceMax returns the maximum number of the Java source files
1094// in a single compilation unit
1095const xrefJavaSourceFileMaxDefault = "1000"
1096
1097func (c Config) XrefCuJavaSourceMax() string {
1098 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1099 if v == "" {
1100 return xrefJavaSourceFileMaxDefault
1101 }
1102 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1103 fmt.Fprintf(os.Stderr,
1104 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1105 err, xrefJavaSourceFileMaxDefault)
1106 return xrefJavaSourceFileMaxDefault
1107 }
1108 return v
1109
1110}
1111
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001112func (c *config) EmitXrefRules() bool {
1113 return c.XrefCorpusName() != ""
1114}
1115
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001116func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001117 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001118}
1119
1120func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001121 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001122 return ""
1123 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001124 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001125}
1126
Colin Cross0f4e0d62016-07-27 10:56:55 -07001127func (c *config) LibartImgHostBaseAddress() string {
1128 return "0x60000000"
1129}
1130
1131func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001132 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001133}
1134
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001135func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001136 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001137}
1138
Jingwen Chenc711fec2020-11-22 23:52:50 -05001139// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1140// but some modules still depend on it.
1141//
1142// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001143func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001144 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001145
Roland Levillainf6cc2612020-07-09 16:58:14 +01001146 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001147 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001148 return true
1149 }
Colin Crossa74ca042019-01-31 14:31:51 -08001150 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001151 }
1152 return false
1153}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001154func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001155 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001156 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001157 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001158 }
1159 return false
1160}
1161
1162func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001163 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001164}
1165
Spandan Dasc5763832022-11-08 18:42:16 +00001166func (c *config) IncludeTags() []string {
1167 return c.productVariables.IncludeTags
1168}
1169
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001170func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001171 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001172}
1173
Colin Cross5a0dcd52018-10-05 14:20:06 -07001174func (c *config) UncompressPrivAppDex() bool {
1175 return Bool(c.productVariables.UncompressPrivAppDex)
1176}
1177
1178func (c *config) ModulesLoadedByPrivilegedModules() []string {
1179 return c.productVariables.ModulesLoadedByPrivilegedModules
1180}
1181
Jingwen Chenc711fec2020-11-22 23:52:50 -05001182// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1183// the output directory, if it was created during the product configuration
1184// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001185func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001186 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001187 return OptionalPathForPath(nil)
1188 }
1189 return OptionalPathForPath(
1190 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1191}
1192
Jingwen Chenc711fec2020-11-22 23:52:50 -05001193// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1194// configuration. Since the configuration file was created by Kati during
1195// product configuration (externally of soong_build), it's not tracked, so we
1196// also manually add a Ninja file dependency on the configuration file to the
1197// rule that creates the main build.ninja file. This ensures that build.ninja is
1198// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001199func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1200 path := c.DexpreoptGlobalConfigPath(ctx)
1201 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001202 return nil, nil
1203 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001204 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001205 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001206}
1207
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001208func (c *deviceConfig) WithDexpreopt() bool {
1209 return c.config.productVariables.WithDexpreopt
1210}
1211
Colin Cross662d6142022-11-03 20:38:01 -07001212func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001213 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001214}
1215
Inseob Kimae553032019-05-14 18:52:49 +09001216func (c *config) VndkSnapshotBuildArtifacts() bool {
1217 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1218}
1219
Colin Cross3b19f5d2019-09-17 14:45:31 -07001220func (c *config) HasMultilibConflict(arch ArchType) bool {
1221 return c.multilibConflicts[arch]
1222}
1223
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001224func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001225 return String(c.productVariables.PrebuiltHiddenApiDir)
1226}
1227
MarkDacekd06db5d2022-11-29 00:47:59 +00001228func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1229 return c.bazelForceEnabledModules
1230}
1231
Colin Cross9272ade2016-08-17 15:24:12 -07001232func (c *deviceConfig) Arches() []Arch {
1233 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001234 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001235 arches = append(arches, target.Arch)
1236 }
1237 return arches
1238}
Dan Willemsend2ede872016-11-18 14:54:24 -08001239
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001240func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001241 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001242 if is32BitBinder != nil && *is32BitBinder {
1243 return "32"
1244 }
1245 return "64"
1246}
1247
Dan Willemsen4353bc42016-12-05 17:16:02 -08001248func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001249 if c.config.productVariables.VendorPath != nil {
1250 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001251 }
1252 return "vendor"
1253}
1254
Justin Yun71549282017-11-17 12:10:28 +09001255func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001256 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001257}
1258
Jose Galmes6f843bc2020-12-11 13:36:29 -08001259func (c *deviceConfig) RecoverySnapshotVersion() string {
1260 return String(c.config.productVariables.RecoverySnapshotVersion)
1261}
1262
Jeongik Cha219141c2020-08-06 23:00:37 +09001263func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1264 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1265}
1266
Justin Yun8fe12122017-12-07 17:18:15 +09001267func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001268 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001269}
1270
Justin Yun5f7f7e82019-11-18 19:52:14 +09001271func (c *deviceConfig) ProductVndkVersion() string {
1272 return String(c.config.productVariables.ProductVndkVersion)
1273}
1274
Justin Yun71549282017-11-17 12:10:28 +09001275func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001276 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001277}
Jack He8cc71432016-12-08 15:45:07 -08001278
Vic Yangefd249e2018-11-12 20:19:56 -08001279func (c *deviceConfig) VndkUseCoreVariant() bool {
1280 return Bool(c.config.productVariables.VndkUseCoreVariant)
1281}
1282
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001283func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001284 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001285}
1286
1287func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001288 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001289}
1290
Jiyong Park2db76922017-11-08 16:03:48 +09001291func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001292 if c.config.productVariables.OdmPath != nil {
1293 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001294 }
1295 return "odm"
1296}
1297
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001298func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001299 if c.config.productVariables.ProductPath != nil {
1300 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001301 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001302 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001303}
1304
Justin Yund5f6c822019-06-25 16:47:17 +09001305func (c *deviceConfig) SystemExtPath() string {
1306 if c.config.productVariables.SystemExtPath != nil {
1307 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001308 }
Justin Yund5f6c822019-06-25 16:47:17 +09001309 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001310}
1311
Jack He8cc71432016-12-08 15:45:07 -08001312func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001313 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001314}
Dan Willemsen581341d2017-02-09 16:16:31 -08001315
Jiyong Parkd773eb32017-07-03 13:18:12 +09001316func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001317 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001318}
1319
Roland Levillainada12702020-06-09 13:07:36 +01001320// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1321// path. Coverage is enabled by default when the product variable
1322// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1323// enabled for any path which is part of this variable (and not part of the
1324// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1325// represents any path.
1326func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1327 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001328 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001329 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1330 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1331 coverage = true
1332 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001333 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001334 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1335 coverage = false
1336 }
1337 }
1338 return coverage
1339}
1340
Colin Cross1a6acd42020-06-16 17:51:46 -07001341// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001342func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001343 return Bool(c.config.productVariables.GcovCoverage) ||
1344 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001345}
1346
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001347func (c *deviceConfig) ClangCoverageEnabled() bool {
1348 return Bool(c.config.productVariables.ClangCoverage)
1349}
1350
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001351func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1352 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1353}
1354
Colin Cross1a6acd42020-06-16 17:51:46 -07001355func (c *deviceConfig) GcovCoverageEnabled() bool {
1356 return Bool(c.config.productVariables.GcovCoverage)
1357}
1358
Roland Levillain4f5297b2020-06-09 12:44:06 +01001359// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1360// code coverage is enabled for path. By default, coverage is not enabled for a
1361// given path unless it is part of the NativeCoveragePaths product variable (and
1362// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1363// NativeCoveragePaths represents any path.
1364func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001365 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001366 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001367 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001368 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001369 }
1370 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001371 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001372 // Workaround coverage boot failure.
1373 // http://b/269981180
1374 if strings.HasPrefix(path, "external/protobuf") {
1375 coverage = false
1376 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001377 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001378 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001379 }
1380 }
1381 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001382}
Ivan Lozano5f595532017-07-13 14:46:05 -07001383
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001384func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001385 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001386}
1387
Tri Vo35a51432018-03-25 20:00:00 -07001388func (c *deviceConfig) VendorSepolicyDirs() []string {
1389 return c.config.productVariables.BoardVendorSepolicyDirs
1390}
1391
1392func (c *deviceConfig) OdmSepolicyDirs() []string {
1393 return c.config.productVariables.BoardOdmSepolicyDirs
1394}
1395
Felixa20a8752020-05-17 18:28:35 +02001396func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1397 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001398}
1399
Felixa20a8752020-05-17 18:28:35 +02001400func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1401 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001402}
1403
Inseob Kim0866b002019-04-15 20:21:29 +09001404func (c *deviceConfig) SepolicyM4Defs() []string {
1405 return c.config.productVariables.BoardSepolicyM4Defs
1406}
1407
Jiyong Park7f67f482019-01-05 12:57:48 +09001408func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001409 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1410 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1411}
1412
1413func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001414 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001415 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1416}
1417
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001418func (c *deviceConfig) OverridePackageNameFor(name string) string {
1419 newName, overridden := findOverrideValue(
1420 c.config.productVariables.PackageNameOverrides,
1421 name,
1422 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1423 if overridden {
1424 return newName
1425 }
1426 return name
1427}
1428
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001429func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001430 if overrides == nil || len(overrides) == 0 {
1431 return "", false
1432 }
1433 for _, o := range overrides {
1434 split := strings.Split(o, ":")
1435 if len(split) != 2 {
1436 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001437 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001438 }
1439 if matchPattern(split[0], name) {
1440 return substPattern(split[0], split[1], name), true
1441 }
1442 }
1443 return "", false
1444}
1445
Albert Martineefabcf2022-03-21 20:11:16 +00001446func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1447 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1448}
1449
Ivan Lozano5f595532017-07-13 14:46:05 -07001450func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001451 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001452 return false
1453 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001454 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001455}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001456
1457func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001458 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001459 return false
1460 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001461 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001462}
1463
1464func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001465 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001466 return false
1467 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001468 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001469}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001470
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001471func (c *config) MemtagHeapDisabledForPath(path string) bool {
1472 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1473 return false
1474 }
1475 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1476}
1477
1478func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1479 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1480 return false
1481 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001482 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001483}
1484
1485func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1486 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1487 return false
1488 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001489 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001490}
1491
Dan Willemsen0fe78662018-03-26 12:41:18 -07001492func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001493 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001494}
1495
Colin Cross395f2cf2018-10-24 16:10:32 -07001496func (c *config) NdkAbis() bool {
1497 return Bool(c.productVariables.Ndk_abis)
1498}
1499
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001500func (c *config) AmlAbis() bool {
1501 return Bool(c.productVariables.Aml_abis)
1502}
1503
Jiyong Park8fd61922018-11-08 02:50:25 +09001504func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001505 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001506}
1507
Jiyong Park4da07972021-01-05 21:01:11 +09001508func (c *config) ForceApexSymlinkOptimization() bool {
1509 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1510}
1511
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001512func (c *config) ApexCompressionEnabled() bool {
1513 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001514}
1515
Dennis Shene2ed70c2023-01-11 14:15:43 +00001516func (c *config) ApexTrimEnabled() bool {
1517 return Bool(c.productVariables.TrimmedApex)
1518}
1519
Jeongik Chac9464142019-01-07 12:07:27 +09001520func (c *config) EnforceSystemCertificate() bool {
1521 return Bool(c.productVariables.EnforceSystemCertificate)
1522}
1523
Colin Cross440e0d02020-06-11 11:32:11 -07001524func (c *config) EnforceSystemCertificateAllowList() []string {
1525 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001526}
1527
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001528func (c *config) EnforceProductPartitionInterface() bool {
1529 return Bool(c.productVariables.EnforceProductPartitionInterface)
1530}
1531
JaeMan Parkff715562020-10-19 17:25:58 +09001532func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1533 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1534}
1535
1536func (c *config) InterPartitionJavaLibraryAllowList() []string {
1537 return c.productVariables.InterPartitionJavaLibraryAllowList
1538}
1539
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001540func (c *config) InstallExtraFlattenedApexes() bool {
1541 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1542}
1543
Colin Crossf24a22a2019-01-31 14:12:44 -08001544func (c *config) ProductHiddenAPIStubs() []string {
1545 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001546}
1547
Colin Crossf24a22a2019-01-31 14:12:44 -08001548func (c *config) ProductHiddenAPIStubsSystem() []string {
1549 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001550}
1551
Colin Crossf24a22a2019-01-31 14:12:44 -08001552func (c *config) ProductHiddenAPIStubsTest() []string {
1553 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001554}
Dan Willemsen71c74602019-04-10 12:27:35 -07001555
Dan Willemsen54879d12019-04-18 10:08:46 -07001556func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001557 return c.config.productVariables.TargetFSConfigGen
1558}
Inseob Kim0866b002019-04-15 20:21:29 +09001559
1560func (c *config) ProductPublicSepolicyDirs() []string {
1561 return c.productVariables.ProductPublicSepolicyDirs
1562}
1563
1564func (c *config) ProductPrivateSepolicyDirs() []string {
1565 return c.productVariables.ProductPrivateSepolicyDirs
1566}
1567
Colin Cross50ddcc42019-05-16 12:28:22 -07001568func (c *config) MissingUsesLibraries() []string {
1569 return c.productVariables.MissingUsesLibraries
1570}
1571
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001572func (c *config) TargetMultitreeUpdateMeta() bool {
1573 return c.productVariables.MultitreeUpdateMeta
1574}
1575
Inseob Kim1f086e22019-05-09 13:29:15 +09001576func (c *deviceConfig) DeviceArch() string {
1577 return String(c.config.productVariables.DeviceArch)
1578}
1579
1580func (c *deviceConfig) DeviceArchVariant() string {
1581 return String(c.config.productVariables.DeviceArchVariant)
1582}
1583
1584func (c *deviceConfig) DeviceSecondaryArch() string {
1585 return String(c.config.productVariables.DeviceSecondaryArch)
1586}
1587
1588func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1589 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1590}
Yifan Hong82db7352020-01-21 16:12:26 -08001591
1592func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1593 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1594}
Yifan Hong97365ee2020-07-29 09:51:57 -07001595
1596func (c *deviceConfig) BoardKernelBinaries() []string {
1597 return c.config.productVariables.BoardKernelBinaries
1598}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001599
Yifan Hong42bef8d2020-08-05 14:36:09 -07001600func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1601 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1602}
1603
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001604func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1605 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1606}
1607
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001608func (c *deviceConfig) PlatformSepolicyVersion() string {
1609 return String(c.config.productVariables.PlatformSepolicyVersion)
1610}
1611
Inseob Kima10ef272021-09-15 03:04:53 +00001612func (c *deviceConfig) TotSepolicyVersion() string {
1613 return String(c.config.productVariables.TotSepolicyVersion)
1614}
1615
Inseob Kim843f6642022-01-07 09:11:23 +09001616func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1617 return c.config.productVariables.PlatformSepolicyCompatVersions
1618}
1619
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001620func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001621 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1622 return ver
1623 }
1624 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001625}
1626
Inseob Kim14178802021-12-08 22:53:31 +09001627func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1628 return c.config.productVariables.BoardPlatVendorPolicy
1629}
1630
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001631func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1632 return c.config.productVariables.BoardReqdMaskPolicy
1633}
1634
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001635func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1636 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1637}
1638
1639func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1640 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1641}
1642
1643func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1644 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1645}
1646
1647func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1648 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1649}
1650
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001651func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1652 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1653}
1654
1655func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1656 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1657}
1658
1659func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1660 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1661}
1662
Inseob Kim7cf14652021-01-06 23:06:52 +09001663func (c *deviceConfig) DirectedVendorSnapshot() bool {
1664 return c.config.productVariables.DirectedVendorSnapshot
1665}
1666
1667func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1668 return c.config.productVariables.VendorSnapshotModules
1669}
1670
Jose Galmes4c6895e2021-02-09 07:44:30 -08001671func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1672 return c.config.productVariables.DirectedRecoverySnapshot
1673}
1674
1675func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1676 return c.config.productVariables.RecoverySnapshotModules
1677}
1678
Justin DeMartino383bfb32021-02-24 10:49:43 -08001679func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1680 var ret = make(map[string]bool)
1681 for _, dir := range dirs {
1682 clean := filepath.Clean(dir)
1683 if previous[clean] || ret[clean] {
1684 return nil, fmt.Errorf("Duplicate entry %s", dir)
1685 }
1686 ret[clean] = true
1687 }
1688 return ret, nil
1689}
1690
1691func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1692 dirMap := c.Once(onceKey, func() interface{} {
1693 ret, err := createDirsMap(previous, dirs)
1694 if err != nil {
1695 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1696 }
1697 return ret
1698 })
1699 if dirMap == nil {
1700 return nil
1701 }
1702 return dirMap.(map[string]bool)
1703}
1704
1705var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1706
1707func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1708 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1709 c.config.productVariables.VendorSnapshotDirsExcluded)
1710}
1711
1712var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1713
1714func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1715 excludedMap := c.VendorSnapshotDirsExcludedMap()
1716 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1717 c.config.productVariables.VendorSnapshotDirsIncluded)
1718}
1719
1720var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1721
1722func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1723 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1724 c.config.productVariables.RecoverySnapshotDirsExcluded)
1725}
1726
1727var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1728
1729func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1730 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1731 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1732 c.config.productVariables.RecoverySnapshotDirsIncluded)
1733}
1734
Rob Seymour925aa092021-08-10 20:42:03 +00001735func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1736 return c.config.productVariables.HostFakeSnapshotEnabled
1737}
1738
Inseob Kim60c32f02020-12-21 22:53:05 +09001739func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1740 if c.config.productVariables.ShippingApiLevel == nil {
1741 return NoneApiLevel
1742 }
1743 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1744 return uncheckedFinalApiLevel(apiLevel)
1745}
1746
Alix Espinoef47e542022-09-14 19:10:51 +00001747func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1748 return c.config.productVariables.BuildBrokenClangAsFlags
1749}
1750
1751func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1752 return c.config.productVariables.BuildBrokenClangCFlags
1753}
1754
Alixb5f6d9e2022-04-20 23:00:58 +00001755func (c *deviceConfig) BuildBrokenClangProperty() bool {
1756 return c.config.productVariables.BuildBrokenClangProperty
1757}
1758
Inseob Kim67e5add192021-03-17 18:05:33 +09001759func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1760 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1761}
1762
1763func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1764 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1765}
1766
Cole Faustedc4c502022-09-09 19:39:25 -07001767func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1768 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1769}
1770
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001771func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1772 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1773}
1774
Inseob Kim0cac7b42021-02-03 18:16:46 +09001775func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1776 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1777}
1778
Liz Kammer619be462022-01-28 15:13:39 -05001779func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1780 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1781}
1782
Vinh Tran140d5882022-06-10 14:23:27 -04001783func (c *deviceConfig) BuildBrokenDepfile() bool {
1784 return Bool(c.config.productVariables.BuildBrokenDepfile)
1785}
1786
Inseob Kim67e5add192021-03-17 18:05:33 +09001787func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1788 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1789}
1790
1791func (c *config) SelinuxIgnoreNeverallows() bool {
1792 return c.productVariables.SelinuxIgnoreNeverallows
1793}
1794
1795func (c *deviceConfig) SepolicySplit() bool {
1796 return c.config.productVariables.SepolicySplit
1797}
1798
Inseob Kima10ef272021-09-15 03:04:53 +00001799func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1800 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1801}
1802
1803func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1804 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1805}
1806
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001807func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1808 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1809}
1810
Christopher Ferris98f10222022-07-13 23:16:52 -07001811func (c *config) IgnorePrefer32OnDevice() bool {
1812 return c.productVariables.IgnorePrefer32OnDevice
1813}
1814
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001815func (c *config) BootJars() []string {
1816 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001817 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001818 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001819 }).([]string)
1820}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001821
satayevd604b212021-07-21 14:23:52 +01001822func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001823 return c.productVariables.BootJars
1824}
1825
satayevd604b212021-07-21 14:23:52 +01001826func (c *config) ApexBootJars() ConfiguredJarList {
1827 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001828}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001829
1830func (c *config) RBEWrapper() string {
1831 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1832}
Colin Cross9b698b62021-12-22 09:55:32 -08001833
1834// UseHostMusl returns true if the host target has been configured to build against musl libc.
1835func (c *config) UseHostMusl() bool {
1836 return Bool(c.productVariables.HostMusl)
1837}
MarkDacekff851b82022-04-21 18:33:17 +00001838
Chris Parsonsf874e462022-05-10 13:50:12 -04001839func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001840 moduleName := ctx.Module().Name()
1841 c.mixedBuildsLock.Lock()
1842 defer c.mixedBuildsLock.Unlock()
1843 if useBazel {
1844 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1845 } else {
1846 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1847 }
1848}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001849
1850// ApiSurfaces directory returns the source path inside the api_surfaces repo
1851// (relative to workspace root).
1852func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1853 return filepath.Join(
1854 "build",
1855 "bazel",
1856 "api_surfaces",
1857 s.String(),
1858 version)
1859}