blob: f52a48fe82de8af9ba7f494f3638ce4c6ea038df [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
Jingwen Chenc711fec2020-11-22 23:52:50 -050017// This is the primary location to write and read all configuration values and
18// product variables necessary for soong_build's operation.
19
Colin Cross3f40fa42015-01-30 17:27:36 -080020import (
Cole Faust082c5f32022-08-04 15:49:20 -070021 "bytes"
Colin Cross3f40fa42015-01-30 17:27:36 -080022 "encoding/json"
23 "fmt"
24 "os"
Colin Cross35cec122015-04-02 14:37:16 -070025 "path/filepath"
Sam Delmerico5c32bbf2022-01-20 20:15:02 +000026 "reflect"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "runtime"
Inseob Kim60c32f02020-12-21 22:53:05 +090028 "strconv"
Dan Willemsen34cc69e2015-09-23 15:26:20 -070029 "strings"
Colin Crossc1e86a32015-04-15 12:33:28 -070030 "sync"
Colin Cross6ff51382015-12-17 16:39:19 -080031
Colin Cross98be1bb2019-12-13 20:41:13 -080032 "github.com/google/blueprint"
Colin Crosse87040b2017-12-11 15:52:26 -080033 "github.com/google/blueprint/bootstrap"
Colin Cross98be1bb2019-12-13 20:41:13 -080034 "github.com/google/blueprint/pathtools"
Colin Cross6ff51382015-12-17 16:39:19 -080035 "github.com/google/blueprint/proptools"
Colin Cross9d34f352019-11-22 16:03:51 -080036
37 "android/soong/android/soongconfig"
Liz Kammer09f947d2021-05-12 14:51:49 -040038 "android/soong/bazel"
Colin Cross77cdcfd2021-03-12 11:28:25 -080039 "android/soong/remoteexec"
Liz Kammer72beb342022-02-03 08:42:10 -050040 "android/soong/starlark_fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080041)
42
Jingwen Chenc711fec2020-11-22 23:52:50 -050043// Bool re-exports proptools.Bool for the android package.
Colin Cross6ff51382015-12-17 16:39:19 -080044var Bool = proptools.Bool
Jingwen Chenc711fec2020-11-22 23:52:50 -050045
46// String re-exports proptools.String for the android package.
Jack He8cc71432016-12-08 15:45:07 -080047var String = proptools.String
Jingwen Chenc711fec2020-11-22 23:52:50 -050048
49// StringDefault re-exports proptools.StringDefault for the android package.
Jeongik Cha219141c2020-08-06 23:00:37 +090050var StringDefault = proptools.StringDefault
Jiyong Park6a927c42020-01-21 02:03:43 +090051
Jingwen Chenc711fec2020-11-22 23:52:50 -050052// FutureApiLevelInt is a placeholder constant for unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070053const FutureApiLevelInt = 10000
54
Spandan Das15da5882023-03-02 23:36:39 +000055// PrivateApiLevel represents the api level of SdkSpecPrivate (sdk_version: "")
56// This api_level exists to differentiate user-provided "" from "current" sdk_version
57// The differentiation is necessary to enable different validation rules for these two possible values.
58var PrivateApiLevel = ApiLevel{
59 value: "current", // The value is current since aidl expects `current` as the default (TestAidlFlagsWithMinSdkVersion)
60 number: FutureApiLevelInt + 1, // This is used to differentiate it from FutureApiLevel
61 isPreview: true,
62}
63
Jingwen Chenc711fec2020-11-22 23:52:50 -050064// FutureApiLevel represents unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070065var FutureApiLevel = ApiLevel{
66 value: "current",
67 number: FutureApiLevelInt,
68 isPreview: true,
69}
Colin Cross6ff51382015-12-17 16:39:19 -080070
Jingwen Chenc4d91bc2020-11-24 22:59:26 -050071// The product variables file name, containing product config from Kati.
Dan Willemsen87b17d12015-07-14 00:39:06 -070072const productVariablesFileName = "soong.variables"
Colin Cross3f40fa42015-01-30 17:27:36 -080073
Colin Cross9272ade2016-08-17 15:24:12 -070074// A Config object represents the entire build configuration for Android.
Colin Crossc3c0a492015-04-10 15:43:55 -070075type Config struct {
76 *config
77}
78
Chris Parsonsad876012022-08-20 14:48:32 -040079type SoongBuildMode int
80
Sasha Smundakaf5ca922022-12-12 21:23:34 -080081type CmdArgs struct {
82 bootstrap.Args
83 RunGoTests bool
84 OutDir string
85 SoongOutDir string
86
87 SymlinkForestMarker string
88 Bp2buildMarker string
89 BazelQueryViewDir string
90 BazelApiBp2buildDir string
91 ModuleGraphFile string
92 ModuleActionsFile string
93 DocFile string
94
LaMont Jones52a72432023-03-09 18:19:35 +000095 MultitreeBuild bool
96
Sasha Smundakaf5ca922022-12-12 21:23:34 -080097 BazelMode bool
98 BazelModeDev bool
99 BazelModeStaging bool
100 BazelForceEnabledModules string
Chris Parsons9402ca82023-02-23 17:28:06 -0500101
102 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000103
104 BuildFromTextStub bool
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800105}
106
Chris Parsonsad876012022-08-20 14:48:32 -0400107// Build modes that soong_build can run as.
108const (
109 // Don't use bazel at all during module analysis.
110 AnalysisNoBazel SoongBuildMode = iota
111
Lukacs T. Berkic541cd22022-10-26 07:26:50 +0000112 // Symlink fores mode: merge two directory trees into a symlink forest
113 SymlinkForest
114
Chris Parsonsad876012022-08-20 14:48:32 -0400115 // Bp2build mode: Generate BUILD files from blueprint files and exit.
116 Bp2build
117
118 // Generate BUILD files which faithfully represent the dependency graph of
119 // blueprint modules. Individual BUILD targets will not, however, faitfhully
120 // express build semantics.
121 GenerateQueryView
122
Spandan Das5af0bd32022-09-28 20:43:08 +0000123 // Generate BUILD files for API contributions to API surfaces
124 ApiBp2build
125
Chris Parsonsad876012022-08-20 14:48:32 -0400126 // Create a JSON representation of the module graph and exit.
127 GenerateModuleGraph
128
129 // Generate a documentation file for module type definitions and exit.
130 GenerateDocFile
131
132 // Use bazel during analysis of many allowlisted build modules. The allowlist
133 // is considered a "developer mode" allowlist, as some modules may be
134 // allowlisted on an experimental basis.
135 BazelDevMode
136
MarkDacekb78465d2022-10-18 20:10:16 +0000137 // Use bazel during analysis of a few allowlisted build modules. The allowlist
138 // is considered "staging, as these are modules being prepared to be released
139 // into prod mode shortly after.
140 BazelStagingMode
141
Chris Parsonsad876012022-08-20 14:48:32 -0400142 // Use bazel during analysis of build modules from an allowlist carefully
143 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400144 BazelProdMode
145)
146
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200147// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200148func (c Config) SoongOutDir() string {
149 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700150}
151
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200152func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200153 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100154}
155
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200156func (c Config) RunGoTests() bool {
157 return c.runGoTests
158}
159
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100160func (c Config) DebugCompilation() bool {
161 return false // Never compile Go code in the main build for debugging
162}
163
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200164func (c Config) Subninjas() []string {
165 return []string{}
166}
167
168func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
169 return []bootstrap.PrimaryBuilderInvocation{}
170}
171
Paul Duffin74135582022-10-06 11:01:59 +0100172// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
173func (c Config) RunningInsideUnitTest() bool {
174 return c.config.TestProductVariables != nil
175}
176
Jingwen Chenc711fec2020-11-22 23:52:50 -0500177// A DeviceConfig object represents the configuration for a particular device
178// being built. For now there will only be one of these, but in the future there
179// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700180type DeviceConfig struct {
181 *deviceConfig
182}
183
Jingwen Chenc711fec2020-11-22 23:52:50 -0500184// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800185type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700186
Jingwen Chenc711fec2020-11-22 23:52:50 -0500187// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500188// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700189type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500190 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800191 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800192
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700193 // Only available on configs created by TestConfig
194 TestProductVariables *productVariables
195
Jingwen Chenc711fec2020-11-22 23:52:50 -0500196 // A specialized context object for Bazel/Soong mixed builds and migration
197 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400198 BazelContext BazelContext
199
Dan Willemsen87b17d12015-07-14 00:39:06 -0700200 ProductVariablesFileName string
201
Colin Cross0c66bc62021-07-20 09:47:41 -0700202 // BuildOS stores the OsType for the OS that the build is running on.
203 BuildOS OsType
204
205 // BuildArch stores the ArchType for the CPU that the build is running on.
206 BuildArch ArchType
207
Jaewoong Jung642916f2020-10-09 17:25:15 -0700208 Targets map[OsType][]Target
209 BuildOSTarget Target // the Target for tools run on the build machine
210 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
211 AndroidCommonTarget Target // the Target for common modules for the Android device
212 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700213
Jingwen Chenc711fec2020-11-22 23:52:50 -0500214 // multilibConflicts for an ArchType is true if there is earlier configured
215 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700216 multilibConflicts map[ArchType]bool
217
Colin Cross9272ade2016-08-17 15:24:12 -0700218 deviceConfig *deviceConfig
219
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200220 outDir string // The output directory (usually out/)
221 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400222 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700223
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200224 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200225
Colin Cross6ccbc912017-10-10 23:07:38 -0700226 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700227 envLock sync.Mutex
228 envDeps map[string]string
229 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800230
Jingwen Chencda22c92020-11-23 00:22:30 -0500231 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
232 // runs standalone.
233 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700234
Colin Cross32616ed2017-09-05 21:56:44 -0700235 captureBuild bool // true for tests, saves build parameters for each module
236 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700237
Colin Cross98be1bb2019-12-13 20:41:13 -0800238 fs pathtools.FileSystem
239 mockBpList string
240
Chris Parsonsad876012022-08-20 14:48:32 -0400241 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700242 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000243 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500244
LaMont Jones52a72432023-03-09 18:19:35 +0000245 // If MultitreeBuild is true then this is one inner tree of a multitree
246 // build directed by the multitree orchestrator.
247 MultitreeBuild bool
248
Colin Cross5e6a7972020-06-07 16:56:32 -0700249 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
250 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000251 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700252
Jingwen Chenc711fec2020-11-22 23:52:50 -0500253 // The list of files that when changed, must invalidate soong_build to
254 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700255 ninjaFileDepsSet sync.Map
256
Colin Cross9272ade2016-08-17 15:24:12 -0700257 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000258
Chris Parsonsad876012022-08-20 14:48:32 -0400259 // These fields are only used for metrics collection. A module should be added
260 // to these maps only if its implementation supports Bazel handling in mixed
261 // builds. A module being in the "enabled" list indicates that there is a
262 // variant of that module for which bazel-handling actually took place.
263 // A module being in the "disabled" list indicates that there is a variant of
264 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000265 mixedBuildsLock sync.Mutex
266 mixedBuildEnabledModules map[string]struct{}
267 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000268
269 // These are modules to be built with Bazel beyond the allowlisted/build-mode
270 // specified modules. They are passed via the command-line flag
271 // "--bazel-force-enabled-modules"
272 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500273
274 // If true, for any requests to Bazel, communicate with a Bazel proxy using
275 // unix sockets, instead of spawning Bazel as a subprocess.
276 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000277
278 // If buildFromTextStub is true then the Java API stubs are
279 // built from the signature text files, not the source Java files.
280 buildFromTextStub bool
Colin Cross9272ade2016-08-17 15:24:12 -0700281}
282
283type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700284 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700285 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800286}
287
Colin Cross485e5722015-08-27 13:28:01 -0700288type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700289 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700290}
Colin Cross3f40fa42015-01-30 17:27:36 -0800291
Colin Cross485e5722015-08-27 13:28:01 -0700292func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000293 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700294}
295
Jingwen Chenc711fec2020-11-22 23:52:50 -0500296// loadFromConfigFile loads and decodes configuration options from a JSON file
297// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400298func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800299 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700300 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800301 defer configFileReader.Close()
302 if os.IsNotExist(err) {
303 // Need to create a file, so that blueprint & ninja don't get in
304 // a dependency tracking loop.
305 // Make a file-configurable-options with defaults, write it out using
306 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700307 configurable.SetDefaultConfig()
308 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800309 if err != nil {
310 return err
311 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800312 } else if err != nil {
313 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800314 } else {
315 // Make a decoder for it
316 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700317 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800318 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800319 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800320 }
321 }
322
Liz Kammer09f947d2021-05-12 14:51:49 -0400323 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
324 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
325 }
326
327 configurable.Native_coverage = proptools.BoolPtr(
328 Bool(configurable.GcovCoverage) ||
329 Bool(configurable.ClangCoverage))
330
Yuntao Xu402e9b02021-08-09 15:44:44 -0700331 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
332 // if false (pre-released version, for example), use Platform_sdk_codename.
333 if Bool(configurable.Platform_sdk_final) {
334 if configurable.Platform_sdk_version != nil {
335 configurable.Platform_sdk_version_or_codename =
336 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
337 } else {
338 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
339 }
340 } else {
341 configurable.Platform_sdk_version_or_codename =
342 proptools.StringPtr(String(configurable.Platform_sdk_codename))
343 }
344
Liz Kammer09f947d2021-05-12 14:51:49 -0400345 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800346}
347
Colin Crossd8f20142016-11-03 09:43:26 -0700348// atomically writes the config file in case two copies of soong_build are running simultaneously
349// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400350func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800351 data, err := json.MarshalIndent(&config, "", " ")
352 if err != nil {
353 return fmt.Errorf("cannot marshal config data: %s", err.Error())
354 }
355
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800356 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800357 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500358 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800359 }
Colin Crossd8f20142016-11-03 09:43:26 -0700360 defer os.Remove(f.Name())
361 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800362
Colin Crossd8f20142016-11-03 09:43:26 -0700363 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800364 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700365 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
366 }
367
Colin Crossd8f20142016-11-03 09:43:26 -0700368 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700369 if err != nil {
370 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800371 }
372
Colin Crossd8f20142016-11-03 09:43:26 -0700373 f.Close()
374 os.Rename(f.Name(), filename)
375
Colin Cross3f40fa42015-01-30 17:27:36 -0800376 return nil
377}
378
Liz Kammer09f947d2021-05-12 14:51:49 -0400379func saveToBazelConfigFile(config *productVariables, outDir string) error {
380 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
381 err := createDirIfNonexistent(dir, os.ModePerm)
382 if err != nil {
383 return fmt.Errorf("Could not create dir %s: %s", dir, err)
384 }
385
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000386 nonArchVariantProductVariables := []string{}
387 archVariantProductVariables := []string{}
388 p := variableProperties{}
389 t := reflect.TypeOf(p.Product_variables)
390 for i := 0; i < t.NumField(); i++ {
391 f := t.Field(i)
392 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
393 if proptools.HasTag(f, "android", "arch_variant") {
394 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
395 }
396 }
397
Liz Kammer72beb342022-02-03 08:42:10 -0500398 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000399 if err != nil {
400 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
401 }
402
Liz Kammer72beb342022-02-03 08:42:10 -0500403 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000404 if err != nil {
405 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
406 }
407
408 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400409 if err != nil {
410 return fmt.Errorf("cannot marshal config data: %s", err.Error())
411 }
Cole Faust082c5f32022-08-04 15:49:20 -0700412 // The backslashes need to be escaped because this text is going to be put
413 // inside a Starlark string literal.
414 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400415
416 bzl := []string{
417 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000418 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
419 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
420 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
421 "\n", `
422product_vars = _product_vars
Cole Fausteb644cf2023-04-11 13:48:17 -0700423
424# TODO(b/269577299) Remove these when everything switches over to loading them from product_variable_constants.bzl
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000425product_var_constraints = _product_var_constraints
426arch_variant_product_var_constraints = _arch_variant_product_var_constraints
427`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400428 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500429 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
430 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400431 if err != nil {
432 return fmt.Errorf("Could not write .bzl config file %s", err)
433 }
Cole Fausteb644cf2023-04-11 13:48:17 -0700434 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variable_constants.bzl"), []byte(fmt.Sprintf(`
435product_var_constraints = %s
436arch_variant_product_var_constraints = %s
437`, nonArchVariantProductVariablesJson, archVariantProductVariablesJson)), 0644)
438 if err != nil {
439 return fmt.Errorf("Could not write .bzl config file %s", err)
440 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500441 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
442 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400443 if err != nil {
444 return fmt.Errorf("Could not write BUILD config file %s", err)
445 }
446
447 return nil
448}
449
Colin Cross988414c2020-01-11 01:11:46 +0000450// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
451// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200452func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000453 return Config{
454 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200455 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200456 soongOutDir: soongOutDir,
457 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000458 },
459 }
460}
461
Jingwen Chenc711fec2020-11-22 23:52:50 -0500462// NewConfig creates a new Config object. The srcDir argument specifies the path
463// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800464func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500465 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700466 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800467 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700468
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200469 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700470
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800471 outDir: cmdArgs.OutDir,
472 soongOutDir: cmdArgs.SoongOutDir,
473 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200474 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800475
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800476 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000477 fs: pathtools.NewOsFs(absSrcDir),
478 mixedBuildDisabledModules: make(map[string]struct{}),
479 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000480 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500481
LaMont Jones52a72432023-03-09 18:19:35 +0000482 MultitreeBuild: cmdArgs.MultitreeBuild,
483 UseBazelProxy: cmdArgs.UseBazelProxy,
Jihoon Kang1bff0342023-01-17 20:40:22 +0000484
485 buildFromTextStub: cmdArgs.BuildFromTextStub,
Colin Cross68f55102015-03-25 14:43:57 -0700486 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800487
Dan Willemsen00269f22017-07-06 16:59:48 -0700488 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700489 config: config,
490 }
491
Liz Kammer7941b302020-07-28 13:27:34 -0700492 // Soundness check of the build and source directories. This won't catch strange
493 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800494 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700495 if err != nil {
496 return Config{}, err
497 }
498
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200499 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700500 if err != nil {
501 return Config{}, err
502 }
503
504 if strings.HasPrefix(absSrcDir, absBuildDir) {
505 return Config{}, fmt.Errorf("Build dir must not contain source directory")
506 }
507
Colin Cross3f40fa42015-01-30 17:27:36 -0800508 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700509 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800510 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700511 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800512 }
513
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800514 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500515 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
516 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800517 }
518
Colin Cross0c66bc62021-07-20 09:47:41 -0700519 determineBuildOS(config)
520
Jingwen Chenc711fec2020-11-22 23:52:50 -0500521 // Sets up the map of target OSes to the finer grained compilation targets
522 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700523 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700524 if err != nil {
525 return Config{}, err
526 }
527
Paul Duffin1356d8c2020-02-25 19:26:33 +0000528 // Make the CommonOS OsType available for all products.
529 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
530
Dan Albert4098deb2016-10-19 14:04:41 -0700531 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500532 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700533 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000534 } else if config.AmlAbis() {
535 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700536 }
537
538 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500539 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800540 if err != nil {
541 return Config{}, err
542 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700543 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800544 }
545
Colin Cross3b19f5d2019-09-17 14:45:31 -0700546 multilib := make(map[string]bool)
547 for _, target := range targets[Android] {
548 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
549 config.multilibConflicts[target.Arch.ArchType] = true
550 }
551 multilib[target.Arch.ArchType.Multilib] = true
552 }
553
Jingwen Chenc711fec2020-11-22 23:52:50 -0500554 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700555 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500556
557 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700558 config.BuildOSTarget = config.Targets[config.BuildOS][0]
559 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500560
561 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700562 if len(config.Targets[Android]) > 0 {
563 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000564 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700565 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700566
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500567 setBuildMode := func(arg string, mode SoongBuildMode) {
568 if arg != "" {
569 if config.BuildMode != AnalysisNoBazel {
570 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
571 os.Exit(1)
572 }
573 config.BuildMode = mode
574 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800575 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500576 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
577 if arg {
578 if config.BuildMode != AnalysisNoBazel {
579 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
580 os.Exit(1)
581 }
582 config.BuildMode = mode
583 }
584 }
585 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
586 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
587 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
588 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
589 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
590 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
591 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
592 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
593 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800594
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800595 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000596 config.bazelForceEnabledModules[module] = struct{}{}
597 }
MarkDacek9c094ca2023-03-16 19:15:19 +0000598 config.BazelContext, err = NewBazelContext(config)
599 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
MarkDacekd06db5d2022-11-29 00:47:59 +0000600
Jingwen Chenc711fec2020-11-22 23:52:50 -0500601 return Config{config}, err
602}
Colin Cross988414c2020-01-11 01:11:46 +0000603
Colin Cross98be1bb2019-12-13 20:41:13 -0800604// mockFileSystem replaces all reads with accesses to the provided map of
605// filenames to contents stored as a byte slice.
606func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
607 mockFS := map[string][]byte{}
608
609 if _, exists := mockFS["Android.bp"]; !exists {
610 mockFS["Android.bp"] = []byte(bp)
611 }
612
613 for k, v := range fs {
614 mockFS[k] = v
615 }
616
617 // no module list file specified; find every file named Blueprints or Android.bp
618 pathsToParse := []string{}
619 for candidate := range mockFS {
620 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200621 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800622 pathsToParse = append(pathsToParse, candidate)
623 }
624 }
625 if len(pathsToParse) < 1 {
626 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
627 }
628 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
629
630 c.fs = pathtools.MockFs(mockFS)
631 c.mockBpList = blueprint.MockModuleListFile
632}
633
Jason Wuff1bb312022-12-21 09:57:26 -0500634// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
635// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400636// Returns true if "Bazel builds" is enabled. In this mode, part of build
637// analysis is handled by Bazel.
638func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500639 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
640 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500641 return false
642 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500643 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500644 return false
645 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500646 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500647 return false
648 }
649 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500650 return false
651 }
652 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500653 return false
654 }
655 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500656 return false
657 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500658 return true
659 }).(bool)
660
661 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
662 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400663}
664
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100665func (c *config) SetAllowMissingDependencies() {
666 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
667}
668
Jingwen Chenc711fec2020-11-22 23:52:50 -0500669// BlueprintToolLocation returns the directory containing build system tools
670// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200671func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700672 if c.KatiEnabled() {
673 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
674 } else {
675 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
676 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700677}
678
Dan Willemsen60e62f02018-11-16 21:05:32 -0800679func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700680 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
681 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800682}
683
Colin Cross790ef352021-10-25 19:15:55 -0700684func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000685 ext := ".so"
686 if runtime.GOOS == "darwin" {
687 ext = ".dylib"
688 }
Colin Cross790ef352021-10-25 19:15:55 -0700689 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
690 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000691}
692
Colin Crossae5330a2021-11-03 13:31:22 -0700693func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
694 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700695 return path
696}
697
Jingwen Chenc711fec2020-11-22 23:52:50 -0500698// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700699func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800700 switch runtime.GOOS {
701 case "linux":
702 return "linux-x86"
703 case "darwin":
704 return "darwin-x86"
705 default:
706 panic("Unknown GOOS")
707 }
708}
709
710// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700711func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200712 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800713}
714
Jingwen Chenc711fec2020-11-22 23:52:50 -0500715// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
716// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700717func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
718 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
719}
720
Jingwen Chenc711fec2020-11-22 23:52:50 -0500721// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
722// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700723func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700724 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800725 case "darwin":
726 return "-R"
727 case "linux":
728 return "-d"
729 default:
730 return ""
731 }
732}
Colin Cross68f55102015-03-25 14:43:57 -0700733
Colin Cross1332b002015-04-07 17:11:30 -0700734func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700735 var val string
736 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700737 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800738 defer c.envLock.Unlock()
739 if c.envDeps == nil {
740 c.envDeps = make(map[string]string)
741 }
Colin Cross68f55102015-03-25 14:43:57 -0700742 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700743 if c.envFrozen {
744 panic("Cannot access new environment variables after envdeps are frozen")
745 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700746 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700747 c.envDeps[key] = val
748 }
749 return val
750}
751
Colin Cross99d7c232016-11-23 16:52:04 -0800752func (c *config) GetenvWithDefault(key string, defaultValue string) string {
753 ret := c.Getenv(key)
754 if ret == "" {
755 return defaultValue
756 }
757 return ret
758}
759
760func (c *config) IsEnvTrue(key string) bool {
761 value := c.Getenv(key)
762 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
763}
764
765func (c *config) IsEnvFalse(key string) bool {
766 value := c.Getenv(key)
767 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
768}
769
Jingwen Chenc711fec2020-11-22 23:52:50 -0500770// EnvDeps returns the environment variables this build depends on. The first
771// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700772func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700773 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800774 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700775 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700776 return c.envDeps
777}
Colin Cross35cec122015-04-02 14:37:16 -0700778
Jingwen Chencda22c92020-11-23 00:22:30 -0500779func (c *config) KatiEnabled() bool {
780 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800781}
782
Nan Zhang581fd212018-01-10 16:06:12 -0800783func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800784 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800785}
786
Jingwen Chenc711fec2020-11-22 23:52:50 -0500787// BuildNumberFile returns the path to a text file containing metadata
788// representing the current build's number.
789//
790// Rules that want to reference the build number should read from this file
791// without depending on it. They will run whenever their other dependencies
792// require them to run and get the current build number. This ensures they don't
793// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800794func (c *config) BuildNumberFile(ctx PathContext) Path {
795 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800796}
797
Jingwen Chenc711fec2020-11-22 23:52:50 -0500798// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700799// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700800func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800801 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700802}
803
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000804// DeviceProduct returns the current product target. There could be multiple of
805// these per device type.
806//
Chris Parsonsef615e52022-08-18 22:04:11 -0400807// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000808func (c *config) DeviceProduct() string {
809 return *c.productVariables.DeviceProduct
810}
811
Cole Faustb85d1a12022-11-08 18:14:01 -0800812// HasDeviceProduct returns if the build has a product. A build will not
813// necessarily have a product when --skip-config is passed to soong, like it is
814// in prebuilts/build-tools/build-prebuilts.sh
815func (c *config) HasDeviceProduct() bool {
816 return c.productVariables.DeviceProduct != nil
817}
818
Anton Hansson53c88442019-03-18 15:53:16 +0000819func (c *config) DeviceResourceOverlays() []string {
820 return c.productVariables.DeviceResourceOverlays
821}
822
823func (c *config) ProductResourceOverlays() []string {
824 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700825}
826
Colin Crossbfd347d2018-05-09 11:11:35 -0700827func (c *config) PlatformVersionName() string {
828 return String(c.productVariables.Platform_version_name)
829}
830
Dan Albert4f378d72020-07-23 17:32:15 -0700831func (c *config) PlatformSdkVersion() ApiLevel {
832 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700833}
834
Cole Faust37d27c42023-04-12 10:27:45 -0700835func (c *config) RawPlatformSdkVersion() *int {
836 return c.productVariables.Platform_sdk_version
837}
838
Mu-Le Lee5e047532022-07-27 02:32:03 +0000839func (c *config) PlatformSdkFinal() bool {
840 return Bool(c.productVariables.Platform_sdk_final)
841}
842
Colin Crossd09b0b62018-04-18 11:06:47 -0700843func (c *config) PlatformSdkCodename() string {
844 return String(c.productVariables.Platform_sdk_codename)
845}
846
Anton Hansson97d0bae2022-02-16 16:15:10 +0000847func (c *config) PlatformSdkExtensionVersion() int {
848 return *c.productVariables.Platform_sdk_extension_version
849}
850
851func (c *config) PlatformBaseSdkExtensionVersion() int {
852 return *c.productVariables.Platform_base_sdk_extension_version
853}
854
Colin Cross092c9da2019-04-02 22:56:43 -0700855func (c *config) PlatformSecurityPatch() string {
856 return String(c.productVariables.Platform_security_patch)
857}
858
859func (c *config) PlatformPreviewSdkVersion() string {
860 return String(c.productVariables.Platform_preview_sdk_version)
861}
862
863func (c *config) PlatformMinSupportedTargetSdkVersion() string {
864 return String(c.productVariables.Platform_min_supported_target_sdk_version)
865}
866
867func (c *config) PlatformBaseOS() string {
868 return String(c.productVariables.Platform_base_os)
869}
870
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900871func (c *config) PlatformVersionLastStable() string {
872 return String(c.productVariables.Platform_version_last_stable)
873}
874
Jiyong Park37073842022-06-21 10:13:42 +0900875func (c *config) PlatformVersionKnownCodenames() string {
876 return String(c.productVariables.Platform_version_known_codenames)
877}
878
Dan Albert1a246272020-07-06 14:49:35 -0700879func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000880 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700881}
882
883func (c *config) FinalApiLevels() []ApiLevel {
884 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700885 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700886 levels = append(levels, uncheckedFinalApiLevel(i))
887 }
888 return levels
889}
890
891func (c *config) PreviewApiLevels() []ApiLevel {
892 var levels []ApiLevel
893 for i, codename := range c.PlatformVersionActiveCodenames() {
894 levels = append(levels, ApiLevel{
895 value: codename,
896 number: i,
897 isPreview: true,
898 })
899 }
900 return levels
901}
902
satayevcca4ab72021-11-30 12:33:55 +0000903func (c *config) LatestPreviewApiLevel() ApiLevel {
904 level := NoneApiLevel
905 for _, l := range c.PreviewApiLevels() {
906 if l.GreaterThan(level) {
907 level = l
908 }
909 }
910 return level
911}
912
Dan Albert1a246272020-07-06 14:49:35 -0700913func (c *config) AllSupportedApiLevels() []ApiLevel {
914 var levels []ApiLevel
915 levels = append(levels, c.FinalApiLevels()...)
916 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700917}
918
Jingwen Chenc711fec2020-11-22 23:52:50 -0500919// DefaultAppTargetSdk returns the API level that platform apps are targeting.
920// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700921func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000922 // This logic is replicated in starlark, if changing logic here update starlark code too
923 // https://cs.android.com/android/platform/superproject/+/master:build/bazel/rules/common/api.bzl;l=72;drc=231c7e8c8038fd478a79eb68aa5b9f5c64e0e061
Colin Crossd09b0b62018-04-18 11:06:47 -0700924 if Bool(c.productVariables.Platform_sdk_final) {
925 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700926 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500927 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900928 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500929 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900930 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
931 // don't set platform sdk codename. Platform sdk codename makes sense only when we
932 // are building the platform. So we don't enforce the below panic for the host-only
933 // builds.
934 if hostOnlyBuild {
935 return NoneApiLevel
936 }
937 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500938 }
939 if codename == "REL" {
940 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
941 }
942 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700943}
944
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800945func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800946 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800947}
948
Dan Albert31384de2017-07-28 12:39:46 -0700949// Codenames that are active in the current lunch target.
950func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800951 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700952}
953
Dan Albert8c7a9942023-03-27 20:34:01 +0000954// All unreleased codenames.
955func (c *config) PlatformVersionAllPreviewCodenames() []string {
956 return c.productVariables.Platform_version_all_preview_codenames
957}
958
Colin Crossface4e42017-10-30 17:32:15 -0700959func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800960 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700961}
962
Colin Crossface4e42017-10-30 17:32:15 -0700963func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800964 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700965}
966
Colin Crossface4e42017-10-30 17:32:15 -0700967func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800968 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700969}
970
971func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800972 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700973}
974
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700975func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800976 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800977 if defaultCert != "" {
978 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800979 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500980 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700981}
982
Colin Crosse1731a52017-12-14 11:22:55 -0800983func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800984 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800985 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800986 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800987 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500988 defaultDir := c.DefaultAppCertificateDir(ctx)
989 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700990}
Colin Cross6ff51382015-12-17 16:39:19 -0800991
Jiyong Park9335a262018-12-24 11:31:58 +0900992func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
993 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
994 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700995 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900996 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
997 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800998 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900999 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001000 // If not, APEX keys are under the specified directory
1001 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001002}
1003
Inseob Kim80fa7982022-08-12 21:36:25 +09001004// Certificate for the NetworkStack sepolicy context
1005func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1006 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1007 if cert != "" {
1008 return PathForSource(ctx, cert)
1009 }
1010 return c.DefaultAppCertificateDir(ctx)
1011}
1012
Jingwen Chenc711fec2020-11-22 23:52:50 -05001013// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1014// are configured to depend on non-existent modules. Note that this does not
1015// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001016func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001017 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001018}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001019
Jeongik Cha816a23a2020-07-08 01:09:23 +09001020// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001021func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001022 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001023}
1024
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001025// Returns true if building apps that aren't bundled with the platform.
1026// UnbundledBuild() is always true when this is true.
1027func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001028 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001029}
1030
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001031// Returns true if building image that aren't bundled with the platform.
1032// UnbundledBuild() is always true when this is true.
1033func (c *config) UnbundledBuildImage() bool {
1034 return Bool(c.productVariables.Unbundled_build_image)
1035}
1036
Jeongik Cha816a23a2020-07-08 01:09:23 +09001037// Returns true if building modules against prebuilt SDKs.
1038func (c *config) AlwaysUsePrebuiltSdks() bool {
1039 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001040}
1041
Colin Cross126a25c2017-10-31 13:55:34 -07001042func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001043 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001044}
1045
Colin Crossed064c02018-09-05 16:28:13 -07001046func (c *config) Debuggable() bool {
1047 return Bool(c.productVariables.Debuggable)
1048}
1049
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001050func (c *config) Eng() bool {
1051 return Bool(c.productVariables.Eng)
1052}
1053
Colin Crossc53c37f2021-12-08 15:42:22 -08001054// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1055// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001056func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001057 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1058 return androidTargets[0].Arch.ArchType
1059 }
1060 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001061}
1062
Colin Cross16b23492016-01-06 14:41:07 -08001063func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001064 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001065}
1066
1067func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001068 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001069}
1070
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001071func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001072 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001073}
1074
Colin Cross23ae82a2016-11-02 14:34:39 -07001075func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001076 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001077}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001078
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001079func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001080 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001081 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001082 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001083 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001084}
1085
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001086func (c *config) DisableScudo() bool {
1087 return Bool(c.productVariables.DisableScudo)
1088}
1089
Colin Crossa1ad8d12016-06-01 17:09:44 -07001090func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001091 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001092 if t.Arch.ArchType.Multilib == "lib64" {
1093 return true
1094 }
1095 }
1096
1097 return false
1098}
Colin Cross9272ade2016-08-17 15:24:12 -07001099
Colin Cross9d45bb72016-08-29 16:14:13 -07001100func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001101 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001102}
1103
Ramy Medhatbbf25672019-07-17 12:30:04 +00001104func (c *config) UseRBE() bool {
1105 return Bool(c.productVariables.UseRBE)
1106}
1107
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001108func (c *config) UseRBEJAVAC() bool {
1109 return Bool(c.productVariables.UseRBEJAVAC)
1110}
1111
1112func (c *config) UseRBER8() bool {
1113 return Bool(c.productVariables.UseRBER8)
1114}
1115
1116func (c *config) UseRBED8() bool {
1117 return Bool(c.productVariables.UseRBED8)
1118}
1119
Colin Cross8b8bec32019-11-15 13:18:43 -08001120func (c *config) UseRemoteBuild() bool {
1121 return c.UseGoma() || c.UseRBE()
1122}
1123
Colin Cross66548102018-06-19 22:47:35 -07001124func (c *config) RunErrorProne() bool {
1125 return c.IsEnvTrue("RUN_ERROR_PRONE")
1126}
1127
Jingwen Chenc711fec2020-11-22 23:52:50 -05001128// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001129func (c *config) XrefCorpusName() string {
1130 return c.Getenv("XREF_CORPUS")
1131}
1132
Jingwen Chenc711fec2020-11-22 23:52:50 -05001133// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1134// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001135func (c *config) XrefCuEncoding() string {
1136 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1137 return enc
1138 }
1139 return "json"
1140}
1141
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001142// XrefCuJavaSourceMax returns the maximum number of the Java source files
1143// in a single compilation unit
1144const xrefJavaSourceFileMaxDefault = "1000"
1145
1146func (c Config) XrefCuJavaSourceMax() string {
1147 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1148 if v == "" {
1149 return xrefJavaSourceFileMaxDefault
1150 }
1151 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1152 fmt.Fprintf(os.Stderr,
1153 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1154 err, xrefJavaSourceFileMaxDefault)
1155 return xrefJavaSourceFileMaxDefault
1156 }
1157 return v
1158
1159}
1160
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001161func (c *config) EmitXrefRules() bool {
1162 return c.XrefCorpusName() != ""
1163}
1164
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001165func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001166 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001167}
1168
1169func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001170 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001171 return ""
1172 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001173 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001174}
1175
Colin Cross0f4e0d62016-07-27 10:56:55 -07001176func (c *config) LibartImgHostBaseAddress() string {
1177 return "0x60000000"
1178}
1179
1180func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001181 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001182}
1183
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001184func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001185 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001186}
1187
Jingwen Chenc711fec2020-11-22 23:52:50 -05001188// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1189// but some modules still depend on it.
1190//
1191// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001192func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001193 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001194
Roland Levillainf6cc2612020-07-09 16:58:14 +01001195 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001196 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001197 return true
1198 }
Colin Crossa74ca042019-01-31 14:31:51 -08001199 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001200 }
1201 return false
1202}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001203func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001204 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001205 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001206 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001207 }
1208 return false
1209}
1210
1211func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001212 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001213}
1214
Sam Delmerico98a73292023-02-21 11:50:29 -05001215func (c *config) SourceRootDirs() []string {
1216 return c.productVariables.SourceRootDirs
1217}
1218
Spandan Dasc5763832022-11-08 18:42:16 +00001219func (c *config) IncludeTags() []string {
1220 return c.productVariables.IncludeTags
1221}
1222
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001223func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001224 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001225}
1226
Colin Cross5a0dcd52018-10-05 14:20:06 -07001227func (c *config) UncompressPrivAppDex() bool {
1228 return Bool(c.productVariables.UncompressPrivAppDex)
1229}
1230
1231func (c *config) ModulesLoadedByPrivilegedModules() []string {
1232 return c.productVariables.ModulesLoadedByPrivilegedModules
1233}
1234
Jingwen Chenc711fec2020-11-22 23:52:50 -05001235// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1236// the output directory, if it was created during the product configuration
1237// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001238func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001239 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001240 return OptionalPathForPath(nil)
1241 }
1242 return OptionalPathForPath(
1243 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1244}
1245
Jingwen Chenc711fec2020-11-22 23:52:50 -05001246// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1247// configuration. Since the configuration file was created by Kati during
1248// product configuration (externally of soong_build), it's not tracked, so we
1249// also manually add a Ninja file dependency on the configuration file to the
1250// rule that creates the main build.ninja file. This ensures that build.ninja is
1251// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001252func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1253 path := c.DexpreoptGlobalConfigPath(ctx)
1254 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001255 return nil, nil
1256 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001257 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001258 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001259}
1260
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001261func (c *deviceConfig) WithDexpreopt() bool {
1262 return c.config.productVariables.WithDexpreopt
1263}
1264
Colin Cross662d6142022-11-03 20:38:01 -07001265func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001266 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001267}
1268
Inseob Kimae553032019-05-14 18:52:49 +09001269func (c *config) VndkSnapshotBuildArtifacts() bool {
1270 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1271}
1272
Colin Cross3b19f5d2019-09-17 14:45:31 -07001273func (c *config) HasMultilibConflict(arch ArchType) bool {
1274 return c.multilibConflicts[arch]
1275}
1276
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001277func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001278 return String(c.productVariables.PrebuiltHiddenApiDir)
1279}
1280
MarkDacekd06db5d2022-11-29 00:47:59 +00001281func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1282 return c.bazelForceEnabledModules
1283}
1284
Colin Cross9272ade2016-08-17 15:24:12 -07001285func (c *deviceConfig) Arches() []Arch {
1286 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001287 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001288 arches = append(arches, target.Arch)
1289 }
1290 return arches
1291}
Dan Willemsend2ede872016-11-18 14:54:24 -08001292
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001293func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001294 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001295 if is32BitBinder != nil && *is32BitBinder {
1296 return "32"
1297 }
1298 return "64"
1299}
1300
Dan Willemsen4353bc42016-12-05 17:16:02 -08001301func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001302 if c.config.productVariables.VendorPath != nil {
1303 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001304 }
1305 return "vendor"
1306}
1307
Justin Yun71549282017-11-17 12:10:28 +09001308func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001309 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001310}
1311
Jose Galmes6f843bc2020-12-11 13:36:29 -08001312func (c *deviceConfig) RecoverySnapshotVersion() string {
1313 return String(c.config.productVariables.RecoverySnapshotVersion)
1314}
1315
Jeongik Cha219141c2020-08-06 23:00:37 +09001316func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1317 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1318}
1319
Justin Yun8fe12122017-12-07 17:18:15 +09001320func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001321 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001322}
1323
Justin Yun5f7f7e82019-11-18 19:52:14 +09001324func (c *deviceConfig) ProductVndkVersion() string {
1325 return String(c.config.productVariables.ProductVndkVersion)
1326}
1327
Justin Yun71549282017-11-17 12:10:28 +09001328func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001329 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001330}
Jack He8cc71432016-12-08 15:45:07 -08001331
Vic Yangefd249e2018-11-12 20:19:56 -08001332func (c *deviceConfig) VndkUseCoreVariant() bool {
1333 return Bool(c.config.productVariables.VndkUseCoreVariant)
1334}
1335
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001336func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001337 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001338}
1339
1340func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001341 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001342}
1343
Jiyong Park2db76922017-11-08 16:03:48 +09001344func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001345 if c.config.productVariables.OdmPath != nil {
1346 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001347 }
1348 return "odm"
1349}
1350
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001351func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001352 if c.config.productVariables.ProductPath != nil {
1353 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001354 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001355 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001356}
1357
Justin Yund5f6c822019-06-25 16:47:17 +09001358func (c *deviceConfig) SystemExtPath() string {
1359 if c.config.productVariables.SystemExtPath != nil {
1360 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001361 }
Justin Yund5f6c822019-06-25 16:47:17 +09001362 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001363}
1364
Jack He8cc71432016-12-08 15:45:07 -08001365func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001366 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001367}
Dan Willemsen581341d2017-02-09 16:16:31 -08001368
Jiyong Parkd773eb32017-07-03 13:18:12 +09001369func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001370 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001371}
1372
Roland Levillainada12702020-06-09 13:07:36 +01001373// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1374// path. Coverage is enabled by default when the product variable
1375// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1376// enabled for any path which is part of this variable (and not part of the
1377// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1378// represents any path.
1379func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1380 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001381 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001382 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1383 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1384 coverage = true
1385 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001386 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001387 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1388 coverage = false
1389 }
1390 }
1391 return coverage
1392}
1393
Colin Cross1a6acd42020-06-16 17:51:46 -07001394// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001395func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001396 return Bool(c.config.productVariables.GcovCoverage) ||
1397 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001398}
1399
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001400func (c *deviceConfig) ClangCoverageEnabled() bool {
1401 return Bool(c.config.productVariables.ClangCoverage)
1402}
1403
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001404func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1405 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1406}
1407
Colin Cross1a6acd42020-06-16 17:51:46 -07001408func (c *deviceConfig) GcovCoverageEnabled() bool {
1409 return Bool(c.config.productVariables.GcovCoverage)
1410}
1411
Roland Levillain4f5297b2020-06-09 12:44:06 +01001412// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1413// code coverage is enabled for path. By default, coverage is not enabled for a
1414// given path unless it is part of the NativeCoveragePaths product variable (and
1415// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1416// NativeCoveragePaths represents any path.
1417func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001418 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001419 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001420 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001421 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001422 }
1423 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001424 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001425 // Workaround coverage boot failure.
1426 // http://b/269981180
1427 if strings.HasPrefix(path, "external/protobuf") {
1428 coverage = false
1429 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001430 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001431 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001432 }
1433 }
1434 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001435}
Ivan Lozano5f595532017-07-13 14:46:05 -07001436
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001437func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001438 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001439}
1440
Vinh Tran44cb78c2023-03-09 22:07:19 -05001441// AfdoProfile returns fully qualified path associated to the given module name
1442func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1443 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1444 split := strings.Split(afdoProfile, ":")
1445 if len(split) != 3 {
1446 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1447 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1448 }
1449 if split[0] == name {
1450 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1451 }
1452 }
1453 return nil, nil
1454}
1455
Tri Vo35a51432018-03-25 20:00:00 -07001456func (c *deviceConfig) VendorSepolicyDirs() []string {
1457 return c.config.productVariables.BoardVendorSepolicyDirs
1458}
1459
1460func (c *deviceConfig) OdmSepolicyDirs() []string {
1461 return c.config.productVariables.BoardOdmSepolicyDirs
1462}
1463
Felixa20a8752020-05-17 18:28:35 +02001464func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1465 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001466}
1467
Felixa20a8752020-05-17 18:28:35 +02001468func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1469 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001470}
1471
Inseob Kim0866b002019-04-15 20:21:29 +09001472func (c *deviceConfig) SepolicyM4Defs() []string {
1473 return c.config.productVariables.BoardSepolicyM4Defs
1474}
1475
Jiyong Park7f67f482019-01-05 12:57:48 +09001476func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001477 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1478 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1479}
1480
1481func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001482 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001483 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1484}
1485
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001486func (c *deviceConfig) OverridePackageNameFor(name string) string {
1487 newName, overridden := findOverrideValue(
1488 c.config.productVariables.PackageNameOverrides,
1489 name,
1490 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1491 if overridden {
1492 return newName
1493 }
1494 return name
1495}
1496
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001497func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001498 if overrides == nil || len(overrides) == 0 {
1499 return "", false
1500 }
1501 for _, o := range overrides {
1502 split := strings.Split(o, ":")
1503 if len(split) != 2 {
1504 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001505 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001506 }
1507 if matchPattern(split[0], name) {
1508 return substPattern(split[0], split[1], name), true
1509 }
1510 }
1511 return "", false
1512}
1513
Albert Martineefabcf2022-03-21 20:11:16 +00001514func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1515 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1516}
1517
Ivan Lozano5f595532017-07-13 14:46:05 -07001518func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001519 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001520 return false
1521 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001522 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001523}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001524
1525func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001526 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001527 return false
1528 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001529 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001530}
1531
1532func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001533 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001534 return false
1535 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001536 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001537}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001538
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001539func (c *config) MemtagHeapDisabledForPath(path string) bool {
1540 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1541 return false
1542 }
1543 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1544}
1545
1546func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1547 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1548 return false
1549 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001550 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001551}
1552
1553func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1554 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1555 return false
1556 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001557 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001558}
1559
Hang Lua98aab92023-03-17 13:17:22 +08001560func (c *config) HWASanEnabledForPath(path string) bool {
1561 if len(c.productVariables.HWASanIncludePaths) == 0 {
1562 return false
1563 }
1564 return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths)
1565}
1566
Dan Willemsen0fe78662018-03-26 12:41:18 -07001567func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001568 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001569}
1570
Colin Cross395f2cf2018-10-24 16:10:32 -07001571func (c *config) NdkAbis() bool {
1572 return Bool(c.productVariables.Ndk_abis)
1573}
1574
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001575func (c *config) AmlAbis() bool {
1576 return Bool(c.productVariables.Aml_abis)
1577}
1578
Jiyong Park8fd61922018-11-08 02:50:25 +09001579func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001580 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001581}
1582
Jiyong Park4da07972021-01-05 21:01:11 +09001583func (c *config) ForceApexSymlinkOptimization() bool {
1584 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1585}
1586
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001587func (c *config) ApexCompressionEnabled() bool {
1588 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001589}
1590
Dennis Shene2ed70c2023-01-11 14:15:43 +00001591func (c *config) ApexTrimEnabled() bool {
1592 return Bool(c.productVariables.TrimmedApex)
1593}
1594
Jeongik Chac9464142019-01-07 12:07:27 +09001595func (c *config) EnforceSystemCertificate() bool {
1596 return Bool(c.productVariables.EnforceSystemCertificate)
1597}
1598
Colin Cross440e0d02020-06-11 11:32:11 -07001599func (c *config) EnforceSystemCertificateAllowList() []string {
1600 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001601}
1602
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001603func (c *config) EnforceProductPartitionInterface() bool {
1604 return Bool(c.productVariables.EnforceProductPartitionInterface)
1605}
1606
JaeMan Parkff715562020-10-19 17:25:58 +09001607func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1608 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1609}
1610
1611func (c *config) InterPartitionJavaLibraryAllowList() []string {
1612 return c.productVariables.InterPartitionJavaLibraryAllowList
1613}
1614
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001615func (c *config) InstallExtraFlattenedApexes() bool {
1616 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1617}
1618
Colin Crossf24a22a2019-01-31 14:12:44 -08001619func (c *config) ProductHiddenAPIStubs() []string {
1620 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001621}
1622
Colin Crossf24a22a2019-01-31 14:12:44 -08001623func (c *config) ProductHiddenAPIStubsSystem() []string {
1624 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001625}
1626
Colin Crossf24a22a2019-01-31 14:12:44 -08001627func (c *config) ProductHiddenAPIStubsTest() []string {
1628 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001629}
Dan Willemsen71c74602019-04-10 12:27:35 -07001630
Dan Willemsen54879d12019-04-18 10:08:46 -07001631func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001632 return c.config.productVariables.TargetFSConfigGen
1633}
Inseob Kim0866b002019-04-15 20:21:29 +09001634
1635func (c *config) ProductPublicSepolicyDirs() []string {
1636 return c.productVariables.ProductPublicSepolicyDirs
1637}
1638
1639func (c *config) ProductPrivateSepolicyDirs() []string {
1640 return c.productVariables.ProductPrivateSepolicyDirs
1641}
1642
Colin Cross50ddcc42019-05-16 12:28:22 -07001643func (c *config) MissingUsesLibraries() []string {
1644 return c.productVariables.MissingUsesLibraries
1645}
1646
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001647func (c *config) TargetMultitreeUpdateMeta() bool {
1648 return c.productVariables.MultitreeUpdateMeta
1649}
1650
Inseob Kim1f086e22019-05-09 13:29:15 +09001651func (c *deviceConfig) DeviceArch() string {
1652 return String(c.config.productVariables.DeviceArch)
1653}
1654
1655func (c *deviceConfig) DeviceArchVariant() string {
1656 return String(c.config.productVariables.DeviceArchVariant)
1657}
1658
1659func (c *deviceConfig) DeviceSecondaryArch() string {
1660 return String(c.config.productVariables.DeviceSecondaryArch)
1661}
1662
1663func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1664 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1665}
Yifan Hong82db7352020-01-21 16:12:26 -08001666
1667func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1668 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1669}
Yifan Hong97365ee2020-07-29 09:51:57 -07001670
1671func (c *deviceConfig) BoardKernelBinaries() []string {
1672 return c.config.productVariables.BoardKernelBinaries
1673}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001674
Yifan Hong42bef8d2020-08-05 14:36:09 -07001675func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1676 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1677}
1678
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001679func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1680 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1681}
1682
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001683func (c *deviceConfig) PlatformSepolicyVersion() string {
1684 return String(c.config.productVariables.PlatformSepolicyVersion)
1685}
1686
Inseob Kima10ef272021-09-15 03:04:53 +00001687func (c *deviceConfig) TotSepolicyVersion() string {
1688 return String(c.config.productVariables.TotSepolicyVersion)
1689}
1690
Inseob Kim843f6642022-01-07 09:11:23 +09001691func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1692 return c.config.productVariables.PlatformSepolicyCompatVersions
1693}
1694
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001695func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001696 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1697 return ver
1698 }
1699 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001700}
1701
Inseob Kim14178802021-12-08 22:53:31 +09001702func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1703 return c.config.productVariables.BoardPlatVendorPolicy
1704}
1705
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001706func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1707 return c.config.productVariables.BoardReqdMaskPolicy
1708}
1709
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001710func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1711 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1712}
1713
1714func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1715 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1716}
1717
1718func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1719 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1720}
1721
1722func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1723 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1724}
1725
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001726func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1727 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1728}
1729
1730func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1731 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1732}
1733
1734func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1735 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1736}
1737
Inseob Kim7cf14652021-01-06 23:06:52 +09001738func (c *deviceConfig) DirectedVendorSnapshot() bool {
1739 return c.config.productVariables.DirectedVendorSnapshot
1740}
1741
1742func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1743 return c.config.productVariables.VendorSnapshotModules
1744}
1745
Jose Galmes4c6895e2021-02-09 07:44:30 -08001746func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1747 return c.config.productVariables.DirectedRecoverySnapshot
1748}
1749
1750func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1751 return c.config.productVariables.RecoverySnapshotModules
1752}
1753
Justin DeMartino383bfb32021-02-24 10:49:43 -08001754func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1755 var ret = make(map[string]bool)
1756 for _, dir := range dirs {
1757 clean := filepath.Clean(dir)
1758 if previous[clean] || ret[clean] {
1759 return nil, fmt.Errorf("Duplicate entry %s", dir)
1760 }
1761 ret[clean] = true
1762 }
1763 return ret, nil
1764}
1765
1766func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1767 dirMap := c.Once(onceKey, func() interface{} {
1768 ret, err := createDirsMap(previous, dirs)
1769 if err != nil {
1770 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1771 }
1772 return ret
1773 })
1774 if dirMap == nil {
1775 return nil
1776 }
1777 return dirMap.(map[string]bool)
1778}
1779
1780var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1781
1782func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1783 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1784 c.config.productVariables.VendorSnapshotDirsExcluded)
1785}
1786
1787var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1788
1789func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1790 excludedMap := c.VendorSnapshotDirsExcludedMap()
1791 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1792 c.config.productVariables.VendorSnapshotDirsIncluded)
1793}
1794
1795var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1796
1797func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1798 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1799 c.config.productVariables.RecoverySnapshotDirsExcluded)
1800}
1801
1802var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1803
1804func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1805 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1806 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1807 c.config.productVariables.RecoverySnapshotDirsIncluded)
1808}
1809
Rob Seymour925aa092021-08-10 20:42:03 +00001810func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1811 return c.config.productVariables.HostFakeSnapshotEnabled
1812}
1813
Inseob Kim60c32f02020-12-21 22:53:05 +09001814func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1815 if c.config.productVariables.ShippingApiLevel == nil {
1816 return NoneApiLevel
1817 }
1818 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1819 return uncheckedFinalApiLevel(apiLevel)
1820}
1821
Alix Espinoef47e542022-09-14 19:10:51 +00001822func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1823 return c.config.productVariables.BuildBrokenClangAsFlags
1824}
1825
1826func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1827 return c.config.productVariables.BuildBrokenClangCFlags
1828}
1829
Alixb5f6d9e2022-04-20 23:00:58 +00001830func (c *deviceConfig) BuildBrokenClangProperty() bool {
1831 return c.config.productVariables.BuildBrokenClangProperty
1832}
1833
Inseob Kim67e5add192021-03-17 18:05:33 +09001834func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1835 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1836}
1837
1838func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1839 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1840}
1841
Cole Faustedc4c502022-09-09 19:39:25 -07001842func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1843 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1844}
1845
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001846func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1847 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1848}
1849
Inseob Kim0cac7b42021-02-03 18:16:46 +09001850func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1851 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1852}
1853
Liz Kammer619be462022-01-28 15:13:39 -05001854func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1855 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1856}
1857
Vinh Tran140d5882022-06-10 14:23:27 -04001858func (c *deviceConfig) BuildBrokenDepfile() bool {
1859 return Bool(c.config.productVariables.BuildBrokenDepfile)
1860}
1861
Inseob Kim67e5add192021-03-17 18:05:33 +09001862func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1863 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1864}
1865
1866func (c *config) SelinuxIgnoreNeverallows() bool {
1867 return c.productVariables.SelinuxIgnoreNeverallows
1868}
1869
1870func (c *deviceConfig) SepolicySplit() bool {
1871 return c.config.productVariables.SepolicySplit
1872}
1873
Inseob Kima10ef272021-09-15 03:04:53 +00001874func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1875 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1876}
1877
1878func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1879 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1880}
1881
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001882func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1883 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1884}
1885
Christopher Ferris98f10222022-07-13 23:16:52 -07001886func (c *config) IgnorePrefer32OnDevice() bool {
1887 return c.productVariables.IgnorePrefer32OnDevice
1888}
1889
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001890func (c *config) BootJars() []string {
1891 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001892 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001893 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001894 }).([]string)
1895}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001896
satayevd604b212021-07-21 14:23:52 +01001897func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001898 return c.productVariables.BootJars
1899}
1900
satayevd604b212021-07-21 14:23:52 +01001901func (c *config) ApexBootJars() ConfiguredJarList {
1902 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001903}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001904
1905func (c *config) RBEWrapper() string {
1906 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1907}
Colin Cross9b698b62021-12-22 09:55:32 -08001908
1909// UseHostMusl returns true if the host target has been configured to build against musl libc.
1910func (c *config) UseHostMusl() bool {
1911 return Bool(c.productVariables.HostMusl)
1912}
MarkDacekff851b82022-04-21 18:33:17 +00001913
Chris Parsonsf874e462022-05-10 13:50:12 -04001914func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001915 moduleName := ctx.Module().Name()
1916 c.mixedBuildsLock.Lock()
1917 defer c.mixedBuildsLock.Unlock()
1918 if useBazel {
1919 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1920 } else {
1921 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1922 }
1923}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001924
1925// ApiSurfaces directory returns the source path inside the api_surfaces repo
1926// (relative to workspace root).
1927func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1928 return filepath.Join(
1929 "build",
1930 "bazel",
1931 "api_surfaces",
1932 s.String(),
1933 version)
1934}
Jihoon Kang1bff0342023-01-17 20:40:22 +00001935
1936func (c *config) BuildFromTextStub() bool {
1937 return c.buildFromTextStub
1938}
Spandan Das4deab282023-03-30 17:06:32 +00001939
1940func (c *config) SetBuildFromTextStub(b bool) {
1941 c.buildFromTextStub = b
1942}
MarkDacek9c094ca2023-03-16 19:15:19 +00001943func (c *config) AddForceEnabledModules(forceEnabled []string) {
1944 for _, forceEnabledModule := range forceEnabled {
1945 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
1946 }
1947}