blob: 7141e54c3d0d9d4bfa238c37dfb3ed4055376d1b [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
Jingwen Chenc711fec2020-11-22 23:52:50 -050017// This is the primary location to write and read all configuration values and
18// product variables necessary for soong_build's operation.
19
Colin Cross3f40fa42015-01-30 17:27:36 -080020import (
Cole Faust082c5f32022-08-04 15:49:20 -070021 "bytes"
Colin Cross3f40fa42015-01-30 17:27:36 -080022 "encoding/json"
23 "fmt"
24 "os"
Colin Cross35cec122015-04-02 14:37:16 -070025 "path/filepath"
Sam Delmerico5c32bbf2022-01-20 20:15:02 +000026 "reflect"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "runtime"
Inseob Kim60c32f02020-12-21 22:53:05 +090028 "strconv"
Dan Willemsen34cc69e2015-09-23 15:26:20 -070029 "strings"
Colin Crossc1e86a32015-04-15 12:33:28 -070030 "sync"
Colin Cross6ff51382015-12-17 16:39:19 -080031
Colin Cross98be1bb2019-12-13 20:41:13 -080032 "github.com/google/blueprint"
Colin Crosse87040b2017-12-11 15:52:26 -080033 "github.com/google/blueprint/bootstrap"
Colin Cross98be1bb2019-12-13 20:41:13 -080034 "github.com/google/blueprint/pathtools"
Colin Cross6ff51382015-12-17 16:39:19 -080035 "github.com/google/blueprint/proptools"
Colin Cross9d34f352019-11-22 16:03:51 -080036
37 "android/soong/android/soongconfig"
Liz Kammer09f947d2021-05-12 14:51:49 -040038 "android/soong/bazel"
Colin Cross77cdcfd2021-03-12 11:28:25 -080039 "android/soong/remoteexec"
Liz Kammer72beb342022-02-03 08:42:10 -050040 "android/soong/starlark_fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080041)
42
Jingwen Chenc711fec2020-11-22 23:52:50 -050043// Bool re-exports proptools.Bool for the android package.
Colin Cross6ff51382015-12-17 16:39:19 -080044var Bool = proptools.Bool
Jingwen Chenc711fec2020-11-22 23:52:50 -050045
46// String re-exports proptools.String for the android package.
Jack He8cc71432016-12-08 15:45:07 -080047var String = proptools.String
Jingwen Chenc711fec2020-11-22 23:52:50 -050048
49// StringDefault re-exports proptools.StringDefault for the android package.
Jeongik Cha219141c2020-08-06 23:00:37 +090050var StringDefault = proptools.StringDefault
Jiyong Park6a927c42020-01-21 02:03:43 +090051
Jingwen Chenc711fec2020-11-22 23:52:50 -050052// FutureApiLevelInt is a placeholder constant for unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070053const FutureApiLevelInt = 10000
54
Spandan Das15da5882023-03-02 23:36:39 +000055// PrivateApiLevel represents the api level of SdkSpecPrivate (sdk_version: "")
56// This api_level exists to differentiate user-provided "" from "current" sdk_version
57// The differentiation is necessary to enable different validation rules for these two possible values.
58var PrivateApiLevel = ApiLevel{
59 value: "current", // The value is current since aidl expects `current` as the default (TestAidlFlagsWithMinSdkVersion)
60 number: FutureApiLevelInt + 1, // This is used to differentiate it from FutureApiLevel
61 isPreview: true,
62}
63
Jingwen Chenc711fec2020-11-22 23:52:50 -050064// FutureApiLevel represents unreleased API levels.
Dan Albert0b176c82020-07-23 16:43:25 -070065var FutureApiLevel = ApiLevel{
66 value: "current",
67 number: FutureApiLevelInt,
68 isPreview: true,
69}
Colin Cross6ff51382015-12-17 16:39:19 -080070
Jingwen Chenc4d91bc2020-11-24 22:59:26 -050071// The product variables file name, containing product config from Kati.
Dan Willemsen87b17d12015-07-14 00:39:06 -070072const productVariablesFileName = "soong.variables"
Colin Cross3f40fa42015-01-30 17:27:36 -080073
Colin Cross9272ade2016-08-17 15:24:12 -070074// A Config object represents the entire build configuration for Android.
Colin Crossc3c0a492015-04-10 15:43:55 -070075type Config struct {
76 *config
77}
78
Chris Parsonsad876012022-08-20 14:48:32 -040079type SoongBuildMode int
80
Sasha Smundakaf5ca922022-12-12 21:23:34 -080081type CmdArgs struct {
82 bootstrap.Args
83 RunGoTests bool
84 OutDir string
85 SoongOutDir string
86
87 SymlinkForestMarker string
88 Bp2buildMarker string
89 BazelQueryViewDir string
90 BazelApiBp2buildDir string
91 ModuleGraphFile string
92 ModuleActionsFile string
93 DocFile string
94
LaMont Jones52a72432023-03-09 18:19:35 +000095 MultitreeBuild bool
96
Sasha Smundakaf5ca922022-12-12 21:23:34 -080097 BazelMode bool
98 BazelModeDev bool
99 BazelModeStaging bool
100 BazelForceEnabledModules string
Chris Parsons9402ca82023-02-23 17:28:06 -0500101
102 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000103
104 BuildFromTextStub bool
MarkDacekf47e1422023-04-19 16:47:36 +0000105
106 EnsureAllowlistIntegrity bool
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800107}
108
Chris Parsonsad876012022-08-20 14:48:32 -0400109// Build modes that soong_build can run as.
110const (
111 // Don't use bazel at all during module analysis.
112 AnalysisNoBazel SoongBuildMode = iota
113
Lukacs T. Berkic541cd22022-10-26 07:26:50 +0000114 // Symlink fores mode: merge two directory trees into a symlink forest
115 SymlinkForest
116
Chris Parsonsad876012022-08-20 14:48:32 -0400117 // Bp2build mode: Generate BUILD files from blueprint files and exit.
118 Bp2build
119
120 // Generate BUILD files which faithfully represent the dependency graph of
121 // blueprint modules. Individual BUILD targets will not, however, faitfhully
122 // express build semantics.
123 GenerateQueryView
124
Spandan Das5af0bd32022-09-28 20:43:08 +0000125 // Generate BUILD files for API contributions to API surfaces
126 ApiBp2build
127
Chris Parsonsad876012022-08-20 14:48:32 -0400128 // Create a JSON representation of the module graph and exit.
129 GenerateModuleGraph
130
131 // Generate a documentation file for module type definitions and exit.
132 GenerateDocFile
133
134 // Use bazel during analysis of many allowlisted build modules. The allowlist
135 // is considered a "developer mode" allowlist, as some modules may be
136 // allowlisted on an experimental basis.
137 BazelDevMode
138
MarkDacekb78465d2022-10-18 20:10:16 +0000139 // Use bazel during analysis of a few allowlisted build modules. The allowlist
140 // is considered "staging, as these are modules being prepared to be released
141 // into prod mode shortly after.
142 BazelStagingMode
143
Chris Parsonsad876012022-08-20 14:48:32 -0400144 // Use bazel during analysis of build modules from an allowlist carefully
145 // curated by the build team to be proven stable.
Chris Parsonsad876012022-08-20 14:48:32 -0400146 BazelProdMode
147)
148
Lukacs T. Berkib078ade2021-08-31 10:42:08 +0200149// SoongOutDir returns the build output directory for the configuration.
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200150func (c Config) SoongOutDir() string {
151 return c.soongOutDir
Jeff Gastonefc1b412017-03-29 17:29:06 -0700152}
153
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200154func (c Config) OutDir() string {
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200155 return c.outDir
Lukacs T. Berki89e9a162021-03-12 08:31:32 +0100156}
157
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200158func (c Config) RunGoTests() bool {
159 return c.runGoTests
160}
161
Lukacs T. Berki5f6cb1d2021-03-17 15:03:14 +0100162func (c Config) DebugCompilation() bool {
163 return false // Never compile Go code in the main build for debugging
164}
165
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200166func (c Config) Subninjas() []string {
167 return []string{}
168}
169
170func (c Config) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderInvocation {
171 return []bootstrap.PrimaryBuilderInvocation{}
172}
173
Paul Duffin74135582022-10-06 11:01:59 +0100174// RunningInsideUnitTest returns true if this code is being run as part of a Soong unit test.
175func (c Config) RunningInsideUnitTest() bool {
176 return c.config.TestProductVariables != nil
177}
178
Jingwen Chenc711fec2020-11-22 23:52:50 -0500179// A DeviceConfig object represents the configuration for a particular device
180// being built. For now there will only be one of these, but in the future there
181// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700182type DeviceConfig struct {
183 *deviceConfig
184}
185
Jingwen Chenc711fec2020-11-22 23:52:50 -0500186// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800187type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700188
Jingwen Chenc711fec2020-11-22 23:52:50 -0500189// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500190// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700191type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500192 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800193 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800194
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700195 // Only available on configs created by TestConfig
196 TestProductVariables *productVariables
197
Jingwen Chenc711fec2020-11-22 23:52:50 -0500198 // A specialized context object for Bazel/Soong mixed builds and migration
199 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400200 BazelContext BazelContext
201
Dan Willemsen87b17d12015-07-14 00:39:06 -0700202 ProductVariablesFileName string
203
Colin Cross0c66bc62021-07-20 09:47:41 -0700204 // BuildOS stores the OsType for the OS that the build is running on.
205 BuildOS OsType
206
207 // BuildArch stores the ArchType for the CPU that the build is running on.
208 BuildArch ArchType
209
Jaewoong Jung642916f2020-10-09 17:25:15 -0700210 Targets map[OsType][]Target
211 BuildOSTarget Target // the Target for tools run on the build machine
212 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
213 AndroidCommonTarget Target // the Target for common modules for the Android device
214 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700215
Jingwen Chenc711fec2020-11-22 23:52:50 -0500216 // multilibConflicts for an ArchType is true if there is earlier configured
217 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700218 multilibConflicts map[ArchType]bool
219
Colin Cross9272ade2016-08-17 15:24:12 -0700220 deviceConfig *deviceConfig
221
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200222 outDir string // The output directory (usually out/)
223 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400224 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700225
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200226 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200227
Colin Cross6ccbc912017-10-10 23:07:38 -0700228 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700229 envLock sync.Mutex
230 envDeps map[string]string
231 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800232
Jingwen Chencda22c92020-11-23 00:22:30 -0500233 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
234 // runs standalone.
235 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700236
Colin Cross32616ed2017-09-05 21:56:44 -0700237 captureBuild bool // true for tests, saves build parameters for each module
238 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700239
Colin Cross98be1bb2019-12-13 20:41:13 -0800240 fs pathtools.FileSystem
241 mockBpList string
242
Chris Parsonsad876012022-08-20 14:48:32 -0400243 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700244 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000245 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500246
LaMont Jones52a72432023-03-09 18:19:35 +0000247 // If MultitreeBuild is true then this is one inner tree of a multitree
248 // build directed by the multitree orchestrator.
249 MultitreeBuild bool
250
Colin Cross5e6a7972020-06-07 16:56:32 -0700251 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
252 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000253 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700254
Jingwen Chenc711fec2020-11-22 23:52:50 -0500255 // The list of files that when changed, must invalidate soong_build to
256 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700257 ninjaFileDepsSet sync.Map
258
Colin Cross9272ade2016-08-17 15:24:12 -0700259 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000260
Chris Parsonsad876012022-08-20 14:48:32 -0400261 // These fields are only used for metrics collection. A module should be added
262 // to these maps only if its implementation supports Bazel handling in mixed
263 // builds. A module being in the "enabled" list indicates that there is a
264 // variant of that module for which bazel-handling actually took place.
265 // A module being in the "disabled" list indicates that there is a variant of
266 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000267 mixedBuildsLock sync.Mutex
268 mixedBuildEnabledModules map[string]struct{}
269 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000270
271 // These are modules to be built with Bazel beyond the allowlisted/build-mode
272 // specified modules. They are passed via the command-line flag
273 // "--bazel-force-enabled-modules"
274 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500275
276 // If true, for any requests to Bazel, communicate with a Bazel proxy using
277 // unix sockets, instead of spawning Bazel as a subprocess.
278 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000279
280 // If buildFromTextStub is true then the Java API stubs are
281 // built from the signature text files, not the source Java files.
282 buildFromTextStub bool
MarkDacekf47e1422023-04-19 16:47:36 +0000283
284 // If ensureAllowlistIntegrity is true, then the presence of any allowlisted
285 // modules that aren't mixed-built for at least one variant will cause a build
286 // failure
287 ensureAllowlistIntegrity bool
Colin Cross9272ade2016-08-17 15:24:12 -0700288}
289
290type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700291 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700292 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800293}
294
Colin Cross485e5722015-08-27 13:28:01 -0700295type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700296 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700297}
Colin Cross3f40fa42015-01-30 17:27:36 -0800298
Colin Cross485e5722015-08-27 13:28:01 -0700299func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000300 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700301}
302
Jingwen Chenc711fec2020-11-22 23:52:50 -0500303// loadFromConfigFile loads and decodes configuration options from a JSON file
304// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400305func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800306 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700307 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800308 defer configFileReader.Close()
309 if os.IsNotExist(err) {
310 // Need to create a file, so that blueprint & ninja don't get in
311 // a dependency tracking loop.
312 // Make a file-configurable-options with defaults, write it out using
313 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700314 configurable.SetDefaultConfig()
315 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800316 if err != nil {
317 return err
318 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800319 } else if err != nil {
320 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800321 } else {
322 // Make a decoder for it
323 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700324 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800325 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800326 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800327 }
328 }
329
Liz Kammer09f947d2021-05-12 14:51:49 -0400330 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
331 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
332 }
333
334 configurable.Native_coverage = proptools.BoolPtr(
335 Bool(configurable.GcovCoverage) ||
336 Bool(configurable.ClangCoverage))
337
Yuntao Xu402e9b02021-08-09 15:44:44 -0700338 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
339 // if false (pre-released version, for example), use Platform_sdk_codename.
340 if Bool(configurable.Platform_sdk_final) {
341 if configurable.Platform_sdk_version != nil {
342 configurable.Platform_sdk_version_or_codename =
343 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
344 } else {
345 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
346 }
347 } else {
348 configurable.Platform_sdk_version_or_codename =
349 proptools.StringPtr(String(configurable.Platform_sdk_codename))
350 }
351
Liz Kammer09f947d2021-05-12 14:51:49 -0400352 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800353}
354
Colin Crossd8f20142016-11-03 09:43:26 -0700355// atomically writes the config file in case two copies of soong_build are running simultaneously
356// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400357func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800358 data, err := json.MarshalIndent(&config, "", " ")
359 if err != nil {
360 return fmt.Errorf("cannot marshal config data: %s", err.Error())
361 }
362
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800363 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800364 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500365 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800366 }
Colin Crossd8f20142016-11-03 09:43:26 -0700367 defer os.Remove(f.Name())
368 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800369
Colin Crossd8f20142016-11-03 09:43:26 -0700370 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800371 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700372 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
373 }
374
Colin Crossd8f20142016-11-03 09:43:26 -0700375 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700376 if err != nil {
377 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 }
379
Colin Crossd8f20142016-11-03 09:43:26 -0700380 f.Close()
381 os.Rename(f.Name(), filename)
382
Colin Cross3f40fa42015-01-30 17:27:36 -0800383 return nil
384}
385
Liz Kammer09f947d2021-05-12 14:51:49 -0400386func saveToBazelConfigFile(config *productVariables, outDir string) error {
387 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
388 err := createDirIfNonexistent(dir, os.ModePerm)
389 if err != nil {
390 return fmt.Errorf("Could not create dir %s: %s", dir, err)
391 }
392
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000393 nonArchVariantProductVariables := []string{}
394 archVariantProductVariables := []string{}
395 p := variableProperties{}
396 t := reflect.TypeOf(p.Product_variables)
397 for i := 0; i < t.NumField(); i++ {
398 f := t.Field(i)
399 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
400 if proptools.HasTag(f, "android", "arch_variant") {
401 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
402 }
403 }
404
Liz Kammer72beb342022-02-03 08:42:10 -0500405 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000406 if err != nil {
407 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
408 }
409
Liz Kammer72beb342022-02-03 08:42:10 -0500410 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000411 if err != nil {
412 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
413 }
414
415 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400416 if err != nil {
417 return fmt.Errorf("cannot marshal config data: %s", err.Error())
418 }
Cole Faust082c5f32022-08-04 15:49:20 -0700419 // The backslashes need to be escaped because this text is going to be put
420 // inside a Starlark string literal.
421 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400422
423 bzl := []string{
424 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000425 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
426 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
427 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
428 "\n", `
429product_vars = _product_vars
Cole Fausteb644cf2023-04-11 13:48:17 -0700430
431# TODO(b/269577299) Remove these when everything switches over to loading them from product_variable_constants.bzl
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000432product_var_constraints = _product_var_constraints
433arch_variant_product_var_constraints = _arch_variant_product_var_constraints
434`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400435 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500436 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
437 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400438 if err != nil {
439 return fmt.Errorf("Could not write .bzl config file %s", err)
440 }
Cole Fausteb644cf2023-04-11 13:48:17 -0700441 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variable_constants.bzl"), []byte(fmt.Sprintf(`
442product_var_constraints = %s
443arch_variant_product_var_constraints = %s
444`, nonArchVariantProductVariablesJson, archVariantProductVariablesJson)), 0644)
445 if err != nil {
446 return fmt.Errorf("Could not write .bzl config file %s", err)
447 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500448 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
449 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400450 if err != nil {
451 return fmt.Errorf("Could not write BUILD config file %s", err)
452 }
453
454 return nil
455}
456
Colin Cross988414c2020-01-11 01:11:46 +0000457// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
458// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200459func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000460 return Config{
461 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200462 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200463 soongOutDir: soongOutDir,
464 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000465 },
466 }
467}
468
Jingwen Chenc711fec2020-11-22 23:52:50 -0500469// NewConfig creates a new Config object. The srcDir argument specifies the path
470// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800471func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500472 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700473 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800474 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700475
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200476 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700477
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800478 outDir: cmdArgs.OutDir,
479 soongOutDir: cmdArgs.SoongOutDir,
480 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200481 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800482
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800483 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000484 fs: pathtools.NewOsFs(absSrcDir),
485 mixedBuildDisabledModules: make(map[string]struct{}),
486 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000487 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500488
LaMont Jones52a72432023-03-09 18:19:35 +0000489 MultitreeBuild: cmdArgs.MultitreeBuild,
490 UseBazelProxy: cmdArgs.UseBazelProxy,
Jihoon Kang1bff0342023-01-17 20:40:22 +0000491
492 buildFromTextStub: cmdArgs.BuildFromTextStub,
Colin Cross68f55102015-03-25 14:43:57 -0700493 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800494
Dan Willemsen00269f22017-07-06 16:59:48 -0700495 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700496 config: config,
497 }
498
Liz Kammer7941b302020-07-28 13:27:34 -0700499 // Soundness check of the build and source directories. This won't catch strange
500 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800501 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700502 if err != nil {
503 return Config{}, err
504 }
505
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200506 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700507 if err != nil {
508 return Config{}, err
509 }
510
511 if strings.HasPrefix(absSrcDir, absBuildDir) {
512 return Config{}, fmt.Errorf("Build dir must not contain source directory")
513 }
514
Colin Cross3f40fa42015-01-30 17:27:36 -0800515 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700516 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800517 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700518 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800519 }
520
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800521 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500522 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
523 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800524 }
525
Colin Cross0c66bc62021-07-20 09:47:41 -0700526 determineBuildOS(config)
527
Jingwen Chenc711fec2020-11-22 23:52:50 -0500528 // Sets up the map of target OSes to the finer grained compilation targets
529 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700530 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700531 if err != nil {
532 return Config{}, err
533 }
534
Paul Duffin1356d8c2020-02-25 19:26:33 +0000535 // Make the CommonOS OsType available for all products.
536 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
537
Dan Albert4098deb2016-10-19 14:04:41 -0700538 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500539 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700540 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000541 } else if config.AmlAbis() {
542 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700543 }
544
545 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500546 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800547 if err != nil {
548 return Config{}, err
549 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700550 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800551 }
552
Colin Cross3b19f5d2019-09-17 14:45:31 -0700553 multilib := make(map[string]bool)
554 for _, target := range targets[Android] {
555 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
556 config.multilibConflicts[target.Arch.ArchType] = true
557 }
558 multilib[target.Arch.ArchType.Multilib] = true
559 }
560
Jingwen Chenc711fec2020-11-22 23:52:50 -0500561 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700562 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500563
564 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700565 config.BuildOSTarget = config.Targets[config.BuildOS][0]
566 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500567
568 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700569 if len(config.Targets[Android]) > 0 {
570 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000571 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700572 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700573
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500574 setBuildMode := func(arg string, mode SoongBuildMode) {
575 if arg != "" {
576 if config.BuildMode != AnalysisNoBazel {
577 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
578 os.Exit(1)
579 }
580 config.BuildMode = mode
581 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800582 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500583 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
584 if arg {
585 if config.BuildMode != AnalysisNoBazel {
586 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
587 os.Exit(1)
588 }
589 config.BuildMode = mode
590 }
591 }
592 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
593 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
594 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
595 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
596 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
597 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
598 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
599 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
600 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800601
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800602 for _, module := range strings.Split(cmdArgs.BazelForceEnabledModules, ",") {
MarkDacekd06db5d2022-11-29 00:47:59 +0000603 config.bazelForceEnabledModules[module] = struct{}{}
604 }
MarkDacek9c094ca2023-03-16 19:15:19 +0000605 config.BazelContext, err = NewBazelContext(config)
606 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
MarkDacekd06db5d2022-11-29 00:47:59 +0000607
Jingwen Chenc711fec2020-11-22 23:52:50 -0500608 return Config{config}, err
609}
Colin Cross988414c2020-01-11 01:11:46 +0000610
Colin Cross98be1bb2019-12-13 20:41:13 -0800611// mockFileSystem replaces all reads with accesses to the provided map of
612// filenames to contents stored as a byte slice.
613func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
614 mockFS := map[string][]byte{}
615
616 if _, exists := mockFS["Android.bp"]; !exists {
617 mockFS["Android.bp"] = []byte(bp)
618 }
619
620 for k, v := range fs {
621 mockFS[k] = v
622 }
623
624 // no module list file specified; find every file named Blueprints or Android.bp
625 pathsToParse := []string{}
626 for candidate := range mockFS {
627 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200628 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800629 pathsToParse = append(pathsToParse, candidate)
630 }
631 }
632 if len(pathsToParse) < 1 {
633 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
634 }
635 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
636
637 c.fs = pathtools.MockFs(mockFS)
638 c.mockBpList = blueprint.MockModuleListFile
639}
640
Jason Wuff1bb312022-12-21 09:57:26 -0500641// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
642// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400643// Returns true if "Bazel builds" is enabled. In this mode, part of build
644// analysis is handled by Bazel.
645func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500646 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
647 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500648 return false
649 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500650 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500651 return false
652 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500653 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500654 return false
655 }
656 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500657 return false
658 }
659 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500660 return false
661 }
662 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500663 return false
664 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500665 return true
666 }).(bool)
667
668 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
669 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400670}
671
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100672func (c *config) SetAllowMissingDependencies() {
673 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
674}
675
Jingwen Chenc711fec2020-11-22 23:52:50 -0500676// BlueprintToolLocation returns the directory containing build system tools
677// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200678func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700679 if c.KatiEnabled() {
680 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
681 } else {
682 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
683 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700684}
685
Dan Willemsen60e62f02018-11-16 21:05:32 -0800686func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700687 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
688 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800689}
690
Colin Cross790ef352021-10-25 19:15:55 -0700691func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000692 ext := ".so"
693 if runtime.GOOS == "darwin" {
694 ext = ".dylib"
695 }
Colin Cross790ef352021-10-25 19:15:55 -0700696 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
697 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000698}
699
Colin Crossae5330a2021-11-03 13:31:22 -0700700func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
701 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700702 return path
703}
704
Jingwen Chenc711fec2020-11-22 23:52:50 -0500705// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700706func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800707 switch runtime.GOOS {
708 case "linux":
709 return "linux-x86"
710 case "darwin":
711 return "darwin-x86"
712 default:
713 panic("Unknown GOOS")
714 }
715}
716
717// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700718func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200719 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800720}
721
Jingwen Chenc711fec2020-11-22 23:52:50 -0500722// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
723// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700724func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
725 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
726}
727
Jingwen Chenc711fec2020-11-22 23:52:50 -0500728// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
729// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700730func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700731 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800732 case "darwin":
733 return "-R"
734 case "linux":
735 return "-d"
736 default:
737 return ""
738 }
739}
Colin Cross68f55102015-03-25 14:43:57 -0700740
Colin Cross1332b002015-04-07 17:11:30 -0700741func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700742 var val string
743 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700744 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800745 defer c.envLock.Unlock()
746 if c.envDeps == nil {
747 c.envDeps = make(map[string]string)
748 }
Colin Cross68f55102015-03-25 14:43:57 -0700749 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700750 if c.envFrozen {
751 panic("Cannot access new environment variables after envdeps are frozen")
752 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700753 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700754 c.envDeps[key] = val
755 }
756 return val
757}
758
Colin Cross99d7c232016-11-23 16:52:04 -0800759func (c *config) GetenvWithDefault(key string, defaultValue string) string {
760 ret := c.Getenv(key)
761 if ret == "" {
762 return defaultValue
763 }
764 return ret
765}
766
767func (c *config) IsEnvTrue(key string) bool {
768 value := c.Getenv(key)
769 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
770}
771
772func (c *config) IsEnvFalse(key string) bool {
773 value := c.Getenv(key)
774 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
775}
776
Jingwen Chenc711fec2020-11-22 23:52:50 -0500777// EnvDeps returns the environment variables this build depends on. The first
778// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700779func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700780 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800781 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700782 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700783 return c.envDeps
784}
Colin Cross35cec122015-04-02 14:37:16 -0700785
Jingwen Chencda22c92020-11-23 00:22:30 -0500786func (c *config) KatiEnabled() bool {
787 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800788}
789
Nan Zhang581fd212018-01-10 16:06:12 -0800790func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800791 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800792}
793
Jingwen Chenc711fec2020-11-22 23:52:50 -0500794// BuildNumberFile returns the path to a text file containing metadata
795// representing the current build's number.
796//
797// Rules that want to reference the build number should read from this file
798// without depending on it. They will run whenever their other dependencies
799// require them to run and get the current build number. This ensures they don't
800// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800801func (c *config) BuildNumberFile(ctx PathContext) Path {
802 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800803}
804
Jingwen Chenc711fec2020-11-22 23:52:50 -0500805// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700806// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700807func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800808 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700809}
810
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000811// DeviceProduct returns the current product target. There could be multiple of
812// these per device type.
813//
Chris Parsonsef615e52022-08-18 22:04:11 -0400814// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000815func (c *config) DeviceProduct() string {
816 return *c.productVariables.DeviceProduct
817}
818
Cole Faustb85d1a12022-11-08 18:14:01 -0800819// HasDeviceProduct returns if the build has a product. A build will not
820// necessarily have a product when --skip-config is passed to soong, like it is
821// in prebuilts/build-tools/build-prebuilts.sh
822func (c *config) HasDeviceProduct() bool {
823 return c.productVariables.DeviceProduct != nil
824}
825
Anton Hansson53c88442019-03-18 15:53:16 +0000826func (c *config) DeviceResourceOverlays() []string {
827 return c.productVariables.DeviceResourceOverlays
828}
829
830func (c *config) ProductResourceOverlays() []string {
831 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700832}
833
Colin Crossbfd347d2018-05-09 11:11:35 -0700834func (c *config) PlatformVersionName() string {
835 return String(c.productVariables.Platform_version_name)
836}
837
Dan Albert4f378d72020-07-23 17:32:15 -0700838func (c *config) PlatformSdkVersion() ApiLevel {
839 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700840}
841
Cole Faust37d27c42023-04-12 10:27:45 -0700842func (c *config) RawPlatformSdkVersion() *int {
843 return c.productVariables.Platform_sdk_version
844}
845
Mu-Le Lee5e047532022-07-27 02:32:03 +0000846func (c *config) PlatformSdkFinal() bool {
847 return Bool(c.productVariables.Platform_sdk_final)
848}
849
Colin Crossd09b0b62018-04-18 11:06:47 -0700850func (c *config) PlatformSdkCodename() string {
851 return String(c.productVariables.Platform_sdk_codename)
852}
853
Anton Hansson97d0bae2022-02-16 16:15:10 +0000854func (c *config) PlatformSdkExtensionVersion() int {
855 return *c.productVariables.Platform_sdk_extension_version
856}
857
858func (c *config) PlatformBaseSdkExtensionVersion() int {
859 return *c.productVariables.Platform_base_sdk_extension_version
860}
861
Colin Cross092c9da2019-04-02 22:56:43 -0700862func (c *config) PlatformSecurityPatch() string {
863 return String(c.productVariables.Platform_security_patch)
864}
865
866func (c *config) PlatformPreviewSdkVersion() string {
867 return String(c.productVariables.Platform_preview_sdk_version)
868}
869
870func (c *config) PlatformMinSupportedTargetSdkVersion() string {
871 return String(c.productVariables.Platform_min_supported_target_sdk_version)
872}
873
874func (c *config) PlatformBaseOS() string {
875 return String(c.productVariables.Platform_base_os)
876}
877
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900878func (c *config) PlatformVersionLastStable() string {
879 return String(c.productVariables.Platform_version_last_stable)
880}
881
Jiyong Park37073842022-06-21 10:13:42 +0900882func (c *config) PlatformVersionKnownCodenames() string {
883 return String(c.productVariables.Platform_version_known_codenames)
884}
885
Dan Albert1a246272020-07-06 14:49:35 -0700886func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000887 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700888}
889
890func (c *config) FinalApiLevels() []ApiLevel {
891 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700892 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700893 levels = append(levels, uncheckedFinalApiLevel(i))
894 }
895 return levels
896}
897
898func (c *config) PreviewApiLevels() []ApiLevel {
899 var levels []ApiLevel
900 for i, codename := range c.PlatformVersionActiveCodenames() {
901 levels = append(levels, ApiLevel{
902 value: codename,
903 number: i,
904 isPreview: true,
905 })
906 }
907 return levels
908}
909
satayevcca4ab72021-11-30 12:33:55 +0000910func (c *config) LatestPreviewApiLevel() ApiLevel {
911 level := NoneApiLevel
912 for _, l := range c.PreviewApiLevels() {
913 if l.GreaterThan(level) {
914 level = l
915 }
916 }
917 return level
918}
919
Dan Albert1a246272020-07-06 14:49:35 -0700920func (c *config) AllSupportedApiLevels() []ApiLevel {
921 var levels []ApiLevel
922 levels = append(levels, c.FinalApiLevels()...)
923 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700924}
925
Jingwen Chenc711fec2020-11-22 23:52:50 -0500926// DefaultAppTargetSdk returns the API level that platform apps are targeting.
927// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700928func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000929 // This logic is replicated in starlark, if changing logic here update starlark code too
930 // 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 -0700931 if Bool(c.productVariables.Platform_sdk_final) {
932 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700933 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500934 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900935 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500936 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900937 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
938 // don't set platform sdk codename. Platform sdk codename makes sense only when we
939 // are building the platform. So we don't enforce the below panic for the host-only
940 // builds.
941 if hostOnlyBuild {
942 return NoneApiLevel
943 }
944 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -0500945 }
946 if codename == "REL" {
947 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
948 }
949 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -0700950}
951
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800952func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800953 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800954}
955
Dan Albert31384de2017-07-28 12:39:46 -0700956// Codenames that are active in the current lunch target.
957func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800958 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -0700959}
960
Dan Albert8c7a9942023-03-27 20:34:01 +0000961// All unreleased codenames.
962func (c *config) PlatformVersionAllPreviewCodenames() []string {
963 return c.productVariables.Platform_version_all_preview_codenames
964}
965
Colin Crossface4e42017-10-30 17:32:15 -0700966func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800967 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -0700968}
969
Colin Crossface4e42017-10-30 17:32:15 -0700970func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800971 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -0700972}
973
Colin Crossface4e42017-10-30 17:32:15 -0700974func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800975 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -0700976}
977
978func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -0800979 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -0700980}
981
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700982func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800983 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800984 if defaultCert != "" {
985 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -0800986 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500987 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -0700988}
989
Colin Crosse1731a52017-12-14 11:22:55 -0800990func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800991 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -0800992 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -0800993 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -0800994 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500995 defaultDir := c.DefaultAppCertificateDir(ctx)
996 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -0700997}
Colin Cross6ff51382015-12-17 16:39:19 -0800998
Jiyong Park9335a262018-12-24 11:31:58 +0900999func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
1000 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
1001 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -07001002 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +09001003 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
1004 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -08001005 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +09001006 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001007 // If not, APEX keys are under the specified directory
1008 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001009}
1010
Inseob Kim80fa7982022-08-12 21:36:25 +09001011// Certificate for the NetworkStack sepolicy context
1012func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1013 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1014 if cert != "" {
1015 return PathForSource(ctx, cert)
1016 }
1017 return c.DefaultAppCertificateDir(ctx)
1018}
1019
Jingwen Chenc711fec2020-11-22 23:52:50 -05001020// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1021// are configured to depend on non-existent modules. Note that this does not
1022// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001023func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001024 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001025}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001026
Jeongik Cha816a23a2020-07-08 01:09:23 +09001027// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001028func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001029 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001030}
1031
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001032// Returns true if building apps that aren't bundled with the platform.
1033// UnbundledBuild() is always true when this is true.
1034func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001035 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001036}
1037
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001038// Returns true if building image that aren't bundled with the platform.
1039// UnbundledBuild() is always true when this is true.
1040func (c *config) UnbundledBuildImage() bool {
1041 return Bool(c.productVariables.Unbundled_build_image)
1042}
1043
Jeongik Cha816a23a2020-07-08 01:09:23 +09001044// Returns true if building modules against prebuilt SDKs.
1045func (c *config) AlwaysUsePrebuiltSdks() bool {
1046 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001047}
1048
Colin Cross126a25c2017-10-31 13:55:34 -07001049func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001050 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001051}
1052
Colin Crossed064c02018-09-05 16:28:13 -07001053func (c *config) Debuggable() bool {
1054 return Bool(c.productVariables.Debuggable)
1055}
1056
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001057func (c *config) Eng() bool {
1058 return Bool(c.productVariables.Eng)
1059}
1060
Colin Crossc53c37f2021-12-08 15:42:22 -08001061// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1062// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001063func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001064 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1065 return androidTargets[0].Arch.ArchType
1066 }
1067 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001068}
1069
Colin Cross16b23492016-01-06 14:41:07 -08001070func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001071 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001072}
1073
1074func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001075 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001076}
1077
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001078func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001079 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001080}
1081
Colin Cross23ae82a2016-11-02 14:34:39 -07001082func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001083 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001084}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001085
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001086func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001087 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001088 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001089 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001090 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001091}
1092
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001093func (c *config) DisableScudo() bool {
1094 return Bool(c.productVariables.DisableScudo)
1095}
1096
Colin Crossa1ad8d12016-06-01 17:09:44 -07001097func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001098 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001099 if t.Arch.ArchType.Multilib == "lib64" {
1100 return true
1101 }
1102 }
1103
1104 return false
1105}
Colin Cross9272ade2016-08-17 15:24:12 -07001106
Colin Cross9d45bb72016-08-29 16:14:13 -07001107func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001108 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001109}
1110
Ramy Medhatbbf25672019-07-17 12:30:04 +00001111func (c *config) UseRBE() bool {
1112 return Bool(c.productVariables.UseRBE)
1113}
1114
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001115func (c *config) UseRBEJAVAC() bool {
1116 return Bool(c.productVariables.UseRBEJAVAC)
1117}
1118
1119func (c *config) UseRBER8() bool {
1120 return Bool(c.productVariables.UseRBER8)
1121}
1122
1123func (c *config) UseRBED8() bool {
1124 return Bool(c.productVariables.UseRBED8)
1125}
1126
Colin Cross8b8bec32019-11-15 13:18:43 -08001127func (c *config) UseRemoteBuild() bool {
1128 return c.UseGoma() || c.UseRBE()
1129}
1130
Colin Cross66548102018-06-19 22:47:35 -07001131func (c *config) RunErrorProne() bool {
1132 return c.IsEnvTrue("RUN_ERROR_PRONE")
1133}
1134
Jingwen Chenc711fec2020-11-22 23:52:50 -05001135// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001136func (c *config) XrefCorpusName() string {
1137 return c.Getenv("XREF_CORPUS")
1138}
1139
Jingwen Chenc711fec2020-11-22 23:52:50 -05001140// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1141// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001142func (c *config) XrefCuEncoding() string {
1143 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1144 return enc
1145 }
1146 return "json"
1147}
1148
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001149// XrefCuJavaSourceMax returns the maximum number of the Java source files
1150// in a single compilation unit
1151const xrefJavaSourceFileMaxDefault = "1000"
1152
1153func (c Config) XrefCuJavaSourceMax() string {
1154 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1155 if v == "" {
1156 return xrefJavaSourceFileMaxDefault
1157 }
1158 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1159 fmt.Fprintf(os.Stderr,
1160 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1161 err, xrefJavaSourceFileMaxDefault)
1162 return xrefJavaSourceFileMaxDefault
1163 }
1164 return v
1165
1166}
1167
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001168func (c *config) EmitXrefRules() bool {
1169 return c.XrefCorpusName() != ""
1170}
1171
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001172func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001173 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001174}
1175
1176func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001177 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001178 return ""
1179 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001180 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001181}
1182
Colin Cross0f4e0d62016-07-27 10:56:55 -07001183func (c *config) LibartImgHostBaseAddress() string {
1184 return "0x60000000"
1185}
1186
1187func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001188 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001189}
1190
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001191func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001192 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001193}
1194
Jingwen Chenc711fec2020-11-22 23:52:50 -05001195// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1196// but some modules still depend on it.
1197//
1198// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001199func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001200 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001201
Roland Levillainf6cc2612020-07-09 16:58:14 +01001202 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001203 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001204 return true
1205 }
Colin Crossa74ca042019-01-31 14:31:51 -08001206 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001207 }
1208 return false
1209}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001210func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001211 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001212 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001213 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001214 }
1215 return false
1216}
1217
1218func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001219 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001220}
1221
Sam Delmerico98a73292023-02-21 11:50:29 -05001222func (c *config) SourceRootDirs() []string {
1223 return c.productVariables.SourceRootDirs
1224}
1225
Spandan Dasc5763832022-11-08 18:42:16 +00001226func (c *config) IncludeTags() []string {
1227 return c.productVariables.IncludeTags
1228}
1229
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001230func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001231 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001232}
1233
Colin Cross5a0dcd52018-10-05 14:20:06 -07001234func (c *config) UncompressPrivAppDex() bool {
1235 return Bool(c.productVariables.UncompressPrivAppDex)
1236}
1237
1238func (c *config) ModulesLoadedByPrivilegedModules() []string {
1239 return c.productVariables.ModulesLoadedByPrivilegedModules
1240}
1241
Jingwen Chenc711fec2020-11-22 23:52:50 -05001242// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1243// the output directory, if it was created during the product configuration
1244// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001245func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001246 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001247 return OptionalPathForPath(nil)
1248 }
1249 return OptionalPathForPath(
1250 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1251}
1252
Jingwen Chenc711fec2020-11-22 23:52:50 -05001253// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1254// configuration. Since the configuration file was created by Kati during
1255// product configuration (externally of soong_build), it's not tracked, so we
1256// also manually add a Ninja file dependency on the configuration file to the
1257// rule that creates the main build.ninja file. This ensures that build.ninja is
1258// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001259func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1260 path := c.DexpreoptGlobalConfigPath(ctx)
1261 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001262 return nil, nil
1263 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001264 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001265 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001266}
1267
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001268func (c *deviceConfig) WithDexpreopt() bool {
1269 return c.config.productVariables.WithDexpreopt
1270}
1271
Colin Cross662d6142022-11-03 20:38:01 -07001272func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001273 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001274}
1275
Inseob Kimae553032019-05-14 18:52:49 +09001276func (c *config) VndkSnapshotBuildArtifacts() bool {
1277 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1278}
1279
Colin Cross3b19f5d2019-09-17 14:45:31 -07001280func (c *config) HasMultilibConflict(arch ArchType) bool {
1281 return c.multilibConflicts[arch]
1282}
1283
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001284func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001285 return String(c.productVariables.PrebuiltHiddenApiDir)
1286}
1287
MarkDacekd06db5d2022-11-29 00:47:59 +00001288func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1289 return c.bazelForceEnabledModules
1290}
1291
Colin Cross9272ade2016-08-17 15:24:12 -07001292func (c *deviceConfig) Arches() []Arch {
1293 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001294 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001295 arches = append(arches, target.Arch)
1296 }
1297 return arches
1298}
Dan Willemsend2ede872016-11-18 14:54:24 -08001299
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001300func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001301 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001302 if is32BitBinder != nil && *is32BitBinder {
1303 return "32"
1304 }
1305 return "64"
1306}
1307
Dan Willemsen4353bc42016-12-05 17:16:02 -08001308func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001309 if c.config.productVariables.VendorPath != nil {
1310 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001311 }
1312 return "vendor"
1313}
1314
Justin Yun71549282017-11-17 12:10:28 +09001315func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001316 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001317}
1318
Jose Galmes6f843bc2020-12-11 13:36:29 -08001319func (c *deviceConfig) RecoverySnapshotVersion() string {
1320 return String(c.config.productVariables.RecoverySnapshotVersion)
1321}
1322
Jeongik Cha219141c2020-08-06 23:00:37 +09001323func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1324 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1325}
1326
Justin Yun8fe12122017-12-07 17:18:15 +09001327func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001328 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001329}
1330
Justin Yun5f7f7e82019-11-18 19:52:14 +09001331func (c *deviceConfig) ProductVndkVersion() string {
1332 return String(c.config.productVariables.ProductVndkVersion)
1333}
1334
Justin Yun71549282017-11-17 12:10:28 +09001335func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001336 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001337}
Jack He8cc71432016-12-08 15:45:07 -08001338
Vic Yangefd249e2018-11-12 20:19:56 -08001339func (c *deviceConfig) VndkUseCoreVariant() bool {
1340 return Bool(c.config.productVariables.VndkUseCoreVariant)
1341}
1342
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001343func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001344 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001345}
1346
1347func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001348 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001349}
1350
Jiyong Park2db76922017-11-08 16:03:48 +09001351func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001352 if c.config.productVariables.OdmPath != nil {
1353 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001354 }
1355 return "odm"
1356}
1357
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001358func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001359 if c.config.productVariables.ProductPath != nil {
1360 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001361 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001362 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001363}
1364
Justin Yund5f6c822019-06-25 16:47:17 +09001365func (c *deviceConfig) SystemExtPath() string {
1366 if c.config.productVariables.SystemExtPath != nil {
1367 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001368 }
Justin Yund5f6c822019-06-25 16:47:17 +09001369 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001370}
1371
Jack He8cc71432016-12-08 15:45:07 -08001372func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001373 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001374}
Dan Willemsen581341d2017-02-09 16:16:31 -08001375
Jiyong Parkd773eb32017-07-03 13:18:12 +09001376func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001377 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001378}
1379
Roland Levillainada12702020-06-09 13:07:36 +01001380// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1381// path. Coverage is enabled by default when the product variable
1382// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1383// enabled for any path which is part of this variable (and not part of the
1384// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1385// represents any path.
1386func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1387 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001388 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001389 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1390 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1391 coverage = true
1392 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001393 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001394 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1395 coverage = false
1396 }
1397 }
1398 return coverage
1399}
1400
Colin Cross1a6acd42020-06-16 17:51:46 -07001401// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001402func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001403 return Bool(c.config.productVariables.GcovCoverage) ||
1404 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001405}
1406
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001407func (c *deviceConfig) ClangCoverageEnabled() bool {
1408 return Bool(c.config.productVariables.ClangCoverage)
1409}
1410
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001411func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1412 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1413}
1414
Colin Cross1a6acd42020-06-16 17:51:46 -07001415func (c *deviceConfig) GcovCoverageEnabled() bool {
1416 return Bool(c.config.productVariables.GcovCoverage)
1417}
1418
Roland Levillain4f5297b2020-06-09 12:44:06 +01001419// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1420// code coverage is enabled for path. By default, coverage is not enabled for a
1421// given path unless it is part of the NativeCoveragePaths product variable (and
1422// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1423// NativeCoveragePaths represents any path.
1424func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001425 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001426 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001427 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001428 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001429 }
1430 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001431 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001432 // Workaround coverage boot failure.
1433 // http://b/269981180
1434 if strings.HasPrefix(path, "external/protobuf") {
1435 coverage = false
1436 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001437 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001438 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001439 }
1440 }
1441 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001442}
Ivan Lozano5f595532017-07-13 14:46:05 -07001443
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001444func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001445 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001446}
1447
Vinh Tran44cb78c2023-03-09 22:07:19 -05001448// AfdoProfile returns fully qualified path associated to the given module name
1449func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1450 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1451 split := strings.Split(afdoProfile, ":")
1452 if len(split) != 3 {
1453 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1454 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1455 }
1456 if split[0] == name {
1457 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1458 }
1459 }
1460 return nil, nil
1461}
1462
Tri Vo35a51432018-03-25 20:00:00 -07001463func (c *deviceConfig) VendorSepolicyDirs() []string {
1464 return c.config.productVariables.BoardVendorSepolicyDirs
1465}
1466
1467func (c *deviceConfig) OdmSepolicyDirs() []string {
1468 return c.config.productVariables.BoardOdmSepolicyDirs
1469}
1470
Felixa20a8752020-05-17 18:28:35 +02001471func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1472 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001473}
1474
Felixa20a8752020-05-17 18:28:35 +02001475func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1476 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001477}
1478
Inseob Kim0866b002019-04-15 20:21:29 +09001479func (c *deviceConfig) SepolicyM4Defs() []string {
1480 return c.config.productVariables.BoardSepolicyM4Defs
1481}
1482
Jiyong Park7f67f482019-01-05 12:57:48 +09001483func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001484 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1485 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1486}
1487
1488func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001489 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001490 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1491}
1492
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001493func (c *deviceConfig) OverridePackageNameFor(name string) string {
1494 newName, overridden := findOverrideValue(
1495 c.config.productVariables.PackageNameOverrides,
1496 name,
1497 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1498 if overridden {
1499 return newName
1500 }
1501 return name
1502}
1503
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001504func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001505 if overrides == nil || len(overrides) == 0 {
1506 return "", false
1507 }
1508 for _, o := range overrides {
1509 split := strings.Split(o, ":")
1510 if len(split) != 2 {
1511 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001512 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001513 }
1514 if matchPattern(split[0], name) {
1515 return substPattern(split[0], split[1], name), true
1516 }
1517 }
1518 return "", false
1519}
1520
Albert Martineefabcf2022-03-21 20:11:16 +00001521func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1522 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1523}
1524
Ivan Lozano5f595532017-07-13 14:46:05 -07001525func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001526 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001527 return false
1528 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001529 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001530}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001531
1532func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001533 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001534 return false
1535 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001536 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001537}
1538
1539func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001540 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001541 return false
1542 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001543 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001544}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001545
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001546func (c *config) MemtagHeapDisabledForPath(path string) bool {
1547 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1548 return false
1549 }
1550 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1551}
1552
1553func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1554 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1555 return false
1556 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001557 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001558}
1559
1560func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1561 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1562 return false
1563 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001564 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001565}
1566
Dan Willemsen0fe78662018-03-26 12:41:18 -07001567func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001568 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001569}
1570
Colin Cross395f2cf2018-10-24 16:10:32 -07001571func (c *config) NdkAbis() bool {
1572 return Bool(c.productVariables.Ndk_abis)
1573}
1574
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001575func (c *config) AmlAbis() bool {
1576 return Bool(c.productVariables.Aml_abis)
1577}
1578
Jiyong Park8fd61922018-11-08 02:50:25 +09001579func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001580 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001581}
1582
Jiyong Park4da07972021-01-05 21:01:11 +09001583func (c *config) ForceApexSymlinkOptimization() bool {
1584 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1585}
1586
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001587func (c *config) ApexCompressionEnabled() bool {
1588 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001589}
1590
Dennis Shene2ed70c2023-01-11 14:15:43 +00001591func (c *config) ApexTrimEnabled() bool {
1592 return Bool(c.productVariables.TrimmedApex)
1593}
1594
Jeongik Chac9464142019-01-07 12:07:27 +09001595func (c *config) EnforceSystemCertificate() bool {
1596 return Bool(c.productVariables.EnforceSystemCertificate)
1597}
1598
Colin Cross440e0d02020-06-11 11:32:11 -07001599func (c *config) EnforceSystemCertificateAllowList() []string {
1600 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001601}
1602
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001603func (c *config) EnforceProductPartitionInterface() bool {
1604 return Bool(c.productVariables.EnforceProductPartitionInterface)
1605}
1606
JaeMan Parkff715562020-10-19 17:25:58 +09001607func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1608 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1609}
1610
1611func (c *config) InterPartitionJavaLibraryAllowList() []string {
1612 return c.productVariables.InterPartitionJavaLibraryAllowList
1613}
1614
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001615func (c *config) InstallExtraFlattenedApexes() bool {
1616 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1617}
1618
Colin Crossf24a22a2019-01-31 14:12:44 -08001619func (c *config) ProductHiddenAPIStubs() []string {
1620 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001621}
1622
Colin Crossf24a22a2019-01-31 14:12:44 -08001623func (c *config) ProductHiddenAPIStubsSystem() []string {
1624 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001625}
1626
Colin Crossf24a22a2019-01-31 14:12:44 -08001627func (c *config) ProductHiddenAPIStubsTest() []string {
1628 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001629}
Dan Willemsen71c74602019-04-10 12:27:35 -07001630
Dan Willemsen54879d12019-04-18 10:08:46 -07001631func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001632 return c.config.productVariables.TargetFSConfigGen
1633}
Inseob Kim0866b002019-04-15 20:21:29 +09001634
1635func (c *config) ProductPublicSepolicyDirs() []string {
1636 return c.productVariables.ProductPublicSepolicyDirs
1637}
1638
1639func (c *config) ProductPrivateSepolicyDirs() []string {
1640 return c.productVariables.ProductPrivateSepolicyDirs
1641}
1642
Colin Cross50ddcc42019-05-16 12:28:22 -07001643func (c *config) MissingUsesLibraries() []string {
1644 return c.productVariables.MissingUsesLibraries
1645}
1646
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001647func (c *config) TargetMultitreeUpdateMeta() bool {
1648 return c.productVariables.MultitreeUpdateMeta
1649}
1650
Inseob Kim1f086e22019-05-09 13:29:15 +09001651func (c *deviceConfig) DeviceArch() string {
1652 return String(c.config.productVariables.DeviceArch)
1653}
1654
1655func (c *deviceConfig) DeviceArchVariant() string {
1656 return String(c.config.productVariables.DeviceArchVariant)
1657}
1658
1659func (c *deviceConfig) DeviceSecondaryArch() string {
1660 return String(c.config.productVariables.DeviceSecondaryArch)
1661}
1662
1663func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1664 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1665}
Yifan Hong82db7352020-01-21 16:12:26 -08001666
1667func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1668 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1669}
Yifan Hong97365ee2020-07-29 09:51:57 -07001670
1671func (c *deviceConfig) BoardKernelBinaries() []string {
1672 return c.config.productVariables.BoardKernelBinaries
1673}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001674
Yifan Hong42bef8d2020-08-05 14:36:09 -07001675func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1676 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1677}
1678
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001679func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1680 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1681}
1682
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001683func (c *deviceConfig) PlatformSepolicyVersion() string {
1684 return String(c.config.productVariables.PlatformSepolicyVersion)
1685}
1686
Inseob Kima10ef272021-09-15 03:04:53 +00001687func (c *deviceConfig) TotSepolicyVersion() string {
1688 return String(c.config.productVariables.TotSepolicyVersion)
1689}
1690
Inseob Kim843f6642022-01-07 09:11:23 +09001691func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1692 return c.config.productVariables.PlatformSepolicyCompatVersions
1693}
1694
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001695func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001696 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1697 return ver
1698 }
1699 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001700}
1701
Inseob Kim14178802021-12-08 22:53:31 +09001702func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1703 return c.config.productVariables.BoardPlatVendorPolicy
1704}
1705
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001706func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1707 return c.config.productVariables.BoardReqdMaskPolicy
1708}
1709
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001710func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1711 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1712}
1713
1714func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1715 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1716}
1717
1718func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1719 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1720}
1721
1722func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1723 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1724}
1725
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001726func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1727 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1728}
1729
1730func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1731 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1732}
1733
1734func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1735 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1736}
1737
Inseob Kim7cf14652021-01-06 23:06:52 +09001738func (c *deviceConfig) DirectedVendorSnapshot() bool {
1739 return c.config.productVariables.DirectedVendorSnapshot
1740}
1741
1742func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1743 return c.config.productVariables.VendorSnapshotModules
1744}
1745
Jose Galmes4c6895e2021-02-09 07:44:30 -08001746func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1747 return c.config.productVariables.DirectedRecoverySnapshot
1748}
1749
1750func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1751 return c.config.productVariables.RecoverySnapshotModules
1752}
1753
Justin DeMartino383bfb32021-02-24 10:49:43 -08001754func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1755 var ret = make(map[string]bool)
1756 for _, dir := range dirs {
1757 clean := filepath.Clean(dir)
1758 if previous[clean] || ret[clean] {
1759 return nil, fmt.Errorf("Duplicate entry %s", dir)
1760 }
1761 ret[clean] = true
1762 }
1763 return ret, nil
1764}
1765
1766func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1767 dirMap := c.Once(onceKey, func() interface{} {
1768 ret, err := createDirsMap(previous, dirs)
1769 if err != nil {
1770 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1771 }
1772 return ret
1773 })
1774 if dirMap == nil {
1775 return nil
1776 }
1777 return dirMap.(map[string]bool)
1778}
1779
1780var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1781
1782func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1783 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1784 c.config.productVariables.VendorSnapshotDirsExcluded)
1785}
1786
1787var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1788
1789func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1790 excludedMap := c.VendorSnapshotDirsExcludedMap()
1791 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1792 c.config.productVariables.VendorSnapshotDirsIncluded)
1793}
1794
1795var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1796
1797func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1798 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1799 c.config.productVariables.RecoverySnapshotDirsExcluded)
1800}
1801
1802var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1803
1804func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1805 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1806 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1807 c.config.productVariables.RecoverySnapshotDirsIncluded)
1808}
1809
Rob Seymour925aa092021-08-10 20:42:03 +00001810func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1811 return c.config.productVariables.HostFakeSnapshotEnabled
1812}
1813
Inseob Kim60c32f02020-12-21 22:53:05 +09001814func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1815 if c.config.productVariables.ShippingApiLevel == nil {
1816 return NoneApiLevel
1817 }
1818 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1819 return uncheckedFinalApiLevel(apiLevel)
1820}
1821
Alix Espinoef47e542022-09-14 19:10:51 +00001822func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1823 return c.config.productVariables.BuildBrokenClangAsFlags
1824}
1825
1826func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1827 return c.config.productVariables.BuildBrokenClangCFlags
1828}
1829
Alixb5f6d9e2022-04-20 23:00:58 +00001830func (c *deviceConfig) BuildBrokenClangProperty() bool {
1831 return c.config.productVariables.BuildBrokenClangProperty
1832}
1833
Inseob Kim67e5add192021-03-17 18:05:33 +09001834func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1835 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1836}
1837
1838func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1839 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1840}
1841
Cole Faustedc4c502022-09-09 19:39:25 -07001842func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1843 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1844}
1845
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001846func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1847 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1848}
1849
Inseob Kim0cac7b42021-02-03 18:16:46 +09001850func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1851 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1852}
1853
Liz Kammer619be462022-01-28 15:13:39 -05001854func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1855 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1856}
1857
Vinh Tran140d5882022-06-10 14:23:27 -04001858func (c *deviceConfig) BuildBrokenDepfile() bool {
1859 return Bool(c.config.productVariables.BuildBrokenDepfile)
1860}
1861
Inseob Kim67e5add192021-03-17 18:05:33 +09001862func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1863 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1864}
1865
1866func (c *config) SelinuxIgnoreNeverallows() bool {
1867 return c.productVariables.SelinuxIgnoreNeverallows
1868}
1869
1870func (c *deviceConfig) SepolicySplit() bool {
1871 return c.config.productVariables.SepolicySplit
1872}
1873
Inseob Kima10ef272021-09-15 03:04:53 +00001874func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1875 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1876}
1877
1878func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1879 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1880}
1881
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001882func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1883 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1884}
1885
Christopher Ferris98f10222022-07-13 23:16:52 -07001886func (c *config) IgnorePrefer32OnDevice() bool {
1887 return c.productVariables.IgnorePrefer32OnDevice
1888}
1889
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001890func (c *config) BootJars() []string {
1891 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001892 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001893 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001894 }).([]string)
1895}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001896
satayevd604b212021-07-21 14:23:52 +01001897func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001898 return c.productVariables.BootJars
1899}
1900
satayevd604b212021-07-21 14:23:52 +01001901func (c *config) ApexBootJars() ConfiguredJarList {
1902 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001903}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001904
1905func (c *config) RBEWrapper() string {
1906 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1907}
Colin Cross9b698b62021-12-22 09:55:32 -08001908
1909// UseHostMusl returns true if the host target has been configured to build against musl libc.
1910func (c *config) UseHostMusl() bool {
1911 return Bool(c.productVariables.HostMusl)
1912}
MarkDacekff851b82022-04-21 18:33:17 +00001913
MarkDacekf47e1422023-04-19 16:47:36 +00001914func (c *config) GetMixedBuildsEnabledModules() map[string]struct{} {
1915 return c.mixedBuildEnabledModules
1916}
1917
Chris Parsonsf874e462022-05-10 13:50:12 -04001918func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001919 moduleName := ctx.Module().Name()
1920 c.mixedBuildsLock.Lock()
1921 defer c.mixedBuildsLock.Unlock()
1922 if useBazel {
1923 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1924 } else {
1925 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1926 }
1927}
Spandan Das9e93d3d2023-03-08 05:47:29 +00001928
1929// ApiSurfaces directory returns the source path inside the api_surfaces repo
1930// (relative to workspace root).
1931func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
1932 return filepath.Join(
1933 "build",
1934 "bazel",
1935 "api_surfaces",
1936 s.String(),
1937 version)
1938}
Jihoon Kang1bff0342023-01-17 20:40:22 +00001939
1940func (c *config) BuildFromTextStub() bool {
1941 return c.buildFromTextStub
1942}
Spandan Das4deab282023-03-30 17:06:32 +00001943
1944func (c *config) SetBuildFromTextStub(b bool) {
1945 c.buildFromTextStub = b
1946}
MarkDacek9c094ca2023-03-16 19:15:19 +00001947func (c *config) AddForceEnabledModules(forceEnabled []string) {
1948 for _, forceEnabledModule := range forceEnabled {
1949 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
1950 }
1951}