blob: 292fcf2fe3611bbd9bff4cc569d5529682d2cc35 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
Jingwen Chenc711fec2020-11-22 23:52:50 -050017// This is the primary location to write and read all configuration values and
18// product variables necessary for soong_build's operation.
19
Colin Cross3f40fa42015-01-30 17:27:36 -080020import (
Cole Faust082c5f32022-08-04 15:49:20 -070021 "bytes"
Colin Cross3f40fa42015-01-30 17:27:36 -080022 "encoding/json"
23 "fmt"
24 "os"
Colin Cross35cec122015-04-02 14:37:16 -070025 "path/filepath"
Sam Delmerico5c32bbf2022-01-20 20:15:02 +000026 "reflect"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "runtime"
Inseob Kim60c32f02020-12-21 22:53:05 +090028 "strconv"
Dan Willemsen34cc69e2015-09-23 15:26:20 -070029 "strings"
Colin Crossc1e86a32015-04-15 12:33:28 -070030 "sync"
Colin Cross6ff51382015-12-17 16:39:19 -080031
Colin Cross98be1bb2019-12-13 20:41:13 -080032 "github.com/google/blueprint"
Colin Crosse87040b2017-12-11 15:52:26 -080033 "github.com/google/blueprint/bootstrap"
Colin Cross98be1bb2019-12-13 20:41:13 -080034 "github.com/google/blueprint/pathtools"
Colin Cross6ff51382015-12-17 16:39:19 -080035 "github.com/google/blueprint/proptools"
Colin Cross9d34f352019-11-22 16:03:51 -080036
37 "android/soong/android/soongconfig"
Liz Kammer09f947d2021-05-12 14:51:49 -040038 "android/soong/bazel"
Colin Cross77cdcfd2021-03-12 11:28:25 -080039 "android/soong/remoteexec"
Liz Kammer72beb342022-02-03 08:42:10 -050040 "android/soong/starlark_fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080041)
42
Jingwen Chenc711fec2020-11-22 23:52:50 -050043// Bool re-exports proptools.Bool for the android package.
Colin Cross6ff51382015-12-17 16:39:19 -080044var Bool = proptools.Bool
Jingwen Chenc711fec2020-11-22 23:52:50 -050045
46// String re-exports proptools.String for the android package.
Jack He8cc71432016-12-08 15:45:07 -080047var String = proptools.String
Jingwen Chenc711fec2020-11-22 23:52:50 -050048
49// StringDefault re-exports proptools.StringDefault for the android package.
Jeongik Cha219141c2020-08-06 23:00:37 +090050var StringDefault = proptools.StringDefault
Jiyong Park6a927c42020-01-21 02:03:43 +090051
Jingwen Chenc711fec2020-11-22 23:52:50 -050052// FutureApiLevelInt is a placeholder constant for unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070053const FutureApiLevelInt = 10000
54
Jingwen Chenc711fec2020-11-22 23:52:50 -050055// FutureApiLevel represents unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070056var FutureApiLevel = ApiLevel{
57 value: "current",
58 number: FutureApiLevelInt,
59 isPreview: true,
60}
Colin Cross6ff51382015-12-17 16:39:19 -080061
Jingwen Chenc4d91bc2020-11-24 22:59:26 -050062// The product variables file name, containing product config from Kati.
Dan Willemsen87b17d12015-07-14 00:39:06 -070063const productVariablesFileName = "soong.variables"
Colin Cross3f40fa42015-01-30 17:27:36 -080064
Colin Cross9272ade2016-08-17 15:24:12 -070065// A Config object represents the entire build configuration for Android.
Colin Crossc3c0a492015-04-10 15:43:55 -070066type Config struct {
67 *config
68}
69
Chris Parsonsad876012022-08-20 14:48:32 -040070type SoongBuildMode int
71
Sasha Smundakaf5ca922022-12-12 21:23:34 -080072type CmdArgs struct {
73 bootstrap.Args
74 RunGoTests bool
75 OutDir string
76 SoongOutDir string
77
78 SymlinkForestMarker string
79 Bp2buildMarker string
80 BazelQueryViewDir string
81 BazelApiBp2buildDir string
82 ModuleGraphFile string
83 ModuleActionsFile string
84 DocFile string
85
LaMont Jones52a72432023-03-09 18:19:35 +000086 MultitreeBuild bool
87
Sasha Smundakaf5ca922022-12-12 21:23:34 -080088 BazelMode bool
89 BazelModeDev bool
90 BazelModeStaging bool
91 BazelForceEnabledModules string
Chris Parsons9402ca82023-02-23 17:28:06 -050092
93 UseBazelProxy bool
Sasha Smundakaf5ca922022-12-12 21:23:34 -080094}
95
Chris Parsonsad876012022-08-20 14:48:32 -040096// Build modes that soong_build can run as.
97const (
98 // Don't use bazel at all during module analysis.
99 AnalysisNoBazel SoongBuildMode = iota
100
Lukacs T. Berkic541cd22022-10-26 07:26:50 +0000101 // Symlink fores mode: merge two directory trees into a symlink forest
102 SymlinkForest
103
Chris Parsonsad876012022-08-20 14:48:32 -0400104 // Bp2build mode: Generate BUILD files from blueprint files and exit.
105 Bp2build
106
107 // Generate BUILD files which faithfully represent the dependency graph of
108 // blueprint modules. Individual BUILD targets will not, however, faitfhully
109 // express build semantics.
110 GenerateQueryView
111
Spandan Das5af0bd32022-09-28 20:43:08 +0000112 // Generate BUILD files for API contributions to API surfaces
113 ApiBp2build
114
Chris Parsonsad876012022-08-20 14:48:32 -0400115 // Create a JSON representation of the module graph and exit.
116 GenerateModuleGraph
117
118 // Generate a documentation file for module type definitions and exit.
119 GenerateDocFile
120
121 // Use bazel during analysis of many allowlisted build modules. The allowlist
122 // is considered a "developer mode" allowlist, as some modules may be
123 // allowlisted on an experimental basis.
124 BazelDevMode
125
MarkDacekb78465d2022-10-18 20:10:16 +0000126 // Use bazel during analysis of a few allowlisted build modules. The allowlist
127 // is considered "staging, as these are modules being prepared to be released
128 // into prod mode shortly after.
129 BazelStagingMode
130
Chris Parsonsad876012022-08-20 14:48:32 -0400131 // Use bazel during analysis of build modules from an allowlist carefully
132 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400133 BazelProdMode
134)
135
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200136// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200137func (c Config) SoongOutDir() string {
138 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700139}
140
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200141func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200142 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100143}
144
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200145func (c Config) RunGoTests() bool {
146 return c.runGoTests
147}
148
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100149func (c Config) DebugCompilation() bool {
150 return false // Never compile Go code in the main build for debugging
151}
152
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200153func (c Config) Subninjas() []string {
154 return []string{}
155}
156
157func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
158 return []bootstrap.PrimaryBuilderInvocation{}
159}
160
Paul Duffin74135582022-10-06 11:01:59 +0100161// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
162func (c Config) RunningInsideUnitTest() bool {
163 return c.config.TestProductVariables != nil
164}
165
Jingwen Chenc711fec2020-11-22 23:52:50 -0500166// A DeviceConfig object represents the configuration for a particular device
167// being built. For now there will only be one of these, but in the future there
168// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700169type DeviceConfig struct {
170 *deviceConfig
171}
172
Jingwen Chenc711fec2020-11-22 23:52:50 -0500173// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800174type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700175
Jingwen Chenc711fec2020-11-22 23:52:50 -0500176// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500177// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700178type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500179 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800180 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800181
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700182 // Only available on configs created by TestConfig
183 TestProductVariables *productVariables
184
Jingwen Chenc711fec2020-11-22 23:52:50 -0500185 // A specialized context object for Bazel/Soong mixed builds and migration
186 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400187 BazelContext BazelContext
188
Dan Willemsen87b17d12015-07-14 00:39:06 -0700189 ProductVariablesFileName string
190
Colin Cross0c66bc62021-07-20 09:47:41 -0700191 // BuildOS stores the OsType for the OS that the build is running on.
192 BuildOS OsType
193
194 // BuildArch stores the ArchType for the CPU that the build is running on.
195 BuildArch ArchType
196
Jaewoong Jung642916f2020-10-09 17:25:15 -0700197 Targets map[OsType][]Target
198 BuildOSTarget Target // the Target for tools run on the build machine
199 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
200 AndroidCommonTarget Target // the Target for common modules for the Android device
201 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700202
Jingwen Chenc711fec2020-11-22 23:52:50 -0500203 // multilibConflicts for an ArchType is true if there is earlier configured
204 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700205 multilibConflicts map[ArchType]bool
206
Colin Cross9272ade2016-08-17 15:24:12 -0700207 deviceConfig *deviceConfig
208
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200209 outDir string // The output directory (usually out/)
210 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400211 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700212
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200213 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200214
Colin Cross6ccbc912017-10-10 23:07:38 -0700215 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700216 envLock sync.Mutex
217 envDeps map[string]string
218 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800219
Jingwen Chencda22c92020-11-23 00:22:30 -0500220 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
221 // runs standalone.
222 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700223
Colin Cross32616ed2017-09-05 21:56:44 -0700224 captureBuild bool // true for tests, saves build parameters for each module
225 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700226
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 fs pathtools.FileSystem
228 mockBpList string
229
Chris Parsonsad876012022-08-20 14:48:32 -0400230 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700231 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000232 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500233
LaMont Jones52a72432023-03-09 18:19:35 +0000234 // If MultitreeBuild is true then this is one inner tree of a multitree
235 // build directed by the multitree orchestrator.
236 MultitreeBuild bool
237
Colin Cross5e6a7972020-06-07 16:56:32 -0700238 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
239 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000240 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700241
Jingwen Chenc711fec2020-11-22 23:52:50 -0500242 // The list of files that when changed, must invalidate soong_build to
243 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700244 ninjaFileDepsSet sync.Map
245
Colin Cross9272ade2016-08-17 15:24:12 -0700246 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000247
Chris Parsonsad876012022-08-20 14:48:32 -0400248 // These fields are only used for metrics collection. A module should be added
249 // to these maps only if its implementation supports Bazel handling in mixed
250 // builds. A module being in the "enabled" list indicates that there is a
251 // variant of that module for which bazel-handling actually took place.
252 // A module being in the "disabled" list indicates that there is a variant of
253 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000254 mixedBuildsLock sync.Mutex
255 mixedBuildEnabledModules map[string]struct{}
256 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000257
258 // These are modules to be built with Bazel beyond the allowlisted/build-mode
259 // specified modules. They are passed via the command-line flag
260 // "--bazel-force-enabled-modules"
261 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500262
263 // If true, for any requests to Bazel, communicate with a Bazel proxy using
264 // unix sockets, instead of spawning Bazel as a subprocess.
265 UseBazelProxy bool
Colin Cross9272ade2016-08-17 15:24:12 -0700266}
267
268type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700269 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700270 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800271}
272
Colin Cross485e5722015-08-27 13:28:01 -0700273type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700274 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700275}
Colin Cross3f40fa42015-01-30 17:27:36 -0800276
Colin Cross485e5722015-08-27 13:28:01 -0700277func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000278 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700279}
280
Jingwen Chenc711fec2020-11-22 23:52:50 -0500281// loadFromConfigFile loads and decodes configuration options from a JSON file
282// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400283func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800284 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700285 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800286 defer configFileReader.Close()
287 if os.IsNotExist(err) {
288 // Need to create a file, so that blueprint & ninja don't get in
289 // a dependency tracking loop.
290 // Make a file-configurable-options with defaults, write it out using
291 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700292 configurable.SetDefaultConfig()
293 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800294 if err != nil {
295 return err
296 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800297 } else if err != nil {
298 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800299 } else {
300 // Make a decoder for it
301 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700302 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800303 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800304 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800305 }
306 }
307
Liz Kammer09f947d2021-05-12 14:51:49 -0400308 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
309 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
310 }
311
312 configurable.Native_coverage = proptools.BoolPtr(
313 Bool(configurable.GcovCoverage) ||
314 Bool(configurable.ClangCoverage))
315
Yuntao Xu402e9b02021-08-09 15:44:44 -0700316 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
317 // if false (pre-released version, for example), use Platform_sdk_codename.
318 if Bool(configurable.Platform_sdk_final) {
319 if configurable.Platform_sdk_version != nil {
320 configurable.Platform_sdk_version_or_codename =
321 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
322 } else {
323 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
324 }
325 } else {
326 configurable.Platform_sdk_version_or_codename =
327 proptools.StringPtr(String(configurable.Platform_sdk_codename))
328 }
329
Liz Kammer09f947d2021-05-12 14:51:49 -0400330 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800331}
332
Colin Crossd8f20142016-11-03 09:43:26 -0700333// atomically writes the config file in case two copies of soong_build are running simultaneously
334// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400335func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800336 data, err := json.MarshalIndent(&config, "", " ")
337 if err != nil {
338 return fmt.Errorf("cannot marshal config data: %s", err.Error())
339 }
340
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800341 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800342 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500343 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800344 }
Colin Crossd8f20142016-11-03 09:43:26 -0700345 defer os.Remove(f.Name())
346 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800347
Colin Crossd8f20142016-11-03 09:43:26 -0700348 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800349 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700350 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
351 }
352
Colin Crossd8f20142016-11-03 09:43:26 -0700353 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700354 if err != nil {
355 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800356 }
357
Colin Crossd8f20142016-11-03 09:43:26 -0700358 f.Close()
359 os.Rename(f.Name(), filename)
360
Colin Cross3f40fa42015-01-30 17:27:36 -0800361 return nil
362}
363
Liz Kammer09f947d2021-05-12 14:51:49 -0400364func saveToBazelConfigFile(config *productVariables, outDir string) error {
365 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
366 err := createDirIfNonexistent(dir, os.ModePerm)
367 if err != nil {
368 return fmt.Errorf("Could not create dir %s: %s", dir, err)
369 }
370
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000371 nonArchVariantProductVariables := []string{}
372 archVariantProductVariables := []string{}
373 p := variableProperties{}
374 t := reflect.TypeOf(p.Product_variables)
375 for i := 0; i < t.NumField(); i++ {
376 f := t.Field(i)
377 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
378 if proptools.HasTag(f, "android", "arch_variant") {
379 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
380 }
381 }
382
Liz Kammer72beb342022-02-03 08:42:10 -0500383 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000384 if err != nil {
385 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
386 }
387
Liz Kammer72beb342022-02-03 08:42:10 -0500388 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000389 if err != nil {
390 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
391 }
392
393 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400394 if err != nil {
395 return fmt.Errorf("cannot marshal config data: %s", err.Error())
396 }
Cole Faust082c5f32022-08-04 15:49:20 -0700397 // The backslashes need to be escaped because this text is going to be put
398 // inside a Starlark string literal.
399 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400400
401 bzl := []string{
402 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000403 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
404 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
405 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
406 "\n", `
407product_vars = _product_vars
408product_var_constraints = _product_var_constraints
409arch_variant_product_var_constraints = _arch_variant_product_var_constraints
410`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400411 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500412 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
413 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400414 if err != nil {
415 return fmt.Errorf("Could not write .bzl config file %s", err)
416 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500417 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
418 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400419 if err != nil {
420 return fmt.Errorf("Could not write BUILD config file %s", err)
421 }
422
423 return nil
424}
425
Colin Cross988414c2020-01-11 01:11:46 +0000426// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
427// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200428func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000429 return Config{
430 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200431 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200432 soongOutDir: soongOutDir,
433 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000434 },
435 }
436}
437
Jingwen Chenc711fec2020-11-22 23:52:50 -0500438// NewConfig creates a new Config object. The srcDir argument specifies the path
439// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800440func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500441 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700442 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800443 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700444
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200445 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700446
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800447 outDir: cmdArgs.OutDir,
448 soongOutDir: cmdArgs.SoongOutDir,
449 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200450 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800451
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800452 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000453 fs: pathtools.NewOsFs(absSrcDir),
454 mixedBuildDisabledModules: make(map[string]struct{}),
455 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000456 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500457
LaMont Jones52a72432023-03-09 18:19:35 +0000458 MultitreeBuild: cmdArgs.MultitreeBuild,
459 UseBazelProxy: cmdArgs.UseBazelProxy,
Colin Cross68f55102015-03-25 14:43:57 -0700460 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800461
Dan Willemsen00269f22017-07-06 16:59:48 -0700462 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700463 config: config,
464 }
465
Liz Kammer7941b302020-07-28 13:27:34 -0700466 // Soundness check of the build and source directories. This won't catch strange
467 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800468 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700469 if err != nil {
470 return Config{}, err
471 }
472
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200473 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700474 if err != nil {
475 return Config{}, err
476 }
477
478 if strings.HasPrefix(absSrcDir, absBuildDir) {
479 return Config{}, fmt.Errorf("Build dir must not contain source directory")
480 }
481
Colin Cross3f40fa42015-01-30 17:27:36 -0800482 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700483 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800484 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700485 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800486 }
487
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800488 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500489 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
490 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800491 }
492
Colin Cross0c66bc62021-07-20 09:47:41 -0700493 determineBuildOS(config)
494
Jingwen Chenc711fec2020-11-22 23:52:50 -0500495 // Sets up the map of target OSes to the finer grained compilation targets
496 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700497 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700498 if err != nil {
499 return Config{}, err
500 }
501
Paul Duffin1356d8c2020-02-25 19:26:33 +0000502 // Make the CommonOS OsType available for all products.
503 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
504
Dan Albert4098deb2016-10-19 14:04:41 -0700505 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500506 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700507 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000508 } else if config.AmlAbis() {
509 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700510 }
511
512 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500513 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800514 if err != nil {
515 return Config{}, err
516 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700517 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800518 }
519
Colin Cross3b19f5d2019-09-17 14:45:31 -0700520 multilib := make(map[string]bool)
521 for _, target := range targets[Android] {
522 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
523 config.multilibConflicts[target.Arch.ArchType] = true
524 }
525 multilib[target.Arch.ArchType.Multilib] = true
526 }
527
Jingwen Chenc711fec2020-11-22 23:52:50 -0500528 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700529 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500530
531 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700532 config.BuildOSTarget = config.Targets[config.BuildOS][0]
533 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500534
535 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700536 if len(config.Targets[Android]) > 0 {
537 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000538 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700539 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700540
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500541 setBuildMode := func(arg string, mode SoongBuildMode) {
542 if arg != "" {
543 if config.BuildMode != AnalysisNoBazel {
544 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
545 os.Exit(1)
546 }
547 config.BuildMode = mode
548 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800549 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500550 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
551 if arg {
552 if config.BuildMode != AnalysisNoBazel {
553 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
554 os.Exit(1)
555 }
556 config.BuildMode = mode
557 }
558 }
559 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
560 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
561 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
562 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
563 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
564 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
565 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
566 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
567 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800568
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400569 config.BazelContext, err = NewBazelContext(config)
Cole Faust324a92e2022-08-23 15:29:05 -0700570 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
Colin Cross3f40fa42015-01-30 17:27:36 -0800571
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800572 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000573 config.bazelForceEnabledModules[module] = struct{}{}
574 }
575
Jingwen Chenc711fec2020-11-22 23:52:50 -0500576 return Config{config}, err
577}
Colin Cross988414c2020-01-11 01:11:46 +0000578
Colin Cross98be1bb2019-12-13 20:41:13 -0800579// mockFileSystem replaces all reads with accesses to the provided map of
580// filenames to contents stored as a byte slice.
581func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
582 mockFS := map[string][]byte{}
583
584 if _, exists := mockFS["Android.bp"]; !exists {
585 mockFS["Android.bp"] = []byte(bp)
586 }
587
588 for k, v := range fs {
589 mockFS[k] = v
590 }
591
592 // no module list file specified; find every file named Blueprints or Android.bp
593 pathsToParse := []string{}
594 for candidate := range mockFS {
595 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200596 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800597 pathsToParse = append(pathsToParse, candidate)
598 }
599 }
600 if len(pathsToParse) < 1 {
601 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
602 }
603 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
604
605 c.fs = pathtools.MockFs(mockFS)
606 c.mockBpList = blueprint.MockModuleListFile
607}
608
Jason Wuff1bb312022-12-21 09:57:26 -0500609// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
610// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400611// Returns true if "Bazel builds" is enabled. In this mode, part of build
612// analysis is handled by Bazel.
613func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500614 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
615 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500616 return false
617 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500618 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500619 return false
620 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500621 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500622 return false
623 }
624 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500625 return false
626 }
627 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500628 return false
629 }
630 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500631 return false
632 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500633 return true
634 }).(bool)
635
636 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
637 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400638}
639
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100640func (c *config) SetAllowMissingDependencies() {
641 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
642}
643
Jingwen Chenc711fec2020-11-22 23:52:50 -0500644// BlueprintToolLocation returns the directory containing build system tools
645// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200646func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700647 if c.KatiEnabled() {
648 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
649 } else {
650 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
651 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700652}
653
Dan Willemsen60e62f02018-11-16 21:05:32 -0800654func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700655 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
656 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800657}
658
Colin Cross790ef352021-10-25 19:15:55 -0700659func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000660 ext := ".so"
661 if runtime.GOOS == "darwin" {
662 ext = ".dylib"
663 }
Colin Cross790ef352021-10-25 19:15:55 -0700664 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
665 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000666}
667
Colin Crossae5330a2021-11-03 13:31:22 -0700668func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
669 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700670 return path
671}
672
Jingwen Chenc711fec2020-11-22 23:52:50 -0500673// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700674func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800675 switch runtime.GOOS {
676 case "linux":
677 return "linux-x86"
678 case "darwin":
679 return "darwin-x86"
680 default:
681 panic("Unknown GOOS")
682 }
683}
684
685// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700686func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200687 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800688}
689
Jingwen Chenc711fec2020-11-22 23:52:50 -0500690// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
691// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700692func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
693 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
694}
695
Jingwen Chenc711fec2020-11-22 23:52:50 -0500696// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
697// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700698func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700699 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800700 case "darwin":
701 return "-R"
702 case "linux":
703 return "-d"
704 default:
705 return ""
706 }
707}
Colin Cross68f55102015-03-25 14:43:57 -0700708
Colin Cross1332b002015-04-07 17:11:30 -0700709func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700710 var val string
711 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700712 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800713 defer c.envLock.Unlock()
714 if c.envDeps == nil {
715 c.envDeps = make(map[string]string)
716 }
Colin Cross68f55102015-03-25 14:43:57 -0700717 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700718 if c.envFrozen {
719 panic("Cannot access new environment variables after envdeps are frozen")
720 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700721 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700722 c.envDeps[key] = val
723 }
724 return val
725}
726
Colin Cross99d7c232016-11-23 16:52:04 -0800727func (c *config) GetenvWithDefault(key string, defaultValue string) string {
728 ret := c.Getenv(key)
729 if ret == "" {
730 return defaultValue
731 }
732 return ret
733}
734
735func (c *config) IsEnvTrue(key string) bool {
736 value := c.Getenv(key)
737 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
738}
739
740func (c *config) IsEnvFalse(key string) bool {
741 value := c.Getenv(key)
742 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
743}
744
Jingwen Chenc711fec2020-11-22 23:52:50 -0500745// EnvDeps returns the environment variables this build depends on. The first
746// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700747func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700748 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800749 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700750 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700751 return c.envDeps
752}
Colin Cross35cec122015-04-02 14:37:16 -0700753
Jingwen Chencda22c92020-11-23 00:22:30 -0500754func (c *config) KatiEnabled() bool {
755 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800756}
757
Nan Zhang581fd212018-01-10 16:06:12 -0800758func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800759 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800760}
761
Jingwen Chenc711fec2020-11-22 23:52:50 -0500762// BuildNumberFile returns the path to a text file containing metadata
763// representing the current build's number.
764//
765// Rules that want to reference the build number should read from this file
766// without depending on it. They will run whenever their other dependencies
767// require them to run and get the current build number. This ensures they don't
768// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800769func (c *config) BuildNumberFile(ctx PathContext) Path {
770 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800771}
772
Jingwen Chenc711fec2020-11-22 23:52:50 -0500773// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700774// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700775func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800776 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700777}
778
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000779// DeviceProduct returns the current product target. There could be multiple of
780// these per device type.
781//
Chris Parsonsef615e52022-08-18 22:04:11 -0400782// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000783func (c *config) DeviceProduct() string {
784 return *c.productVariables.DeviceProduct
785}
786
Cole Faustb85d1a12022-11-08 18:14:01 -0800787// HasDeviceProduct returns if the build has a product. A build will not
788// necessarily have a product when --skip-config is passed to soong, like it is
789// in prebuilts/build-tools/build-prebuilts.sh
790func (c *config) HasDeviceProduct() bool {
791 return c.productVariables.DeviceProduct != nil
792}
793
Anton Hansson53c88442019-03-18 15:53:16 +0000794func (c *config) DeviceResourceOverlays() []string {
795 return c.productVariables.DeviceResourceOverlays
796}
797
798func (c *config) ProductResourceOverlays() []string {
799 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700800}
801
Colin Crossbfd347d2018-05-09 11:11:35 -0700802func (c *config) PlatformVersionName() string {
803 return String(c.productVariables.Platform_version_name)
804}
805
Dan Albert4f378d72020-07-23 17:32:15 -0700806func (c *config) PlatformSdkVersion() ApiLevel {
807 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700808}
809
Mu-Le Lee5e047532022-07-27 02:32:03 +0000810func (c *config) PlatformSdkFinal() bool {
811 return Bool(c.productVariables.Platform_sdk_final)
812}
813
Colin Crossd09b0b62018-04-18 11:06:47 -0700814func (c *config) PlatformSdkCodename() string {
815 return String(c.productVariables.Platform_sdk_codename)
816}
817
Anton Hansson97d0bae2022-02-16 16:15:10 +0000818func (c *config) PlatformSdkExtensionVersion() int {
819 return *c.productVariables.Platform_sdk_extension_version
820}
821
822func (c *config) PlatformBaseSdkExtensionVersion() int {
823 return *c.productVariables.Platform_base_sdk_extension_version
824}
825
Colin Cross092c9da2019-04-02 22:56:43 -0700826func (c *config) PlatformSecurityPatch() string {
827 return String(c.productVariables.Platform_security_patch)
828}
829
830func (c *config) PlatformPreviewSdkVersion() string {
831 return String(c.productVariables.Platform_preview_sdk_version)
832}
833
834func (c *config) PlatformMinSupportedTargetSdkVersion() string {
835 return String(c.productVariables.Platform_min_supported_target_sdk_version)
836}
837
838func (c *config) PlatformBaseOS() string {
839 return String(c.productVariables.Platform_base_os)
840}
841
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900842func (c *config) PlatformVersionLastStable() string {
843 return String(c.productVariables.Platform_version_last_stable)
844}
845
Jiyong Park37073842022-06-21 10:13:42 +0900846func (c *config) PlatformVersionKnownCodenames() string {
847 return String(c.productVariables.Platform_version_known_codenames)
848}
849
Dan Albert1a246272020-07-06 14:49:35 -0700850func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000851 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700852}
853
854func (c *config) FinalApiLevels() []ApiLevel {
855 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700856 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700857 levels = append(levels, uncheckedFinalApiLevel(i))
858 }
859 return levels
860}
861
862func (c *config) PreviewApiLevels() []ApiLevel {
863 var levels []ApiLevel
864 for i, codename := range c.PlatformVersionActiveCodenames() {
865 levels = append(levels, ApiLevel{
866 value: codename,
867 number: i,
868 isPreview: true,
869 })
870 }
871 return levels
872}
873
satayevcca4ab72021-11-30 12:33:55 +0000874func (c *config) LatestPreviewApiLevel() ApiLevel {
875 level := NoneApiLevel
876 for _, l := range c.PreviewApiLevels() {
877 if l.GreaterThan(level) {
878 level = l
879 }
880 }
881 return level
882}
883
Dan Albert1a246272020-07-06 14:49:35 -0700884func (c *config) AllSupportedApiLevels() []ApiLevel {
885 var levels []ApiLevel
886 levels = append(levels, c.FinalApiLevels()...)
887 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700888}
889
Jingwen Chenc711fec2020-11-22 23:52:50 -0500890// DefaultAppTargetSdk returns the API level that platform apps are targeting.
891// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700892func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000893 // This logic is replicated in starlark, if changing logic here update starlark code too
894 // 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 -0700895 if Bool(c.productVariables.Platform_sdk_final) {
896 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700897 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500898 codename := c.PlatformSdkCodename()
899 if codename == "" {
900 return NoneApiLevel
901 }
902 if codename == "REL" {
903 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
904 }
905 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700906}
907
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800908func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800909 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800910}
911
Dan Albert31384de2017-07-28 12:39:46 -0700912// Codenames that are active in the current lunch target.
913func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800914 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700915}
916
Colin Crossface4e42017-10-30 17:32:15 -0700917func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800918 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700919}
920
Colin Crossface4e42017-10-30 17:32:15 -0700921func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800922 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700923}
924
Colin Crossface4e42017-10-30 17:32:15 -0700925func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800926 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700927}
928
929func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800930 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700931}
932
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700933func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800934 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800935 if defaultCert != "" {
936 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800937 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500938 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700939}
940
Colin Crosse1731a52017-12-14 11:22:55 -0800941func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800942 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800943 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800944 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800945 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500946 defaultDir := c.DefaultAppCertificateDir(ctx)
947 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700948}
Colin Cross6ff51382015-12-17 16:39:19 -0800949
Jiyong Park9335a262018-12-24 11:31:58 +0900950func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
951 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
952 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -0700953 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +0900954 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
955 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -0800956 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +0900957 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500958 // If not, APEX keys are under the specified directory
959 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +0900960}
961
Inseob Kim80fa7982022-08-12 21:36:25 +0900962// Certificate for the NetworkStack sepolicy context
963func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
964 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
965 if cert != "" {
966 return PathForSource(ctx, cert)
967 }
968 return c.DefaultAppCertificateDir(ctx)
969}
970
Jingwen Chenc711fec2020-11-22 23:52:50 -0500971// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
972// are configured to depend on non-existent modules. Note that this does not
973// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -0800974func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800975 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -0800976}
Dan Willemsen322acaf2016-01-12 23:07:05 -0800977
Jeongik Cha816a23a2020-07-08 01:09:23 +0900978// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -0700979func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800980 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -0700981}
982
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100983// Returns true if building apps that aren't bundled with the platform.
984// UnbundledBuild() is always true when this is true.
985func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -0800986 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +0100987}
988
Jeongik Cha4b073cd2021-06-08 11:35:00 +0900989// Returns true if building image that aren't bundled with the platform.
990// UnbundledBuild() is always true when this is true.
991func (c *config) UnbundledBuildImage() bool {
992 return Bool(c.productVariables.Unbundled_build_image)
993}
994
Jeongik Cha816a23a2020-07-08 01:09:23 +0900995// Returns true if building modules against prebuilt SDKs.
996func (c *config) AlwaysUsePrebuiltSdks() bool {
997 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -0800998}
999
Colin Cross126a25c2017-10-31 13:55:34 -07001000func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001001 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001002}
1003
Colin Crossed064c02018-09-05 16:28:13 -07001004func (c *config) Debuggable() bool {
1005 return Bool(c.productVariables.Debuggable)
1006}
1007
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001008func (c *config) Eng() bool {
1009 return Bool(c.productVariables.Eng)
1010}
1011
Colin Crossc53c37f2021-12-08 15:42:22 -08001012// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1013// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001014func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001015 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1016 return androidTargets[0].Arch.ArchType
1017 }
1018 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001019}
1020
Colin Cross16b23492016-01-06 14:41:07 -08001021func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001022 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001023}
1024
1025func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001026 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001027}
1028
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001029func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001030 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001031}
1032
Colin Cross23ae82a2016-11-02 14:34:39 -07001033func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001034 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001035}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001036
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001037func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001038 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001039 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001040 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001041 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001042}
1043
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001044func (c *config) DisableScudo() bool {
1045 return Bool(c.productVariables.DisableScudo)
1046}
1047
Colin Crossa1ad8d12016-06-01 17:09:44 -07001048func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001049 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001050 if t.Arch.ArchType.Multilib == "lib64" {
1051 return true
1052 }
1053 }
1054
1055 return false
1056}
Colin Cross9272ade2016-08-17 15:24:12 -07001057
Colin Cross9d45bb72016-08-29 16:14:13 -07001058func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001059 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001060}
1061
Ramy Medhatbbf25672019-07-17 12:30:04 +00001062func (c *config) UseRBE() bool {
1063 return Bool(c.productVariables.UseRBE)
1064}
1065
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001066func (c *config) UseRBEJAVAC() bool {
1067 return Bool(c.productVariables.UseRBEJAVAC)
1068}
1069
1070func (c *config) UseRBER8() bool {
1071 return Bool(c.productVariables.UseRBER8)
1072}
1073
1074func (c *config) UseRBED8() bool {
1075 return Bool(c.productVariables.UseRBED8)
1076}
1077
Colin Cross8b8bec32019-11-15 13:18:43 -08001078func (c *config) UseRemoteBuild() bool {
1079 return c.UseGoma() || c.UseRBE()
1080}
1081
Colin Cross66548102018-06-19 22:47:35 -07001082func (c *config) RunErrorProne() bool {
1083 return c.IsEnvTrue("RUN_ERROR_PRONE")
1084}
1085
Jingwen Chenc711fec2020-11-22 23:52:50 -05001086// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001087func (c *config) XrefCorpusName() string {
1088 return c.Getenv("XREF_CORPUS")
1089}
1090
Jingwen Chenc711fec2020-11-22 23:52:50 -05001091// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1092// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001093func (c *config) XrefCuEncoding() string {
1094 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1095 return enc
1096 }
1097 return "json"
1098}
1099
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001100// XrefCuJavaSourceMax returns the maximum number of the Java source files
1101// in a single compilation unit
1102const xrefJavaSourceFileMaxDefault = "1000"
1103
1104func (c Config) XrefCuJavaSourceMax() string {
1105 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1106 if v == "" {
1107 return xrefJavaSourceFileMaxDefault
1108 }
1109 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1110 fmt.Fprintf(os.Stderr,
1111 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1112 err, xrefJavaSourceFileMaxDefault)
1113 return xrefJavaSourceFileMaxDefault
1114 }
1115 return v
1116
1117}
1118
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001119func (c *config) EmitXrefRules() bool {
1120 return c.XrefCorpusName() != ""
1121}
1122
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001123func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001124 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001125}
1126
1127func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001128 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001129 return ""
1130 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001131 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001132}
1133
Colin Cross0f4e0d62016-07-27 10:56:55 -07001134func (c *config) LibartImgHostBaseAddress() string {
1135 return "0x60000000"
1136}
1137
1138func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001139 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001140}
1141
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001142func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001143 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001144}
1145
Jingwen Chenc711fec2020-11-22 23:52:50 -05001146// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1147// but some modules still depend on it.
1148//
1149// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001150func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001151 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001152
Roland Levillainf6cc2612020-07-09 16:58:14 +01001153 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001154 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001155 return true
1156 }
Colin Crossa74ca042019-01-31 14:31:51 -08001157 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001158 }
1159 return false
1160}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001161func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001162 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001163 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001164 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001165 }
1166 return false
1167}
1168
1169func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001170 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001171}
1172
Spandan Dasc5763832022-11-08 18:42:16 +00001173func (c *config) IncludeTags() []string {
1174 return c.productVariables.IncludeTags
1175}
1176
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001177func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001178 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001179}
1180
Colin Cross5a0dcd52018-10-05 14:20:06 -07001181func (c *config) UncompressPrivAppDex() bool {
1182 return Bool(c.productVariables.UncompressPrivAppDex)
1183}
1184
1185func (c *config) ModulesLoadedByPrivilegedModules() []string {
1186 return c.productVariables.ModulesLoadedByPrivilegedModules
1187}
1188
Jingwen Chenc711fec2020-11-22 23:52:50 -05001189// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1190// the output directory, if it was created during the product configuration
1191// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001192func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001193 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001194 return OptionalPathForPath(nil)
1195 }
1196 return OptionalPathForPath(
1197 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1198}
1199
Jingwen Chenc711fec2020-11-22 23:52:50 -05001200// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1201// configuration. Since the configuration file was created by Kati during
1202// product configuration (externally of soong_build), it's not tracked, so we
1203// also manually add a Ninja file dependency on the configuration file to the
1204// rule that creates the main build.ninja file. This ensures that build.ninja is
1205// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001206func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1207 path := c.DexpreoptGlobalConfigPath(ctx)
1208 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001209 return nil, nil
1210 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001211 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001212 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001213}
1214
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001215func (c *deviceConfig) WithDexpreopt() bool {
1216 return c.config.productVariables.WithDexpreopt
1217}
1218
Colin Cross662d6142022-11-03 20:38:01 -07001219func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001220 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001221}
1222
Inseob Kimae553032019-05-14 18:52:49 +09001223func (c *config) VndkSnapshotBuildArtifacts() bool {
1224 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1225}
1226
Colin Cross3b19f5d2019-09-17 14:45:31 -07001227func (c *config) HasMultilibConflict(arch ArchType) bool {
1228 return c.multilibConflicts[arch]
1229}
1230
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001231func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001232 return String(c.productVariables.PrebuiltHiddenApiDir)
1233}
1234
MarkDacekd06db5d2022-11-29 00:47:59 +00001235func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1236 return c.bazelForceEnabledModules
1237}
1238
Colin Cross9272ade2016-08-17 15:24:12 -07001239func (c *deviceConfig) Arches() []Arch {
1240 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001241 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001242 arches = append(arches, target.Arch)
1243 }
1244 return arches
1245}
Dan Willemsend2ede872016-11-18 14:54:24 -08001246
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001247func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001248 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001249 if is32BitBinder != nil && *is32BitBinder {
1250 return "32"
1251 }
1252 return "64"
1253}
1254
Dan Willemsen4353bc42016-12-05 17:16:02 -08001255func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001256 if c.config.productVariables.VendorPath != nil {
1257 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001258 }
1259 return "vendor"
1260}
1261
Justin Yun71549282017-11-17 12:10:28 +09001262func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001263 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001264}
1265
Jose Galmes6f843bc2020-12-11 13:36:29 -08001266func (c *deviceConfig) RecoverySnapshotVersion() string {
1267 return String(c.config.productVariables.RecoverySnapshotVersion)
1268}
1269
Jeongik Cha219141c2020-08-06 23:00:37 +09001270func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1271 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1272}
1273
Justin Yun8fe12122017-12-07 17:18:15 +09001274func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001275 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001276}
1277
Justin Yun5f7f7e82019-11-18 19:52:14 +09001278func (c *deviceConfig) ProductVndkVersion() string {
1279 return String(c.config.productVariables.ProductVndkVersion)
1280}
1281
Justin Yun71549282017-11-17 12:10:28 +09001282func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001283 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001284}
Jack He8cc71432016-12-08 15:45:07 -08001285
Vic Yangefd249e2018-11-12 20:19:56 -08001286func (c *deviceConfig) VndkUseCoreVariant() bool {
1287 return Bool(c.config.productVariables.VndkUseCoreVariant)
1288}
1289
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001290func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001291 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001292}
1293
1294func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001295 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001296}
1297
Jiyong Park2db76922017-11-08 16:03:48 +09001298func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001299 if c.config.productVariables.OdmPath != nil {
1300 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001301 }
1302 return "odm"
1303}
1304
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001305func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001306 if c.config.productVariables.ProductPath != nil {
1307 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001308 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001309 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001310}
1311
Justin Yund5f6c822019-06-25 16:47:17 +09001312func (c *deviceConfig) SystemExtPath() string {
1313 if c.config.productVariables.SystemExtPath != nil {
1314 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001315 }
Justin Yund5f6c822019-06-25 16:47:17 +09001316 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001317}
1318
Jack He8cc71432016-12-08 15:45:07 -08001319func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001320 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001321}
Dan Willemsen581341d2017-02-09 16:16:31 -08001322
Jiyong Parkd773eb32017-07-03 13:18:12 +09001323func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001324 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001325}
1326
Roland Levillainada12702020-06-09 13:07:36 +01001327// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1328// path. Coverage is enabled by default when the product variable
1329// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1330// enabled for any path which is part of this variable (and not part of the
1331// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1332// represents any path.
1333func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1334 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001335 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001336 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1337 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1338 coverage = true
1339 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001340 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001341 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1342 coverage = false
1343 }
1344 }
1345 return coverage
1346}
1347
Colin Cross1a6acd42020-06-16 17:51:46 -07001348// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001349func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001350 return Bool(c.config.productVariables.GcovCoverage) ||
1351 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001352}
1353
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001354func (c *deviceConfig) ClangCoverageEnabled() bool {
1355 return Bool(c.config.productVariables.ClangCoverage)
1356}
1357
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001358func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1359 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1360}
1361
Colin Cross1a6acd42020-06-16 17:51:46 -07001362func (c *deviceConfig) GcovCoverageEnabled() bool {
1363 return Bool(c.config.productVariables.GcovCoverage)
1364}
1365
Roland Levillain4f5297b2020-06-09 12:44:06 +01001366// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1367// code coverage is enabled for path. By default, coverage is not enabled for a
1368// given path unless it is part of the NativeCoveragePaths product variable (and
1369// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1370// NativeCoveragePaths represents any path.
1371func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001372 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001373 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001374 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001375 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001376 }
1377 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001378 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001379 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001380 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001381 }
1382 }
1383 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001384}
Ivan Lozano5f595532017-07-13 14:46:05 -07001385
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001386func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001387 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001388}
1389
Tri Vo35a51432018-03-25 20:00:00 -07001390func (c *deviceConfig) VendorSepolicyDirs() []string {
1391 return c.config.productVariables.BoardVendorSepolicyDirs
1392}
1393
1394func (c *deviceConfig) OdmSepolicyDirs() []string {
1395 return c.config.productVariables.BoardOdmSepolicyDirs
1396}
1397
Felixa20a8752020-05-17 18:28:35 +02001398func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1399 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001400}
1401
Felixa20a8752020-05-17 18:28:35 +02001402func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1403 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001404}
1405
Inseob Kim0866b002019-04-15 20:21:29 +09001406func (c *deviceConfig) SepolicyM4Defs() []string {
1407 return c.config.productVariables.BoardSepolicyM4Defs
1408}
1409
Jiyong Park7f67f482019-01-05 12:57:48 +09001410func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001411 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1412 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1413}
1414
1415func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001416 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001417 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1418}
1419
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001420func (c *deviceConfig) OverridePackageNameFor(name string) string {
1421 newName, overridden := findOverrideValue(
1422 c.config.productVariables.PackageNameOverrides,
1423 name,
1424 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1425 if overridden {
1426 return newName
1427 }
1428 return name
1429}
1430
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001431func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001432 if overrides == nil || len(overrides) == 0 {
1433 return "", false
1434 }
1435 for _, o := range overrides {
1436 split := strings.Split(o, ":")
1437 if len(split) != 2 {
1438 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001439 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001440 }
1441 if matchPattern(split[0], name) {
1442 return substPattern(split[0], split[1], name), true
1443 }
1444 }
1445 return "", false
1446}
1447
Albert Martineefabcf2022-03-21 20:11:16 +00001448func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1449 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1450}
1451
Ivan Lozano5f595532017-07-13 14:46:05 -07001452func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001453 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001454 return false
1455 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001456 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001457}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001458
1459func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001460 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001461 return false
1462 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001463 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001464}
1465
1466func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001467 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001468 return false
1469 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001470 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001471}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001472
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001473func (c *config) MemtagHeapDisabledForPath(path string) bool {
1474 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1475 return false
1476 }
1477 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1478}
1479
1480func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1481 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1482 return false
1483 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001484 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001485}
1486
1487func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1488 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1489 return false
1490 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001491 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001492}
1493
Dan Willemsen0fe78662018-03-26 12:41:18 -07001494func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001495 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001496}
1497
Colin Cross395f2cf2018-10-24 16:10:32 -07001498func (c *config) NdkAbis() bool {
1499 return Bool(c.productVariables.Ndk_abis)
1500}
1501
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001502func (c *config) AmlAbis() bool {
1503 return Bool(c.productVariables.Aml_abis)
1504}
1505
Jiyong Park8fd61922018-11-08 02:50:25 +09001506func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001507 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001508}
1509
Jiyong Park4da07972021-01-05 21:01:11 +09001510func (c *config) ForceApexSymlinkOptimization() bool {
1511 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1512}
1513
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001514func (c *config) ApexCompressionEnabled() bool {
1515 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001516}
1517
Dennis Shene2ed70c2023-01-11 14:15:43 +00001518func (c *config) ApexTrimEnabled() bool {
1519 return Bool(c.productVariables.TrimmedApex)
1520}
1521
Jeongik Chac9464142019-01-07 12:07:27 +09001522func (c *config) EnforceSystemCertificate() bool {
1523 return Bool(c.productVariables.EnforceSystemCertificate)
1524}
1525
Colin Cross440e0d02020-06-11 11:32:11 -07001526func (c *config) EnforceSystemCertificateAllowList() []string {
1527 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001528}
1529
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001530func (c *config) EnforceProductPartitionInterface() bool {
1531 return Bool(c.productVariables.EnforceProductPartitionInterface)
1532}
1533
JaeMan Parkff715562020-10-19 17:25:58 +09001534func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1535 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1536}
1537
1538func (c *config) InterPartitionJavaLibraryAllowList() []string {
1539 return c.productVariables.InterPartitionJavaLibraryAllowList
1540}
1541
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001542func (c *config) InstallExtraFlattenedApexes() bool {
1543 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1544}
1545
Colin Crossf24a22a2019-01-31 14:12:44 -08001546func (c *config) ProductHiddenAPIStubs() []string {
1547 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001548}
1549
Colin Crossf24a22a2019-01-31 14:12:44 -08001550func (c *config) ProductHiddenAPIStubsSystem() []string {
1551 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001552}
1553
Colin Crossf24a22a2019-01-31 14:12:44 -08001554func (c *config) ProductHiddenAPIStubsTest() []string {
1555 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001556}
Dan Willemsen71c74602019-04-10 12:27:35 -07001557
Dan Willemsen54879d12019-04-18 10:08:46 -07001558func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001559 return c.config.productVariables.TargetFSConfigGen
1560}
Inseob Kim0866b002019-04-15 20:21:29 +09001561
1562func (c *config) ProductPublicSepolicyDirs() []string {
1563 return c.productVariables.ProductPublicSepolicyDirs
1564}
1565
1566func (c *config) ProductPrivateSepolicyDirs() []string {
1567 return c.productVariables.ProductPrivateSepolicyDirs
1568}
1569
Colin Cross50ddcc42019-05-16 12:28:22 -07001570func (c *config) MissingUsesLibraries() []string {
1571 return c.productVariables.MissingUsesLibraries
1572}
1573
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001574func (c *config) TargetMultitreeUpdateMeta() bool {
1575 return c.productVariables.MultitreeUpdateMeta
1576}
1577
Inseob Kim1f086e22019-05-09 13:29:15 +09001578func (c *deviceConfig) DeviceArch() string {
1579 return String(c.config.productVariables.DeviceArch)
1580}
1581
1582func (c *deviceConfig) DeviceArchVariant() string {
1583 return String(c.config.productVariables.DeviceArchVariant)
1584}
1585
1586func (c *deviceConfig) DeviceSecondaryArch() string {
1587 return String(c.config.productVariables.DeviceSecondaryArch)
1588}
1589
1590func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1591 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1592}
Yifan Hong82db7352020-01-21 16:12:26 -08001593
1594func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1595 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1596}
Yifan Hong97365ee2020-07-29 09:51:57 -07001597
1598func (c *deviceConfig) BoardKernelBinaries() []string {
1599 return c.config.productVariables.BoardKernelBinaries
1600}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001601
Yifan Hong42bef8d2020-08-05 14:36:09 -07001602func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1603 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1604}
1605
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001606func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1607 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1608}
1609
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001610func (c *deviceConfig) PlatformSepolicyVersion() string {
1611 return String(c.config.productVariables.PlatformSepolicyVersion)
1612}
1613
Inseob Kima10ef272021-09-15 03:04:53 +00001614func (c *deviceConfig) TotSepolicyVersion() string {
1615 return String(c.config.productVariables.TotSepolicyVersion)
1616}
1617
Inseob Kim843f6642022-01-07 09:11:23 +09001618func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1619 return c.config.productVariables.PlatformSepolicyCompatVersions
1620}
1621
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001622func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001623 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1624 return ver
1625 }
1626 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001627}
1628
Inseob Kim14178802021-12-08 22:53:31 +09001629func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1630 return c.config.productVariables.BoardPlatVendorPolicy
1631}
1632
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001633func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1634 return c.config.productVariables.BoardReqdMaskPolicy
1635}
1636
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001637func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1638 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1639}
1640
1641func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1642 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1643}
1644
1645func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1646 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1647}
1648
1649func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1650 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1651}
1652
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001653func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1654 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1655}
1656
1657func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1658 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1659}
1660
1661func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1662 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1663}
1664
Inseob Kim7cf14652021-01-06 23:06:52 +09001665func (c *deviceConfig) DirectedVendorSnapshot() bool {
1666 return c.config.productVariables.DirectedVendorSnapshot
1667}
1668
1669func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1670 return c.config.productVariables.VendorSnapshotModules
1671}
1672
Jose Galmes4c6895e2021-02-09 07:44:30 -08001673func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1674 return c.config.productVariables.DirectedRecoverySnapshot
1675}
1676
1677func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1678 return c.config.productVariables.RecoverySnapshotModules
1679}
1680
Justin DeMartino383bfb32021-02-24 10:49:43 -08001681func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1682 var ret = make(map[string]bool)
1683 for _, dir := range dirs {
1684 clean := filepath.Clean(dir)
1685 if previous[clean] || ret[clean] {
1686 return nil, fmt.Errorf("Duplicate entry %s", dir)
1687 }
1688 ret[clean] = true
1689 }
1690 return ret, nil
1691}
1692
1693func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1694 dirMap := c.Once(onceKey, func() interface{} {
1695 ret, err := createDirsMap(previous, dirs)
1696 if err != nil {
1697 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1698 }
1699 return ret
1700 })
1701 if dirMap == nil {
1702 return nil
1703 }
1704 return dirMap.(map[string]bool)
1705}
1706
1707var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1708
1709func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1710 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1711 c.config.productVariables.VendorSnapshotDirsExcluded)
1712}
1713
1714var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1715
1716func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1717 excludedMap := c.VendorSnapshotDirsExcludedMap()
1718 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1719 c.config.productVariables.VendorSnapshotDirsIncluded)
1720}
1721
1722var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1723
1724func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1725 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1726 c.config.productVariables.RecoverySnapshotDirsExcluded)
1727}
1728
1729var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1730
1731func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1732 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1733 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1734 c.config.productVariables.RecoverySnapshotDirsIncluded)
1735}
1736
Rob Seymour925aa092021-08-10 20:42:03 +00001737func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1738 return c.config.productVariables.HostFakeSnapshotEnabled
1739}
1740
Inseob Kim60c32f02020-12-21 22:53:05 +09001741func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1742 if c.config.productVariables.ShippingApiLevel == nil {
1743 return NoneApiLevel
1744 }
1745 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1746 return uncheckedFinalApiLevel(apiLevel)
1747}
1748
Alix Espinoef47e542022-09-14 19:10:51 +00001749func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1750 return c.config.productVariables.BuildBrokenClangAsFlags
1751}
1752
1753func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1754 return c.config.productVariables.BuildBrokenClangCFlags
1755}
1756
Alixb5f6d9e2022-04-20 23:00:58 +00001757func (c *deviceConfig) BuildBrokenClangProperty() bool {
1758 return c.config.productVariables.BuildBrokenClangProperty
1759}
1760
Inseob Kim67e5add192021-03-17 18:05:33 +09001761func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1762 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1763}
1764
1765func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1766 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1767}
1768
Cole Faustedc4c502022-09-09 19:39:25 -07001769func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1770 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1771}
1772
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001773func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1774 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1775}
1776
Inseob Kim0cac7b42021-02-03 18:16:46 +09001777func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1778 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1779}
1780
Liz Kammer619be462022-01-28 15:13:39 -05001781func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1782 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1783}
1784
Vinh Tran140d5882022-06-10 14:23:27 -04001785func (c *deviceConfig) BuildBrokenDepfile() bool {
1786 return Bool(c.config.productVariables.BuildBrokenDepfile)
1787}
1788
Inseob Kim67e5add192021-03-17 18:05:33 +09001789func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1790 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1791}
1792
1793func (c *config) SelinuxIgnoreNeverallows() bool {
1794 return c.productVariables.SelinuxIgnoreNeverallows
1795}
1796
1797func (c *deviceConfig) SepolicySplit() bool {
1798 return c.config.productVariables.SepolicySplit
1799}
1800
Inseob Kima10ef272021-09-15 03:04:53 +00001801func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1802 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1803}
1804
1805func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1806 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1807}
1808
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001809func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1810 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1811}
1812
Christopher Ferris98f10222022-07-13 23:16:52 -07001813func (c *config) IgnorePrefer32OnDevice() bool {
1814 return c.productVariables.IgnorePrefer32OnDevice
1815}
1816
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001817func (c *config) BootJars() []string {
1818 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001819 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001820 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001821 }).([]string)
1822}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001823
satayevd604b212021-07-21 14:23:52 +01001824func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001825 return c.productVariables.BootJars
1826}
1827
satayevd604b212021-07-21 14:23:52 +01001828func (c *config) ApexBootJars() ConfiguredJarList {
1829 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001830}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001831
1832func (c *config) RBEWrapper() string {
1833 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1834}
Colin Cross9b698b62021-12-22 09:55:32 -08001835
1836// UseHostMusl returns true if the host target has been configured to build against musl libc.
1837func (c *config) UseHostMusl() bool {
1838 return Bool(c.productVariables.HostMusl)
1839}
MarkDacekff851b82022-04-21 18:33:17 +00001840
Chris Parsonsf874e462022-05-10 13:50:12 -04001841func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001842 moduleName := ctx.Module().Name()
1843 c.mixedBuildsLock.Lock()
1844 defer c.mixedBuildsLock.Unlock()
1845 if useBazel {
1846 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1847 } else {
1848 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1849 }
1850}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001851
1852// ApiSurfaces directory returns the source path inside the api_surfaces repo
1853// (relative to workspace root).
1854func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1855 return filepath.Join(
1856 "build",
1857 "bazel",
1858 "api_surfaces",
1859 s.String(),
1860 version)
1861}