blob: 1c8be0f056e00473d3b9c5b372ddfdd5d627e783 [file] [log] [blame]
Colin Cross1f7f3bd2016-07-27 10:12:38 -07001// Copyright (C) 2016 The Android Open Source Project
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
15package art
16
17import (
Colin Cross1f7f3bd2016-07-27 10:12:38 -070018 "android/soong/android"
19 "android/soong/cc"
20 "fmt"
Colin Cross6e95dd52016-09-12 15:37:10 -070021 "sync"
Colin Cross84b69332017-11-01 14:23:17 -070022
23 "github.com/google/blueprint/proptools"
Colin Cross1f7f3bd2016-07-27 10:12:38 -070024)
25
26var supportedArches = []string{"arm", "arm64", "mips", "mips64", "x86", "x86_64"}
27
28func globalFlags(ctx android.BaseContext) ([]string, []string) {
29 var cflags []string
30 var asflags []string
31
Colin Crossbe332ed2016-09-21 13:23:53 -070032 opt := envDefault(ctx, "ART_NDEBUG_OPT_FLAG", "-O3")
33 cflags = append(cflags, opt)
34
Colin Cross1f7f3bd2016-07-27 10:12:38 -070035 tlab := false
36
37 gcType := envDefault(ctx, "ART_DEFAULT_GC_TYPE", "CMS")
38
39 if envTrue(ctx, "ART_TEST_DEBUG_GC") {
40 gcType = "SS"
41 tlab = true
42 }
43
44 cflags = append(cflags, "-DART_DEFAULT_GC_TYPE_IS_"+gcType)
45 if tlab {
46 cflags = append(cflags, "-DART_USE_TLAB=1")
47 }
48
49 imtSize := envDefault(ctx, "ART_IMT_SIZE", "43")
50 cflags = append(cflags, "-DIMT_SIZE="+imtSize)
51
52 if envTrue(ctx, "ART_HEAP_POISONING") {
53 cflags = append(cflags, "-DART_HEAP_POISONING=1")
54 asflags = append(asflags, "-DART_HEAP_POISONING=1")
55 }
David Srbecky8ed45c82018-11-08 15:08:57 +000056 if envTrue(ctx, "ART_USE_CXX_INTERPRETER") {
57 cflags = append(cflags, "-DART_USE_CXX_INTERPRETER=1")
58 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -070059
Hiroshi Yamauchida75ad72017-01-24 11:06:47 -080060 if !envFalse(ctx, "ART_USE_READ_BARRIER") && ctx.AConfig().ArtUseReadBarrier() {
Roland Levillainb81e9e92017-04-20 17:35:32 +010061 // Used to change the read barrier type. Valid values are BAKER, BROOKS,
62 // TABLELOOKUP. The default is BAKER.
Colin Cross1f7f3bd2016-07-27 10:12:38 -070063 barrierType := envDefault(ctx, "ART_READ_BARRIER_TYPE", "BAKER")
64 cflags = append(cflags,
65 "-DART_USE_READ_BARRIER=1",
66 "-DART_READ_BARRIER_TYPE_IS_"+barrierType+"=1")
67 asflags = append(asflags,
68 "-DART_USE_READ_BARRIER=1",
69 "-DART_READ_BARRIER_TYPE_IS_"+barrierType+"=1")
Colin Cross1f7f3bd2016-07-27 10:12:38 -070070 }
71
Roland Levillain95fb31e2018-08-29 13:08:11 +010072 if !envFalse(ctx, "ART_USE_GENERATIONAL_CC") {
Mathieu Chartier8d1a9962016-08-17 16:39:45 -070073 cflags = append(cflags, "-DART_USE_GENERATIONAL_CC=1")
74 }
75
76 cdexLevel := envDefault(ctx, "ART_DEFAULT_COMPACT_DEX_LEVEL", "fast")
77 cflags = append(cflags, "-DART_DEFAULT_COMPACT_DEX_LEVEL="+cdexLevel)
Mathieu Chartiera7f6b812017-12-11 13:34:29 -080078
Andreas Gampe655c6fd2017-05-24 21:42:10 -070079 // We need larger stack overflow guards for ASAN, as the compiled code will have
80 // larger frame sizes. For simplicity, just use global not-target-specific cflags.
81 // Note: We increase this for both debug and non-debug, as the overflow gap will
82 // be compiled into managed code. We always preopt (and build core images) with
83 // the debug version. So make the gap consistent (and adjust for the worst).
84 if len(ctx.AConfig().SanitizeDevice()) > 0 || len(ctx.AConfig().SanitizeHost()) > 0 {
85 cflags = append(cflags,
Colin Cross2db58b62017-06-27 10:38:31 -070086 "-DART_STACK_OVERFLOW_GAP_arm=8192",
87 "-DART_STACK_OVERFLOW_GAP_arm64=8192",
88 "-DART_STACK_OVERFLOW_GAP_mips=16384",
89 "-DART_STACK_OVERFLOW_GAP_mips64=16384",
90 "-DART_STACK_OVERFLOW_GAP_x86=16384",
91 "-DART_STACK_OVERFLOW_GAP_x86_64=20480")
Andreas Gampe655c6fd2017-05-24 21:42:10 -070092 } else {
93 cflags = append(cflags,
Colin Cross2db58b62017-06-27 10:38:31 -070094 "-DART_STACK_OVERFLOW_GAP_arm=8192",
95 "-DART_STACK_OVERFLOW_GAP_arm64=8192",
96 "-DART_STACK_OVERFLOW_GAP_mips=16384",
97 "-DART_STACK_OVERFLOW_GAP_mips64=16384",
98 "-DART_STACK_OVERFLOW_GAP_x86=8192",
99 "-DART_STACK_OVERFLOW_GAP_x86_64=8192")
Andreas Gampe655c6fd2017-05-24 21:42:10 -0700100 }
Andreas Gampebc9f10c2017-05-19 08:28:06 -0700101
Andreas Gampedbf0e0f2017-07-11 08:34:48 -0700102 if envTrue(ctx, "ART_ENABLE_ADDRESS_SANITIZER") {
103 // Used to enable full sanitization, i.e., user poisoning, under ASAN.
104 cflags = append(cflags, "-DART_ENABLE_ADDRESS_SANITIZER=1")
105 asflags = append(asflags, "-DART_ENABLE_ADDRESS_SANITIZER=1")
106 }
107
Chris Larsen715f43e2017-10-23 11:00:32 -0700108 if envTrue(ctx, "ART_MIPS32_CHECK_ALIGNMENT") {
109 // Enable the use of MIPS32 CHECK_ALIGNMENT macro for debugging purposes
110 asflags = append(asflags, "-DART_MIPS32_CHECK_ALIGNMENT")
111 }
112
Alan Leung50173eb2017-12-20 13:33:21 -0800113 if envTrueOrDefault(ctx, "USE_D8_DESUGAR") {
Alan Leung8f514ee2017-12-08 14:08:25 -0800114 cflags = append(cflags, "-DUSE_D8_DESUGAR=1")
115 }
116
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700117 return cflags, asflags
118}
119
Colin Crossbe332ed2016-09-21 13:23:53 -0700120func debugFlags(ctx android.BaseContext) []string {
121 var cflags []string
122
123 opt := envDefault(ctx, "ART_DEBUG_OPT_FLAG", "-O2")
124 cflags = append(cflags, opt)
125
126 return cflags
127}
128
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700129func deviceFlags(ctx android.BaseContext) []string {
130 var cflags []string
131 deviceFrameSizeLimit := 1736
132 if len(ctx.AConfig().SanitizeDevice()) > 0 {
Vishwath Mohan1ecc4fe2016-09-26 09:22:42 -0700133 deviceFrameSizeLimit = 7400
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700134 }
135 cflags = append(cflags,
136 fmt.Sprintf("-Wframe-larger-than=%d", deviceFrameSizeLimit),
137 fmt.Sprintf("-DART_FRAME_SIZE_LIMIT=%d", deviceFrameSizeLimit),
138 )
139
140 cflags = append(cflags, "-DART_BASE_ADDRESS="+ctx.AConfig().LibartImgDeviceBaseAddress())
141 if envTrue(ctx, "ART_TARGET_LINUX") {
142 cflags = append(cflags, "-DART_TARGET_LINUX")
143 } else {
144 cflags = append(cflags, "-DART_TARGET_ANDROID")
145 }
146 minDelta := envDefault(ctx, "LIBART_IMG_TARGET_MIN_BASE_ADDRESS_DELTA", "-0x1000000")
147 maxDelta := envDefault(ctx, "LIBART_IMG_TARGET_MAX_BASE_ADDRESS_DELTA", "0x1000000")
148 cflags = append(cflags, "-DART_BASE_ADDRESS_MIN_DELTA="+minDelta)
149 cflags = append(cflags, "-DART_BASE_ADDRESS_MAX_DELTA="+maxDelta)
150
151 return cflags
152}
153
154func hostFlags(ctx android.BaseContext) []string {
155 var cflags []string
156 hostFrameSizeLimit := 1736
Colin Cross3174b682016-09-19 12:25:31 -0700157 if len(ctx.AConfig().SanitizeHost()) > 0 {
158 // art/test/137-cfi/cfi.cc
159 // error: stack frame size of 1944 bytes in function 'Java_Main_unwindInProcess'
David Srbecky9cc67b12018-10-25 10:10:35 +0000160 hostFrameSizeLimit = 6400
Colin Cross3174b682016-09-19 12:25:31 -0700161 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700162 cflags = append(cflags,
163 fmt.Sprintf("-Wframe-larger-than=%d", hostFrameSizeLimit),
164 fmt.Sprintf("-DART_FRAME_SIZE_LIMIT=%d", hostFrameSizeLimit),
165 )
166
167 cflags = append(cflags, "-DART_BASE_ADDRESS="+ctx.AConfig().LibartImgHostBaseAddress())
168 minDelta := envDefault(ctx, "LIBART_IMG_HOST_MIN_BASE_ADDRESS_DELTA", "-0x1000000")
169 maxDelta := envDefault(ctx, "LIBART_IMG_HOST_MAX_BASE_ADDRESS_DELTA", "0x1000000")
170 cflags = append(cflags, "-DART_BASE_ADDRESS_MIN_DELTA="+minDelta)
171 cflags = append(cflags, "-DART_BASE_ADDRESS_MAX_DELTA="+maxDelta)
172
Andreas Gampefcc7d672017-07-19 10:30:22 -0700173 if len(ctx.AConfig().SanitizeHost()) > 0 && !envFalse(ctx, "ART_ENABLE_ADDRESS_SANITIZER") {
174 // We enable full sanitization on the host by default.
175 cflags = append(cflags, "-DART_ENABLE_ADDRESS_SANITIZER=1")
176 }
177
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700178 return cflags
179}
180
Colin Cross6e511782016-09-13 13:41:03 -0700181func globalDefaults(ctx android.LoadHookContext) {
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700182 type props struct {
183 Target struct {
184 Android struct {
185 Cflags []string
186 }
187 Host struct {
188 Cflags []string
189 }
190 }
Colin Cross2db58b62017-06-27 10:38:31 -0700191 Cflags []string
192 Asflags []string
Bharadwaj Kalandhabhatta0bb40312017-06-01 10:47:00 -0700193 Sanitize struct {
Colin Cross2db58b62017-06-27 10:38:31 -0700194 Recover []string
Bharadwaj Kalandhabhatta0bb40312017-06-01 10:47:00 -0700195 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700196 }
197
198 p := &props{}
199 p.Cflags, p.Asflags = globalFlags(ctx)
200 p.Target.Android.Cflags = deviceFlags(ctx)
201 p.Target.Host.Cflags = hostFlags(ctx)
Bharadwaj Kalandhabhatta0bb40312017-06-01 10:47:00 -0700202
203 if envTrue(ctx, "ART_DEX_FILE_ACCESS_TRACKING") {
204 p.Cflags = append(p.Cflags, "-DART_DEX_FILE_ACCESS_TRACKING")
Colin Cross2db58b62017-06-27 10:38:31 -0700205 p.Sanitize.Recover = []string{
Bharadwaj Kalandhabhatta0bb40312017-06-01 10:47:00 -0700206 "address",
207 }
208 }
209
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700210 ctx.AppendProperties(p)
Colin Crossfe6064a2016-08-30 13:49:26 -0700211}
Colin Cross6326d1b2016-09-06 10:24:28 -0700212
Colin Crossbe332ed2016-09-21 13:23:53 -0700213func debugDefaults(ctx android.LoadHookContext) {
214 type props struct {
215 Cflags []string
216 }
217
218 p := &props{}
219 p.Cflags = debugFlags(ctx)
220 ctx.AppendProperties(p)
221}
222
Colin Cross6e511782016-09-13 13:41:03 -0700223func customLinker(ctx android.LoadHookContext) {
Colin Crossfe6064a2016-08-30 13:49:26 -0700224 linker := envDefault(ctx, "CUSTOM_TARGET_LINKER", "")
Colin Cross84b69332017-11-01 14:23:17 -0700225 type props struct {
226 DynamicLinker string
Colin Crossfe6064a2016-08-30 13:49:26 -0700227 }
Colin Cross84b69332017-11-01 14:23:17 -0700228
229 p := &props{}
230 if linker != "" {
231 p.DynamicLinker = linker
232 }
233
234 ctx.AppendProperties(p)
Colin Crossfe6064a2016-08-30 13:49:26 -0700235}
236
Colin Cross6e511782016-09-13 13:41:03 -0700237func prefer32Bit(ctx android.LoadHookContext) {
Colin Cross84b69332017-11-01 14:23:17 -0700238 type props struct {
239 Target struct {
240 Host struct {
241 Compile_multilib *string
Colin Cross6326d1b2016-09-06 10:24:28 -0700242 }
243 }
Colin Cross6326d1b2016-09-06 10:24:28 -0700244 }
Colin Cross84b69332017-11-01 14:23:17 -0700245
246 p := &props{}
247 if envTrue(ctx, "HOST_PREFER_32_BIT") {
248 p.Target.Host.Compile_multilib = proptools.StringPtr("prefer32")
249 }
250
251 ctx.AppendProperties(p)
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700252}
253
Colin Cross6e95dd52016-09-12 15:37:10 -0700254func testMap(config android.Config) map[string][]string {
255 return config.Once("artTests", func() interface{} {
256 return make(map[string][]string)
257 }).(map[string][]string)
258}
259
260func testInstall(ctx android.InstallHookContext) {
261 testMap := testMap(ctx.AConfig())
262
263 var name string
264 if ctx.Host() {
265 name = "host_"
266 } else {
267 name = "device_"
268 }
269 name += ctx.Arch().ArchType.String() + "_" + ctx.ModuleName()
270
271 artTestMutex.Lock()
272 defer artTestMutex.Unlock()
273
274 tests := testMap[name]
275 tests = append(tests, ctx.Path().RelPathString())
276 testMap[name] = tests
277}
278
279var artTestMutex sync.Mutex
280
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700281func init() {
Colin Cross96548c92016-10-12 14:26:55 -0700282 android.RegisterModuleType("art_cc_library", artLibrary)
Vladimir Marko74527972016-11-29 15:57:32 +0000283 android.RegisterModuleType("art_cc_static_library", artStaticLibrary)
Colin Cross96548c92016-10-12 14:26:55 -0700284 android.RegisterModuleType("art_cc_binary", artBinary)
285 android.RegisterModuleType("art_cc_test", artTest)
286 android.RegisterModuleType("art_cc_test_library", artTestLibrary)
287 android.RegisterModuleType("art_cc_defaults", artDefaultsFactory)
Nicolas Geoffray8a229072018-05-10 16:34:14 +0100288 android.RegisterModuleType("libart_cc_defaults", libartDefaultsFactory)
Andreas Gampeec5ed062018-01-26 16:20:02 -0800289 android.RegisterModuleType("libart_static_cc_defaults", libartStaticDefaultsFactory)
Colin Cross96548c92016-10-12 14:26:55 -0700290 android.RegisterModuleType("art_global_defaults", artGlobalDefaultsFactory)
291 android.RegisterModuleType("art_debug_defaults", artDebugDefaultsFactory)
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700292}
293
Colin Crossca06ea32017-06-27 10:38:55 -0700294func artGlobalDefaultsFactory() android.Module {
295 module := artDefaultsFactory()
Colin Cross6e511782016-09-13 13:41:03 -0700296 android.AddLoadHook(module, globalDefaults)
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700297
Colin Crossca06ea32017-06-27 10:38:55 -0700298 return module
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700299}
300
Colin Crossca06ea32017-06-27 10:38:55 -0700301func artDebugDefaultsFactory() android.Module {
302 module := artDefaultsFactory()
Colin Crossbe332ed2016-09-21 13:23:53 -0700303 android.AddLoadHook(module, debugDefaults)
304
Colin Crossca06ea32017-06-27 10:38:55 -0700305 return module
Colin Crossbe332ed2016-09-21 13:23:53 -0700306}
307
Colin Crossca06ea32017-06-27 10:38:55 -0700308func artDefaultsFactory() android.Module {
Colin Cross6e511782016-09-13 13:41:03 -0700309 c := &codegenProperties{}
Colin Crossca06ea32017-06-27 10:38:55 -0700310 module := cc.DefaultsFactory(c)
Colin Cross6e95dd52016-09-12 15:37:10 -0700311 android.AddLoadHook(module, func(ctx android.LoadHookContext) { codegen(ctx, c, true) })
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700312
Colin Crossca06ea32017-06-27 10:38:55 -0700313 return module
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700314}
315
Nicolas Geoffray8a229072018-05-10 16:34:14 +0100316func libartDefaultsFactory() android.Module {
317 c := &codegenProperties{}
318 module := cc.DefaultsFactory(c)
319 android.AddLoadHook(module, func(ctx android.LoadHookContext) {
320 codegen(ctx, c, true)
321
322 type props struct {
Mathieu Chartier8d1a9962016-08-17 16:39:45 -0700323 Target struct {
324 Android struct {
325 Shared_libs []string
326 }
327 }
Nicolas Geoffray8a229072018-05-10 16:34:14 +0100328 }
329
330 p := &props{}
331 // TODO: express this in .bp instead b/79671158
332 if !envTrue(ctx, "ART_TARGET_LINUX") {
Mathieu Chartier8d1a9962016-08-17 16:39:45 -0700333 p.Target.Android.Shared_libs = []string{
334 "libmetricslogger",
335 }
Nicolas Geoffray8a229072018-05-10 16:34:14 +0100336 }
337 ctx.AppendProperties(p)
338 })
339
340 return module
341}
342
Andreas Gampeec5ed062018-01-26 16:20:02 -0800343func libartStaticDefaultsFactory() android.Module {
344 c := &codegenProperties{}
345 module := cc.DefaultsFactory(c)
346 android.AddLoadHook(module, func(ctx android.LoadHookContext) {
347 codegen(ctx, c, true)
348
349 type props struct {
350 Target struct {
351 Android struct {
352 Static_libs []string
353 }
354 }
355 }
356
357 p := &props{}
358 // TODO: express this in .bp instead b/79671158
359 if !envTrue(ctx, "ART_TARGET_LINUX") {
360 p.Target.Android.Static_libs = []string{
Howard Ro5c8d4762018-10-23 00:42:09 +0000361 "libmetricslogger",
362 "libstatssocket",
Andreas Gampeec5ed062018-01-26 16:20:02 -0800363 }
364 }
365 ctx.AppendProperties(p)
366 })
367
368 return module
369}
370
Colin Crossca06ea32017-06-27 10:38:55 -0700371func artLibrary() android.Module {
Vladimir Marko74527972016-11-29 15:57:32 +0000372 m, _ := cc.NewLibrary(android.HostAndDeviceSupported)
373 module := m.Init()
374
375 installCodegenCustomizer(module, true)
376
377 return module
378}
379
380func artStaticLibrary() android.Module {
381 m, library := cc.NewLibrary(android.HostAndDeviceSupported)
382 library.BuildOnlyStatic()
383 module := m.Init()
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700384
Colin Crossca06ea32017-06-27 10:38:55 -0700385 installCodegenCustomizer(module, true)
Colin Crossfe6064a2016-08-30 13:49:26 -0700386
Colin Crossca06ea32017-06-27 10:38:55 -0700387 return module
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700388}
389
Colin Crossca06ea32017-06-27 10:38:55 -0700390func artBinary() android.Module {
Colin Cross123989f2016-09-07 14:12:50 -0700391 binary, _ := cc.NewBinary(android.HostAndDeviceSupported)
Colin Crossca06ea32017-06-27 10:38:55 -0700392 module := binary.Init()
Colin Cross123989f2016-09-07 14:12:50 -0700393
Colin Cross6e511782016-09-13 13:41:03 -0700394 android.AddLoadHook(module, customLinker)
395 android.AddLoadHook(module, prefer32Bit)
Colin Crossca06ea32017-06-27 10:38:55 -0700396 return module
Colin Cross123989f2016-09-07 14:12:50 -0700397}
398
Colin Crossca06ea32017-06-27 10:38:55 -0700399func artTest() android.Module {
Colin Crossc7376e02016-09-08 12:52:18 -0700400 test := cc.NewTest(android.HostAndDeviceSupported)
Colin Crossca06ea32017-06-27 10:38:55 -0700401 module := test.Init()
Colin Crossc7376e02016-09-08 12:52:18 -0700402
Colin Crossca06ea32017-06-27 10:38:55 -0700403 installCodegenCustomizer(module, false)
Colin Cross6e95dd52016-09-12 15:37:10 -0700404
Colin Cross6e511782016-09-13 13:41:03 -0700405 android.AddLoadHook(module, customLinker)
406 android.AddLoadHook(module, prefer32Bit)
Colin Cross6e95dd52016-09-12 15:37:10 -0700407 android.AddInstallHook(module, testInstall)
Colin Crossca06ea32017-06-27 10:38:55 -0700408 return module
Colin Crossc7376e02016-09-08 12:52:18 -0700409}
410
Colin Crossca06ea32017-06-27 10:38:55 -0700411func artTestLibrary() android.Module {
Colin Crossafd3c9e2016-09-16 13:47:21 -0700412 test := cc.NewTestLibrary(android.HostAndDeviceSupported)
Colin Crossca06ea32017-06-27 10:38:55 -0700413 module := test.Init()
Colin Crossafd3c9e2016-09-16 13:47:21 -0700414
Colin Crossca06ea32017-06-27 10:38:55 -0700415 installCodegenCustomizer(module, false)
Colin Crossafd3c9e2016-09-16 13:47:21 -0700416
417 android.AddLoadHook(module, prefer32Bit)
418 android.AddInstallHook(module, testInstall)
Colin Crossca06ea32017-06-27 10:38:55 -0700419 return module
Colin Crossafd3c9e2016-09-16 13:47:21 -0700420}
421
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700422func envDefault(ctx android.BaseContext, key string, defaultValue string) string {
423 ret := ctx.AConfig().Getenv(key)
424 if ret == "" {
425 return defaultValue
426 }
427 return ret
428}
429
430func envTrue(ctx android.BaseContext, key string) bool {
431 return ctx.AConfig().Getenv(key) == "true"
432}
David Brazdil7b49e6c2016-09-01 11:06:18 +0100433
434func envFalse(ctx android.BaseContext, key string) bool {
435 return ctx.AConfig().Getenv(key) == "false"
436}
Alan Leung50173eb2017-12-20 13:33:21 -0800437
438func envTrueOrDefault(ctx android.BaseContext, key string) bool {
439 return ctx.AConfig().Getenv(key) != "false"
440}