blob: a60ceedf294b2d25ff0efacf1731939c19dcc24f [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
Juan Yescas05d4d902023-04-07 10:35:35 -0700179// MaxPageSizeSupported returns the max page size supported by the device. This
180// value will define the ELF segment alignment for binaries (executables and
181// shared libraries).
182func (c Config) MaxPageSizeSupported() string {
183 return String(c.config.productVariables.DeviceMaxPageSizeSupported)
184}
185
Joe Onoratofee845a2023-05-09 08:14:14 -0700186// The release version passed to aconfig, derived from RELEASE_VERSION
187func (c Config) ReleaseVersion() string {
188 return c.config.productVariables.ReleaseVersion
189}
190
191// The flag values files passed to aconfig, derived from RELEASE_VERSION
192func (c Config) ReleaseDeviceConfigValueSets() []string {
193 return c.config.productVariables.ReleaseDeviceConfigValueSets
194}
195
Jingwen Chenc711fec2020-11-22 23:52:50 -0500196// A DeviceConfig object represents the configuration for a particular device
197// being built. For now there will only be one of these, but in the future there
198// may be multiple devices being built.
Colin Cross9272ade2016-08-17 15:24:12 -0700199type DeviceConfig struct {
200 *deviceConfig
201}
202
Jingwen Chenc711fec2020-11-22 23:52:50 -0500203// VendorConfig represents the configuration for vendor-specific behavior.
Colin Cross9d34f352019-11-22 16:03:51 -0800204type VendorConfig soongconfig.SoongConfig
Dan Willemsen0fe78662018-03-26 12:41:18 -0700205
Jingwen Chenc711fec2020-11-22 23:52:50 -0500206// Definition of general build configuration for soong_build. Some of these
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500207// product configuration values are read from Kati-generated soong.variables.
Colin Cross1332b002015-04-07 17:11:30 -0700208type config struct {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500209 // Options configurable with soong.variables
Dan Willemsen45133ac2018-03-09 21:22:06 -0800210 productVariables productVariables
Colin Cross3f40fa42015-01-30 17:27:36 -0800211
Dan Willemsen674dc7f2018-03-12 18:06:05 -0700212 // Only available on configs created by TestConfig
213 TestProductVariables *productVariables
214
Jingwen Chenc711fec2020-11-22 23:52:50 -0500215 // A specialized context object for Bazel/Soong mixed builds and migration
216 // purposes.
Chris Parsonsf3c96ef2020-09-29 02:23:17 -0400217 BazelContext BazelContext
218
Dan Willemsen87b17d12015-07-14 00:39:06 -0700219 ProductVariablesFileName string
220
Colin Cross0c66bc62021-07-20 09:47:41 -0700221 // BuildOS stores the OsType for the OS that the build is running on.
222 BuildOS OsType
223
224 // BuildArch stores the ArchType for the CPU that the build is running on.
225 BuildArch ArchType
226
Jaewoong Jung642916f2020-10-09 17:25:15 -0700227 Targets map[OsType][]Target
228 BuildOSTarget Target // the Target for tools run on the build machine
229 BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
230 AndroidCommonTarget Target // the Target for common modules for the Android device
231 AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
Dan Willemsen218f6562015-07-08 18:13:11 -0700232
Jingwen Chenc711fec2020-11-22 23:52:50 -0500233 // multilibConflicts for an ArchType is true if there is earlier configured
234 // device architecture with the same multilib value.
Colin Cross3b19f5d2019-09-17 14:45:31 -0700235 multilibConflicts map[ArchType]bool
236
Colin Cross9272ade2016-08-17 15:24:12 -0700237 deviceConfig *deviceConfig
238
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200239 outDir string // The output directory (usually out/)
240 soongOutDir string
Chris Parsons8f232a22020-06-23 17:37:05 -0400241 moduleListFile string // the path to the file which lists blueprint files to parse.
Colin Crossc1e86a32015-04-15 12:33:28 -0700242
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200243 runGoTests bool
Lukacs T. Berkiea1a31c2021-09-02 09:58:09 +0200244
Colin Cross6ccbc912017-10-10 23:07:38 -0700245 env map[string]string
Dan Willemsene7680ba2015-09-11 17:06:19 -0700246 envLock sync.Mutex
247 envDeps map[string]string
248 envFrozen bool
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800249
Jingwen Chencda22c92020-11-23 00:22:30 -0500250 // Changes behavior based on whether Kati runs after soong_build, or if soong_build
251 // runs standalone.
252 katiEnabled bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700253
Colin Cross32616ed2017-09-05 21:56:44 -0700254 captureBuild bool // true for tests, saves build parameters for each module
255 ignoreEnvironment bool // true for tests, returns empty from all Getenv calls
Colin Crosscec81712017-07-13 14:43:27 -0700256
Colin Cross98be1bb2019-12-13 20:41:13 -0800257 fs pathtools.FileSystem
258 mockBpList string
259
Chris Parsonsad876012022-08-20 14:48:32 -0400260 BuildMode SoongBuildMode
Cole Faust324a92e2022-08-23 15:29:05 -0700261 Bp2buildPackageConfig Bp2BuildConversionAllowlist
Jingwen Chen01812022021-11-19 14:29:43 +0000262 Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions
Jingwen Chen12b4c272021-03-10 02:05:59 -0500263
LaMont Jones52a72432023-03-09 18:19:35 +0000264 // If MultitreeBuild is true then this is one inner tree of a multitree
265 // build directed by the multitree orchestrator.
266 MultitreeBuild bool
267
Colin Cross5e6a7972020-06-07 16:56:32 -0700268 // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
269 // in tests when a path doesn't exist.
Pedro Loureiro5d190cc2021-02-15 15:41:33 +0000270 TestAllowNonExistentPaths bool
Colin Cross5e6a7972020-06-07 16:56:32 -0700271
Jingwen Chenc711fec2020-11-22 23:52:50 -0500272 // The list of files that when changed, must invalidate soong_build to
273 // regenerate build.ninja.
Colin Cross12129292020-10-29 18:23:58 -0700274 ninjaFileDepsSet sync.Map
275
Colin Cross9272ade2016-08-17 15:24:12 -0700276 OncePer
MarkDacekff851b82022-04-21 18:33:17 +0000277
Chris Parsonsad876012022-08-20 14:48:32 -0400278 // These fields are only used for metrics collection. A module should be added
279 // to these maps only if its implementation supports Bazel handling in mixed
280 // builds. A module being in the "enabled" list indicates that there is a
281 // variant of that module for which bazel-handling actually took place.
282 // A module being in the "disabled" list indicates that there is a variant of
283 // that module for which bazel-handling was denied.
MarkDacekff851b82022-04-21 18:33:17 +0000284 mixedBuildsLock sync.Mutex
285 mixedBuildEnabledModules map[string]struct{}
286 mixedBuildDisabledModules map[string]struct{}
MarkDacekd06db5d2022-11-29 00:47:59 +0000287
288 // These are modules to be built with Bazel beyond the allowlisted/build-mode
289 // specified modules. They are passed via the command-line flag
290 // "--bazel-force-enabled-modules"
291 bazelForceEnabledModules map[string]struct{}
Chris Parsons9402ca82023-02-23 17:28:06 -0500292
293 // If true, for any requests to Bazel, communicate with a Bazel proxy using
294 // unix sockets, instead of spawning Bazel as a subprocess.
295 UseBazelProxy bool
Jihoon Kang1bff0342023-01-17 20:40:22 +0000296
297 // If buildFromTextStub is true then the Java API stubs are
298 // built from the signature text files, not the source Java files.
299 buildFromTextStub bool
MarkDacekf47e1422023-04-19 16:47:36 +0000300
301 // If ensureAllowlistIntegrity is true, then the presence of any allowlisted
302 // modules that aren't mixed-built for at least one variant will cause a build
303 // failure
304 ensureAllowlistIntegrity bool
Jihoon Kang480943f2023-05-19 06:02:08 +0000305
306 // List of Api libraries that contribute to Api surfaces.
307 apiLibraries map[string]struct{}
Colin Cross9272ade2016-08-17 15:24:12 -0700308}
309
310type deviceConfig struct {
Dan Willemsen00269f22017-07-06 16:59:48 -0700311 config *config
Colin Cross9272ade2016-08-17 15:24:12 -0700312 OncePer
Colin Cross3f40fa42015-01-30 17:27:36 -0800313}
314
Colin Cross485e5722015-08-27 13:28:01 -0700315type jsonConfigurable interface {
Colin Cross27385972015-09-18 10:57:10 -0700316 SetDefaultConfig()
Colin Cross485e5722015-08-27 13:28:01 -0700317}
Colin Cross3f40fa42015-01-30 17:27:36 -0800318
Colin Cross485e5722015-08-27 13:28:01 -0700319func loadConfig(config *config) error {
Colin Cross988414c2020-01-11 01:11:46 +0000320 return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
Colin Cross485e5722015-08-27 13:28:01 -0700321}
322
Jingwen Chenc711fec2020-11-22 23:52:50 -0500323// loadFromConfigFile loads and decodes configuration options from a JSON file
324// in the current working directory.
Liz Kammer09f947d2021-05-12 14:51:49 -0400325func loadFromConfigFile(configurable *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800326 // Try to open the file
Colin Cross485e5722015-08-27 13:28:01 -0700327 configFileReader, err := os.Open(filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800328 defer configFileReader.Close()
329 if os.IsNotExist(err) {
330 // Need to create a file, so that blueprint & ninja don't get in
331 // a dependency tracking loop.
332 // Make a file-configurable-options with defaults, write it out using
333 // a json writer.
Colin Cross27385972015-09-18 10:57:10 -0700334 configurable.SetDefaultConfig()
335 err = saveToConfigFile(configurable, filename)
Colin Cross3f40fa42015-01-30 17:27:36 -0800336 if err != nil {
337 return err
338 }
Colin Cross15cd21a2018-02-27 11:26:02 -0800339 } else if err != nil {
340 return fmt.Errorf("config file: could not open %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800341 } else {
342 // Make a decoder for it
343 jsonDecoder := json.NewDecoder(configFileReader)
Colin Cross485e5722015-08-27 13:28:01 -0700344 err = jsonDecoder.Decode(configurable)
Colin Cross3f40fa42015-01-30 17:27:36 -0800345 if err != nil {
Colin Cross15cd21a2018-02-27 11:26:02 -0800346 return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800347 }
348 }
349
Liz Kammer09f947d2021-05-12 14:51:49 -0400350 if Bool(configurable.GcovCoverage) && Bool(configurable.ClangCoverage) {
351 return fmt.Errorf("GcovCoverage and ClangCoverage cannot both be set")
352 }
353
354 configurable.Native_coverage = proptools.BoolPtr(
355 Bool(configurable.GcovCoverage) ||
356 Bool(configurable.ClangCoverage))
357
Yuntao Xu402e9b02021-08-09 15:44:44 -0700358 // when Platform_sdk_final is true (or PLATFORM_VERSION_CODENAME is REL), use Platform_sdk_version;
359 // if false (pre-released version, for example), use Platform_sdk_codename.
360 if Bool(configurable.Platform_sdk_final) {
361 if configurable.Platform_sdk_version != nil {
362 configurable.Platform_sdk_version_or_codename =
363 proptools.StringPtr(strconv.Itoa(*(configurable.Platform_sdk_version)))
364 } else {
365 return fmt.Errorf("Platform_sdk_version cannot be pointed by a NULL pointer")
366 }
367 } else {
368 configurable.Platform_sdk_version_or_codename =
369 proptools.StringPtr(String(configurable.Platform_sdk_codename))
370 }
371
Liz Kammer09f947d2021-05-12 14:51:49 -0400372 return saveToBazelConfigFile(configurable, filepath.Dir(filename))
Colin Cross3f40fa42015-01-30 17:27:36 -0800373}
374
Colin Crossd8f20142016-11-03 09:43:26 -0700375// atomically writes the config file in case two copies of soong_build are running simultaneously
376// (for example, docs generation and ninja manifest generation)
Liz Kammer09f947d2021-05-12 14:51:49 -0400377func saveToConfigFile(config *productVariables, filename string) error {
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 data, err := json.MarshalIndent(&config, "", " ")
379 if err != nil {
380 return fmt.Errorf("cannot marshal config data: %s", err.Error())
381 }
382
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800383 f, err := os.CreateTemp(filepath.Dir(filename), "config")
Colin Cross3f40fa42015-01-30 17:27:36 -0800384 if err != nil {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500385 return fmt.Errorf("cannot create empty config file %s: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800386 }
Colin Crossd8f20142016-11-03 09:43:26 -0700387 defer os.Remove(f.Name())
388 defer f.Close()
Colin Cross3f40fa42015-01-30 17:27:36 -0800389
Colin Crossd8f20142016-11-03 09:43:26 -0700390 _, err = f.Write(data)
Colin Cross3f40fa42015-01-30 17:27:36 -0800391 if err != nil {
Colin Cross485e5722015-08-27 13:28:01 -0700392 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
393 }
394
Colin Crossd8f20142016-11-03 09:43:26 -0700395 _, err = f.WriteString("\n")
Colin Cross485e5722015-08-27 13:28:01 -0700396 if err != nil {
397 return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
Colin Cross3f40fa42015-01-30 17:27:36 -0800398 }
399
Colin Crossd8f20142016-11-03 09:43:26 -0700400 f.Close()
401 os.Rename(f.Name(), filename)
402
Colin Cross3f40fa42015-01-30 17:27:36 -0800403 return nil
404}
405
Liz Kammer09f947d2021-05-12 14:51:49 -0400406func saveToBazelConfigFile(config *productVariables, outDir string) error {
407 dir := filepath.Join(outDir, bazel.SoongInjectionDirName, "product_config")
408 err := createDirIfNonexistent(dir, os.ModePerm)
409 if err != nil {
410 return fmt.Errorf("Could not create dir %s: %s", dir, err)
411 }
412
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000413 nonArchVariantProductVariables := []string{}
414 archVariantProductVariables := []string{}
415 p := variableProperties{}
416 t := reflect.TypeOf(p.Product_variables)
417 for i := 0; i < t.NumField(); i++ {
418 f := t.Field(i)
419 nonArchVariantProductVariables = append(nonArchVariantProductVariables, strings.ToLower(f.Name))
420 if proptools.HasTag(f, "android", "arch_variant") {
421 archVariantProductVariables = append(archVariantProductVariables, strings.ToLower(f.Name))
422 }
423 }
424
Liz Kammer72beb342022-02-03 08:42:10 -0500425 nonArchVariantProductVariablesJson := starlark_fmt.PrintStringList(nonArchVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000426 if err != nil {
427 return fmt.Errorf("cannot marshal product variable data: %s", err.Error())
428 }
429
Liz Kammer72beb342022-02-03 08:42:10 -0500430 archVariantProductVariablesJson := starlark_fmt.PrintStringList(archVariantProductVariables, 0)
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000431 if err != nil {
432 return fmt.Errorf("cannot marshal arch variant product variable data: %s", err.Error())
433 }
434
435 configJson, err := json.MarshalIndent(&config, "", " ")
Liz Kammer09f947d2021-05-12 14:51:49 -0400436 if err != nil {
437 return fmt.Errorf("cannot marshal config data: %s", err.Error())
438 }
Cole Faust082c5f32022-08-04 15:49:20 -0700439 // The backslashes need to be escaped because this text is going to be put
440 // inside a Starlark string literal.
441 configJson = bytes.ReplaceAll(configJson, []byte("\\"), []byte("\\\\"))
Liz Kammer09f947d2021-05-12 14:51:49 -0400442
443 bzl := []string{
444 bazel.GeneratedBazelFileWarning,
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000445 fmt.Sprintf(`_product_vars = json.decode("""%s""")`, configJson),
446 fmt.Sprintf(`_product_var_constraints = %s`, nonArchVariantProductVariablesJson),
447 fmt.Sprintf(`_arch_variant_product_var_constraints = %s`, archVariantProductVariablesJson),
448 "\n", `
449product_vars = _product_vars
Cole Fausteb644cf2023-04-11 13:48:17 -0700450
451# TODO(b/269577299) Remove these when everything switches over to loading them from product_variable_constants.bzl
Sam Delmerico5c32bbf2022-01-20 20:15:02 +0000452product_var_constraints = _product_var_constraints
453arch_variant_product_var_constraints = _arch_variant_product_var_constraints
454`,
Liz Kammer09f947d2021-05-12 14:51:49 -0400455 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500456 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variables.bzl"),
457 []byte(strings.Join(bzl, "\n")), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400458 if err != nil {
459 return fmt.Errorf("Could not write .bzl config file %s", err)
460 }
Cole Fausteb644cf2023-04-11 13:48:17 -0700461 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "product_variable_constants.bzl"), []byte(fmt.Sprintf(`
462product_var_constraints = %s
463arch_variant_product_var_constraints = %s
464`, nonArchVariantProductVariablesJson, archVariantProductVariablesJson)), 0644)
465 if err != nil {
466 return fmt.Errorf("Could not write .bzl config file %s", err)
467 }
Chris Parsons0008cf82023-02-03 18:45:43 -0500468 err = pathtools.WriteFileIfChanged(filepath.Join(dir, "BUILD"),
469 []byte(bazel.GeneratedBazelFileWarning), 0644)
Liz Kammer09f947d2021-05-12 14:51:49 -0400470 if err != nil {
471 return fmt.Errorf("Could not write BUILD config file %s", err)
472 }
473
474 return nil
475}
476
Colin Cross988414c2020-01-11 01:11:46 +0000477// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
478// use the android package.
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200479func NullConfig(outDir, soongOutDir string) Config {
Colin Cross988414c2020-01-11 01:11:46 +0000480 return Config{
481 config: &config{
Lukacs T. Berkid6cee7e2021-09-01 16:25:51 +0200482 outDir: outDir,
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +0200483 soongOutDir: soongOutDir,
484 fs: pathtools.OsFs,
Colin Cross988414c2020-01-11 01:11:46 +0000485 },
486 }
487}
488
Jingwen Chenc711fec2020-11-22 23:52:50 -0500489// NewConfig creates a new Config object. The srcDir argument specifies the path
490// to the root source directory. It also loads the config file, if found.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800491func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) {
Jingwen Chenc711fec2020-11-22 23:52:50 -0500492 // Make a config with default options.
Colin Cross9272ade2016-08-17 15:24:12 -0700493 config := &config{
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800494 ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName),
Dan Willemsen87b17d12015-07-14 00:39:06 -0700495
Lukacs T. Berki53b2f362021-04-12 14:04:24 +0200496 env: availableEnv,
Colin Cross6ccbc912017-10-10 23:07:38 -0700497
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800498 outDir: cmdArgs.OutDir,
499 soongOutDir: cmdArgs.SoongOutDir,
500 runGoTests: cmdArgs.RunGoTests,
Lukacs T. Berkie1df43f2021-09-08 15:31:14 +0200501 multilibConflicts: make(map[ArchType]bool),
Colin Cross98be1bb2019-12-13 20:41:13 -0800502
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800503 moduleListFile: cmdArgs.ModuleListFile,
MarkDacekff851b82022-04-21 18:33:17 +0000504 fs: pathtools.NewOsFs(absSrcDir),
505 mixedBuildDisabledModules: make(map[string]struct{}),
506 mixedBuildEnabledModules: make(map[string]struct{}),
MarkDacekd06db5d2022-11-29 00:47:59 +0000507 bazelForceEnabledModules: make(map[string]struct{}),
Chris Parsons9402ca82023-02-23 17:28:06 -0500508
LaMont Jones52a72432023-03-09 18:19:35 +0000509 MultitreeBuild: cmdArgs.MultitreeBuild,
510 UseBazelProxy: cmdArgs.UseBazelProxy,
Jihoon Kang1bff0342023-01-17 20:40:22 +0000511
512 buildFromTextStub: cmdArgs.BuildFromTextStub,
Colin Cross68f55102015-03-25 14:43:57 -0700513 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800514
Dan Willemsen00269f22017-07-06 16:59:48 -0700515 config.deviceConfig = &deviceConfig{
Colin Cross9272ade2016-08-17 15:24:12 -0700516 config: config,
517 }
518
Liz Kammer7941b302020-07-28 13:27:34 -0700519 // Soundness check of the build and source directories. This won't catch strange
520 // configurations with symlinks, but at least checks the obvious case.
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800521 absBuildDir, err := filepath.Abs(cmdArgs.SoongOutDir)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700522 if err != nil {
523 return Config{}, err
524 }
525
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200526 absSrcDir, err := filepath.Abs(".")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700527 if err != nil {
528 return Config{}, err
529 }
530
531 if strings.HasPrefix(absSrcDir, absBuildDir) {
532 return Config{}, fmt.Errorf("Build dir must not contain source directory")
533 }
534
Colin Cross3f40fa42015-01-30 17:27:36 -0800535 // Load any configurable options from the configuration file
Colin Cross9272ade2016-08-17 15:24:12 -0700536 err = loadConfig(config)
Colin Cross3f40fa42015-01-30 17:27:36 -0800537 if err != nil {
Colin Crossc3c0a492015-04-10 15:43:55 -0700538 return Config{}, err
Colin Cross3f40fa42015-01-30 17:27:36 -0800539 }
540
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800541 KatiEnabledMarkerFile := filepath.Join(cmdArgs.SoongOutDir, ".soong.kati_enabled")
Jingwen Chencda22c92020-11-23 00:22:30 -0500542 if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil {
543 config.katiEnabled = true
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800544 }
545
Colin Cross0c66bc62021-07-20 09:47:41 -0700546 determineBuildOS(config)
547
Jingwen Chenc711fec2020-11-22 23:52:50 -0500548 // Sets up the map of target OSes to the finer grained compilation targets
549 // that are configured from the product variables.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700550 targets, err := decodeTargetProductVariables(config)
Dan Willemsen218f6562015-07-08 18:13:11 -0700551 if err != nil {
552 return Config{}, err
553 }
554
Paul Duffin1356d8c2020-02-25 19:26:33 +0000555 // Make the CommonOS OsType available for all products.
556 targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
557
Dan Albert4098deb2016-10-19 14:04:41 -0700558 var archConfig []archConfig
Jingwen Chenc4d91bc2020-11-24 22:59:26 -0500559 if config.NdkAbis() {
Dan Albert4098deb2016-10-19 14:04:41 -0700560 archConfig = getNdkAbisConfig()
Martin Stjernholmc1ecc432019-11-15 15:00:31 +0000561 } else if config.AmlAbis() {
562 archConfig = getAmlAbisConfig()
Dan Albert4098deb2016-10-19 14:04:41 -0700563 }
564
565 if archConfig != nil {
Liz Kammerb7f33662022-02-28 14:16:16 -0500566 androidTargets, err := decodeAndroidArchSettings(archConfig)
Dan Willemsen322acaf2016-01-12 23:07:05 -0800567 if err != nil {
568 return Config{}, err
569 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -0700570 targets[Android] = androidTargets
Dan Willemsen322acaf2016-01-12 23:07:05 -0800571 }
572
Colin Cross3b19f5d2019-09-17 14:45:31 -0700573 multilib := make(map[string]bool)
574 for _, target := range targets[Android] {
575 if seen := multilib[target.Arch.ArchType.Multilib]; seen {
576 config.multilibConflicts[target.Arch.ArchType] = true
577 }
578 multilib[target.Arch.ArchType.Multilib] = true
579 }
580
Jingwen Chenc711fec2020-11-22 23:52:50 -0500581 // Map of OS to compilation targets.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700582 config.Targets = targets
Jingwen Chenc711fec2020-11-22 23:52:50 -0500583
584 // Compilation targets for host tools.
Colin Cross0c66bc62021-07-20 09:47:41 -0700585 config.BuildOSTarget = config.Targets[config.BuildOS][0]
586 config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
Jingwen Chenc711fec2020-11-22 23:52:50 -0500587
588 // Compilation targets for Android.
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700589 if len(config.Targets[Android]) > 0 {
590 config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
Sam Delmericocc271e22022-06-01 15:45:02 +0000591 config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
Colin Cross0f7d2ef2019-10-16 11:03:10 -0700592 }
Dan Willemsen218f6562015-07-08 18:13:11 -0700593
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500594 setBuildMode := func(arg string, mode SoongBuildMode) {
595 if arg != "" {
596 if config.BuildMode != AnalysisNoBazel {
597 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", arg)
598 os.Exit(1)
599 }
600 config.BuildMode = mode
601 }
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800602 }
Usta Shresthacae3bfa2022-12-21 11:44:26 -0500603 setBazelMode := func(arg bool, argName string, mode SoongBuildMode) {
604 if arg {
605 if config.BuildMode != AnalysisNoBazel {
606 fmt.Fprintf(os.Stderr, "buildMode is already set, illegal argument: %s", argName)
607 os.Exit(1)
608 }
609 config.BuildMode = mode
610 }
611 }
612 setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
613 setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
614 setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
615 setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
616 setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
617 setBuildMode(cmdArgs.DocFile, GenerateDocFile)
618 setBazelMode(cmdArgs.BazelModeDev, "--bazel-mode-dev", BazelDevMode)
619 setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
620 setBazelMode(cmdArgs.BazelModeStaging, "--bazel-mode-staging", BazelStagingMode)
Sasha Smundakaf5ca922022-12-12 21:23:34 -0800621
MarkDacek1de78f32023-05-02 21:00:48 +0000622 for _, module := range getForceEnabledModulesFromFlag(cmdArgs.BazelForceEnabledModules) {
MarkDacekd06db5d2022-11-29 00:47:59 +0000623 config.bazelForceEnabledModules[module] = struct{}{}
624 }
MarkDacek9c094ca2023-03-16 19:15:19 +0000625 config.BazelContext, err = NewBazelContext(config)
626 config.Bp2buildPackageConfig = GetBp2BuildAllowList()
MarkDacekd06db5d2022-11-29 00:47:59 +0000627
Jihoon Kang480943f2023-05-19 06:02:08 +0000628 // TODO(b/276958307): Replace the hardcoded list to a sdk_library local prop.
629 config.apiLibraries = map[string]struct{}{
630 "android.net.ipsec.ike": {},
631 "art.module.public.api": {},
632 "conscrypt.module.public.api": {},
633 "framework-adservices": {},
634 "framework-appsearch": {},
635 "framework-bluetooth": {},
636 "framework-configinfrastructure": {},
637 "framework-connectivity": {},
638 "framework-connectivity-t": {},
639 "framework-devicelock": {},
640 "framework-graphics": {},
641 "framework-healthfitness": {},
642 "framework-media": {},
643 "framework-mediaprovider": {},
644 "framework-ondevicepersonalization": {},
645 "framework-permission": {},
646 "framework-permission-s": {},
647 "framework-scheduling": {},
648 "framework-sdkextensions": {},
649 "framework-statsd": {},
650 "framework-sdksandbox": {},
651 "framework-tethering": {},
652 "framework-uwb": {},
653 "framework-virtualization": {},
654 "framework-wifi": {},
655 "i18n.module.public.api": {},
656 }
657
Jingwen Chenc711fec2020-11-22 23:52:50 -0500658 return Config{config}, err
659}
Colin Cross988414c2020-01-11 01:11:46 +0000660
MarkDacek1de78f32023-05-02 21:00:48 +0000661func getForceEnabledModulesFromFlag(forceEnabledFlag string) []string {
662 if forceEnabledFlag == "" {
663 return []string{}
664 }
665 return strings.Split(forceEnabledFlag, ",")
666}
667
Colin Cross98be1bb2019-12-13 20:41:13 -0800668// mockFileSystem replaces all reads with accesses to the provided map of
669// filenames to contents stored as a byte slice.
670func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
671 mockFS := map[string][]byte{}
672
673 if _, exists := mockFS["Android.bp"]; !exists {
674 mockFS["Android.bp"] = []byte(bp)
675 }
676
677 for k, v := range fs {
678 mockFS[k] = v
679 }
680
681 // no module list file specified; find every file named Blueprints or Android.bp
682 pathsToParse := []string{}
683 for candidate := range mockFS {
684 base := filepath.Base(candidate)
Lukacs T. Berkib838b0a2021-09-02 11:46:24 +0200685 if base == "Android.bp" {
Colin Cross98be1bb2019-12-13 20:41:13 -0800686 pathsToParse = append(pathsToParse, candidate)
687 }
688 }
689 if len(pathsToParse) < 1 {
690 panic(fmt.Sprintf("No Blueprint or Android.bp files found in mock filesystem: %v\n", mockFS))
691 }
692 mockFS[blueprint.MockModuleListFile] = []byte(strings.Join(pathsToParse, "\n"))
693
694 c.fs = pathtools.MockFs(mockFS)
695 c.mockBpList = blueprint.MockModuleListFile
696}
697
Jason Wuff1bb312022-12-21 09:57:26 -0500698// TODO(b/265062549): Add a field to our collected (and uploaded) metrics which
699// describes a reason that we fell back to non-mixed builds.
Chris Parsonsad876012022-08-20 14:48:32 -0400700// Returns true if "Bazel builds" is enabled. In this mode, part of build
701// analysis is handled by Bazel.
702func (c *config) IsMixedBuildsEnabled() bool {
Chris Parsons428c30f2022-11-29 14:14:52 -0500703 globalMixedBuildsSupport := c.Once(OnceKey{"globalMixedBuildsSupport"}, func() interface{} {
704 if c.productVariables.DeviceArch != nil && *c.productVariables.DeviceArch == "riscv64" {
Chris Parsons428c30f2022-11-29 14:14:52 -0500705 return false
706 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500707 if c.IsEnvTrue("GLOBAL_THINLTO") {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500708 return false
709 }
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500710 if len(c.productVariables.SanitizeHost) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500711 return false
712 }
713 if len(c.productVariables.SanitizeDevice) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500714 return false
715 }
716 if len(c.productVariables.SanitizeDeviceDiag) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500717 return false
718 }
719 if len(c.productVariables.SanitizeDeviceArch) > 0 {
Sam Delmerico5150d0d2022-11-15 17:44:44 -0500720 return false
721 }
Chris Parsons428c30f2022-11-29 14:14:52 -0500722 return true
723 }).(bool)
724
725 bazelModeEnabled := c.BuildMode == BazelProdMode || c.BuildMode == BazelDevMode || c.BuildMode == BazelStagingMode
726 return globalMixedBuildsSupport && bazelModeEnabled
Chris Parsonsad876012022-08-20 14:48:32 -0400727}
728
Lukacs T. Berkid1e3f1f2021-03-16 08:55:23 +0100729func (c *config) SetAllowMissingDependencies() {
730 c.productVariables.Allow_missing_dependencies = proptools.BoolPtr(true)
731}
732
Jingwen Chenc711fec2020-11-22 23:52:50 -0500733// BlueprintToolLocation returns the directory containing build system tools
734// from Blueprint, like soong_zip and merge_zips.
Lukacs T. Berkia806e412021-09-01 08:57:48 +0200735func (c *config) HostToolDir() string {
Colin Crossacfcc1f2021-10-25 15:40:32 -0700736 if c.KatiEnabled() {
737 return filepath.Join(c.outDir, "host", c.PrebuiltOS(), "bin")
738 } else {
739 return filepath.Join(c.soongOutDir, "host", c.PrebuiltOS(), "bin")
740 }
Dan Willemsenc2aa4a92016-05-26 15:13:03 -0700741}
742
Dan Willemsen60e62f02018-11-16 21:05:32 -0800743func (c *config) HostToolPath(ctx PathContext, tool string) Path {
Colin Cross790ef352021-10-25 19:15:55 -0700744 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool)
745 return path
Dan Willemsen60e62f02018-11-16 21:05:32 -0800746}
747
Colin Cross790ef352021-10-25 19:15:55 -0700748func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path {
Martin Stjernholm7260d062019-12-09 21:47:14 +0000749 ext := ".so"
750 if runtime.GOOS == "darwin" {
751 ext = ".dylib"
752 }
Colin Cross790ef352021-10-25 19:15:55 -0700753 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "lib64", false, lib+ext)
754 return path
Martin Stjernholm7260d062019-12-09 21:47:14 +0000755}
756
Colin Crossae5330a2021-11-03 13:31:22 -0700757func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path {
758 path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool)
Colin Cross3e3eda62021-11-04 10:22:51 -0700759 return path
760}
761
Jingwen Chenc711fec2020-11-22 23:52:50 -0500762// PrebuiltOS returns the name of the host OS used in prebuilts directories.
Colin Cross1332b002015-04-07 17:11:30 -0700763func (c *config) PrebuiltOS() string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800764 switch runtime.GOOS {
765 case "linux":
766 return "linux-x86"
767 case "darwin":
768 return "darwin-x86"
769 default:
770 panic("Unknown GOOS")
771 }
772}
773
774// GoRoot returns the path to the root directory of the Go toolchain.
Colin Cross1332b002015-04-07 17:11:30 -0700775func (c *config) GoRoot() string {
Lukacs T. Berkif7e36d82021-08-16 17:05:09 +0200776 return fmt.Sprintf("prebuilts/go/%s", c.PrebuiltOS())
Colin Cross3f40fa42015-01-30 17:27:36 -0800777}
778
Jingwen Chenc711fec2020-11-22 23:52:50 -0500779// PrebuiltBuildTool returns the path to a tool in the prebuilts directory containing
780// checked-in tools, like Kati, Ninja or Toybox, for the current host OS.
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700781func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path {
782 return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool)
783}
784
Jingwen Chenc711fec2020-11-22 23:52:50 -0500785// CpPreserveSymlinksFlags returns the host-specific flag for the cp(1) command
786// to preserve symlinks.
Colin Cross1332b002015-04-07 17:11:30 -0700787func (c *config) CpPreserveSymlinksFlags() string {
Colin Cross485e5722015-08-27 13:28:01 -0700788 switch runtime.GOOS {
Colin Cross3f40fa42015-01-30 17:27:36 -0800789 case "darwin":
790 return "-R"
791 case "linux":
792 return "-d"
793 default:
794 return ""
795 }
796}
Colin Cross68f55102015-03-25 14:43:57 -0700797
Colin Cross1332b002015-04-07 17:11:30 -0700798func (c *config) Getenv(key string) string {
Colin Cross68f55102015-03-25 14:43:57 -0700799 var val string
800 var exists bool
Colin Crossc1e86a32015-04-15 12:33:28 -0700801 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800802 defer c.envLock.Unlock()
803 if c.envDeps == nil {
804 c.envDeps = make(map[string]string)
805 }
Colin Cross68f55102015-03-25 14:43:57 -0700806 if val, exists = c.envDeps[key]; !exists {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700807 if c.envFrozen {
808 panic("Cannot access new environment variables after envdeps are frozen")
809 }
Colin Cross6ccbc912017-10-10 23:07:38 -0700810 val, _ = c.env[key]
Colin Cross68f55102015-03-25 14:43:57 -0700811 c.envDeps[key] = val
812 }
813 return val
814}
815
Colin Cross99d7c232016-11-23 16:52:04 -0800816func (c *config) GetenvWithDefault(key string, defaultValue string) string {
817 ret := c.Getenv(key)
818 if ret == "" {
819 return defaultValue
820 }
821 return ret
822}
823
824func (c *config) IsEnvTrue(key string) bool {
825 value := c.Getenv(key)
826 return value == "1" || value == "y" || value == "yes" || value == "on" || value == "true"
827}
828
829func (c *config) IsEnvFalse(key string) bool {
830 value := c.Getenv(key)
831 return value == "0" || value == "n" || value == "no" || value == "off" || value == "false"
832}
833
Jingwen Chenc711fec2020-11-22 23:52:50 -0500834// EnvDeps returns the environment variables this build depends on. The first
835// call to this function blocks future reads from the environment.
Colin Cross1332b002015-04-07 17:11:30 -0700836func (c *config) EnvDeps() map[string]string {
Dan Willemsene7680ba2015-09-11 17:06:19 -0700837 c.envLock.Lock()
Colin Crossc0d58b42017-02-06 15:40:41 -0800838 defer c.envLock.Unlock()
Dan Willemsene7680ba2015-09-11 17:06:19 -0700839 c.envFrozen = true
Colin Cross68f55102015-03-25 14:43:57 -0700840 return c.envDeps
841}
Colin Cross35cec122015-04-02 14:37:16 -0700842
Jingwen Chencda22c92020-11-23 00:22:30 -0500843func (c *config) KatiEnabled() bool {
844 return c.katiEnabled
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800845}
846
Nan Zhang581fd212018-01-10 16:06:12 -0800847func (c *config) BuildId() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800848 return String(c.productVariables.BuildId)
Nan Zhang581fd212018-01-10 16:06:12 -0800849}
850
Jingwen Chenc711fec2020-11-22 23:52:50 -0500851// BuildNumberFile returns the path to a text file containing metadata
852// representing the current build's number.
853//
854// Rules that want to reference the build number should read from this file
855// without depending on it. They will run whenever their other dependencies
856// require them to run and get the current build number. This ensures they don't
857// rebuild on every incremental build when the build number changes.
Colin Cross2a2e0db2020-02-21 16:55:46 -0800858func (c *config) BuildNumberFile(ctx PathContext) Path {
859 return PathForOutput(ctx, String(c.productVariables.BuildNumberFile))
Nan Zhang581fd212018-01-10 16:06:12 -0800860}
861
Jingwen Chenc711fec2020-11-22 23:52:50 -0500862// DeviceName returns the name of the current device target.
Colin Cross35cec122015-04-02 14:37:16 -0700863// TODO: take an AndroidModuleContext to select the device name for multi-device builds
Colin Cross1332b002015-04-07 17:11:30 -0700864func (c *config) DeviceName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -0800865 return *c.productVariables.DeviceName
Colin Cross35cec122015-04-02 14:37:16 -0700866}
867
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000868// DeviceProduct returns the current product target. There could be multiple of
869// these per device type.
870//
Chris Parsonsef615e52022-08-18 22:04:11 -0400871// NOTE: Do not base conditional logic on this value. It may break product inheritance.
Trevor Radcliffe90727f42022-03-21 19:34:02 +0000872func (c *config) DeviceProduct() string {
873 return *c.productVariables.DeviceProduct
874}
875
Cole Faustb85d1a12022-11-08 18:14:01 -0800876// HasDeviceProduct returns if the build has a product. A build will not
877// necessarily have a product when --skip-config is passed to soong, like it is
878// in prebuilts/build-tools/build-prebuilts.sh
879func (c *config) HasDeviceProduct() bool {
880 return c.productVariables.DeviceProduct != nil
881}
882
Anton Hansson53c88442019-03-18 15:53:16 +0000883func (c *config) DeviceResourceOverlays() []string {
884 return c.productVariables.DeviceResourceOverlays
885}
886
887func (c *config) ProductResourceOverlays() []string {
888 return c.productVariables.ProductResourceOverlays
Colin Cross30e076a2015-04-13 13:58:27 -0700889}
890
Colin Crossbfd347d2018-05-09 11:11:35 -0700891func (c *config) PlatformVersionName() string {
892 return String(c.productVariables.Platform_version_name)
893}
894
Dan Albert4f378d72020-07-23 17:32:15 -0700895func (c *config) PlatformSdkVersion() ApiLevel {
896 return uncheckedFinalApiLevel(*c.productVariables.Platform_sdk_version)
Colin Cross30e076a2015-04-13 13:58:27 -0700897}
898
Cole Faust37d27c42023-04-12 10:27:45 -0700899func (c *config) RawPlatformSdkVersion() *int {
900 return c.productVariables.Platform_sdk_version
901}
902
Mu-Le Lee5e047532022-07-27 02:32:03 +0000903func (c *config) PlatformSdkFinal() bool {
904 return Bool(c.productVariables.Platform_sdk_final)
905}
906
Colin Crossd09b0b62018-04-18 11:06:47 -0700907func (c *config) PlatformSdkCodename() string {
908 return String(c.productVariables.Platform_sdk_codename)
909}
910
Anton Hansson97d0bae2022-02-16 16:15:10 +0000911func (c *config) PlatformSdkExtensionVersion() int {
912 return *c.productVariables.Platform_sdk_extension_version
913}
914
915func (c *config) PlatformBaseSdkExtensionVersion() int {
916 return *c.productVariables.Platform_base_sdk_extension_version
917}
918
Colin Cross092c9da2019-04-02 22:56:43 -0700919func (c *config) PlatformSecurityPatch() string {
920 return String(c.productVariables.Platform_security_patch)
921}
922
923func (c *config) PlatformPreviewSdkVersion() string {
924 return String(c.productVariables.Platform_preview_sdk_version)
925}
926
927func (c *config) PlatformMinSupportedTargetSdkVersion() string {
928 return String(c.productVariables.Platform_min_supported_target_sdk_version)
929}
930
931func (c *config) PlatformBaseOS() string {
932 return String(c.productVariables.Platform_base_os)
933}
934
Inseob Kim4f1f3d92022-04-25 18:23:58 +0900935func (c *config) PlatformVersionLastStable() string {
936 return String(c.productVariables.Platform_version_last_stable)
937}
938
Jiyong Park37073842022-06-21 10:13:42 +0900939func (c *config) PlatformVersionKnownCodenames() string {
940 return String(c.productVariables.Platform_version_known_codenames)
941}
942
Dan Albert1a246272020-07-06 14:49:35 -0700943func (c *config) MinSupportedSdkVersion() ApiLevel {
Dan Albert6bfb6bb2022-08-17 20:11:57 +0000944 return uncheckedFinalApiLevel(21)
Dan Albert1a246272020-07-06 14:49:35 -0700945}
946
947func (c *config) FinalApiLevels() []ApiLevel {
948 var levels []ApiLevel
Dan Albert4f378d72020-07-23 17:32:15 -0700949 for i := 1; i <= c.PlatformSdkVersion().FinalOrFutureInt(); i++ {
Dan Albert1a246272020-07-06 14:49:35 -0700950 levels = append(levels, uncheckedFinalApiLevel(i))
951 }
952 return levels
953}
954
955func (c *config) PreviewApiLevels() []ApiLevel {
956 var levels []ApiLevel
957 for i, codename := range c.PlatformVersionActiveCodenames() {
958 levels = append(levels, ApiLevel{
959 value: codename,
960 number: i,
961 isPreview: true,
962 })
963 }
964 return levels
965}
966
satayevcca4ab72021-11-30 12:33:55 +0000967func (c *config) LatestPreviewApiLevel() ApiLevel {
968 level := NoneApiLevel
969 for _, l := range c.PreviewApiLevels() {
970 if l.GreaterThan(level) {
971 level = l
972 }
973 }
974 return level
975}
976
Dan Albert1a246272020-07-06 14:49:35 -0700977func (c *config) AllSupportedApiLevels() []ApiLevel {
978 var levels []ApiLevel
979 levels = append(levels, c.FinalApiLevels()...)
980 return append(levels, c.PreviewApiLevels()...)
Dan Albertf5415d72017-08-17 16:19:59 -0700981}
982
Jingwen Chenc711fec2020-11-22 23:52:50 -0500983// DefaultAppTargetSdk returns the API level that platform apps are targeting.
984// This converts a codename to the exact ApiLevel it represents.
Dan Albert4f378d72020-07-23 17:32:15 -0700985func (c *config) DefaultAppTargetSdk(ctx EarlyModuleContext) ApiLevel {
Alixfb7f7b92023-03-02 19:35:02 +0000986 // This logic is replicated in starlark, if changing logic here update starlark code too
987 // 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 -0700988 if Bool(c.productVariables.Platform_sdk_final) {
989 return c.PlatformSdkVersion()
Colin Crossd09b0b62018-04-18 11:06:47 -0700990 }
Jingwen Chenc711fec2020-11-22 23:52:50 -0500991 codename := c.PlatformSdkCodename()
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900992 hostOnlyBuild := c.productVariables.DeviceArch == nil
Jingwen Chenc711fec2020-11-22 23:52:50 -0500993 if codename == "" {
Jiyong Park3a00e3d2023-03-27 17:39:48 +0900994 // There are some host-only builds (those are invoked by build-prebuilts.sh) which
995 // don't set platform sdk codename. Platform sdk codename makes sense only when we
996 // are building the platform. So we don't enforce the below panic for the host-only
997 // builds.
998 if hostOnlyBuild {
999 return NoneApiLevel
1000 }
1001 panic("Platform_sdk_codename must be set")
Jingwen Chenc711fec2020-11-22 23:52:50 -05001002 }
1003 if codename == "REL" {
1004 panic("Platform_sdk_codename should not be REL when Platform_sdk_final is true")
1005 }
1006 return ApiLevelOrPanic(ctx, codename)
Colin Crossd09b0b62018-04-18 11:06:47 -07001007}
1008
Colin Cross3bc7ffa2017-11-22 16:19:37 -08001009func (c *config) AppsDefaultVersionName() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001010 return String(c.productVariables.AppsDefaultVersionName)
Colin Cross3bc7ffa2017-11-22 16:19:37 -08001011}
1012
Dan Albert31384de2017-07-28 12:39:46 -07001013// Codenames that are active in the current lunch target.
1014func (c *config) PlatformVersionActiveCodenames() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001015 return c.productVariables.Platform_version_active_codenames
Dan Albert31384de2017-07-28 12:39:46 -07001016}
1017
Dan Albert8c7a9942023-03-27 20:34:01 +00001018// All unreleased codenames.
1019func (c *config) PlatformVersionAllPreviewCodenames() []string {
1020 return c.productVariables.Platform_version_all_preview_codenames
1021}
1022
Colin Crossface4e42017-10-30 17:32:15 -07001023func (c *config) ProductAAPTConfig() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001024 return c.productVariables.AAPTConfig
Colin Cross30e076a2015-04-13 13:58:27 -07001025}
1026
Colin Crossface4e42017-10-30 17:32:15 -07001027func (c *config) ProductAAPTPreferredConfig() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001028 return String(c.productVariables.AAPTPreferredConfig)
Colin Cross30e076a2015-04-13 13:58:27 -07001029}
1030
Colin Crossface4e42017-10-30 17:32:15 -07001031func (c *config) ProductAAPTCharacteristics() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001032 return String(c.productVariables.AAPTCharacteristics)
Colin Crossface4e42017-10-30 17:32:15 -07001033}
1034
1035func (c *config) ProductAAPTPrebuiltDPI() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001036 return c.productVariables.AAPTPrebuiltDPI
Colin Cross30e076a2015-04-13 13:58:27 -07001037}
1038
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001039func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001040 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001041 if defaultCert != "" {
1042 return PathForSource(ctx, filepath.Dir(defaultCert))
Colin Cross61ae0b72017-12-01 17:16:02 -08001043 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001044 return PathForSource(ctx, "build/make/target/product/security")
Colin Cross30e076a2015-04-13 13:58:27 -07001045}
1046
Colin Crosse1731a52017-12-14 11:22:55 -08001047func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001048 defaultCert := String(c.productVariables.DefaultAppCertificate)
Colin Cross61ae0b72017-12-01 17:16:02 -08001049 if defaultCert != "" {
Colin Crosse1731a52017-12-14 11:22:55 -08001050 return PathForSource(ctx, defaultCert+".x509.pem"), PathForSource(ctx, defaultCert+".pk8")
Colin Cross61ae0b72017-12-01 17:16:02 -08001051 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001052 defaultDir := c.DefaultAppCertificateDir(ctx)
1053 return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8")
Colin Cross30e076a2015-04-13 13:58:27 -07001054}
Colin Cross6ff51382015-12-17 16:39:19 -08001055
Jiyong Park9335a262018-12-24 11:31:58 +09001056func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath {
1057 // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE
1058 defaultCert := String(c.productVariables.DefaultAppCertificate)
Dan Willemsen412160e2019-04-09 21:36:26 -07001059 if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" {
Jiyong Park9335a262018-12-24 11:31:58 +09001060 // When defaultCert is unset or is set to the testkeys path, use the APEX keys
1061 // that is under the module dir
Colin Cross07e51612019-03-05 12:46:40 -08001062 return pathForModuleSrc(ctx)
Jiyong Park9335a262018-12-24 11:31:58 +09001063 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001064 // If not, APEX keys are under the specified directory
1065 return PathForSource(ctx, filepath.Dir(defaultCert))
Jiyong Park9335a262018-12-24 11:31:58 +09001066}
1067
Inseob Kim80fa7982022-08-12 21:36:25 +09001068// Certificate for the NetworkStack sepolicy context
1069func (c *config) MainlineSepolicyDevCertificatesDir(ctx ModuleContext) SourcePath {
1070 cert := String(c.productVariables.MainlineSepolicyDevCertificates)
1071 if cert != "" {
1072 return PathForSource(ctx, cert)
1073 }
1074 return c.DefaultAppCertificateDir(ctx)
1075}
1076
Jingwen Chenc711fec2020-11-22 23:52:50 -05001077// AllowMissingDependencies configures Blueprint/Soong to not fail when modules
1078// are configured to depend on non-existent modules. Note that this does not
1079// affect missing input dependencies at the Ninja level.
Colin Cross6ff51382015-12-17 16:39:19 -08001080func (c *config) AllowMissingDependencies() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001081 return Bool(c.productVariables.Allow_missing_dependencies)
Colin Cross6ff51382015-12-17 16:39:19 -08001082}
Dan Willemsen322acaf2016-01-12 23:07:05 -08001083
Jeongik Cha816a23a2020-07-08 01:09:23 +09001084// Returns true if a full platform source tree cannot be assumed.
Colin Crossfc3674a2017-09-18 17:41:52 -07001085func (c *config) UnbundledBuild() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001086 return Bool(c.productVariables.Unbundled_build)
Colin Crossfc3674a2017-09-18 17:41:52 -07001087}
1088
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001089// Returns true if building apps that aren't bundled with the platform.
1090// UnbundledBuild() is always true when this is true.
1091func (c *config) UnbundledBuildApps() bool {
Cole Faust701ca252021-11-23 19:02:08 -08001092 return len(c.productVariables.Unbundled_build_apps) > 0
Martin Stjernholmfd9eb4b2020-06-17 01:13:15 +01001093}
1094
Jeongik Cha4b073cd2021-06-08 11:35:00 +09001095// Returns true if building image that aren't bundled with the platform.
1096// UnbundledBuild() is always true when this is true.
1097func (c *config) UnbundledBuildImage() bool {
1098 return Bool(c.productVariables.Unbundled_build_image)
1099}
1100
Jeongik Cha816a23a2020-07-08 01:09:23 +09001101// Returns true if building modules against prebuilt SDKs.
1102func (c *config) AlwaysUsePrebuiltSdks() bool {
1103 return Bool(c.productVariables.Always_use_prebuilt_sdks)
Colin Cross1f367bf2018-12-18 22:46:24 -08001104}
1105
Colin Cross126a25c2017-10-31 13:55:34 -07001106func (c *config) MinimizeJavaDebugInfo() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001107 return Bool(c.productVariables.MinimizeJavaDebugInfo) && !Bool(c.productVariables.Eng)
Colin Cross126a25c2017-10-31 13:55:34 -07001108}
1109
Colin Crossed064c02018-09-05 16:28:13 -07001110func (c *config) Debuggable() bool {
1111 return Bool(c.productVariables.Debuggable)
1112}
1113
Jaewoong Jung1d6eb682018-11-29 15:08:44 -08001114func (c *config) Eng() bool {
1115 return Bool(c.productVariables.Eng)
1116}
1117
Colin Crossc53c37f2021-12-08 15:42:22 -08001118// DevicePrimaryArchType returns the ArchType for the first configured device architecture, or
1119// Common if there are no device architectures.
Jiyong Park8d52f862018-07-07 18:02:07 +09001120func (c *config) DevicePrimaryArchType() ArchType {
Colin Crossc53c37f2021-12-08 15:42:22 -08001121 if androidTargets := c.Targets[Android]; len(androidTargets) > 0 {
1122 return androidTargets[0].Arch.ArchType
1123 }
1124 return Common
Jiyong Park8d52f862018-07-07 18:02:07 +09001125}
1126
Colin Cross16b23492016-01-06 14:41:07 -08001127func (c *config) SanitizeHost() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001128 return append([]string(nil), c.productVariables.SanitizeHost...)
Colin Cross16b23492016-01-06 14:41:07 -08001129}
1130
1131func (c *config) SanitizeDevice() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001132 return append([]string(nil), c.productVariables.SanitizeDevice...)
Colin Cross23ae82a2016-11-02 14:34:39 -07001133}
1134
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001135func (c *config) SanitizeDeviceDiag() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001136 return append([]string(nil), c.productVariables.SanitizeDeviceDiag...)
Ivan Lozano0c3a1ef2017-06-28 09:10:48 -07001137}
1138
Colin Cross23ae82a2016-11-02 14:34:39 -07001139func (c *config) SanitizeDeviceArch() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001140 return append([]string(nil), c.productVariables.SanitizeDeviceArch...)
Colin Cross16b23492016-01-06 14:41:07 -08001141}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001142
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001143func (c *config) EnableCFI() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001144 if c.productVariables.EnableCFI == nil {
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001145 return true
Vishwath Mohanc32c3eb2017-01-24 14:20:54 -08001146 }
Jingwen Chenc711fec2020-11-22 23:52:50 -05001147 return *c.productVariables.EnableCFI
Vishwath Mohan1b017a72017-01-19 13:54:55 -08001148}
1149
Kostya Kortchinskyd5275c82019-02-01 08:42:56 -08001150func (c *config) DisableScudo() bool {
1151 return Bool(c.productVariables.DisableScudo)
1152}
1153
Colin Crossa1ad8d12016-06-01 17:09:44 -07001154func (c *config) Android64() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001155 for _, t := range c.Targets[Android] {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001156 if t.Arch.ArchType.Multilib == "lib64" {
1157 return true
1158 }
1159 }
1160
1161 return false
1162}
Colin Cross9272ade2016-08-17 15:24:12 -07001163
Colin Cross9d45bb72016-08-29 16:14:13 -07001164func (c *config) UseGoma() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001165 return Bool(c.productVariables.UseGoma)
Colin Cross9d45bb72016-08-29 16:14:13 -07001166}
1167
Ramy Medhatbbf25672019-07-17 12:30:04 +00001168func (c *config) UseRBE() bool {
1169 return Bool(c.productVariables.UseRBE)
1170}
1171
Ramy Medhat8ea054a2020-01-27 14:19:44 -05001172func (c *config) UseRBEJAVAC() bool {
1173 return Bool(c.productVariables.UseRBEJAVAC)
1174}
1175
1176func (c *config) UseRBER8() bool {
1177 return Bool(c.productVariables.UseRBER8)
1178}
1179
1180func (c *config) UseRBED8() bool {
1181 return Bool(c.productVariables.UseRBED8)
1182}
1183
Colin Cross8b8bec32019-11-15 13:18:43 -08001184func (c *config) UseRemoteBuild() bool {
1185 return c.UseGoma() || c.UseRBE()
1186}
1187
Colin Cross66548102018-06-19 22:47:35 -07001188func (c *config) RunErrorProne() bool {
1189 return c.IsEnvTrue("RUN_ERROR_PRONE")
1190}
1191
Jingwen Chenc711fec2020-11-22 23:52:50 -05001192// XrefCorpusName returns the Kythe cross-reference corpus name.
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001193func (c *config) XrefCorpusName() string {
1194 return c.Getenv("XREF_CORPUS")
1195}
1196
Jingwen Chenc711fec2020-11-22 23:52:50 -05001197// XrefCuEncoding returns the compilation unit encoding to use for Kythe code
1198// xrefs. Can be 'json' (default), 'proto' or 'all'.
Sasha Smundak6c2d4f92020-01-09 17:34:23 -08001199func (c *config) XrefCuEncoding() string {
1200 if enc := c.Getenv("KYTHE_KZIP_ENCODING"); enc != "" {
1201 return enc
1202 }
1203 return "json"
1204}
1205
Sasha Smundakb0addaf2021-02-16 10:39:40 -08001206// XrefCuJavaSourceMax returns the maximum number of the Java source files
1207// in a single compilation unit
1208const xrefJavaSourceFileMaxDefault = "1000"
1209
1210func (c Config) XrefCuJavaSourceMax() string {
1211 v := c.Getenv("KYTHE_JAVA_SOURCE_BATCH_SIZE")
1212 if v == "" {
1213 return xrefJavaSourceFileMaxDefault
1214 }
1215 if _, err := strconv.ParseUint(v, 0, 0); err != nil {
1216 fmt.Fprintf(os.Stderr,
1217 "bad KYTHE_JAVA_SOURCE_BATCH_SIZE value: %s, will use %s",
1218 err, xrefJavaSourceFileMaxDefault)
1219 return xrefJavaSourceFileMaxDefault
1220 }
1221 return v
1222
1223}
1224
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001225func (c *config) EmitXrefRules() bool {
1226 return c.XrefCorpusName() != ""
1227}
1228
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001229func (c *config) ClangTidy() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001230 return Bool(c.productVariables.ClangTidy)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001231}
1232
1233func (c *config) TidyChecks() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001234 if c.productVariables.TidyChecks == nil {
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001235 return ""
1236 }
Dan Willemsen45133ac2018-03-09 21:22:06 -08001237 return *c.productVariables.TidyChecks
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001238}
1239
Colin Cross0f4e0d62016-07-27 10:56:55 -07001240func (c *config) LibartImgHostBaseAddress() string {
1241 return "0x60000000"
1242}
1243
1244func (c *config) LibartImgDeviceBaseAddress() string {
Elliott Hughesda3a0712020-03-06 16:55:28 -08001245 return "0x70000000"
Colin Cross0f4e0d62016-07-27 10:56:55 -07001246}
1247
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001248func (c *config) ArtUseReadBarrier() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001249 return Bool(c.productVariables.ArtUseReadBarrier)
Hiroshi Yamauchie2a10632016-12-19 13:44:41 -08001250}
1251
Jingwen Chenc711fec2020-11-22 23:52:50 -05001252// Enforce Runtime Resource Overlays for a module. RROs supersede static RROs,
1253// but some modules still depend on it.
1254//
1255// More info: https://source.android.com/devices/architecture/rros
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001256func (c *config) EnforceRROForModule(name string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001257 enforceList := c.productVariables.EnforceRROTargets
Jeongik Chacee5ba92021-02-19 12:11:51 +09001258
Roland Levillainf6cc2612020-07-09 16:58:14 +01001259 if len(enforceList) > 0 {
Yo Chiang4ebd06a2019-10-01 13:13:41 +08001260 if InList("*", enforceList) {
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001261 return true
1262 }
Colin Crossa74ca042019-01-31 14:31:51 -08001263 return InList(name, enforceList)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001264 }
1265 return false
1266}
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001267func (c *config) EnforceRROExcludedOverlay(path string) bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001268 excluded := c.productVariables.EnforceRROExcludedOverlays
Roland Levillainf6cc2612020-07-09 16:58:14 +01001269 if len(excluded) > 0 {
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001270 return HasAnyPrefix(path, excluded)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001271 }
1272 return false
1273}
1274
1275func (c *config) ExportedNamespaces() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001276 return append([]string(nil), c.productVariables.NamespacesToExport...)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001277}
1278
Sam Delmerico98a73292023-02-21 11:50:29 -05001279func (c *config) SourceRootDirs() []string {
1280 return c.productVariables.SourceRootDirs
1281}
1282
Spandan Dasc5763832022-11-08 18:42:16 +00001283func (c *config) IncludeTags() []string {
1284 return c.productVariables.IncludeTags
1285}
1286
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001287func (c *config) HostStaticBinaries() bool {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001288 return Bool(c.productVariables.HostStaticBinaries)
Dan Willemsen3fb1fae2018-03-12 15:30:26 -07001289}
1290
Colin Cross5a0dcd52018-10-05 14:20:06 -07001291func (c *config) UncompressPrivAppDex() bool {
1292 return Bool(c.productVariables.UncompressPrivAppDex)
1293}
1294
1295func (c *config) ModulesLoadedByPrivilegedModules() []string {
1296 return c.productVariables.ModulesLoadedByPrivilegedModules
1297}
1298
Jingwen Chenc711fec2020-11-22 23:52:50 -05001299// DexpreoptGlobalConfigPath returns the path to the dexpreopt.config file in
1300// the output directory, if it was created during the product configuration
1301// phase by Kati.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001302func (c *config) DexpreoptGlobalConfigPath(ctx PathContext) OptionalPath {
Colin Cross988414c2020-01-11 01:11:46 +00001303 if c.productVariables.DexpreoptGlobalConfig == nil {
Jingwen Chenebb0b572020-11-02 00:24:57 -05001304 return OptionalPathForPath(nil)
1305 }
1306 return OptionalPathForPath(
1307 pathForBuildToolDep(ctx, *c.productVariables.DexpreoptGlobalConfig))
1308}
1309
Jingwen Chenc711fec2020-11-22 23:52:50 -05001310// DexpreoptGlobalConfig returns the raw byte contents of the dexpreopt global
1311// configuration. Since the configuration file was created by Kati during
1312// product configuration (externally of soong_build), it's not tracked, so we
1313// also manually add a Ninja file dependency on the configuration file to the
1314// rule that creates the main build.ninja file. This ensures that build.ninja is
1315// regenerated correctly if dexpreopt.config changes.
Jingwen Chenebb0b572020-11-02 00:24:57 -05001316func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
1317 path := c.DexpreoptGlobalConfigPath(ctx)
1318 if !path.Valid() {
Colin Cross988414c2020-01-11 01:11:46 +00001319 return nil, nil
1320 }
Jingwen Chenebb0b572020-11-02 00:24:57 -05001321 ctx.AddNinjaFileDeps(path.String())
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001322 return os.ReadFile(absolutePath(path.String()))
Colin Cross43f08db2018-11-12 10:13:39 -08001323}
1324
Inseob Kim7b85eeb2021-03-23 20:52:24 +09001325func (c *deviceConfig) WithDexpreopt() bool {
1326 return c.config.productVariables.WithDexpreopt
1327}
1328
Colin Cross662d6142022-11-03 20:38:01 -07001329func (c *config) FrameworksBaseDirExists(ctx PathGlobContext) bool {
Colin Cross5a756a62021-03-16 16:34:46 -07001330 return ExistentPathForSource(ctx, "frameworks", "base", "Android.bp").Valid()
David Brazdil91b4e3e2019-01-23 21:04:05 +00001331}
1332
Inseob Kimae553032019-05-14 18:52:49 +09001333func (c *config) VndkSnapshotBuildArtifacts() bool {
1334 return Bool(c.productVariables.VndkSnapshotBuildArtifacts)
1335}
1336
Colin Cross3b19f5d2019-09-17 14:45:31 -07001337func (c *config) HasMultilibConflict(arch ArchType) bool {
1338 return c.multilibConflicts[arch]
1339}
1340
Sasha Smundakaf5ca922022-12-12 21:23:34 -08001341func (c *config) PrebuiltHiddenApiDir(_ PathContext) string {
Bill Peckhambae47492021-01-08 09:34:44 -08001342 return String(c.productVariables.PrebuiltHiddenApiDir)
1343}
1344
MarkDacekd06db5d2022-11-29 00:47:59 +00001345func (c *config) BazelModulesForceEnabledByFlag() map[string]struct{} {
1346 return c.bazelForceEnabledModules
1347}
1348
Colin Cross9272ade2016-08-17 15:24:12 -07001349func (c *deviceConfig) Arches() []Arch {
1350 var arches []Arch
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001351 for _, target := range c.config.Targets[Android] {
Colin Cross9272ade2016-08-17 15:24:12 -07001352 arches = append(arches, target.Arch)
1353 }
1354 return arches
1355}
Dan Willemsend2ede872016-11-18 14:54:24 -08001356
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001357func (c *deviceConfig) BinderBitness() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001358 is32BitBinder := c.config.productVariables.Binder32bit
Jayant Chowdhary34ce67d2018-03-08 11:00:50 -08001359 if is32BitBinder != nil && *is32BitBinder {
1360 return "32"
1361 }
1362 return "64"
1363}
1364
Dan Willemsen4353bc42016-12-05 17:16:02 -08001365func (c *deviceConfig) VendorPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001366 if c.config.productVariables.VendorPath != nil {
1367 return *c.config.productVariables.VendorPath
Dan Willemsen4353bc42016-12-05 17:16:02 -08001368 }
1369 return "vendor"
1370}
1371
Justin Yun71549282017-11-17 12:10:28 +09001372func (c *deviceConfig) VndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001373 return String(c.config.productVariables.DeviceVndkVersion)
Justin Yun71549282017-11-17 12:10:28 +09001374}
1375
Jose Galmes6f843bc2020-12-11 13:36:29 -08001376func (c *deviceConfig) RecoverySnapshotVersion() string {
1377 return String(c.config.productVariables.RecoverySnapshotVersion)
1378}
1379
Jeongik Cha219141c2020-08-06 23:00:37 +09001380func (c *deviceConfig) CurrentApiLevelForVendorModules() string {
1381 return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current")
1382}
1383
Justin Yun8fe12122017-12-07 17:18:15 +09001384func (c *deviceConfig) PlatformVndkVersion() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001385 return String(c.config.productVariables.Platform_vndk_version)
Justin Yun8fe12122017-12-07 17:18:15 +09001386}
1387
Justin Yun5f7f7e82019-11-18 19:52:14 +09001388func (c *deviceConfig) ProductVndkVersion() string {
1389 return String(c.config.productVariables.ProductVndkVersion)
1390}
1391
Justin Yun71549282017-11-17 12:10:28 +09001392func (c *deviceConfig) ExtraVndkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001393 return c.config.productVariables.ExtraVndkVersions
Dan Willemsend2ede872016-11-18 14:54:24 -08001394}
Jack He8cc71432016-12-08 15:45:07 -08001395
Vic Yangefd249e2018-11-12 20:19:56 -08001396func (c *deviceConfig) VndkUseCoreVariant() bool {
1397 return Bool(c.config.productVariables.VndkUseCoreVariant)
1398}
1399
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001400func (c *deviceConfig) SystemSdkVersions() []string {
Colin Crossa74ca042019-01-31 14:31:51 -08001401 return c.config.productVariables.DeviceSystemSdkVersions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001402}
1403
1404func (c *deviceConfig) PlatformSystemSdkVersions() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001405 return c.config.productVariables.Platform_systemsdk_versions
Jiyong Park1a5d7b12018-01-15 15:05:10 +09001406}
1407
Jiyong Park2db76922017-11-08 16:03:48 +09001408func (c *deviceConfig) OdmPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001409 if c.config.productVariables.OdmPath != nil {
1410 return *c.config.productVariables.OdmPath
Jiyong Park2db76922017-11-08 16:03:48 +09001411 }
1412 return "odm"
1413}
1414
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001415func (c *deviceConfig) ProductPath() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001416 if c.config.productVariables.ProductPath != nil {
1417 return *c.config.productVariables.ProductPath
Jiyong Park2db76922017-11-08 16:03:48 +09001418 }
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +09001419 return "product"
Jiyong Park2db76922017-11-08 16:03:48 +09001420}
1421
Justin Yund5f6c822019-06-25 16:47:17 +09001422func (c *deviceConfig) SystemExtPath() string {
1423 if c.config.productVariables.SystemExtPath != nil {
1424 return *c.config.productVariables.SystemExtPath
Dario Frenifd05a742018-05-29 13:28:54 +01001425 }
Justin Yund5f6c822019-06-25 16:47:17 +09001426 return "system_ext"
Dario Frenifd05a742018-05-29 13:28:54 +01001427}
1428
Jack He8cc71432016-12-08 15:45:07 -08001429func (c *deviceConfig) BtConfigIncludeDir() string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001430 return String(c.config.productVariables.BtConfigIncludeDir)
Jack He8cc71432016-12-08 15:45:07 -08001431}
Dan Willemsen581341d2017-02-09 16:16:31 -08001432
Jiyong Parkd773eb32017-07-03 13:18:12 +09001433func (c *deviceConfig) DeviceKernelHeaderDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001434 return c.config.productVariables.DeviceKernelHeaders
Jiyong Parkd773eb32017-07-03 13:18:12 +09001435}
1436
Roland Levillainada12702020-06-09 13:07:36 +01001437// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
1438// path. Coverage is enabled by default when the product variable
1439// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
1440// enabled for any path which is part of this variable (and not part of the
1441// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
1442// represents any path.
1443func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
1444 coverage := false
Chris Gross2f748692020-06-24 20:36:59 +00001445 if len(c.config.productVariables.JavaCoveragePaths) == 0 ||
Roland Levillainada12702020-06-09 13:07:36 +01001446 InList("*", c.config.productVariables.JavaCoveragePaths) ||
1447 HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
1448 coverage = true
1449 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001450 if coverage && len(c.config.productVariables.JavaCoverageExcludePaths) > 0 {
Roland Levillainada12702020-06-09 13:07:36 +01001451 if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
1452 coverage = false
1453 }
1454 }
1455 return coverage
1456}
1457
Colin Cross1a6acd42020-06-16 17:51:46 -07001458// Returns true if gcov or clang coverage is enabled.
Dan Willemsen581341d2017-02-09 16:16:31 -08001459func (c *deviceConfig) NativeCoverageEnabled() bool {
Colin Cross1a6acd42020-06-16 17:51:46 -07001460 return Bool(c.config.productVariables.GcovCoverage) ||
1461 Bool(c.config.productVariables.ClangCoverage)
Dan Willemsen581341d2017-02-09 16:16:31 -08001462}
1463
Oliver Nguyen1382ab62019-12-06 15:22:41 -08001464func (c *deviceConfig) ClangCoverageEnabled() bool {
1465 return Bool(c.config.productVariables.ClangCoverage)
1466}
1467
Pirama Arumuga Nainarb37ae582022-01-26 22:14:32 -08001468func (c *deviceConfig) ClangCoverageContinuousMode() bool {
1469 return Bool(c.config.productVariables.ClangCoverageContinuousMode)
1470}
1471
Colin Cross1a6acd42020-06-16 17:51:46 -07001472func (c *deviceConfig) GcovCoverageEnabled() bool {
1473 return Bool(c.config.productVariables.GcovCoverage)
1474}
1475
Roland Levillain4f5297b2020-06-09 12:44:06 +01001476// NativeCoverageEnabledForPath returns whether (GCOV- or Clang-based) native
1477// code coverage is enabled for path. By default, coverage is not enabled for a
1478// given path unless it is part of the NativeCoveragePaths product variable (and
1479// not part of the NativeCoverageExcludePaths product variable). Value "*" in
1480// NativeCoveragePaths represents any path.
1481func (c *deviceConfig) NativeCoverageEnabledForPath(path string) bool {
Ryan Campbell469a18a2017-02-27 09:01:54 -08001482 coverage := false
Roland Levillainf6cc2612020-07-09 16:58:14 +01001483 if len(c.config.productVariables.NativeCoveragePaths) > 0 {
Roland Levillain4f5297b2020-06-09 12:44:06 +01001484 if InList("*", c.config.productVariables.NativeCoveragePaths) || HasAnyPrefix(path, c.config.productVariables.NativeCoveragePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001485 coverage = true
Dan Willemsen581341d2017-02-09 16:16:31 -08001486 }
1487 }
Roland Levillainf6cc2612020-07-09 16:58:14 +01001488 if coverage && len(c.config.productVariables.NativeCoverageExcludePaths) > 0 {
Yi Kongfd07ed22023-02-16 17:42:27 +09001489 // Workaround coverage boot failure.
1490 // http://b/269981180
1491 if strings.HasPrefix(path, "external/protobuf") {
1492 coverage = false
1493 }
Roland Levillain4f5297b2020-06-09 12:44:06 +01001494 if HasAnyPrefix(path, c.config.productVariables.NativeCoverageExcludePaths) {
Ivan Lozano5f595532017-07-13 14:46:05 -07001495 coverage = false
Ryan Campbell469a18a2017-02-27 09:01:54 -08001496 }
1497 }
1498 return coverage
Dan Willemsen581341d2017-02-09 16:16:31 -08001499}
Ivan Lozano5f595532017-07-13 14:46:05 -07001500
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001501func (c *deviceConfig) PgoAdditionalProfileDirs() []string {
Dan Willemsen45133ac2018-03-09 21:22:06 -08001502 return c.config.productVariables.PgoAdditionalProfileDirs
Pirama Arumuga Nainar49540802018-01-29 23:11:42 -08001503}
1504
Vinh Tran44cb78c2023-03-09 22:07:19 -05001505// AfdoProfile returns fully qualified path associated to the given module name
1506func (c *deviceConfig) AfdoProfile(name string) (*string, error) {
1507 for _, afdoProfile := range c.config.productVariables.AfdoProfiles {
1508 split := strings.Split(afdoProfile, ":")
1509 if len(split) != 3 {
1510 return nil, fmt.Errorf("AFDO_PROFILES has invalid value: %s. "+
1511 "The expected format is <module>:<fully-qualified-path-to-fdo_profile>", afdoProfile)
1512 }
1513 if split[0] == name {
1514 return proptools.StringPtr(strings.Join([]string{split[1], split[2]}, ":")), nil
1515 }
1516 }
1517 return nil, nil
1518}
1519
Tri Vo35a51432018-03-25 20:00:00 -07001520func (c *deviceConfig) VendorSepolicyDirs() []string {
1521 return c.config.productVariables.BoardVendorSepolicyDirs
1522}
1523
1524func (c *deviceConfig) OdmSepolicyDirs() []string {
1525 return c.config.productVariables.BoardOdmSepolicyDirs
1526}
1527
Felixa20a8752020-05-17 18:28:35 +02001528func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
1529 return c.config.productVariables.SystemExtPublicSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001530}
1531
Felixa20a8752020-05-17 18:28:35 +02001532func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
1533 return c.config.productVariables.SystemExtPrivateSepolicyDirs
Tri Vo35a51432018-03-25 20:00:00 -07001534}
1535
Inseob Kim0866b002019-04-15 20:21:29 +09001536func (c *deviceConfig) SepolicyM4Defs() []string {
1537 return c.config.productVariables.BoardSepolicyM4Defs
1538}
1539
Jiyong Park7f67f482019-01-05 12:57:48 +09001540func (c *deviceConfig) OverrideManifestPackageNameFor(name string) (manifestName string, overridden bool) {
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001541 return findOverrideValue(c.config.productVariables.ManifestPackageNameOverrides, name,
1542 "invalid override rule %q in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES should be <module_name>:<manifest_name>")
1543}
1544
1545func (c *deviceConfig) OverrideCertificateFor(name string) (certificatePath string, overridden bool) {
Jaewoong Jungacb6db32019-02-28 16:22:30 +00001546 return findOverrideValue(c.config.productVariables.CertificateOverrides, name,
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001547 "invalid override rule %q in PRODUCT_CERTIFICATE_OVERRIDES should be <module_name>:<certificate_module_name>")
1548}
1549
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001550func (c *deviceConfig) OverridePackageNameFor(name string) string {
1551 newName, overridden := findOverrideValue(
1552 c.config.productVariables.PackageNameOverrides,
1553 name,
1554 "invalid override rule %q in PRODUCT_PACKAGE_NAME_OVERRIDES should be <module_name>:<package_name>")
1555 if overridden {
1556 return newName
1557 }
1558 return name
1559}
1560
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001561func findOverrideValue(overrides []string, name string, errorMsg string) (newValue string, overridden bool) {
Jiyong Park7f67f482019-01-05 12:57:48 +09001562 if overrides == nil || len(overrides) == 0 {
1563 return "", false
1564 }
1565 for _, o := range overrides {
1566 split := strings.Split(o, ":")
1567 if len(split) != 2 {
1568 // This shouldn't happen as this is first checked in make, but just in case.
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001569 panic(fmt.Errorf(errorMsg, o))
Jiyong Park7f67f482019-01-05 12:57:48 +09001570 }
1571 if matchPattern(split[0], name) {
1572 return substPattern(split[0], split[1], name), true
1573 }
1574 }
1575 return "", false
1576}
1577
Albert Martineefabcf2022-03-21 20:11:16 +00001578func (c *deviceConfig) ApexGlobalMinSdkVersionOverride() string {
1579 return String(c.config.productVariables.ApexGlobalMinSdkVersionOverride)
1580}
1581
Ivan Lozano5f595532017-07-13 14:46:05 -07001582func (c *config) IntegerOverflowDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001583 if len(c.productVariables.IntegerOverflowExcludePaths) == 0 {
Ivan Lozano5f595532017-07-13 14:46:05 -07001584 return false
1585 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001586 return HasAnyPrefix(path, c.productVariables.IntegerOverflowExcludePaths)
Ivan Lozano5f595532017-07-13 14:46:05 -07001587}
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001588
1589func (c *config) CFIDisabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001590 if len(c.productVariables.CFIExcludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001591 return false
1592 }
Jaewoong Jung3aff5782020-02-11 07:54:35 -08001593 return HasAnyPrefix(path, c.productVariables.CFIExcludePaths)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001594}
1595
1596func (c *config) CFIEnabledForPath(path string) bool {
Roland Levillainf6cc2612020-07-09 16:58:14 +01001597 if len(c.productVariables.CFIIncludePaths) == 0 {
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001598 return false
1599 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001600 return HasAnyPrefix(path, c.productVariables.CFIIncludePaths) && !c.CFIDisabledForPath(path)
Vishwath Mohan1fa3ac52017-10-31 02:26:14 -07001601}
Colin Crosse15ddaf2017-12-04 11:24:31 -08001602
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001603func (c *config) MemtagHeapDisabledForPath(path string) bool {
1604 if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
1605 return false
1606 }
1607 return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
1608}
1609
1610func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
1611 if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
1612 return false
1613 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001614 return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001615}
1616
1617func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
1618 if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
1619 return false
1620 }
Evgenii Stepanov779b64e2021-04-09 14:33:10 -07001621 return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths) && !c.MemtagHeapDisabledForPath(path)
Evgenii Stepanov4beaa0c2021-01-05 16:41:26 -08001622}
1623
Hang Lua98aab92023-03-17 13:17:22 +08001624func (c *config) HWASanEnabledForPath(path string) bool {
1625 if len(c.productVariables.HWASanIncludePaths) == 0 {
1626 return false
1627 }
1628 return HasAnyPrefix(path, c.productVariables.HWASanIncludePaths)
1629}
1630
Dan Willemsen0fe78662018-03-26 12:41:18 -07001631func (c *config) VendorConfig(name string) VendorConfig {
Colin Cross9d34f352019-11-22 16:03:51 -08001632 return soongconfig.Config(c.productVariables.VendorVars[name])
Dan Willemsen0fe78662018-03-26 12:41:18 -07001633}
1634
Colin Cross395f2cf2018-10-24 16:10:32 -07001635func (c *config) NdkAbis() bool {
1636 return Bool(c.productVariables.Ndk_abis)
1637}
1638
Martin Stjernholmc1ecc432019-11-15 15:00:31 +00001639func (c *config) AmlAbis() bool {
1640 return Bool(c.productVariables.Aml_abis)
1641}
1642
Jiyong Park8fd61922018-11-08 02:50:25 +09001643func (c *config) FlattenApex() bool {
Roland Levillaina3863212019-08-12 19:56:16 +01001644 return Bool(c.productVariables.Flatten_apex)
Jiyong Park8fd61922018-11-08 02:50:25 +09001645}
1646
Jiyong Park4da07972021-01-05 21:01:11 +09001647func (c *config) ForceApexSymlinkOptimization() bool {
1648 return Bool(c.productVariables.ForceApexSymlinkOptimization)
1649}
1650
Sasha Smundakfe9a5b82022-07-27 14:51:45 -07001651func (c *config) ApexCompressionEnabled() bool {
1652 return Bool(c.productVariables.CompressedApex) && !c.UnbundledBuildApps()
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00001653}
1654
Dennis Shene2ed70c2023-01-11 14:15:43 +00001655func (c *config) ApexTrimEnabled() bool {
1656 return Bool(c.productVariables.TrimmedApex)
1657}
1658
Jeongik Chac9464142019-01-07 12:07:27 +09001659func (c *config) EnforceSystemCertificate() bool {
1660 return Bool(c.productVariables.EnforceSystemCertificate)
1661}
1662
Colin Cross440e0d02020-06-11 11:32:11 -07001663func (c *config) EnforceSystemCertificateAllowList() []string {
1664 return c.productVariables.EnforceSystemCertificateAllowList
Jeongik Chac9464142019-01-07 12:07:27 +09001665}
1666
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001667func (c *config) EnforceProductPartitionInterface() bool {
1668 return Bool(c.productVariables.EnforceProductPartitionInterface)
1669}
1670
JaeMan Parkff715562020-10-19 17:25:58 +09001671func (c *config) EnforceInterPartitionJavaSdkLibrary() bool {
1672 return Bool(c.productVariables.EnforceInterPartitionJavaSdkLibrary)
1673}
1674
1675func (c *config) InterPartitionJavaLibraryAllowList() []string {
1676 return c.productVariables.InterPartitionJavaLibraryAllowList
1677}
1678
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09001679func (c *config) InstallExtraFlattenedApexes() bool {
1680 return Bool(c.productVariables.InstallExtraFlattenedApexes)
1681}
1682
Colin Crossf24a22a2019-01-31 14:12:44 -08001683func (c *config) ProductHiddenAPIStubs() []string {
1684 return c.productVariables.ProductHiddenAPIStubs
Colin Cross8faf8fc2019-01-16 15:15:52 -08001685}
1686
Colin Crossf24a22a2019-01-31 14:12:44 -08001687func (c *config) ProductHiddenAPIStubsSystem() []string {
1688 return c.productVariables.ProductHiddenAPIStubsSystem
Colin Cross8faf8fc2019-01-16 15:15:52 -08001689}
1690
Colin Crossf24a22a2019-01-31 14:12:44 -08001691func (c *config) ProductHiddenAPIStubsTest() []string {
1692 return c.productVariables.ProductHiddenAPIStubsTest
Colin Cross8faf8fc2019-01-16 15:15:52 -08001693}
Dan Willemsen71c74602019-04-10 12:27:35 -07001694
Dan Willemsen54879d12019-04-18 10:08:46 -07001695func (c *deviceConfig) TargetFSConfigGen() []string {
Dan Willemsen71c74602019-04-10 12:27:35 -07001696 return c.config.productVariables.TargetFSConfigGen
1697}
Inseob Kim0866b002019-04-15 20:21:29 +09001698
1699func (c *config) ProductPublicSepolicyDirs() []string {
1700 return c.productVariables.ProductPublicSepolicyDirs
1701}
1702
1703func (c *config) ProductPrivateSepolicyDirs() []string {
1704 return c.productVariables.ProductPrivateSepolicyDirs
1705}
1706
Colin Cross50ddcc42019-05-16 12:28:22 -07001707func (c *config) MissingUsesLibraries() []string {
1708 return c.productVariables.MissingUsesLibraries
1709}
1710
Inseob Kim5eb7ee92022-04-27 10:30:34 +09001711func (c *config) TargetMultitreeUpdateMeta() bool {
1712 return c.productVariables.MultitreeUpdateMeta
1713}
1714
Inseob Kim1f086e22019-05-09 13:29:15 +09001715func (c *deviceConfig) DeviceArch() string {
1716 return String(c.config.productVariables.DeviceArch)
1717}
1718
1719func (c *deviceConfig) DeviceArchVariant() string {
1720 return String(c.config.productVariables.DeviceArchVariant)
1721}
1722
1723func (c *deviceConfig) DeviceSecondaryArch() string {
1724 return String(c.config.productVariables.DeviceSecondaryArch)
1725}
1726
1727func (c *deviceConfig) DeviceSecondaryArchVariant() string {
1728 return String(c.config.productVariables.DeviceSecondaryArchVariant)
1729}
Yifan Hong82db7352020-01-21 16:12:26 -08001730
1731func (c *deviceConfig) BoardUsesRecoveryAsBoot() bool {
1732 return Bool(c.config.productVariables.BoardUsesRecoveryAsBoot)
1733}
Yifan Hong97365ee2020-07-29 09:51:57 -07001734
1735func (c *deviceConfig) BoardKernelBinaries() []string {
1736 return c.config.productVariables.BoardKernelBinaries
1737}
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001738
Yifan Hong42bef8d2020-08-05 14:36:09 -07001739func (c *deviceConfig) BoardKernelModuleInterfaceVersions() []string {
1740 return c.config.productVariables.BoardKernelModuleInterfaceVersions
1741}
1742
Yifan Hongdd8dacc2020-10-21 15:40:17 -07001743func (c *deviceConfig) BoardMoveRecoveryResourcesToVendorBoot() bool {
1744 return Bool(c.config.productVariables.BoardMoveRecoveryResourcesToVendorBoot)
1745}
1746
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001747func (c *deviceConfig) PlatformSepolicyVersion() string {
1748 return String(c.config.productVariables.PlatformSepolicyVersion)
1749}
1750
Inseob Kima10ef272021-09-15 03:04:53 +00001751func (c *deviceConfig) TotSepolicyVersion() string {
1752 return String(c.config.productVariables.TotSepolicyVersion)
1753}
1754
Inseob Kim843f6642022-01-07 09:11:23 +09001755func (c *deviceConfig) PlatformSepolicyCompatVersions() []string {
1756 return c.config.productVariables.PlatformSepolicyCompatVersions
1757}
1758
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001759func (c *deviceConfig) BoardSepolicyVers() string {
Inseob Kim0c4eec82021-03-22 22:33:40 +09001760 if ver := String(c.config.productVariables.BoardSepolicyVers); ver != "" {
1761 return ver
1762 }
1763 return c.PlatformSepolicyVersion()
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001764}
1765
Inseob Kim14178802021-12-08 22:53:31 +09001766func (c *deviceConfig) BoardPlatVendorPolicy() []string {
1767 return c.config.productVariables.BoardPlatVendorPolicy
1768}
1769
Inseob Kim16ebd5a2020-12-09 23:08:17 +09001770func (c *deviceConfig) BoardReqdMaskPolicy() []string {
1771 return c.config.productVariables.BoardReqdMaskPolicy
1772}
1773
Inseob Kim0f46e7c2021-12-15 22:48:14 +09001774func (c *deviceConfig) BoardSystemExtPublicPrebuiltDirs() []string {
1775 return c.config.productVariables.BoardSystemExtPublicPrebuiltDirs
1776}
1777
1778func (c *deviceConfig) BoardSystemExtPrivatePrebuiltDirs() []string {
1779 return c.config.productVariables.BoardSystemExtPrivatePrebuiltDirs
1780}
1781
1782func (c *deviceConfig) BoardProductPublicPrebuiltDirs() []string {
1783 return c.config.productVariables.BoardProductPublicPrebuiltDirs
1784}
1785
1786func (c *deviceConfig) BoardProductPrivatePrebuiltDirs() []string {
1787 return c.config.productVariables.BoardProductPrivatePrebuiltDirs
1788}
1789
Inseob Kim1a0afcc2022-02-14 23:10:51 +09001790func (c *deviceConfig) SystemExtSepolicyPrebuiltApiDir() string {
1791 return String(c.config.productVariables.SystemExtSepolicyPrebuiltApiDir)
1792}
1793
1794func (c *deviceConfig) ProductSepolicyPrebuiltApiDir() string {
1795 return String(c.config.productVariables.ProductSepolicyPrebuiltApiDir)
1796}
1797
1798func (c *deviceConfig) IsPartnerTrebleSepolicyTestEnabled() bool {
1799 return c.SystemExtSepolicyPrebuiltApiDir() != "" || c.ProductSepolicyPrebuiltApiDir() != ""
1800}
1801
Inseob Kim7cf14652021-01-06 23:06:52 +09001802func (c *deviceConfig) DirectedVendorSnapshot() bool {
1803 return c.config.productVariables.DirectedVendorSnapshot
1804}
1805
1806func (c *deviceConfig) VendorSnapshotModules() map[string]bool {
1807 return c.config.productVariables.VendorSnapshotModules
1808}
1809
Jose Galmes4c6895e2021-02-09 07:44:30 -08001810func (c *deviceConfig) DirectedRecoverySnapshot() bool {
1811 return c.config.productVariables.DirectedRecoverySnapshot
1812}
1813
1814func (c *deviceConfig) RecoverySnapshotModules() map[string]bool {
1815 return c.config.productVariables.RecoverySnapshotModules
1816}
1817
Justin DeMartino383bfb32021-02-24 10:49:43 -08001818func createDirsMap(previous map[string]bool, dirs []string) (map[string]bool, error) {
1819 var ret = make(map[string]bool)
1820 for _, dir := range dirs {
1821 clean := filepath.Clean(dir)
1822 if previous[clean] || ret[clean] {
1823 return nil, fmt.Errorf("Duplicate entry %s", dir)
1824 }
1825 ret[clean] = true
1826 }
1827 return ret, nil
1828}
1829
1830func (c *deviceConfig) createDirsMapOnce(onceKey OnceKey, previous map[string]bool, dirs []string) map[string]bool {
1831 dirMap := c.Once(onceKey, func() interface{} {
1832 ret, err := createDirsMap(previous, dirs)
1833 if err != nil {
1834 panic(fmt.Errorf("%s: %w", onceKey.key, err))
1835 }
1836 return ret
1837 })
1838 if dirMap == nil {
1839 return nil
1840 }
1841 return dirMap.(map[string]bool)
1842}
1843
1844var vendorSnapshotDirsExcludedKey = NewOnceKey("VendorSnapshotDirsExcludedMap")
1845
1846func (c *deviceConfig) VendorSnapshotDirsExcludedMap() map[string]bool {
1847 return c.createDirsMapOnce(vendorSnapshotDirsExcludedKey, nil,
1848 c.config.productVariables.VendorSnapshotDirsExcluded)
1849}
1850
1851var vendorSnapshotDirsIncludedKey = NewOnceKey("VendorSnapshotDirsIncludedMap")
1852
1853func (c *deviceConfig) VendorSnapshotDirsIncludedMap() map[string]bool {
1854 excludedMap := c.VendorSnapshotDirsExcludedMap()
1855 return c.createDirsMapOnce(vendorSnapshotDirsIncludedKey, excludedMap,
1856 c.config.productVariables.VendorSnapshotDirsIncluded)
1857}
1858
1859var recoverySnapshotDirsExcludedKey = NewOnceKey("RecoverySnapshotDirsExcludedMap")
1860
1861func (c *deviceConfig) RecoverySnapshotDirsExcludedMap() map[string]bool {
1862 return c.createDirsMapOnce(recoverySnapshotDirsExcludedKey, nil,
1863 c.config.productVariables.RecoverySnapshotDirsExcluded)
1864}
1865
1866var recoverySnapshotDirsIncludedKey = NewOnceKey("RecoverySnapshotDirsIncludedMap")
1867
1868func (c *deviceConfig) RecoverySnapshotDirsIncludedMap() map[string]bool {
1869 excludedMap := c.RecoverySnapshotDirsExcludedMap()
1870 return c.createDirsMapOnce(recoverySnapshotDirsIncludedKey, excludedMap,
1871 c.config.productVariables.RecoverySnapshotDirsIncluded)
1872}
1873
Rob Seymour925aa092021-08-10 20:42:03 +00001874func (c *deviceConfig) HostFakeSnapshotEnabled() bool {
1875 return c.config.productVariables.HostFakeSnapshotEnabled
1876}
1877
Inseob Kim60c32f02020-12-21 22:53:05 +09001878func (c *deviceConfig) ShippingApiLevel() ApiLevel {
1879 if c.config.productVariables.ShippingApiLevel == nil {
1880 return NoneApiLevel
1881 }
1882 apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel)
1883 return uncheckedFinalApiLevel(apiLevel)
1884}
1885
Liz Kammerdfe4a9e2023-05-18 11:54:46 +00001886func (c *deviceConfig) BuildBrokenPluginValidation() []string {
1887 return c.config.productVariables.BuildBrokenPluginValidation
1888}
1889
Alix Espinoef47e542022-09-14 19:10:51 +00001890func (c *deviceConfig) BuildBrokenClangAsFlags() bool {
1891 return c.config.productVariables.BuildBrokenClangAsFlags
1892}
1893
1894func (c *deviceConfig) BuildBrokenClangCFlags() bool {
1895 return c.config.productVariables.BuildBrokenClangCFlags
1896}
1897
Alixb5f6d9e2022-04-20 23:00:58 +00001898func (c *deviceConfig) BuildBrokenClangProperty() bool {
1899 return c.config.productVariables.BuildBrokenClangProperty
1900}
1901
Inseob Kim67e5add192021-03-17 18:05:33 +09001902func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool {
1903 return c.config.productVariables.BuildBrokenEnforceSyspropOwner
1904}
1905
1906func (c *deviceConfig) BuildBrokenTrebleSyspropNeverallow() bool {
1907 return c.config.productVariables.BuildBrokenTrebleSyspropNeverallow
1908}
1909
Cole Faustedc4c502022-09-09 19:39:25 -07001910func (c *deviceConfig) BuildBrokenUsesSoongPython2Modules() bool {
1911 return c.config.productVariables.BuildBrokenUsesSoongPython2Modules
1912}
1913
Hridya Valsaraju5a5c7d52021-04-02 16:45:24 -07001914func (c *deviceConfig) BuildDebugfsRestrictionsEnabled() bool {
1915 return c.config.productVariables.BuildDebugfsRestrictionsEnabled
1916}
1917
Inseob Kim0cac7b42021-02-03 18:16:46 +09001918func (c *deviceConfig) BuildBrokenVendorPropertyNamespace() bool {
1919 return c.config.productVariables.BuildBrokenVendorPropertyNamespace
1920}
1921
Liz Kammer619be462022-01-28 15:13:39 -05001922func (c *deviceConfig) BuildBrokenInputDir(name string) bool {
1923 return InList(name, c.config.productVariables.BuildBrokenInputDirModules)
1924}
1925
Vinh Tran140d5882022-06-10 14:23:27 -04001926func (c *deviceConfig) BuildBrokenDepfile() bool {
1927 return Bool(c.config.productVariables.BuildBrokenDepfile)
1928}
1929
Inseob Kim67e5add192021-03-17 18:05:33 +09001930func (c *deviceConfig) RequiresInsecureExecmemForSwiftshader() bool {
1931 return c.config.productVariables.RequiresInsecureExecmemForSwiftshader
1932}
1933
1934func (c *config) SelinuxIgnoreNeverallows() bool {
1935 return c.productVariables.SelinuxIgnoreNeverallows
1936}
1937
1938func (c *deviceConfig) SepolicySplit() bool {
1939 return c.config.productVariables.SepolicySplit
1940}
1941
Inseob Kima10ef272021-09-15 03:04:53 +00001942func (c *deviceConfig) SepolicyFreezeTestExtraDirs() []string {
1943 return c.config.productVariables.SepolicyFreezeTestExtraDirs
1944}
1945
1946func (c *deviceConfig) SepolicyFreezeTestExtraPrebuiltDirs() []string {
1947 return c.config.productVariables.SepolicyFreezeTestExtraPrebuiltDirs
1948}
1949
Jiyong Parkd163d4d2021-10-12 16:47:43 +09001950func (c *deviceConfig) GenerateAidlNdkPlatformBackend() bool {
1951 return c.config.productVariables.GenerateAidlNdkPlatformBackend
1952}
1953
Christopher Ferris98f10222022-07-13 23:16:52 -07001954func (c *config) IgnorePrefer32OnDevice() bool {
1955 return c.productVariables.IgnorePrefer32OnDevice
1956}
1957
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001958func (c *config) BootJars() []string {
1959 return c.Once(earlyBootJarsKey, func() interface{} {
Paul Duffin69d1fb12020-10-23 21:14:20 +01001960 list := c.productVariables.BootJars.CopyOfJars()
satayevd604b212021-07-21 14:23:52 +01001961 return append(list, c.productVariables.ApexBootJars.CopyOfJars()...)
Ulya Trafimovich249386a2020-07-01 14:31:13 +01001962 }).([]string)
1963}
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001964
satayevd604b212021-07-21 14:23:52 +01001965func (c *config) NonApexBootJars() ConfiguredJarList {
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001966 return c.productVariables.BootJars
1967}
1968
satayevd604b212021-07-21 14:23:52 +01001969func (c *config) ApexBootJars() ConfiguredJarList {
1970 return c.productVariables.ApexBootJars
Paul Duffin9a89a2a2020-10-28 19:20:06 +00001971}
Colin Cross77cdcfd2021-03-12 11:28:25 -08001972
1973func (c *config) RBEWrapper() string {
1974 return c.GetenvWithDefault("RBE_WRAPPER", remoteexec.DefaultWrapperPath)
1975}
Colin Cross9b698b62021-12-22 09:55:32 -08001976
1977// UseHostMusl returns true if the host target has been configured to build against musl libc.
1978func (c *config) UseHostMusl() bool {
1979 return Bool(c.productVariables.HostMusl)
1980}
MarkDacekff851b82022-04-21 18:33:17 +00001981
MarkDacekf47e1422023-04-19 16:47:36 +00001982func (c *config) GetMixedBuildsEnabledModules() map[string]struct{} {
1983 return c.mixedBuildEnabledModules
1984}
1985
MarkDacek6f6b9622023-05-02 16:28:55 +00001986func (c *config) GetMixedBuildsDisabledModules() map[string]struct{} {
1987 return c.mixedBuildDisabledModules
1988}
1989
Chris Parsonsf874e462022-05-10 13:50:12 -04001990func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
MarkDacekff851b82022-04-21 18:33:17 +00001991 moduleName := ctx.Module().Name()
1992 c.mixedBuildsLock.Lock()
1993 defer c.mixedBuildsLock.Unlock()
1994 if useBazel {
1995 c.mixedBuildEnabledModules[moduleName] = struct{}{}
1996 } else {
1997 c.mixedBuildDisabledModules[moduleName] = struct{}{}
1998 }
1999}
Spandan Das9e93d3d2023-03-08 05:47:29 +00002000
2001// ApiSurfaces directory returns the source path inside the api_surfaces repo
2002// (relative to workspace root).
2003func (c *config) ApiSurfacesDir(s ApiSurface, version string) string {
2004 return filepath.Join(
2005 "build",
2006 "bazel",
2007 "api_surfaces",
2008 s.String(),
2009 version)
2010}
Jihoon Kang1bff0342023-01-17 20:40:22 +00002011
2012func (c *config) BuildFromTextStub() bool {
2013 return c.buildFromTextStub
2014}
Spandan Das4deab282023-03-30 17:06:32 +00002015
2016func (c *config) SetBuildFromTextStub(b bool) {
2017 c.buildFromTextStub = b
2018}
Jihoon Kang480943f2023-05-19 06:02:08 +00002019
MarkDacek9c094ca2023-03-16 19:15:19 +00002020func (c *config) AddForceEnabledModules(forceEnabled []string) {
2021 for _, forceEnabledModule := range forceEnabled {
2022 c.bazelForceEnabledModules[forceEnabledModule] = struct{}{}
2023 }
2024}
Jihoon Kang480943f2023-05-19 06:02:08 +00002025
2026func (c *config) SetApiLibraries(libs []string) {
2027 c.apiLibraries = make(map[string]struct{})
2028 for _, lib := range libs {
2029 c.apiLibraries[lib] = struct{}{}
2030 }
2031}
2032
2033func (c *config) GetApiLibraries() map[string]struct{} {
2034 return c.apiLibraries
2035}