blob: a8b0a40b4c10b1b1cfbef5fcc97c6bff529028ee [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
90}
91
Chris Parsonsad876012022-08-20 14:48:32 -040092// Build modes that soong_build can run as.
93const (
94 // Don't use bazel at all during module analysis.
95 AnalysisNoBazel SoongBuildMode = iota
96
Lukacs T. Berkic541cd22022-10-26 07:26:50 +000097 // Symlink fores mode: merge two directory trees into a symlink forest
98 SymlinkForest
99
Chris Parsonsad876012022-08-20 14:48:32 -0400100 // Bp2build mode: Generate BUILD files from blueprint files and exit.
101 Bp2build
102
103 // Generate BUILD files which faithfully represent the dependency graph of
104 // blueprint modules. Individual BUILD targets will not, however, faitfhully
105 // express build semantics.
106 GenerateQueryView
107
Spandan Das5af0bd32022-09-28 20:43:08 +0000108 // Generate BUILD files for API contributions to API surfaces
109 ApiBp2build
110
Chris Parsonsad876012022-08-20 14:48:32 -0400111 // Create a JSON representation of the module graph and exit.
112 GenerateModuleGraph
113
114 // Generate a documentation file for module type definitions and exit.
115 GenerateDocFile
116
117 // Use bazel during analysis of many allowlisted build modules. The allowlist
118 // is considered a "developer mode" allowlist, as some modules may be
119 // allowlisted on an experimental basis.
120 BazelDevMode
121
MarkDacekb78465d2022-10-18 20:10:16 +0000122 // Use bazel during analysis of a few allowlisted build modules. The allowlist
123 // is considered "staging, as these are modules being prepared to be released
124 // into prod mode shortly after.
125 BazelStagingMode
126
Chris Parsonsad876012022-08-20 14:48:32 -0400127 // Use bazel during analysis of build modules from an allowlist carefully
128 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400129 BazelProdMode
130)
131
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200132// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200133func (c Config) SoongOutDir() string {
134 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700135}
136
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200137func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200138 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100139}
140
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200141func (c Config) RunGoTests() bool {
142 return c.runGoTests
143}
144
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100145func (c Config) DebugCompilation() bool {
146 return false // Never compile Go code in the main build for debugging
147}
148
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200149func (c Config) Subninjas() []string {
150 return []string{}
151}
152
153func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
154 return []bootstrap.PrimaryBuilderInvocation{}
155}
156
Paul Duffin74135582022-10-06 11:01:59 +0100157// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
158func (c Config) RunningInsideUnitTest() bool {
159 return c.config.TestProductVariables != nil
160}
161
Jingwen Chenc711fec2020-11-22 23:52:50 -0500162// A DeviceConfig object represents the configuration for a particular device
163// being built. For now there will only be one of these, but in the future there
164// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700165type DeviceConfig struct {
166 *deviceConfig
167}
168
Jingwen Chenc711fec2020-11-22 23:52:50 -0500169// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800170type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700171
Jingwen Chenc711fec2020-11-22 23:52:50 -0500172// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500173// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700174type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500175 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800176 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800177
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700178 // Only available on configs created by TestConfig
179 TestProductVariables *productVariables
180
Jingwen Chenc711fec2020-11-22 23:52:50 -0500181 // A specialized context object for Bazel/Soong mixed builds and migration
182 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400183 BazelContext BazelContext
184
Dan Willemsen87b17d12015-07-14 00:39:06 -0700185 ProductVariablesFileName string
186
Colin Cross0c66bc62021-07-20 09:47:41 -0700187 // BuildOS stores the OsType for the OS that the build is running on.
188 BuildOS OsType
189
190 // BuildArch stores the ArchType for the CPU that the build is running on.
191 BuildArch ArchType
192
Jaewoong Jung642916f2020-10-09 17:25:15 -0700193 Targets map[OsType][]Target
194 BuildOSTarget Target // the Target for tools run on the build machine
195 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
196 AndroidCommonTarget Target // the Target for common modules for the Android device
197 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700198
Jingwen Chenc711fec2020-11-22 23:52:50 -0500199 // multilibConflicts for an ArchType is true if there is earlier configured
200 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700201 multilibConflicts map[ArchType]bool
202
Colin Cross9272ade2016-08-17 15:24:12 -0700203 deviceConfig *deviceConfig
204
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200205 outDir string // The output directory (usually out/)
206 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400207 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700208
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200209 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200210
Colin Cross6ccbc912017-10-10 23:07:38 -0700211 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700212 envLock sync.Mutex
213 envDeps map[string]string
214 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800215
Jingwen Chencda22c92020-11-23 00:22:30 -0500216 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
217 // runs standalone.
218 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700219
Colin Cross32616ed2017-09-05 21:56:44 -0700220 captureBuild bool // true for tests, saves build parameters for each module
221 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700222
Colin Cross98be1bb2019-12-13 20:41:13 -0800223 fs pathtools.FileSystem
224 mockBpList string
225
Chris Parsonsad876012022-08-20 14:48:32 -0400226 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700227 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000228 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500229
Colin Cross5e6a7972020-06-07 16:56:32 -0700230 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
231 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000232 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700233
Jingwen Chenc711fec2020-11-22 23:52:50 -0500234 // The list of files that when changed, must invalidate soong_build to
235 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700236 ninjaFileDepsSet sync.Map
237
Colin Cross9272ade2016-08-17 15:24:12 -0700238 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000239
Chris Parsonsad876012022-08-20 14:48:32 -0400240 // These fields are only used for metrics collection. A module should be added
241 // to these maps only if its implementation supports Bazel handling in mixed
242 // builds. A module being in the "enabled" list indicates that there is a
243 // variant of that module for which bazel-handling actually took place.
244 // A module being in the "disabled" list indicates that there is a variant of
245 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000246 mixedBuildsLock sync.Mutex
247 mixedBuildEnabledModules map[string]struct{}
248 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000249
250 // These are modules to be built with Bazel beyond the allowlisted/build-mode
251 // specified modules. They are passed via the command-line flag
252 // "--bazel-force-enabled-modules"
253 bazelForceEnabledModules map[string]struct{}
Colin Cross9272ade2016-08-17 15:24:12 -0700254}
255
256type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700257 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700258 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800259}
260
Colin Cross485e5722015-08-27 13:28:01 -0700261type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700262 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700263}
Colin Cross3f40fa42015-01-30 17:27:36 -0800264
Colin Cross485e5722015-08-27 13:28:01 -0700265func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000266 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700267}
268
Jingwen Chenc711fec2020-11-22 23:52:50 -0500269// loadFromConfigFile loads and decodes configuration options from a JSON file
270// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400271func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800272 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700273 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800274 defer configFileReader.Close()
275 if os.IsNotExist(err) {
276 // Need to create a file, so that blueprint & ninja don't get in
277 // a dependency tracking loop.
278 // Make a file-configurable-options with defaults, write it out using
279 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700280 configurable.SetDefaultConfig()
281 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800282 if err != nil {
283 return err
284 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800285 } else if err != nil {
286 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800287 } else {
288 // Make a decoder for it
289 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700290 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800291 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800292 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800293 }
294 }
295
Liz Kammer09f947d2021-05-12 14:51:49 -0400296 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
297 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
298 }
299
300 configurable.Native_coverage = proptools.BoolPtr(
301 Bool(configurable.GcovCoverage) ||
302 Bool(configurable.ClangCoverage))
303
Yuntao Xu402e9b02021-08-09 15:44:44 -0700304 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
305 // if false (pre-released version, for example), use Platform_sdk_codename.
306 if Bool(configurable.Platform_sdk_final) {
307 if configurable.Platform_sdk_version != nil {
308 configurable.Platform_sdk_version_or_codename =
309 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
310 } else {
311 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
312 }
313 } else {
314 configurable.Platform_sdk_version_or_codename =
315 proptools.StringPtr(String(configurable.Platform_sdk_codename))
316 }
317
Liz Kammer09f947d2021-05-12 14:51:49 -0400318 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800319}
320
Colin Crossd8f20142016-11-03 09:43:26 -0700321// atomically writes the config file in case two copies of soong_build are running simultaneously
322// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400323func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800324 data, err := json.MarshalIndent(&config, "", " ")
325 if err != nil {
326 return fmt.Errorf("cannot marshal config data: %s", err.Error())
327 }
328
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800329 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800330 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500331 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800332 }
Colin Crossd8f20142016-11-03 09:43:26 -0700333 defer os.Remove(f.Name())
334 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800335
Colin Crossd8f20142016-11-03 09:43:26 -0700336 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800337 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700338 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
339 }
340
Colin Crossd8f20142016-11-03 09:43:26 -0700341 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700342 if err != nil {
343 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800344 }
345
Colin Crossd8f20142016-11-03 09:43:26 -0700346 f.Close()
347 os.Rename(f.Name(), filename)
348
Colin Cross3f40fa42015-01-30 17:27:36 -0800349 return nil
350}
351
Liz Kammer09f947d2021-05-12 14:51:49 -0400352func saveToBazelConfigFile(config *productVariables, outDir string) error {
353 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
354 err := createDirIfNonexistent(dir, os.ModePerm)
355 if err != nil {
356 return fmt.Errorf("Could not create dir %s: %s", dir, err)
357 }
358
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000359 nonArchVariantProductVariables := []string{}
360 archVariantProductVariables := []string{}
361 p := variableProperties{}
362 t := reflect.TypeOf(p.Product_variables)
363 for i := 0; i < t.NumField(); i++ {
364 f := t.Field(i)
365 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
366 if proptools.HasTag(f, "android", "arch_variant") {
367 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
368 }
369 }
370
Liz Kammer72beb342022-02-03 08:42:10 -0500371 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000372 if err != nil {
373 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
374 }
375
Liz Kammer72beb342022-02-03 08:42:10 -0500376 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000377 if err != nil {
378 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
379 }
380
381 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400382 if err != nil {
383 return fmt.Errorf("cannot marshal config data: %s", err.Error())
384 }
Cole Faust082c5f32022-08-04 15:49:20 -0700385 // The backslashes need to be escaped because this text is going to be put
386 // inside a Starlark string literal.
387 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400388
389 bzl := []string{
390 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000391 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
392 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
393 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
394 "\n", `
395product_vars = _product_vars
396product_var_constraints = _product_var_constraints
397arch_variant_product_var_constraints = _arch_variant_product_var_constraints
398`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400399 }
Cole Faust082c5f32022-08-04 15:49:20 -0700400 err = os.WriteFile(filepath.Join(dir, "product_variables.bzl"), []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400401 if err != nil {
402 return fmt.Errorf("Could not write .bzl config file %s", err)
403 }
Cole Faust082c5f32022-08-04 15:49:20 -0700404 err = os.WriteFile(filepath.Join(dir, "BUILD"), []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400405 if err != nil {
406 return fmt.Errorf("Could not write BUILD config file %s", err)
407 }
408
409 return nil
410}
411
Colin Cross988414c2020-01-11 01:11:46 +0000412// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
413// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200414func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000415 return Config{
416 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200417 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200418 soongOutDir: soongOutDir,
419 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000420 },
421 }
422}
423
Jingwen Chenc711fec2020-11-22 23:52:50 -0500424// NewConfig creates a new Config object. The srcDir argument specifies the path
425// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800426func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500427 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700428 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800429 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700430
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200431 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700432
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800433 outDir: cmdArgs.OutDir,
434 soongOutDir: cmdArgs.SoongOutDir,
435 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200436 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800437
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800438 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000439 fs: pathtools.NewOsFs(absSrcDir),
440 mixedBuildDisabledModules: make(map[string]struct{}),
441 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000442 bazelForceEnabledModules: make(map[string]struct{}),
Colin Cross68f55102015-03-25 14:43:57 -0700443 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800444
Dan Willemsen00269f22017-07-06 16:59:48 -0700445 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700446 config: config,
447 }
448
Liz Kammer7941b302020-07-28 13:27:34 -0700449 // Soundness check of the build and source directories. This won't catch strange
450 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800451 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700452 if err != nil {
453 return Config{}, err
454 }
455
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200456 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700457 if err != nil {
458 return Config{}, err
459 }
460
461 if strings.HasPrefix(absSrcDir, absBuildDir) {
462 return Config{}, fmt.Errorf("Build dir must not contain source directory")
463 }
464
Colin Cross3f40fa42015-01-30 17:27:36 -0800465 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700466 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800467 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700468 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800469 }
470
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800471 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500472 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
473 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800474 }
475
Colin Cross0c66bc62021-07-20 09:47:41 -0700476 determineBuildOS(config)
477
Jingwen Chenc711fec2020-11-22 23:52:50 -0500478 // Sets up the map of target OSes to the finer grained compilation targets
479 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700480 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700481 if err != nil {
482 return Config{}, err
483 }
484
Paul Duffin1356d8c2020-02-25 19:26:33 +0000485 // Make the CommonOS OsType available for all products.
486 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
487
Dan Albert4098deb2016-10-19 14:04:41 -0700488 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500489 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700490 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000491 } else if config.AmlAbis() {
492 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700493 }
494
495 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500496 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800497 if err != nil {
498 return Config{}, err
499 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700500 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800501 }
502
Colin Cross3b19f5d2019-09-17 14:45:31 -0700503 multilib := make(map[string]bool)
504 for _, target := range targets[Android] {
505 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
506 config.multilibConflicts[target.Arch.ArchType] = true
507 }
508 multilib[target.Arch.ArchType.Multilib] = true
509 }
510
Jingwen Chenc711fec2020-11-22 23:52:50 -0500511 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700512 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500513
514 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700515 config.BuildOSTarget = config.Targets[config.BuildOS][0]
516 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500517
518 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700519 if len(config.Targets[Android]) > 0 {
520 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000521 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700522 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700523
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800524 if cmdArgs.SymlinkForestMarker != "" {
525 config.BuildMode = SymlinkForest
526 } else if cmdArgs.Bp2buildMarker != "" {
527 config.BuildMode = Bp2build
528 } else if cmdArgs.BazelQueryViewDir != "" {
529 config.BuildMode = GenerateQueryView
530 } else if cmdArgs.BazelApiBp2buildDir != "" {
531 config.BuildMode = ApiBp2build
532 } else if cmdArgs.ModuleGraphFile != "" {
533 config.BuildMode = GenerateModuleGraph
534 } else if cmdArgs.DocFile != "" {
535 config.BuildMode = GenerateDocFile
536 } else if cmdArgs.BazelModeDev {
537 config.BuildMode = BazelDevMode
538 } else if cmdArgs.BazelMode {
539 config.BuildMode = BazelProdMode
540 } else if cmdArgs.BazelModeStaging {
541 config.BuildMode = BazelStagingMode
542 } else {
543 config.BuildMode = AnalysisNoBazel
544 }
545
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400546 config.BazelContext, err = NewBazelContext(config)
Cole Faust324a92e2022-08-23 15:29:05 -0700547 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
Colin Cross3f40fa42015-01-30 17:27:36 -0800548
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800549 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000550 config.bazelForceEnabledModules[module] = struct{}{}
551 }
552
Jingwen Chenc711fec2020-11-22 23:52:50 -0500553 return Config{config}, err
554}
Colin Cross988414c2020-01-11 01:11:46 +0000555
Colin Cross98be1bb2019-12-13 20:41:13 -0800556// mockFileSystem replaces all reads with accesses to the provided map of
557// filenames to contents stored as a byte slice.
558func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
559 mockFS := map[string][]byte{}
560
561 if _, exists := mockFS["Android.bp"]; !exists {
562 mockFS["Android.bp"] = []byte(bp)
563 }
564
565 for k, v := range fs {
566 mockFS[k] = v
567 }
568
569 // no module list file specified; find every file named Blueprints or Android.bp
570 pathsToParse := []string{}
571 for candidate := range mockFS {
572 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200573 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800574 pathsToParse = append(pathsToParse, candidate)
575 }
576 }
577 if len(pathsToParse) < 1 {
578 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
579 }
580 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
581
582 c.fs = pathtools.MockFs(mockFS)
583 c.mockBpList = blueprint.MockModuleListFile
584}
585
Jason Wuff1bb312022-12-21 09:57:26 -0500586// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
587// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400588// Returns true if "Bazel builds" is enabled. In this mode, part of build
589// analysis is handled by Bazel.
590func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500591 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
592 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500593 return false
594 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500595 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500596 return false
597 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500598 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500599 return false
600 }
601 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500602 return false
603 }
604 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500605 return false
606 }
607 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500608 return false
609 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500610 return true
611 }).(bool)
612
613 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
614 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400615}
616
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100617func (c *config) SetAllowMissingDependencies() {
618 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
619}
620
Jingwen Chenc711fec2020-11-22 23:52:50 -0500621// BlueprintToolLocation returns the directory containing build system tools
622// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200623func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700624 if c.KatiEnabled() {
625 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
626 } else {
627 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
628 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700629}
630
Dan Willemsen60e62f02018-11-16 21:05:32 -0800631func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700632 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
633 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800634}
635
Colin Cross790ef352021-10-25 19:15:55 -0700636func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000637 ext := ".so"
638 if runtime.GOOS == "darwin" {
639 ext = ".dylib"
640 }
Colin Cross790ef352021-10-25 19:15:55 -0700641 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
642 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000643}
644
Colin Crossae5330a2021-11-03 13:31:22 -0700645func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
646 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700647 return path
648}
649
Jingwen Chenc711fec2020-11-22 23:52:50 -0500650// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700651func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800652 switch runtime.GOOS {
653 case "linux":
654 return "linux-x86"
655 case "darwin":
656 return "darwin-x86"
657 default:
658 panic("Unknown GOOS")
659 }
660}
661
662// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700663func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200664 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800665}
666
Jingwen Chenc711fec2020-11-22 23:52:50 -0500667// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
668// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700669func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
670 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
671}
672
Jingwen Chenc711fec2020-11-22 23:52:50 -0500673// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
674// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700675func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700676 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800677 case "darwin":
678 return "-R"
679 case "linux":
680 return "-d"
681 default:
682 return ""
683 }
684}
Colin Cross68f55102015-03-25 14:43:57 -0700685
Colin Cross1332b002015-04-07 17:11:30 -0700686func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700687 var val string
688 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700689 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800690 defer c.envLock.Unlock()
691 if c.envDeps == nil {
692 c.envDeps = make(map[string]string)
693 }
Colin Cross68f55102015-03-25 14:43:57 -0700694 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700695 if c.envFrozen {
696 panic("Cannot access new environment variables after envdeps are frozen")
697 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700698 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700699 c.envDeps[key] = val
700 }
701 return val
702}
703
Colin Cross99d7c232016-11-23 16:52:04 -0800704func (c *config) GetenvWithDefault(key string, defaultValue string) string {
705 ret := c.Getenv(key)
706 if ret == "" {
707 return defaultValue
708 }
709 return ret
710}
711
712func (c *config) IsEnvTrue(key string) bool {
713 value := c.Getenv(key)
714 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
715}
716
717func (c *config) IsEnvFalse(key string) bool {
718 value := c.Getenv(key)
719 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
720}
721
Sorin Bascace720c32022-05-24 12:13:50 +0100722func (c *config) TargetsJava17() bool {
723 return c.IsEnvTrue("EXPERIMENTAL_TARGET_JAVA_VERSION_17")
724}
725
Jingwen Chenc711fec2020-11-22 23:52:50 -0500726// EnvDeps returns the environment variables this build depends on. The first
727// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700728func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700729 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800730 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700731 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700732 return c.envDeps
733}
Colin Cross35cec122015-04-02 14:37:16 -0700734
Jingwen Chencda22c92020-11-23 00:22:30 -0500735func (c *config) KatiEnabled() bool {
736 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800737}
738
Nan Zhang581fd212018-01-10 16:06:12 -0800739func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800740 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800741}
742
Jingwen Chenc711fec2020-11-22 23:52:50 -0500743// BuildNumberFile returns the path to a text file containing metadata
744// representing the current build's number.
745//
746// Rules that want to reference the build number should read from this file
747// without depending on it. They will run whenever their other dependencies
748// require them to run and get the current build number. This ensures they don't
749// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800750func (c *config) BuildNumberFile(ctx PathContext) Path {
751 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800752}
753
Jingwen Chenc711fec2020-11-22 23:52:50 -0500754// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700755// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700756func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800757 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700758}
759
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000760// DeviceProduct returns the current product target. There could be multiple of
761// these per device type.
762//
Chris Parsonsef615e52022-08-18 22:04:11 -0400763// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000764func (c *config) DeviceProduct() string {
765 return *c.productVariables.DeviceProduct
766}
767
Cole Faustb85d1a12022-11-08 18:14:01 -0800768// HasDeviceProduct returns if the build has a product. A build will not
769// necessarily have a product when --skip-config is passed to soong, like it is
770// in prebuilts/build-tools/build-prebuilts.sh
771func (c *config) HasDeviceProduct() bool {
772 return c.productVariables.DeviceProduct != nil
773}
774
Anton Hansson53c88442019-03-18 15:53:16 +0000775func (c *config) DeviceResourceOverlays() []string {
776 return c.productVariables.DeviceResourceOverlays
777}
778
779func (c *config) ProductResourceOverlays() []string {
780 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700781}
782
Colin Crossbfd347d2018-05-09 11:11:35 -0700783func (c *config) PlatformVersionName() string {
784 return String(c.productVariables.Platform_version_name)
785}
786
Dan Albert4f378d72020-07-23 17:32:15 -0700787func (c *config) PlatformSdkVersion() ApiLevel {
788 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700789}
790
Mu-Le Lee5e047532022-07-27 02:32:03 +0000791func (c *config) PlatformSdkFinal() bool {
792 return Bool(c.productVariables.Platform_sdk_final)
793}
794
Colin Crossd09b0b62018-04-18 11:06:47 -0700795func (c *config) PlatformSdkCodename() string {
796 return String(c.productVariables.Platform_sdk_codename)
797}
798
Anton Hansson97d0bae2022-02-16 16:15:10 +0000799func (c *config) PlatformSdkExtensionVersion() int {
800 return *c.productVariables.Platform_sdk_extension_version
801}
802
803func (c *config) PlatformBaseSdkExtensionVersion() int {
804 return *c.productVariables.Platform_base_sdk_extension_version
805}
806
Colin Cross092c9da2019-04-02 22:56:43 -0700807func (c *config) PlatformSecurityPatch() string {
808 return String(c.productVariables.Platform_security_patch)
809}
810
811func (c *config) PlatformPreviewSdkVersion() string {
812 return String(c.productVariables.Platform_preview_sdk_version)
813}
814
815func (c *config) PlatformMinSupportedTargetSdkVersion() string {
816 return String(c.productVariables.Platform_min_supported_target_sdk_version)
817}
818
819func (c *config) PlatformBaseOS() string {
820 return String(c.productVariables.Platform_base_os)
821}
822
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900823func (c *config) PlatformVersionLastStable() string {
824 return String(c.productVariables.Platform_version_last_stable)
825}
826
Jiyong Park37073842022-06-21 10:13:42 +0900827func (c *config) PlatformVersionKnownCodenames() string {
828 return String(c.productVariables.Platform_version_known_codenames)
829}
830
Dan Albert1a246272020-07-06 14:49:35 -0700831func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000832 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700833}
834
835func (c *config) FinalApiLevels() []ApiLevel {
836 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700837 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700838 levels = append(levels, uncheckedFinalApiLevel(i))
839 }
840 return levels
841}
842
843func (c *config) PreviewApiLevels() []ApiLevel {
844 var levels []ApiLevel
845 for i, codename := range c.PlatformVersionActiveCodenames() {
846 levels = append(levels, ApiLevel{
847 value: codename,
848 number: i,
849 isPreview: true,
850 })
851 }
852 return levels
853}
854
satayevcca4ab72021-11-30 12:33:55 +0000855func (c *config) LatestPreviewApiLevel() ApiLevel {
856 level := NoneApiLevel
857 for _, l := range c.PreviewApiLevels() {
858 if l.GreaterThan(level) {
859 level = l
860 }
861 }
862 return level
863}
864
Dan Albert1a246272020-07-06 14:49:35 -0700865func (c *config) AllSupportedApiLevels() []ApiLevel {
866 var levels []ApiLevel
867 levels = append(levels, c.FinalApiLevels()...)
868 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700869}
870
Jingwen Chenc711fec2020-11-22 23:52:50 -0500871// DefaultAppTargetSdk returns the API level that platform apps are targeting.
872// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700873func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Colin Crossd09b0b62018-04-18 11:06:47 -0700874 if Bool(c.productVariables.Platform_sdk_final) {
875 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700876 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500877 codename := c.PlatformSdkCodename()
878 if codename == "" {
879 return NoneApiLevel
880 }
881 if codename == "REL" {
882 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
883 }
884 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700885}
886
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800887func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800888 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800889}
890
Dan Albert31384de2017-07-28 12:39:46 -0700891// Codenames that are active in the current lunch target.
892func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800893 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700894}
895
Colin Crossface4e42017-10-30 17:32:15 -0700896func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800897 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700898}
899
Colin Crossface4e42017-10-30 17:32:15 -0700900func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800901 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700902}
903
Colin Crossface4e42017-10-30 17:32:15 -0700904func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800905 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700906}
907
908func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800909 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700910}
911
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700912func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800913 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800914 if defaultCert != "" {
915 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800916 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500917 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700918}
919
Colin Crosse1731a52017-12-14 11:22:55 -0800920func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800921 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800922 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800923 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800924 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500925 defaultDir := c.DefaultAppCertificateDir(ctx)
926 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700927}
Colin Cross6ff51382015-12-17 16:39:19 -0800928
Jiyong Park9335a262018-12-24 11:31:58 +0900929func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
930 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
931 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700932 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900933 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
934 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800935 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900936 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500937 // If not, APEX keys are under the specified directory
938 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900939}
940
Inseob Kim80fa7982022-08-12 21:36:25 +0900941// Certificate for the NetworkStack sepolicy context
942func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
943 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
944 if cert != "" {
945 return PathForSource(ctx, cert)
946 }
947 return c.DefaultAppCertificateDir(ctx)
948}
949
Jingwen Chenc711fec2020-11-22 23:52:50 -0500950// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
951// are configured to depend on non-existent modules. Note that this does not
952// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800953func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800954 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800955}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800956
Jeongik Cha816a23a2020-07-08 01:09:23 +0900957// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700958func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800959 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700960}
961
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100962// Returns true if building apps that aren't bundled with the platform.
963// UnbundledBuild() is always true when this is true.
964func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -0800965 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100966}
967
Jeongik Cha4b073cd2021-06-08 11:35:00 +0900968// Returns true if building image that aren't bundled with the platform.
969// UnbundledBuild() is always true when this is true.
970func (c *config) UnbundledBuildImage() bool {
971 return Bool(c.productVariables.Unbundled_build_image)
972}
973
Jeongik Cha816a23a2020-07-08 01:09:23 +0900974// Returns true if building modules against prebuilt SDKs.
975func (c *config) AlwaysUsePrebuiltSdks() bool {
976 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -0800977}
978
Colin Cross126a25c2017-10-31 13:55:34 -0700979func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800980 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -0700981}
982
Colin Crossed064c02018-09-05 16:28:13 -0700983func (c *config) Debuggable() bool {
984 return Bool(c.productVariables.Debuggable)
985}
986
Jaewoong Jung1d6eb682018-11-29 15:08:44 -0800987func (c *config) Eng() bool {
988 return Bool(c.productVariables.Eng)
989}
990
Colin Crossc53c37f2021-12-08 15:42:22 -0800991// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
992// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +0900993func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -0800994 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
995 return androidTargets[0].Arch.ArchType
996 }
997 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +0900998}
999
Colin Cross16b23492016-01-06 14:41:07 -08001000func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001001 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001002}
1003
1004func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001005 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001006}
1007
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001008func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001009 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001010}
1011
Colin Cross23ae82a2016-11-02 14:34:39 -07001012func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001013 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001014}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001015
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001016func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001017 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001018 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001019 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001020 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001021}
1022
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001023func (c *config) DisableScudo() bool {
1024 return Bool(c.productVariables.DisableScudo)
1025}
1026
Colin Crossa1ad8d12016-06-01 17:09:44 -07001027func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001028 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001029 if t.Arch.ArchType.Multilib == "lib64" {
1030 return true
1031 }
1032 }
1033
1034 return false
1035}
Colin Cross9272ade2016-08-17 15:24:12 -07001036
Colin Cross9d45bb72016-08-29 16:14:13 -07001037func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001038 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001039}
1040
Ramy Medhatbbf25672019-07-17 12:30:04 +00001041func (c *config) UseRBE() bool {
1042 return Bool(c.productVariables.UseRBE)
1043}
1044
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001045func (c *config) UseRBEJAVAC() bool {
1046 return Bool(c.productVariables.UseRBEJAVAC)
1047}
1048
1049func (c *config) UseRBER8() bool {
1050 return Bool(c.productVariables.UseRBER8)
1051}
1052
1053func (c *config) UseRBED8() bool {
1054 return Bool(c.productVariables.UseRBED8)
1055}
1056
Colin Cross8b8bec32019-11-15 13:18:43 -08001057func (c *config) UseRemoteBuild() bool {
1058 return c.UseGoma() || c.UseRBE()
1059}
1060
Colin Cross66548102018-06-19 22:47:35 -07001061func (c *config) RunErrorProne() bool {
1062 return c.IsEnvTrue("RUN_ERROR_PRONE")
1063}
1064
Jingwen Chenc711fec2020-11-22 23:52:50 -05001065// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001066func (c *config) XrefCorpusName() string {
1067 return c.Getenv("XREF_CORPUS")
1068}
1069
Jingwen Chenc711fec2020-11-22 23:52:50 -05001070// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1071// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001072func (c *config) XrefCuEncoding() string {
1073 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1074 return enc
1075 }
1076 return "json"
1077}
1078
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001079// XrefCuJavaSourceMax returns the maximum number of the Java source files
1080// in a single compilation unit
1081const xrefJavaSourceFileMaxDefault = "1000"
1082
1083func (c Config) XrefCuJavaSourceMax() string {
1084 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1085 if v == "" {
1086 return xrefJavaSourceFileMaxDefault
1087 }
1088 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1089 fmt.Fprintf(os.Stderr,
1090 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1091 err, xrefJavaSourceFileMaxDefault)
1092 return xrefJavaSourceFileMaxDefault
1093 }
1094 return v
1095
1096}
1097
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001098func (c *config) EmitXrefRules() bool {
1099 return c.XrefCorpusName() != ""
1100}
1101
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001102func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001103 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001104}
1105
1106func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001107 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001108 return ""
1109 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001110 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001111}
1112
Colin Cross0f4e0d62016-07-27 10:56:55 -07001113func (c *config) LibartImgHostBaseAddress() string {
1114 return "0x60000000"
1115}
1116
1117func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001118 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001119}
1120
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001121func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001122 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001123}
1124
Jingwen Chenc711fec2020-11-22 23:52:50 -05001125// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1126// but some modules still depend on it.
1127//
1128// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001129func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001130 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001131
Roland Levillainf6cc2612020-07-09 16:58:14 +01001132 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001133 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001134 return true
1135 }
Colin Crossa74ca042019-01-31 14:31:51 -08001136 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001137 }
1138 return false
1139}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001140func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001141 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001142 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001143 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001144 }
1145 return false
1146}
1147
1148func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001149 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001150}
1151
Spandan Dasc5763832022-11-08 18:42:16 +00001152func (c *config) IncludeTags() []string {
1153 return c.productVariables.IncludeTags
1154}
1155
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001156func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001157 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001158}
1159
Colin Cross5a0dcd52018-10-05 14:20:06 -07001160func (c *config) UncompressPrivAppDex() bool {
1161 return Bool(c.productVariables.UncompressPrivAppDex)
1162}
1163
1164func (c *config) ModulesLoadedByPrivilegedModules() []string {
1165 return c.productVariables.ModulesLoadedByPrivilegedModules
1166}
1167
Jingwen Chenc711fec2020-11-22 23:52:50 -05001168// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1169// the output directory, if it was created during the product configuration
1170// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001171func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001172 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001173 return OptionalPathForPath(nil)
1174 }
1175 return OptionalPathForPath(
1176 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1177}
1178
Jingwen Chenc711fec2020-11-22 23:52:50 -05001179// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1180// configuration. Since the configuration file was created by Kati during
1181// product configuration (externally of soong_build), it's not tracked, so we
1182// also manually add a Ninja file dependency on the configuration file to the
1183// rule that creates the main build.ninja file. This ensures that build.ninja is
1184// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001185func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1186 path := c.DexpreoptGlobalConfigPath(ctx)
1187 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001188 return nil, nil
1189 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001190 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001191 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001192}
1193
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001194func (c *deviceConfig) WithDexpreopt() bool {
1195 return c.config.productVariables.WithDexpreopt
1196}
1197
Colin Cross662d6142022-11-03 20:38:01 -07001198func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001199 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001200}
1201
Inseob Kimae553032019-05-14 18:52:49 +09001202func (c *config) VndkSnapshotBuildArtifacts() bool {
1203 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1204}
1205
Colin Cross3b19f5d2019-09-17 14:45:31 -07001206func (c *config) HasMultilibConflict(arch ArchType) bool {
1207 return c.multilibConflicts[arch]
1208}
1209
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001210func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001211 return String(c.productVariables.PrebuiltHiddenApiDir)
1212}
1213
MarkDacekd06db5d2022-11-29 00:47:59 +00001214func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1215 return c.bazelForceEnabledModules
1216}
1217
Colin Cross9272ade2016-08-17 15:24:12 -07001218func (c *deviceConfig) Arches() []Arch {
1219 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001220 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001221 arches = append(arches, target.Arch)
1222 }
1223 return arches
1224}
Dan Willemsend2ede872016-11-18 14:54:24 -08001225
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001226func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001227 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001228 if is32BitBinder != nil && *is32BitBinder {
1229 return "32"
1230 }
1231 return "64"
1232}
1233
Dan Willemsen4353bc42016-12-05 17:16:02 -08001234func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001235 if c.config.productVariables.VendorPath != nil {
1236 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001237 }
1238 return "vendor"
1239}
1240
Justin Yun71549282017-11-17 12:10:28 +09001241func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001242 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001243}
1244
Jose Galmes6f843bc2020-12-11 13:36:29 -08001245func (c *deviceConfig) RecoverySnapshotVersion() string {
1246 return String(c.config.productVariables.RecoverySnapshotVersion)
1247}
1248
Jeongik Cha219141c2020-08-06 23:00:37 +09001249func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1250 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1251}
1252
Justin Yun8fe12122017-12-07 17:18:15 +09001253func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001254 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001255}
1256
Justin Yun5f7f7e82019-11-18 19:52:14 +09001257func (c *deviceConfig) ProductVndkVersion() string {
1258 return String(c.config.productVariables.ProductVndkVersion)
1259}
1260
Justin Yun71549282017-11-17 12:10:28 +09001261func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001262 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001263}
Jack He8cc71432016-12-08 15:45:07 -08001264
Vic Yangefd249e2018-11-12 20:19:56 -08001265func (c *deviceConfig) VndkUseCoreVariant() bool {
1266 return Bool(c.config.productVariables.VndkUseCoreVariant)
1267}
1268
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001269func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001270 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001271}
1272
1273func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001274 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001275}
1276
Jiyong Park2db76922017-11-08 16:03:48 +09001277func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001278 if c.config.productVariables.OdmPath != nil {
1279 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001280 }
1281 return "odm"
1282}
1283
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001284func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001285 if c.config.productVariables.ProductPath != nil {
1286 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001287 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001288 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001289}
1290
Justin Yund5f6c822019-06-25 16:47:17 +09001291func (c *deviceConfig) SystemExtPath() string {
1292 if c.config.productVariables.SystemExtPath != nil {
1293 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001294 }
Justin Yund5f6c822019-06-25 16:47:17 +09001295 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001296}
1297
Jack He8cc71432016-12-08 15:45:07 -08001298func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001299 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001300}
Dan Willemsen581341d2017-02-09 16:16:31 -08001301
Jiyong Parkd773eb32017-07-03 13:18:12 +09001302func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001303 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001304}
1305
Roland Levillainada12702020-06-09 13:07:36 +01001306// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1307// path. Coverage is enabled by default when the product variable
1308// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1309// enabled for any path which is part of this variable (and not part of the
1310// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1311// represents any path.
1312func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1313 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001314 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001315 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1316 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1317 coverage = true
1318 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001319 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001320 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1321 coverage = false
1322 }
1323 }
1324 return coverage
1325}
1326
Colin Cross1a6acd42020-06-16 17:51:46 -07001327// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001328func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001329 return Bool(c.config.productVariables.GcovCoverage) ||
1330 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001331}
1332
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001333func (c *deviceConfig) ClangCoverageEnabled() bool {
1334 return Bool(c.config.productVariables.ClangCoverage)
1335}
1336
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001337func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1338 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1339}
1340
Colin Cross1a6acd42020-06-16 17:51:46 -07001341func (c *deviceConfig) GcovCoverageEnabled() bool {
1342 return Bool(c.config.productVariables.GcovCoverage)
1343}
1344
Roland Levillain4f5297b2020-06-09 12:44:06 +01001345// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1346// code coverage is enabled for path. By default, coverage is not enabled for a
1347// given path unless it is part of the NativeCoveragePaths product variable (and
1348// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1349// NativeCoveragePaths represents any path.
1350func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001351 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001352 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001353 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001354 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001355 }
1356 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001357 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001358 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001359 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001360 }
1361 }
1362 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001363}
Ivan Lozano5f595532017-07-13 14:46:05 -07001364
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001365func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001366 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001367}
1368
Tri Vo35a51432018-03-25 20:00:00 -07001369func (c *deviceConfig) VendorSepolicyDirs() []string {
1370 return c.config.productVariables.BoardVendorSepolicyDirs
1371}
1372
1373func (c *deviceConfig) OdmSepolicyDirs() []string {
1374 return c.config.productVariables.BoardOdmSepolicyDirs
1375}
1376
Felixa20a8752020-05-17 18:28:35 +02001377func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1378 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001379}
1380
Felixa20a8752020-05-17 18:28:35 +02001381func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1382 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001383}
1384
Inseob Kim0866b002019-04-15 20:21:29 +09001385func (c *deviceConfig) SepolicyM4Defs() []string {
1386 return c.config.productVariables.BoardSepolicyM4Defs
1387}
1388
Jiyong Park7f67f482019-01-05 12:57:48 +09001389func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001390 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1391 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1392}
1393
1394func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001395 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001396 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1397}
1398
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001399func (c *deviceConfig) OverridePackageNameFor(name string) string {
1400 newName, overridden := findOverrideValue(
1401 c.config.productVariables.PackageNameOverrides,
1402 name,
1403 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1404 if overridden {
1405 return newName
1406 }
1407 return name
1408}
1409
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001410func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001411 if overrides == nil || len(overrides) == 0 {
1412 return "", false
1413 }
1414 for _, o := range overrides {
1415 split := strings.Split(o, ":")
1416 if len(split) != 2 {
1417 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001418 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001419 }
1420 if matchPattern(split[0], name) {
1421 return substPattern(split[0], split[1], name), true
1422 }
1423 }
1424 return "", false
1425}
1426
Albert Martineefabcf2022-03-21 20:11:16 +00001427func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1428 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1429}
1430
Ivan Lozano5f595532017-07-13 14:46:05 -07001431func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001432 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001433 return false
1434 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001435 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001436}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001437
1438func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001439 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001440 return false
1441 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001442 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001443}
1444
1445func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001446 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001447 return false
1448 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001449 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001450}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001451
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001452func (c *config) MemtagHeapDisabledForPath(path string) bool {
1453 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1454 return false
1455 }
1456 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1457}
1458
1459func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1460 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1461 return false
1462 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001463 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001464}
1465
1466func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1467 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1468 return false
1469 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001470 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001471}
1472
Dan Willemsen0fe78662018-03-26 12:41:18 -07001473func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001474 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001475}
1476
Colin Cross395f2cf2018-10-24 16:10:32 -07001477func (c *config) NdkAbis() bool {
1478 return Bool(c.productVariables.Ndk_abis)
1479}
1480
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001481func (c *config) AmlAbis() bool {
1482 return Bool(c.productVariables.Aml_abis)
1483}
1484
Jiyong Park8fd61922018-11-08 02:50:25 +09001485func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001486 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001487}
1488
Jiyong Park4da07972021-01-05 21:01:11 +09001489func (c *config) ForceApexSymlinkOptimization() bool {
1490 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1491}
1492
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001493func (c *config) ApexCompressionEnabled() bool {
1494 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001495}
1496
Jeongik Chac9464142019-01-07 12:07:27 +09001497func (c *config) EnforceSystemCertificate() bool {
1498 return Bool(c.productVariables.EnforceSystemCertificate)
1499}
1500
Colin Cross440e0d02020-06-11 11:32:11 -07001501func (c *config) EnforceSystemCertificateAllowList() []string {
1502 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001503}
1504
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001505func (c *config) EnforceProductPartitionInterface() bool {
1506 return Bool(c.productVariables.EnforceProductPartitionInterface)
1507}
1508
JaeMan Parkff715562020-10-19 17:25:58 +09001509func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1510 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1511}
1512
1513func (c *config) InterPartitionJavaLibraryAllowList() []string {
1514 return c.productVariables.InterPartitionJavaLibraryAllowList
1515}
1516
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001517func (c *config) InstallExtraFlattenedApexes() bool {
1518 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1519}
1520
Colin Crossf24a22a2019-01-31 14:12:44 -08001521func (c *config) ProductHiddenAPIStubs() []string {
1522 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001523}
1524
Colin Crossf24a22a2019-01-31 14:12:44 -08001525func (c *config) ProductHiddenAPIStubsSystem() []string {
1526 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001527}
1528
Colin Crossf24a22a2019-01-31 14:12:44 -08001529func (c *config) ProductHiddenAPIStubsTest() []string {
1530 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001531}
Dan Willemsen71c74602019-04-10 12:27:35 -07001532
Dan Willemsen54879d12019-04-18 10:08:46 -07001533func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001534 return c.config.productVariables.TargetFSConfigGen
1535}
Inseob Kim0866b002019-04-15 20:21:29 +09001536
1537func (c *config) ProductPublicSepolicyDirs() []string {
1538 return c.productVariables.ProductPublicSepolicyDirs
1539}
1540
1541func (c *config) ProductPrivateSepolicyDirs() []string {
1542 return c.productVariables.ProductPrivateSepolicyDirs
1543}
1544
Colin Cross50ddcc42019-05-16 12:28:22 -07001545func (c *config) MissingUsesLibraries() []string {
1546 return c.productVariables.MissingUsesLibraries
1547}
1548
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001549func (c *config) TargetMultitreeUpdateMeta() bool {
1550 return c.productVariables.MultitreeUpdateMeta
1551}
1552
Inseob Kim1f086e22019-05-09 13:29:15 +09001553func (c *deviceConfig) DeviceArch() string {
1554 return String(c.config.productVariables.DeviceArch)
1555}
1556
1557func (c *deviceConfig) DeviceArchVariant() string {
1558 return String(c.config.productVariables.DeviceArchVariant)
1559}
1560
1561func (c *deviceConfig) DeviceSecondaryArch() string {
1562 return String(c.config.productVariables.DeviceSecondaryArch)
1563}
1564
1565func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1566 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1567}
Yifan Hong82db7352020-01-21 16:12:26 -08001568
1569func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1570 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1571}
Yifan Hong97365ee2020-07-29 09:51:57 -07001572
1573func (c *deviceConfig) BoardKernelBinaries() []string {
1574 return c.config.productVariables.BoardKernelBinaries
1575}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001576
Yifan Hong42bef8d2020-08-05 14:36:09 -07001577func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1578 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1579}
1580
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001581func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1582 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1583}
1584
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001585func (c *deviceConfig) PlatformSepolicyVersion() string {
1586 return String(c.config.productVariables.PlatformSepolicyVersion)
1587}
1588
Inseob Kima10ef272021-09-15 03:04:53 +00001589func (c *deviceConfig) TotSepolicyVersion() string {
1590 return String(c.config.productVariables.TotSepolicyVersion)
1591}
1592
Inseob Kim843f6642022-01-07 09:11:23 +09001593func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1594 return c.config.productVariables.PlatformSepolicyCompatVersions
1595}
1596
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001597func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001598 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1599 return ver
1600 }
1601 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001602}
1603
Inseob Kim14178802021-12-08 22:53:31 +09001604func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1605 return c.config.productVariables.BoardPlatVendorPolicy
1606}
1607
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001608func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1609 return c.config.productVariables.BoardReqdMaskPolicy
1610}
1611
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001612func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1613 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1614}
1615
1616func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1617 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1618}
1619
1620func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1621 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1622}
1623
1624func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1625 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1626}
1627
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001628func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1629 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1630}
1631
1632func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1633 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1634}
1635
1636func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1637 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1638}
1639
Inseob Kim7cf14652021-01-06 23:06:52 +09001640func (c *deviceConfig) DirectedVendorSnapshot() bool {
1641 return c.config.productVariables.DirectedVendorSnapshot
1642}
1643
1644func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1645 return c.config.productVariables.VendorSnapshotModules
1646}
1647
Jose Galmes4c6895e2021-02-09 07:44:30 -08001648func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1649 return c.config.productVariables.DirectedRecoverySnapshot
1650}
1651
1652func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1653 return c.config.productVariables.RecoverySnapshotModules
1654}
1655
Justin DeMartino383bfb32021-02-24 10:49:43 -08001656func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1657 var ret = make(map[string]bool)
1658 for _, dir := range dirs {
1659 clean := filepath.Clean(dir)
1660 if previous[clean] || ret[clean] {
1661 return nil, fmt.Errorf("Duplicate entry %s", dir)
1662 }
1663 ret[clean] = true
1664 }
1665 return ret, nil
1666}
1667
1668func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1669 dirMap := c.Once(onceKey, func() interface{} {
1670 ret, err := createDirsMap(previous, dirs)
1671 if err != nil {
1672 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1673 }
1674 return ret
1675 })
1676 if dirMap == nil {
1677 return nil
1678 }
1679 return dirMap.(map[string]bool)
1680}
1681
1682var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1683
1684func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1685 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1686 c.config.productVariables.VendorSnapshotDirsExcluded)
1687}
1688
1689var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1690
1691func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1692 excludedMap := c.VendorSnapshotDirsExcludedMap()
1693 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1694 c.config.productVariables.VendorSnapshotDirsIncluded)
1695}
1696
1697var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1698
1699func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1700 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1701 c.config.productVariables.RecoverySnapshotDirsExcluded)
1702}
1703
1704var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1705
1706func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1707 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1708 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1709 c.config.productVariables.RecoverySnapshotDirsIncluded)
1710}
1711
Rob Seymour925aa092021-08-10 20:42:03 +00001712func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1713 return c.config.productVariables.HostFakeSnapshotEnabled
1714}
1715
Inseob Kim60c32f02020-12-21 22:53:05 +09001716func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1717 if c.config.productVariables.ShippingApiLevel == nil {
1718 return NoneApiLevel
1719 }
1720 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1721 return uncheckedFinalApiLevel(apiLevel)
1722}
1723
Alix Espinoef47e542022-09-14 19:10:51 +00001724func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1725 return c.config.productVariables.BuildBrokenClangAsFlags
1726}
1727
1728func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1729 return c.config.productVariables.BuildBrokenClangCFlags
1730}
1731
Alixb5f6d9e2022-04-20 23:00:58 +00001732func (c *deviceConfig) BuildBrokenClangProperty() bool {
1733 return c.config.productVariables.BuildBrokenClangProperty
1734}
1735
Inseob Kim67e5add192021-03-17 18:05:33 +09001736func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1737 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1738}
1739
1740func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1741 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1742}
1743
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001744func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1745 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1746}
1747
Inseob Kim0cac7b42021-02-03 18:16:46 +09001748func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1749 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1750}
1751
Liz Kammer619be462022-01-28 15:13:39 -05001752func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1753 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1754}
1755
Vinh Tran140d5882022-06-10 14:23:27 -04001756func (c *deviceConfig) BuildBrokenDepfile() bool {
1757 return Bool(c.config.productVariables.BuildBrokenDepfile)
1758}
1759
Inseob Kim67e5add192021-03-17 18:05:33 +09001760func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1761 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1762}
1763
1764func (c *config) SelinuxIgnoreNeverallows() bool {
1765 return c.productVariables.SelinuxIgnoreNeverallows
1766}
1767
1768func (c *deviceConfig) SepolicySplit() bool {
1769 return c.config.productVariables.SepolicySplit
1770}
1771
Inseob Kima10ef272021-09-15 03:04:53 +00001772func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1773 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1774}
1775
1776func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1777 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1778}
1779
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001780func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1781 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1782}
1783
Christopher Ferris98f10222022-07-13 23:16:52 -07001784func (c *config) IgnorePrefer32OnDevice() bool {
1785 return c.productVariables.IgnorePrefer32OnDevice
1786}
1787
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001788func (c *config) BootJars() []string {
1789 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001790 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001791 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001792 }).([]string)
1793}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001794
satayevd604b212021-07-21 14:23:52 +01001795func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001796 return c.productVariables.BootJars
1797}
1798
satayevd604b212021-07-21 14:23:52 +01001799func (c *config) ApexBootJars() ConfiguredJarList {
1800 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001801}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001802
1803func (c *config) RBEWrapper() string {
1804 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1805}
Colin Cross9b698b62021-12-22 09:55:32 -08001806
1807// UseHostMusl returns true if the host target has been configured to build against musl libc.
1808func (c *config) UseHostMusl() bool {
1809 return Bool(c.productVariables.HostMusl)
1810}
MarkDacekff851b82022-04-21 18:33:17 +00001811
Chris Parsonsf874e462022-05-10 13:50:12 -04001812func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001813 moduleName := ctx.Module().Name()
1814 c.mixedBuildsLock.Lock()
1815 defer c.mixedBuildsLock.Unlock()
1816 if useBazel {
1817 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1818 } else {
1819 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1820 }
1821}