blob: f2f1af1d332b122850cd43e04dda7768abe08550 [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
17import (
Colin Cross6ff51382015-12-17 16:39:19 -080018 "fmt"
Alex Lightfb4353d2019-01-17 13:57:45 -080019 "path"
Colin Cross3f40fa42015-01-30 17:27:36 -080020 "path/filepath"
Colin Cross0875c522017-11-28 17:34:01 -080021 "sort"
Colin Cross6ff51382015-12-17 16:39:19 -080022 "strings"
Colin Crossaabf6792017-11-29 00:27:14 -080023 "text/scanner"
Colin Crossf6566ed2015-03-24 11:13:38 -070024
25 "github.com/google/blueprint"
Colin Cross7f19f372016-11-01 11:10:25 -070026 "github.com/google/blueprint/pathtools"
Colin Crossfe4bc362018-09-12 10:02:13 -070027 "github.com/google/blueprint/proptools"
Colin Cross3f40fa42015-01-30 17:27:36 -080028)
29
30var (
31 DeviceSharedLibrary = "shared_library"
32 DeviceStaticLibrary = "static_library"
33 DeviceExecutable = "executable"
34 HostSharedLibrary = "host_shared_library"
35 HostStaticLibrary = "host_static_library"
36 HostExecutable = "host_executable"
37)
38
Colin Crossae887032017-10-23 17:16:14 -070039type BuildParams struct {
Dan Willemsen9f3c5742016-11-03 14:28:31 -070040 Rule blueprint.Rule
Colin Cross33bfb0a2016-11-21 17:23:08 -080041 Deps blueprint.Deps
42 Depfile WritablePath
Colin Cross67a5c132017-05-09 13:45:28 -070043 Description string
Dan Willemsen9f3c5742016-11-03 14:28:31 -070044 Output WritablePath
45 Outputs WritablePaths
46 ImplicitOutput WritablePath
47 ImplicitOutputs WritablePaths
48 Input Path
49 Inputs Paths
50 Implicit Path
51 Implicits Paths
52 OrderOnly Paths
53 Default bool
54 Args map[string]string
Dan Willemsen34cc69e2015-09-23 15:26:20 -070055}
56
Colin Crossae887032017-10-23 17:16:14 -070057type ModuleBuildParams BuildParams
58
Colin Crossf6566ed2015-03-24 11:13:38 -070059type androidBaseContext interface {
Colin Crossa1ad8d12016-06-01 17:09:44 -070060 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -070061 TargetPrimary() bool
Colin Crossee0bc3b2018-10-02 22:01:37 -070062 MultiTargets() []Target
Colin Crossf6566ed2015-03-24 11:13:38 -070063 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -070064 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -070065 Host() bool
66 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -070067 Darwin() bool
Doug Horn21b94272019-01-16 12:06:11 -080068 Fuchsia() bool
Colin Cross3edeee12017-04-04 12:59:48 -070069 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -070070 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -070071 PrimaryArch() bool
Jiyong Park2db76922017-11-08 16:03:48 +090072 Platform() bool
73 DeviceSpecific() bool
74 SocSpecific() bool
75 ProductSpecific() bool
Dario Frenifd05a742018-05-29 13:28:54 +010076 ProductServicesSpecific() bool
Colin Cross1332b002015-04-07 17:11:30 -070077 AConfig() Config
Colin Cross9272ade2016-08-17 15:24:12 -070078 DeviceConfig() DeviceConfig
Colin Crossf6566ed2015-03-24 11:13:38 -070079}
80
Colin Cross635c3b02016-05-18 15:37:25 -070081type BaseContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -080082 BaseModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -070083 androidBaseContext
84}
85
Colin Crossaabf6792017-11-29 00:27:14 -080086// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
87// a Config instead of an interface{}.
88type BaseModuleContext interface {
89 ModuleName() string
90 ModuleDir() string
91 Config() Config
92
93 ContainsProperty(name string) bool
94 Errorf(pos scanner.Position, fmt string, args ...interface{})
95 ModuleErrorf(fmt string, args ...interface{})
96 PropertyErrorf(property, fmt string, args ...interface{})
97 Failed() bool
98
99 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
100 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
101 // builder whenever a file matching the pattern as added or removed, without rerunning if a
102 // file that does not match the pattern is added to a searched directory.
103 GlobWithDeps(pattern string, excludes []string) ([]string, error)
104
105 Fs() pathtools.FileSystem
106 AddNinjaFileDeps(deps ...string)
107}
108
Colin Cross635c3b02016-05-18 15:37:25 -0700109type ModuleContext interface {
Colin Crossf6566ed2015-03-24 11:13:38 -0700110 androidBaseContext
Colin Crossaabf6792017-11-29 00:27:14 -0800111 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800112
Colin Crossae887032017-10-23 17:16:14 -0700113 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800114 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700115
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700116 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800117 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800118 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Colin Crossfaeb7aa2017-02-01 14:12:44 -0800119 ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths
Colin Cross7f19f372016-11-01 11:10:25 -0700120 Glob(globPattern string, excludes []string) Paths
Nan Zhang581fd212018-01-10 16:06:12 -0800121 GlobFiles(globPattern string, excludes []string) Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700122
Colin Cross5c517922017-08-31 12:29:17 -0700123 InstallExecutable(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
124 InstallFile(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
Colin Cross3854a602016-01-11 12:49:11 -0800125 InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700126 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800127
128 AddMissingDependencies(deps []string)
Colin Cross8d8f8e22016-08-03 11:57:50 -0700129
Colin Cross8d8f8e22016-08-03 11:57:50 -0700130 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700131 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900132 InstallInRecovery() bool
Nan Zhang6d34b302017-02-04 17:47:46 -0800133
134 RequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700135
136 // android.ModuleContext methods
137 // These are duplicated instead of embedded so that can eventually be wrapped to take an
138 // android.Module instead of a blueprint.Module
139 OtherModuleName(m blueprint.Module) string
140 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
141 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
142
143 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
144 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
145
146 ModuleSubDir() string
147
Colin Cross35143d02017-11-16 00:11:20 -0800148 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700149 VisitDirectDeps(visit func(Module))
Colin Crossee6143c2017-12-30 17:54:27 -0800150 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700151 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -0700152 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Crossd11fcda2017-10-23 17:59:01 -0700153 VisitDepsDepthFirst(visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -0700154 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Crossd11fcda2017-10-23 17:59:01 -0700155 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
156 WalkDeps(visit func(Module, Module) bool)
Colin Cross3f68a132017-10-23 17:10:29 -0700157
Colin Cross0875c522017-11-28 17:34:01 -0800158 Variable(pctx PackageContext, name, value string)
159 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700160 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
161 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800162 Build(pctx PackageContext, params BuildParams)
Colin Cross3f68a132017-10-23 17:10:29 -0700163
Colin Cross0875c522017-11-28 17:34:01 -0800164 PrimaryModule() Module
165 FinalModule() Module
166 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700167
168 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800169 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800170}
171
Colin Cross635c3b02016-05-18 15:37:25 -0700172type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800173 blueprint.Module
174
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700175 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
176 // but GenerateAndroidBuildActions also has access to Android-specific information.
177 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700178 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700179
Colin Cross1e676be2016-10-12 14:38:15 -0700180 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800181
Colin Cross635c3b02016-05-18 15:37:25 -0700182 base() *ModuleBase
Dan Willemsen0effe062015-11-30 16:06:01 -0800183 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700184 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800185 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700186 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900187 InstallInRecovery() bool
Colin Crossa2f296f2016-11-29 15:16:18 -0800188 SkipInstall()
Jiyong Park374510b2018-03-19 18:23:01 +0900189 ExportedToMake() bool
Colin Cross36242852017-06-23 15:06:31 -0700190
191 AddProperties(props ...interface{})
192 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700193
Colin Crossae887032017-10-23 17:16:14 -0700194 BuildParamsForTests() []BuildParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800195 VariablesForTests() map[string]string
Colin Cross3f40fa42015-01-30 17:27:36 -0800196}
197
Colin Crossfc754582016-05-17 16:34:16 -0700198type nameProperties struct {
199 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800200 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700201}
202
203type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800204 // emit build rules for this module
205 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800206
Colin Cross7d5136f2015-05-11 13:39:40 -0700207 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800208 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
209 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
210 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700211 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700212
213 Target struct {
214 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700215 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700216 }
217 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700218 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700219 }
220 }
221
Colin Crossee0bc3b2018-10-02 22:01:37 -0700222 UseTargetVariants bool `blueprint:"mutated"`
223 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800224
Dan Willemsen782a2d12015-12-21 14:55:28 -0800225 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700226 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800227
Colin Cross55708f32017-03-20 13:23:34 -0700228 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700229 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700230
Jiyong Park2db76922017-11-08 16:03:48 +0900231 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
232 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
233 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700234 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700235
Jiyong Park2db76922017-11-08 16:03:48 +0900236 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
237 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
238 Soc_specific *bool
239
240 // whether this module is specific to a device, not only for SoC, but also for off-chip
241 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
242 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
243 // This implies `soc_specific:true`.
244 Device_specific *bool
245
246 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900247 // network operator, etc). When set to true, it is installed into /product (or
248 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900249 Product_specific *bool
250
Dario Frenifd05a742018-05-29 13:28:54 +0100251 // whether this module provides services owned by the OS provider to the core platform. When set
Dario Freni95cf7672018-08-17 00:57:57 +0100252 // to true, it is installed into /product_services (or /system/product_services if
253 // product_services partition does not exist).
254 Product_services_specific *bool
Dario Frenifd05a742018-05-29 13:28:54 +0100255
Jiyong Parkf9332f12018-02-01 00:54:12 +0900256 // Whether this module is installed to recovery partition
257 Recovery *bool
258
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700259 // init.rc files to be installed if this module is installed
260 Init_rc []string
261
Steven Moreland57a23d22018-04-04 15:42:19 -0700262 // VINTF manifest fragments to be installed if this module is installed
263 Vintf_fragments []string
264
Chris Wolfe998306e2016-08-15 14:47:23 -0400265 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700266 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400267
Colin Cross5aac3622017-08-31 15:07:09 -0700268 // relative path to a file to include in the list of notices for the device
269 Notice *string
270
Dan Willemsen569edc52018-11-19 09:33:29 -0800271 Dist struct {
272 // copy the output of this module to the $DIST_DIR when `dist` is specified on the
273 // command line and any of these targets are also on the command line, or otherwise
274 // built
275 Targets []string `android:"arch_variant"`
276
277 // The name of the output artifact. This defaults to the basename of the output of
278 // the module.
279 Dest *string `android:"arch_variant"`
280
281 // The directory within the dist directory to store the artifact. Defaults to the
282 // top level directory ("").
283 Dir *string `android:"arch_variant"`
284
285 // A suffix to add to the artifact file name (before any extension).
286 Suffix *string `android:"arch_variant"`
287 } `android:"arch_variant"`
288
Colin Crossa1ad8d12016-06-01 17:09:44 -0700289 // Set by TargetMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700290 CompileTarget Target `blueprint:"mutated"`
291 CompileMultiTargets []Target `blueprint:"mutated"`
292 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800293
294 // Set by InitAndroidModule
295 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700296 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700297
298 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800299
300 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800301}
302
303type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800304 // If set to true, build a variant of the module for the host. Defaults to false.
305 Host_supported *bool
306
307 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700308 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800309}
310
Colin Crossc472d572015-03-17 15:06:21 -0700311type Multilib string
312
313const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800314 MultilibBoth Multilib = "both"
315 MultilibFirst Multilib = "first"
316 MultilibCommon Multilib = "common"
317 MultilibCommonFirst Multilib = "common_first"
318 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700319)
320
Colin Crossa1ad8d12016-06-01 17:09:44 -0700321type HostOrDeviceSupported int
322
323const (
324 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700325
326 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700327 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700328
329 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700330 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700331
332 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700333 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700334
335 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700336 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700337
338 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700339 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700340
341 // Nothing is supported. This is not exposed to the user, but used to mark a
342 // host only module as unsupported when the module type is not supported on
343 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700344 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700345)
346
Jiyong Park2db76922017-11-08 16:03:48 +0900347type moduleKind int
348
349const (
350 platformModule moduleKind = iota
351 deviceSpecificModule
352 socSpecificModule
353 productSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +0100354 productServicesSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900355)
356
357func (k moduleKind) String() string {
358 switch k {
359 case platformModule:
360 return "platform"
361 case deviceSpecificModule:
362 return "device-specific"
363 case socSpecificModule:
364 return "soc-specific"
365 case productSpecificModule:
366 return "product-specific"
Dario Frenifd05a742018-05-29 13:28:54 +0100367 case productServicesSpecificModule:
368 return "productservices-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900369 default:
370 panic(fmt.Errorf("unknown module kind %d", k))
371 }
372}
373
Colin Cross36242852017-06-23 15:06:31 -0700374func InitAndroidModule(m Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800375 base := m.base()
376 base.module = m
Colin Cross5049f022015-03-18 13:28:46 -0700377
Colin Cross36242852017-06-23 15:06:31 -0700378 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700379 &base.nameProperties,
380 &base.commonProperties,
381 &base.variableProperties)
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700382 base.customizableProperties = m.GetProperties()
Colin Cross5049f022015-03-18 13:28:46 -0700383}
384
Colin Cross36242852017-06-23 15:06:31 -0700385func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
386 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700387
388 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800389 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700390 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700391 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700392 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800393
Dan Willemsen218f6562015-07-08 18:13:11 -0700394 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700395 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700396 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 }
398
Colin Cross36242852017-06-23 15:06:31 -0700399 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800400}
401
Colin Crossee0bc3b2018-10-02 22:01:37 -0700402func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
403 InitAndroidArchModule(m, hod, defaultMultilib)
404 m.base().commonProperties.UseTargetVariants = false
405}
406
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800407// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800408// modules. It should be included as an anonymous field in every module
409// struct definition. InitAndroidModule should then be called from the module's
410// factory function, and the return values from InitAndroidModule should be
411// returned from the factory function.
412//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800413// The ModuleBase type is responsible for implementing the GenerateBuildActions
414// method to support the blueprint.Module interface. This method will then call
415// the module's GenerateAndroidBuildActions method once for each build variant
416// that is to be built. GenerateAndroidBuildActions is passed a
417// AndroidModuleContext rather than the usual blueprint.ModuleContext.
Colin Cross3f40fa42015-01-30 17:27:36 -0800418// AndroidModuleContext exposes extra functionality specific to the Android build
419// system including details about the particular build variant that is to be
420// generated.
421//
422// For example:
423//
424// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800425// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800426// )
427//
428// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800429// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800430// properties struct {
431// MyProperty string
432// }
433// }
434//
Colin Cross36242852017-06-23 15:06:31 -0700435// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800436// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700437// m.AddProperties(&m.properties)
438// android.InitAndroidModule(m)
439// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800440// }
441//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800442// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800443// // Get the CPU architecture for the current build variant.
444// variantArch := ctx.Arch()
445//
446// // ...
447// }
Colin Cross635c3b02016-05-18 15:37:25 -0700448type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800449 // Putting the curiously recurring thing pointing to the thing that contains
450 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700451 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700452 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800453
Colin Crossfc754582016-05-17 16:34:16 -0700454 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800455 commonProperties commonProperties
Colin Cross7f64b6d2015-07-09 13:57:48 -0700456 variableProperties variableProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800457 hostAndDeviceProperties hostAndDeviceProperties
458 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700459 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700460 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800461
462 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700463 installFiles Paths
464 checkbuildFiles Paths
Jaewoong Jung62707f72018-11-16 13:26:43 -0800465 noticeFile Path
Colin Cross1f8c52b2015-06-16 16:38:17 -0700466
467 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
468 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800469 installTarget WritablePath
470 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700471 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700472
Colin Cross178a5092016-09-13 13:42:32 -0700473 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700474
475 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700476
477 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700478 buildParams []BuildParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800479 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700480
481 prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
Colin Cross36242852017-06-23 15:06:31 -0700482}
483
Colin Cross5f692ec2019-02-01 16:53:07 -0800484func (a *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
485
Colin Cross36242852017-06-23 15:06:31 -0700486func (a *ModuleBase) AddProperties(props ...interface{}) {
487 a.registerProps = append(a.registerProps, props...)
488}
489
490func (a *ModuleBase) GetProperties() []interface{} {
491 return a.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800492}
493
Colin Crossae887032017-10-23 17:16:14 -0700494func (a *ModuleBase) BuildParamsForTests() []BuildParams {
Colin Crosscec81712017-07-13 14:43:27 -0700495 return a.buildParams
496}
497
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800498func (a *ModuleBase) VariablesForTests() map[string]string {
499 return a.variables
500}
501
Colin Crossa9d8bee2018-10-02 13:59:46 -0700502func (a *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
503 a.prefer32 = prefer32
504}
505
Colin Crossce75d2c2016-10-06 16:12:58 -0700506// Name returns the name of the module. It may be overridden by individual module types, for
507// example prebuilts will prepend prebuilt_ to the name.
Colin Crossfc754582016-05-17 16:34:16 -0700508func (a *ModuleBase) Name() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800509 return String(a.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700510}
511
Colin Crossce75d2c2016-10-06 16:12:58 -0700512// BaseModuleName returns the name of the module as specified in the blueprints file.
513func (a *ModuleBase) BaseModuleName() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800514 return String(a.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700515}
516
Colin Cross635c3b02016-05-18 15:37:25 -0700517func (a *ModuleBase) base() *ModuleBase {
Colin Cross3f40fa42015-01-30 17:27:36 -0800518 return a
519}
520
Colin Crossee0bc3b2018-10-02 22:01:37 -0700521func (a *ModuleBase) SetTarget(target Target, multiTargets []Target, primary bool) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700522 a.commonProperties.CompileTarget = target
Colin Crossee0bc3b2018-10-02 22:01:37 -0700523 a.commonProperties.CompileMultiTargets = multiTargets
Colin Cross8b74d172016-09-13 09:59:14 -0700524 a.commonProperties.CompilePrimary = primary
Colin Crossd3ba0392015-05-07 14:11:29 -0700525}
526
Colin Crossa1ad8d12016-06-01 17:09:44 -0700527func (a *ModuleBase) Target() Target {
528 return a.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800529}
530
Colin Cross8b74d172016-09-13 09:59:14 -0700531func (a *ModuleBase) TargetPrimary() bool {
532 return a.commonProperties.CompilePrimary
533}
534
Colin Crossee0bc3b2018-10-02 22:01:37 -0700535func (a *ModuleBase) MultiTargets() []Target {
536 return a.commonProperties.CompileMultiTargets
537}
538
Colin Crossa1ad8d12016-06-01 17:09:44 -0700539func (a *ModuleBase) Os() OsType {
540 return a.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800541}
542
Colin Cross635c3b02016-05-18 15:37:25 -0700543func (a *ModuleBase) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700544 return a.Os().Class == Host || a.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800545}
546
Colin Cross635c3b02016-05-18 15:37:25 -0700547func (a *ModuleBase) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700548 return a.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800549}
550
Dan Willemsen0b24c742016-10-04 15:13:37 -0700551func (a *ModuleBase) ArchSpecific() bool {
552 return a.commonProperties.ArchSpecific
553}
554
Colin Crossa1ad8d12016-06-01 17:09:44 -0700555func (a *ModuleBase) OsClassSupported() []OsClass {
556 switch a.commonProperties.HostOrDeviceSupported {
557 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700558 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700559 case HostSupportedNoCross:
560 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700561 case DeviceSupported:
562 return []OsClass{Device}
Dan Albert0981b5c2018-08-02 13:46:35 -0700563 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700564 var supported []OsClass
Dan Albert0981b5c2018-08-02 13:46:35 -0700565 if Bool(a.hostAndDeviceProperties.Host_supported) ||
566 (a.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
567 a.hostAndDeviceProperties.Host_supported == nil) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700568 supported = append(supported, Host, HostCross)
569 }
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700570 if a.hostAndDeviceProperties.Device_supported == nil ||
571 *a.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700572 supported = append(supported, Device)
573 }
574 return supported
575 default:
576 return nil
577 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800578}
579
Colin Cross635c3b02016-05-18 15:37:25 -0700580func (a *ModuleBase) DeviceSupported() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800581 return a.commonProperties.HostOrDeviceSupported == DeviceSupported ||
582 a.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700583 (a.hostAndDeviceProperties.Device_supported == nil ||
584 *a.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800585}
586
Jiyong Parkc678ad32018-04-10 13:07:10 +0900587func (a *ModuleBase) Platform() bool {
Dario Frenifd05a742018-05-29 13:28:54 +0100588 return !a.DeviceSpecific() && !a.SocSpecific() && !a.ProductSpecific() && !a.ProductServicesSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900589}
590
591func (a *ModuleBase) DeviceSpecific() bool {
592 return Bool(a.commonProperties.Device_specific)
593}
594
595func (a *ModuleBase) SocSpecific() bool {
596 return Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
597}
598
599func (a *ModuleBase) ProductSpecific() bool {
600 return Bool(a.commonProperties.Product_specific)
601}
602
Dario Frenifd05a742018-05-29 13:28:54 +0100603func (a *ModuleBase) ProductServicesSpecific() bool {
Dario Freni95cf7672018-08-17 00:57:57 +0100604 return Bool(a.commonProperties.Product_services_specific)
Dario Frenifd05a742018-05-29 13:28:54 +0100605}
606
Colin Cross635c3b02016-05-18 15:37:25 -0700607func (a *ModuleBase) Enabled() bool {
Dan Willemsen0effe062015-11-30 16:06:01 -0800608 if a.commonProperties.Enabled == nil {
Dan Willemsen0a37a2a2016-11-13 10:16:05 -0800609 return !a.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800610 }
Dan Willemsen0effe062015-11-30 16:06:01 -0800611 return *a.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800612}
613
Colin Crossce75d2c2016-10-06 16:12:58 -0700614func (a *ModuleBase) SkipInstall() {
615 a.commonProperties.SkipInstall = true
616}
617
Jiyong Park374510b2018-03-19 18:23:01 +0900618func (a *ModuleBase) ExportedToMake() bool {
619 return a.commonProperties.NamespaceExportedToMake
620}
621
Colin Cross635c3b02016-05-18 15:37:25 -0700622func (a *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700623 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800624
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700625 result := Paths{}
Colin Cross6b753602018-06-21 13:03:07 -0700626 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 ctx.VisitDepsDepthFirstIf(isFileInstaller,
628 func(m blueprint.Module) {
629 fileInstaller := m.(fileInstaller)
630 files := fileInstaller.filesToInstall()
631 result = append(result, files...)
632 })
633
634 return result
635}
636
Colin Cross635c3b02016-05-18 15:37:25 -0700637func (a *ModuleBase) filesToInstall() Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800638 return a.installFiles
639}
640
Colin Cross635c3b02016-05-18 15:37:25 -0700641func (p *ModuleBase) NoAddressSanitizer() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800642 return p.noAddressSanitizer
643}
644
Colin Cross635c3b02016-05-18 15:37:25 -0700645func (p *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800646 return false
647}
648
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700649func (p *ModuleBase) InstallInSanitizerDir() bool {
650 return false
651}
652
Jiyong Parkf9332f12018-02-01 00:54:12 +0900653func (p *ModuleBase) InstallInRecovery() bool {
654 return Bool(p.commonProperties.Recovery)
655}
656
Sundong Ahn4fd04bb2018-08-31 18:01:37 +0900657func (a *ModuleBase) Owner() string {
658 return String(a.commonProperties.Owner)
659}
660
Colin Cross0875c522017-11-28 17:34:01 -0800661func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700662 allInstalledFiles := Paths{}
663 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800664 ctx.VisitAllModuleVariants(func(module Module) {
665 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700666 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
667 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 })
669
Colin Cross0875c522017-11-28 17:34:01 -0800670 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700671
Jeff Gaston088e29e2017-11-29 16:47:17 -0800672 namespacePrefix := ctx.Namespace().(*Namespace).id
673 if namespacePrefix != "" {
674 namespacePrefix = namespacePrefix + "-"
675 }
676
Colin Cross3f40fa42015-01-30 17:27:36 -0800677 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800678 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800679 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700680 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800681 Output: name,
682 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800683 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700684 })
685 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700686 a.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700687 }
688
689 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800690 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
Colin Cross0875c522017-11-28 17:34:01 -0800691 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700692 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800693 Output: name,
694 Implicits: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700695 })
696 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700697 a.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700698 }
699
700 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800701 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800702 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800703 suffix = "-soong"
704 }
705
Jeff Gaston088e29e2017-11-29 16:47:17 -0800706 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800707 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700708 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800709 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700710 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800711 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700712
713 a.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800714 }
715}
716
Jiyong Park2db76922017-11-08 16:03:48 +0900717func determineModuleKind(a *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
718 var socSpecific = Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
719 var deviceSpecific = Bool(a.commonProperties.Device_specific)
720 var productSpecific = Bool(a.commonProperties.Product_specific)
Dario Freni95cf7672018-08-17 00:57:57 +0100721 var productServicesSpecific = Bool(a.commonProperties.Product_services_specific)
Jiyong Park2db76922017-11-08 16:03:48 +0900722
Dario Frenifd05a742018-05-29 13:28:54 +0100723 msg := "conflicting value set here"
724 if socSpecific && deviceSpecific {
725 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Jiyong Park2db76922017-11-08 16:03:48 +0900726 if Bool(a.commonProperties.Vendor) {
727 ctx.PropertyErrorf("vendor", msg)
728 }
729 if Bool(a.commonProperties.Proprietary) {
730 ctx.PropertyErrorf("proprietary", msg)
731 }
732 if Bool(a.commonProperties.Soc_specific) {
733 ctx.PropertyErrorf("soc_specific", msg)
734 }
735 }
736
Dario Frenifd05a742018-05-29 13:28:54 +0100737 if productSpecific && productServicesSpecific {
738 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and product_services at the same time.")
739 ctx.PropertyErrorf("product_services_specific", msg)
740 }
741
742 if (socSpecific || deviceSpecific) && (productSpecific || productServicesSpecific) {
743 if productSpecific {
744 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
745 } else {
746 ctx.PropertyErrorf("product_services_specific", "a module cannot be specific to SoC or device and product_services at the same time.")
747 }
748 if deviceSpecific {
749 ctx.PropertyErrorf("device_specific", msg)
750 } else {
751 if Bool(a.commonProperties.Vendor) {
752 ctx.PropertyErrorf("vendor", msg)
753 }
754 if Bool(a.commonProperties.Proprietary) {
755 ctx.PropertyErrorf("proprietary", msg)
756 }
757 if Bool(a.commonProperties.Soc_specific) {
758 ctx.PropertyErrorf("soc_specific", msg)
759 }
760 }
761 }
762
Jiyong Park2db76922017-11-08 16:03:48 +0900763 if productSpecific {
764 return productSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +0100765 } else if productServicesSpecific {
766 return productServicesSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900767 } else if deviceSpecific {
768 return deviceSpecificModule
769 } else if socSpecific {
770 return socSpecificModule
771 } else {
772 return platformModule
773 }
774}
775
Colin Cross635c3b02016-05-18 15:37:25 -0700776func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
Colin Cross6362e272015-10-29 15:25:03 -0700777 return androidBaseContextImpl{
Colin Cross8b74d172016-09-13 09:59:14 -0700778 target: a.commonProperties.CompileTarget,
779 targetPrimary: a.commonProperties.CompilePrimary,
Colin Crossee0bc3b2018-10-02 22:01:37 -0700780 multiTargets: a.commonProperties.CompileMultiTargets,
Jiyong Park2db76922017-11-08 16:03:48 +0900781 kind: determineModuleKind(a, ctx),
Colin Cross8b74d172016-09-13 09:59:14 -0700782 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -0800783 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800784}
785
Colin Cross0875c522017-11-28 17:34:01 -0800786func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
787 ctx := &androidModuleContext{
Colin Cross8d8f8e22016-08-03 11:57:50 -0700788 module: a.module,
Colin Cross0875c522017-11-28 17:34:01 -0800789 ModuleContext: blueprintCtx,
790 androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx),
791 installDeps: a.computeInstallDeps(blueprintCtx),
Colin Cross6362e272015-10-29 15:25:03 -0700792 installFiles: a.installFiles,
Colin Cross0875c522017-11-28 17:34:01 -0800793 missingDeps: blueprintCtx.GetMissingDependencies(),
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800794 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -0800795 }
796
Colin Cross67a5c132017-05-09 13:45:28 -0700797 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
798 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -0800799 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
800 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -0700801 }
Colin Cross0875c522017-11-28 17:34:01 -0800802 if !ctx.PrimaryArch() {
803 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -0700804 }
805
806 ctx.Variable(pctx, "moduleDesc", desc)
807
808 s := ""
809 if len(suffix) > 0 {
810 s = " [" + strings.Join(suffix, " ") + "]"
811 }
812 ctx.Variable(pctx, "moduleDescSuffix", s)
813
Dan Willemsen569edc52018-11-19 09:33:29 -0800814 // Some common property checks for properties that will be used later in androidmk.go
815 if a.commonProperties.Dist.Dest != nil {
816 _, err := validateSafePath(*a.commonProperties.Dist.Dest)
817 if err != nil {
818 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
819 }
820 }
821 if a.commonProperties.Dist.Dir != nil {
822 _, err := validateSafePath(*a.commonProperties.Dist.Dir)
823 if err != nil {
824 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
825 }
826 }
827 if a.commonProperties.Dist.Suffix != nil {
828 if strings.Contains(*a.commonProperties.Dist.Suffix, "/") {
829 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
830 }
831 }
832
Colin Cross9b1d13d2016-09-19 15:18:11 -0700833 if a.Enabled() {
Colin Cross0875c522017-11-28 17:34:01 -0800834 a.module.GenerateAndroidBuildActions(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -0700835 if ctx.Failed() {
836 return
837 }
838
Colin Cross0875c522017-11-28 17:34:01 -0800839 a.installFiles = append(a.installFiles, ctx.installFiles...)
840 a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...)
Jaewoong Jung62707f72018-11-16 13:26:43 -0800841
842 if a.commonProperties.Notice != nil {
843 // For filegroup-based notice file references.
844 a.noticeFile = ctx.ExpandSource(*a.commonProperties.Notice, "notice")
845 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800846 }
847
Colin Cross9b1d13d2016-09-19 15:18:11 -0700848 if a == ctx.FinalModule().(Module).base() {
849 a.generateModuleTarget(ctx)
850 if ctx.Failed() {
851 return
852 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800853 }
Colin Crosscec81712017-07-13 14:43:27 -0700854
Colin Cross0875c522017-11-28 17:34:01 -0800855 a.buildParams = ctx.buildParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800856 a.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -0800857}
858
Colin Crossf6566ed2015-03-24 11:13:38 -0700859type androidBaseContextImpl struct {
Colin Cross8b74d172016-09-13 09:59:14 -0700860 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -0700861 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -0700862 targetPrimary bool
863 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +0900864 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -0700865 config Config
Colin Crossf6566ed2015-03-24 11:13:38 -0700866}
867
Colin Cross3f40fa42015-01-30 17:27:36 -0800868type androidModuleContext struct {
869 blueprint.ModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -0700870 androidBaseContextImpl
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700871 installDeps Paths
872 installFiles Paths
873 checkbuildFiles Paths
Colin Cross6ff51382015-12-17 16:39:19 -0800874 missingDeps []string
Colin Cross8d8f8e22016-08-03 11:57:50 -0700875 module Module
Colin Crosscec81712017-07-13 14:43:27 -0700876
877 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700878 buildParams []BuildParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800879 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -0800880}
881
Colin Cross67a5c132017-05-09 13:45:28 -0700882func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
Colin Cross0875c522017-11-28 17:34:01 -0800883 a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700884 Rule: ErrorRule,
885 Description: desc,
886 Outputs: outputs,
887 Optional: true,
Colin Cross6ff51382015-12-17 16:39:19 -0800888 Args: map[string]string{
889 "error": err.Error(),
890 },
891 })
892 return
Colin Cross3f40fa42015-01-30 17:27:36 -0800893}
894
Colin Crossaabf6792017-11-29 00:27:14 -0800895func (a *androidModuleContext) Config() Config {
896 return a.ModuleContext.Config().(Config)
897}
898
Colin Cross0875c522017-11-28 17:34:01 -0800899func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
Colin Crossae887032017-10-23 17:16:14 -0700900 a.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -0800901}
902
Colin Cross0875c522017-11-28 17:34:01 -0800903func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700904 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700905 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -0800906 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -0800907 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700908 Outputs: params.Outputs.Strings(),
909 ImplicitOutputs: params.ImplicitOutputs.Strings(),
910 Inputs: params.Inputs.Strings(),
911 Implicits: params.Implicits.Strings(),
912 OrderOnly: params.OrderOnly.Strings(),
913 Args: params.Args,
914 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700915 }
916
Colin Cross33bfb0a2016-11-21 17:23:08 -0800917 if params.Depfile != nil {
918 bparams.Depfile = params.Depfile.String()
919 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700920 if params.Output != nil {
921 bparams.Outputs = append(bparams.Outputs, params.Output.String())
922 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700923 if params.ImplicitOutput != nil {
924 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
925 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700926 if params.Input != nil {
927 bparams.Inputs = append(bparams.Inputs, params.Input.String())
928 }
929 if params.Implicit != nil {
930 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
931 }
932
Colin Crossfe4bc362018-09-12 10:02:13 -0700933 bparams.Outputs = proptools.NinjaEscape(bparams.Outputs)
934 bparams.ImplicitOutputs = proptools.NinjaEscape(bparams.ImplicitOutputs)
935 bparams.Inputs = proptools.NinjaEscape(bparams.Inputs)
936 bparams.Implicits = proptools.NinjaEscape(bparams.Implicits)
937 bparams.OrderOnly = proptools.NinjaEscape(bparams.OrderOnly)
938 bparams.Depfile = proptools.NinjaEscape([]string{bparams.Depfile})[0]
939
Colin Cross0875c522017-11-28 17:34:01 -0800940 return bparams
941}
942
943func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800944 if a.config.captureBuild {
945 a.variables[name] = value
946 }
947
Colin Cross0875c522017-11-28 17:34:01 -0800948 a.ModuleContext.Variable(pctx.PackageContext, name, value)
949}
950
951func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
952 argNames ...string) blueprint.Rule {
953
954 return a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...)
955}
956
957func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) {
958 if a.config.captureBuild {
959 a.buildParams = append(a.buildParams, params)
960 }
961
962 bparams := convertBuildParams(params)
963
964 if bparams.Description != "" {
965 bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
966 }
967
Colin Cross6ff51382015-12-17 16:39:19 -0800968 if a.missingDeps != nil {
Colin Cross67a5c132017-05-09 13:45:28 -0700969 a.ninjaError(bparams.Description, bparams.Outputs,
970 fmt.Errorf("module %s missing dependencies: %s\n",
971 a.ModuleName(), strings.Join(a.missingDeps, ", ")))
Colin Cross6ff51382015-12-17 16:39:19 -0800972 return
973 }
974
Colin Cross0875c522017-11-28 17:34:01 -0800975 a.ModuleContext.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700976}
977
Colin Cross6ff51382015-12-17 16:39:19 -0800978func (a *androidModuleContext) GetMissingDependencies() []string {
979 return a.missingDeps
980}
981
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800982func (a *androidModuleContext) AddMissingDependencies(deps []string) {
983 if deps != nil {
984 a.missingDeps = append(a.missingDeps, deps...)
Colin Crossd11fcda2017-10-23 17:59:01 -0700985 a.missingDeps = FirstUniqueStrings(a.missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800986 }
987}
988
Colin Crossd11fcda2017-10-23 17:59:01 -0700989func (a *androidModuleContext) validateAndroidModule(module blueprint.Module) Module {
990 aModule, _ := module.(Module)
991 if aModule == nil {
992 a.ModuleErrorf("module %q not an android module", a.OtherModuleName(aModule))
993 return nil
994 }
995
996 if !aModule.Enabled() {
Colin Cross6510f912017-11-29 00:27:14 -0800997 if a.Config().AllowMissingDependencies() {
Colin Crossd11fcda2017-10-23 17:59:01 -0700998 a.AddMissingDependencies([]string{a.OtherModuleName(aModule)})
999 } else {
1000 a.ModuleErrorf("depends on disabled module %q", a.OtherModuleName(aModule))
1001 }
1002 return nil
1003 }
1004
1005 return aModule
1006}
1007
Colin Cross35143d02017-11-16 00:11:20 -08001008func (a *androidModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
1009 a.ModuleContext.VisitDirectDeps(visit)
1010}
1011
Colin Crossd11fcda2017-10-23 17:59:01 -07001012func (a *androidModuleContext) VisitDirectDeps(visit func(Module)) {
1013 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1014 if aModule := a.validateAndroidModule(module); aModule != nil {
1015 visit(aModule)
1016 }
1017 })
1018}
1019
Colin Crossee6143c2017-12-30 17:54:27 -08001020func (a *androidModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
1021 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1022 if aModule := a.validateAndroidModule(module); aModule != nil {
1023 if a.ModuleContext.OtherModuleDependencyTag(aModule) == tag {
1024 visit(aModule)
1025 }
1026 }
1027 })
1028}
1029
Colin Crossd11fcda2017-10-23 17:59:01 -07001030func (a *androidModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
1031 a.ModuleContext.VisitDirectDepsIf(
1032 // pred
1033 func(module blueprint.Module) bool {
1034 if aModule := a.validateAndroidModule(module); aModule != nil {
1035 return pred(aModule)
1036 } else {
1037 return false
1038 }
1039 },
1040 // visit
1041 func(module blueprint.Module) {
1042 visit(module.(Module))
1043 })
1044}
1045
1046func (a *androidModuleContext) VisitDepsDepthFirst(visit func(Module)) {
1047 a.ModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
1048 if aModule := a.validateAndroidModule(module); aModule != nil {
1049 visit(aModule)
1050 }
1051 })
1052}
1053
1054func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
1055 a.ModuleContext.VisitDepsDepthFirstIf(
1056 // pred
1057 func(module blueprint.Module) bool {
1058 if aModule := a.validateAndroidModule(module); aModule != nil {
1059 return pred(aModule)
1060 } else {
1061 return false
1062 }
1063 },
1064 // visit
1065 func(module blueprint.Module) {
1066 visit(module.(Module))
1067 })
1068}
1069
1070func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) {
1071 a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
1072 childAndroidModule := a.validateAndroidModule(child)
1073 parentAndroidModule := a.validateAndroidModule(parent)
1074 if childAndroidModule != nil && parentAndroidModule != nil {
1075 return visit(childAndroidModule, parentAndroidModule)
1076 } else {
1077 return false
1078 }
1079 })
1080}
1081
Colin Cross0875c522017-11-28 17:34:01 -08001082func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) {
1083 a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) {
1084 visit(module.(Module))
1085 })
1086}
1087
1088func (a *androidModuleContext) PrimaryModule() Module {
1089 return a.ModuleContext.PrimaryModule().(Module)
1090}
1091
1092func (a *androidModuleContext) FinalModule() Module {
1093 return a.ModuleContext.FinalModule().(Module)
1094}
1095
Colin Crossa1ad8d12016-06-01 17:09:44 -07001096func (a *androidBaseContextImpl) Target() Target {
1097 return a.target
1098}
1099
Colin Cross8b74d172016-09-13 09:59:14 -07001100func (a *androidBaseContextImpl) TargetPrimary() bool {
1101 return a.targetPrimary
1102}
1103
Colin Crossee0bc3b2018-10-02 22:01:37 -07001104func (a *androidBaseContextImpl) MultiTargets() []Target {
1105 return a.multiTargets
1106}
1107
Colin Crossf6566ed2015-03-24 11:13:38 -07001108func (a *androidBaseContextImpl) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001109 return a.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08001110}
1111
Colin Crossa1ad8d12016-06-01 17:09:44 -07001112func (a *androidBaseContextImpl) Os() OsType {
1113 return a.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001114}
1115
Colin Crossf6566ed2015-03-24 11:13:38 -07001116func (a *androidBaseContextImpl) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001117 return a.target.Os.Class == Host || a.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -07001118}
1119
1120func (a *androidBaseContextImpl) Device() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001121 return a.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07001122}
1123
Colin Cross0af4b842015-04-30 16:36:18 -07001124func (a *androidBaseContextImpl) Darwin() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001125 return a.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07001126}
1127
Doug Horn21b94272019-01-16 12:06:11 -08001128func (a *androidBaseContextImpl) Fuchsia() bool {
1129 return a.target.Os == Fuchsia
1130}
1131
Colin Cross3edeee12017-04-04 12:59:48 -07001132func (a *androidBaseContextImpl) Windows() bool {
1133 return a.target.Os == Windows
1134}
1135
Colin Crossf6566ed2015-03-24 11:13:38 -07001136func (a *androidBaseContextImpl) Debug() bool {
1137 return a.debug
1138}
1139
Colin Cross1e7d3702016-08-24 15:25:47 -07001140func (a *androidBaseContextImpl) PrimaryArch() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001141 if len(a.config.Targets[a.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07001142 return true
1143 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001144 return a.target.Arch.ArchType == a.config.Targets[a.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07001145}
1146
Colin Cross1332b002015-04-07 17:11:30 -07001147func (a *androidBaseContextImpl) AConfig() Config {
1148 return a.config
1149}
1150
Colin Cross9272ade2016-08-17 15:24:12 -07001151func (a *androidBaseContextImpl) DeviceConfig() DeviceConfig {
1152 return DeviceConfig{a.config.deviceConfig}
1153}
1154
Jiyong Park2db76922017-11-08 16:03:48 +09001155func (a *androidBaseContextImpl) Platform() bool {
1156 return a.kind == platformModule
1157}
1158
1159func (a *androidBaseContextImpl) DeviceSpecific() bool {
1160 return a.kind == deviceSpecificModule
1161}
1162
1163func (a *androidBaseContextImpl) SocSpecific() bool {
1164 return a.kind == socSpecificModule
1165}
1166
1167func (a *androidBaseContextImpl) ProductSpecific() bool {
1168 return a.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -08001169}
1170
Dario Frenifd05a742018-05-29 13:28:54 +01001171func (a *androidBaseContextImpl) ProductServicesSpecific() bool {
1172 return a.kind == productServicesSpecificModule
1173}
1174
Jiyong Park5baac542018-08-28 09:55:37 +09001175// Makes this module a platform module, i.e. not specific to soc, device,
1176// product, or product_services.
1177func (a *ModuleBase) MakeAsPlatform() {
1178 a.commonProperties.Vendor = boolPtr(false)
1179 a.commonProperties.Proprietary = boolPtr(false)
1180 a.commonProperties.Soc_specific = boolPtr(false)
1181 a.commonProperties.Product_specific = boolPtr(false)
1182 a.commonProperties.Product_services_specific = boolPtr(false)
1183}
1184
Colin Cross8d8f8e22016-08-03 11:57:50 -07001185func (a *androidModuleContext) InstallInData() bool {
1186 return a.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08001187}
1188
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001189func (a *androidModuleContext) InstallInSanitizerDir() bool {
1190 return a.module.InstallInSanitizerDir()
1191}
1192
Jiyong Parkf9332f12018-02-01 00:54:12 +09001193func (a *androidModuleContext) InstallInRecovery() bool {
1194 return a.module.InstallInRecovery()
1195}
1196
Colin Cross893d8162017-04-26 17:34:03 -07001197func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool {
1198 if a.module.base().commonProperties.SkipInstall {
1199 return true
1200 }
1201
Colin Cross3607f212018-05-07 15:28:05 -07001202 // We'll need a solution for choosing which of modules with the same name in different
1203 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
1204 // list of namespaces to install in a Soong-only build.
1205 if !a.module.base().commonProperties.NamespaceExportedToMake {
1206 return true
1207 }
1208
Colin Cross893d8162017-04-26 17:34:03 -07001209 if a.Device() {
Colin Cross6510f912017-11-29 00:27:14 -08001210 if a.Config().SkipDeviceInstall() {
Colin Cross893d8162017-04-26 17:34:03 -07001211 return true
1212 }
1213
Colin Cross6510f912017-11-29 00:27:14 -08001214 if a.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07001215 return true
1216 }
1217 }
1218
1219 return false
1220}
1221
Colin Cross5c517922017-08-31 12:29:17 -07001222func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
Colin Crossa2344662016-03-24 13:14:12 -07001223 deps ...Path) OutputPath {
Colin Cross5c517922017-08-31 12:29:17 -07001224 return a.installFile(installPath, name, srcPath, Cp, deps)
1225}
1226
1227func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
1228 deps ...Path) OutputPath {
1229 return a.installFile(installPath, name, srcPath, CpExecutable, deps)
1230}
1231
1232func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path,
1233 rule blueprint.Rule, deps []Path) OutputPath {
Colin Cross35cec122015-04-02 14:37:16 -07001234
Dan Willemsen782a2d12015-12-21 14:55:28 -08001235 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001236 a.module.base().hooks.runInstallHooks(a, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001237
Colin Cross893d8162017-04-26 17:34:03 -07001238 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001239
Dan Willemsen322acaf2016-01-12 23:07:05 -08001240 deps = append(deps, a.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001241
Colin Cross89562dc2016-10-03 17:47:19 -07001242 var implicitDeps, orderOnlyDeps Paths
1243
1244 if a.Host() {
1245 // Installed host modules might be used during the build, depend directly on their
1246 // dependencies so their timestamp is updated whenever their dependency is updated
1247 implicitDeps = deps
1248 } else {
1249 orderOnlyDeps = deps
1250 }
1251
Colin Crossae887032017-10-23 17:16:14 -07001252 a.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001253 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001254 Description: "install " + fullInstallPath.Base(),
1255 Output: fullInstallPath,
1256 Input: srcPath,
1257 Implicits: implicitDeps,
1258 OrderOnly: orderOnlyDeps,
Colin Cross6510f912017-11-29 00:27:14 -08001259 Default: !a.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001260 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001261
Dan Willemsen322acaf2016-01-12 23:07:05 -08001262 a.installFiles = append(a.installFiles, fullInstallPath)
1263 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001264 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001265 return fullInstallPath
1266}
1267
Colin Cross3854a602016-01-11 12:49:11 -08001268func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
1269 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001270 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001271
Colin Cross893d8162017-04-26 17:34:03 -07001272 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001273
Alex Lightfb4353d2019-01-17 13:57:45 -08001274 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
1275 if err != nil {
1276 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
1277 }
Colin Crossae887032017-10-23 17:16:14 -07001278 a.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001279 Rule: Symlink,
1280 Description: "install symlink " + fullInstallPath.Base(),
1281 Output: fullInstallPath,
1282 OrderOnly: Paths{srcPath},
Colin Cross6510f912017-11-29 00:27:14 -08001283 Default: !a.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001284 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08001285 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08001286 },
1287 })
Colin Cross3854a602016-01-11 12:49:11 -08001288
Colin Cross12fc4972016-01-11 12:49:11 -08001289 a.installFiles = append(a.installFiles, fullInstallPath)
1290 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1291 }
Colin Cross3854a602016-01-11 12:49:11 -08001292 return fullInstallPath
1293}
1294
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001295func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
Colin Cross3f40fa42015-01-30 17:27:36 -08001296 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1297}
1298
Colin Cross3f40fa42015-01-30 17:27:36 -08001299type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001300 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001301}
1302
1303func isFileInstaller(m blueprint.Module) bool {
1304 _, ok := m.(fileInstaller)
1305 return ok
1306}
1307
1308func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001309 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001310 return ok
1311}
Colin Crossfce53272015-04-08 11:21:40 -07001312
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001313func findStringInSlice(str string, slice []string) int {
1314 for i, s := range slice {
1315 if s == str {
1316 return i
Colin Crossfce53272015-04-08 11:21:40 -07001317 }
1318 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001319 return -1
1320}
1321
Colin Cross068e0fe2016-12-13 15:23:47 -08001322func SrcIsModule(s string) string {
1323 if len(s) > 1 && s[0] == ':' {
1324 return s[1:]
1325 }
1326 return ""
1327}
1328
1329type sourceDependencyTag struct {
1330 blueprint.BaseDependencyTag
1331}
1332
1333var SourceDepTag sourceDependencyTag
1334
Colin Cross366938f2017-12-11 16:29:02 -08001335// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1336// using ":module" syntax, if any.
Colin Cross068e0fe2016-12-13 15:23:47 -08001337func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
1338 var deps []string
Nan Zhang2439eb72017-04-10 11:27:50 -07001339 set := make(map[string]bool)
1340
Colin Cross068e0fe2016-12-13 15:23:47 -08001341 for _, s := range srcFiles {
1342 if m := SrcIsModule(s); m != "" {
Nan Zhang2439eb72017-04-10 11:27:50 -07001343 if _, found := set[m]; found {
1344 ctx.ModuleErrorf("found source dependency duplicate: %q!", m)
1345 } else {
1346 set[m] = true
1347 deps = append(deps, m)
1348 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001349 }
1350 }
1351
1352 ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
1353}
1354
Colin Cross366938f2017-12-11 16:29:02 -08001355// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1356// using ":module" syntax, if any.
1357func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1358 if s != nil {
1359 if m := SrcIsModule(*s); m != "" {
1360 ctx.AddDependency(ctx.Module(), SourceDepTag, m)
1361 }
1362 }
1363}
1364
Colin Cross068e0fe2016-12-13 15:23:47 -08001365type SourceFileProducer interface {
1366 Srcs() Paths
1367}
1368
1369// Returns a list of paths expanded from globs and modules referenced using ":module" syntax.
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001370// ExtractSourcesDeps must have already been called during the dependency resolution phase.
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001371func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001372 return ctx.ExpandSourcesSubDir(srcFiles, excludes, "")
1373}
1374
Colin Cross366938f2017-12-11 16:29:02 -08001375// Returns a single path expanded from globs and modules referenced using ":module" syntax.
1376// ExtractSourceDeps must have already been called during the dependency resolution phase.
1377func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
1378 srcFiles := ctx.ExpandSourcesSubDir([]string{srcFile}, nil, "")
1379 if len(srcFiles) == 1 {
1380 return srcFiles[0]
Jaewoong Jung62707f72018-11-16 13:26:43 -08001381 } else if len(srcFiles) == 0 {
1382 if ctx.Config().AllowMissingDependencies() {
1383 ctx.AddMissingDependencies([]string{srcFile})
1384 } else {
1385 ctx.PropertyErrorf(prop, "%s path %s does not exist", prop, srcFile)
1386 }
1387 return nil
Colin Cross366938f2017-12-11 16:29:02 -08001388 } else {
1389 ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop)
1390 return nil
1391 }
1392}
1393
Colin Cross2383f3b2018-02-06 14:40:13 -08001394// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
1395// the srcFile is non-nil.
1396// ExtractSourceDeps must have already been called during the dependency resolution phase.
1397func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
1398 if srcFile != nil {
1399 return OptionalPathForPath(ctx.ExpandSource(*srcFile, prop))
1400 }
1401 return OptionalPath{}
1402}
1403
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001404func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001405 prefix := PathForModuleSrc(ctx).String()
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001406
Colin Cross461b4452018-02-23 09:22:42 -08001407 var expandedExcludes []string
1408 if excludes != nil {
1409 expandedExcludes = make([]string, 0, len(excludes))
1410 }
Nan Zhang27e284d2018-02-09 21:03:53 +00001411
1412 for _, e := range excludes {
1413 if m := SrcIsModule(e); m != "" {
1414 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
1415 if module == nil {
1416 // Error will have been handled by ExtractSourcesDeps
1417 continue
1418 }
1419 if srcProducer, ok := module.(SourceFileProducer); ok {
1420 expandedExcludes = append(expandedExcludes, srcProducer.Srcs().Strings()...)
1421 } else {
1422 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1423 }
1424 } else {
1425 expandedExcludes = append(expandedExcludes, filepath.Join(prefix, e))
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001426 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001427 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001428 expandedSrcFiles := make(Paths, 0, len(srcFiles))
Colin Cross8f101b42015-06-17 15:09:06 -07001429 for _, s := range srcFiles {
Colin Cross068e0fe2016-12-13 15:23:47 -08001430 if m := SrcIsModule(s); m != "" {
1431 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
Colin Cross0617bb82017-10-24 13:01:18 -07001432 if module == nil {
1433 // Error will have been handled by ExtractSourcesDeps
1434 continue
1435 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001436 if srcProducer, ok := module.(SourceFileProducer); ok {
Nan Zhang27e284d2018-02-09 21:03:53 +00001437 moduleSrcs := srcProducer.Srcs()
1438 for _, e := range expandedExcludes {
1439 for j, ms := range moduleSrcs {
1440 if ms.String() == e {
1441 moduleSrcs = append(moduleSrcs[:j], moduleSrcs[j+1:]...)
1442 }
1443 }
1444 }
1445 expandedSrcFiles = append(expandedSrcFiles, moduleSrcs...)
Colin Cross068e0fe2016-12-13 15:23:47 -08001446 } else {
1447 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1448 }
1449 } else if pathtools.IsGlob(s) {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001450 globbedSrcFiles := ctx.GlobFiles(filepath.Join(prefix, s), expandedExcludes)
Colin Cross05a39cb2017-10-09 13:35:19 -07001451 for i, s := range globbedSrcFiles {
1452 globbedSrcFiles[i] = s.(ModuleSrcPath).WithSubDir(ctx, subDir)
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001453 }
Colin Cross05a39cb2017-10-09 13:35:19 -07001454 expandedSrcFiles = append(expandedSrcFiles, globbedSrcFiles...)
Colin Cross8f101b42015-06-17 15:09:06 -07001455 } else {
Nan Zhang27e284d2018-02-09 21:03:53 +00001456 p := PathForModuleSrc(ctx, s).WithSubDir(ctx, subDir)
1457 j := findStringInSlice(p.String(), expandedExcludes)
1458 if j == -1 {
1459 expandedSrcFiles = append(expandedSrcFiles, p)
1460 }
1461
Colin Cross8f101b42015-06-17 15:09:06 -07001462 }
1463 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001464 return expandedSrcFiles
Colin Cross8f101b42015-06-17 15:09:06 -07001465}
1466
Nan Zhang6d34b302017-02-04 17:47:46 -08001467func (ctx *androidModuleContext) RequiredModuleNames() []string {
1468 return ctx.module.base().commonProperties.Required
1469}
1470
Colin Cross7f19f372016-11-01 11:10:25 -07001471func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
1472 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001473 if err != nil {
1474 ctx.ModuleErrorf("glob: %s", err.Error())
1475 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001476 return pathsForModuleSrcFromFullPath(ctx, ret, true)
Colin Crossfce53272015-04-08 11:21:40 -07001477}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001478
Nan Zhang581fd212018-01-10 16:06:12 -08001479func (ctx *androidModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001480 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Nan Zhang581fd212018-01-10 16:06:12 -08001481 if err != nil {
1482 ctx.ModuleErrorf("glob: %s", err.Error())
1483 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001484 return pathsForModuleSrcFromFullPath(ctx, ret, false)
Nan Zhang581fd212018-01-10 16:06:12 -08001485}
1486
Colin Cross463a90e2015-06-17 14:20:06 -07001487func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001488 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001489}
1490
Colin Cross0875c522017-11-28 17:34:01 -08001491func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001492 return &buildTargetSingleton{}
1493}
1494
Colin Cross87d8b562017-04-25 10:01:55 -07001495func parentDir(dir string) string {
1496 dir, _ = filepath.Split(dir)
1497 return filepath.Clean(dir)
1498}
1499
Colin Cross1f8c52b2015-06-16 16:38:17 -07001500type buildTargetSingleton struct{}
1501
Colin Cross0875c522017-11-28 17:34:01 -08001502func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1503 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001504
Colin Cross0875c522017-11-28 17:34:01 -08001505 mmTarget := func(dir string) WritablePath {
1506 return PathForPhony(ctx,
1507 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001508 }
1509
Colin Cross0875c522017-11-28 17:34:01 -08001510 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001511
Colin Cross0875c522017-11-28 17:34:01 -08001512 ctx.VisitAllModules(func(module Module) {
1513 blueprintDir := module.base().blueprintDir
1514 installTarget := module.base().installTarget
1515 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001516
Colin Cross0875c522017-11-28 17:34:01 -08001517 if checkbuildTarget != nil {
1518 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1519 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1520 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001521
Colin Cross0875c522017-11-28 17:34:01 -08001522 if installTarget != nil {
1523 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001524 }
1525 })
1526
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001527 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001528 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001529 suffix = "-soong"
1530 }
1531
Colin Cross1f8c52b2015-06-16 16:38:17 -07001532 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001533 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001534 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001535 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001536 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001537 })
1538
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001539 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001540 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001541 return
1542 }
1543
Colin Cross0875c522017-11-28 17:34:01 -08001544 sortedKeys := func(m map[string]Paths) []string {
1545 s := make([]string, 0, len(m))
1546 for k := range m {
1547 s = append(s, k)
1548 }
1549 sort.Strings(s)
1550 return s
1551 }
1552
Colin Cross87d8b562017-04-25 10:01:55 -07001553 // Ensure ancestor directories are in modulesInDir
1554 dirs := sortedKeys(modulesInDir)
1555 for _, dir := range dirs {
1556 dir := parentDir(dir)
1557 for dir != "." && dir != "/" {
1558 if _, exists := modulesInDir[dir]; exists {
1559 break
1560 }
1561 modulesInDir[dir] = nil
1562 dir = parentDir(dir)
1563 }
1564 }
1565
1566 // Make directories build their direct subdirectories
1567 dirs = sortedKeys(modulesInDir)
1568 for _, dir := range dirs {
1569 p := parentDir(dir)
1570 if p != "." && p != "/" {
1571 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1572 }
1573 }
1574
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001575 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1576 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1577 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001578 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001579 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001580 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001581 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001582 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001583 // HACK: checkbuild should be an optional build, but force it
1584 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001585 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001586 })
1587 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001588
1589 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1590 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001591 ctx.VisitAllModules(func(module Module) {
1592 if module.Enabled() {
1593 os := module.Target().Os
1594 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001595 }
1596 })
1597
Colin Cross0875c522017-11-28 17:34:01 -08001598 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001599 for os, deps := range osDeps {
1600 var className string
1601
1602 switch os.Class {
1603 case Host:
1604 className = "host"
1605 case HostCross:
1606 className = "host-cross"
1607 case Device:
1608 className = "target"
1609 default:
1610 continue
1611 }
1612
Colin Cross0875c522017-11-28 17:34:01 -08001613 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001614 osClass[className] = append(osClass[className], name)
1615
Colin Cross0875c522017-11-28 17:34:01 -08001616 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001617 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001618 Output: name,
1619 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001620 })
1621 }
1622
1623 // Wrap those into host|host-cross|target phony rules
1624 osClasses := sortedKeys(osClass)
1625 for _, class := range osClasses {
Colin Cross0875c522017-11-28 17:34:01 -08001626 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001627 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001628 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001629 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001630 })
1631 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001632}
Colin Crossd779da42015-12-17 18:00:23 -08001633
Brandon Lee5d45c6f2018-08-15 15:35:38 -07001634// Collect information for opening IDE project files in java/jdeps.go.
1635type IDEInfo interface {
1636 IDEInfo(ideInfo *IdeInfo)
1637 BaseModuleName() string
1638}
1639
1640// Extract the base module name from the Import name.
1641// Often the Import name has a prefix "prebuilt_".
1642// Remove the prefix explicitly if needed
1643// until we find a better solution to get the Import name.
1644type IDECustomizedModuleName interface {
1645 IDECustomizedModuleName() string
1646}
1647
1648type IdeInfo struct {
1649 Deps []string `json:"dependencies,omitempty"`
1650 Srcs []string `json:"srcs,omitempty"`
1651 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
1652 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
1653 Jars []string `json:"jars,omitempty"`
1654 Classes []string `json:"class,omitempty"`
1655 Installed_paths []string `json:"installed,omitempty"`
1656}