blob: 3bd256a42275a31d1ce5c5502401e58223aee071 [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"
Colin Cross3f40fa42015-01-30 17:27:36 -080019 "path/filepath"
Colin Cross0875c522017-11-28 17:34:01 -080020 "sort"
Colin Cross6ff51382015-12-17 16:39:19 -080021 "strings"
Colin Crossaabf6792017-11-29 00:27:14 -080022 "text/scanner"
Colin Crossf6566ed2015-03-24 11:13:38 -070023
24 "github.com/google/blueprint"
Colin Cross7f19f372016-11-01 11:10:25 -070025 "github.com/google/blueprint/pathtools"
Colin Cross3f40fa42015-01-30 17:27:36 -080026)
27
28var (
29 DeviceSharedLibrary = "shared_library"
30 DeviceStaticLibrary = "static_library"
31 DeviceExecutable = "executable"
32 HostSharedLibrary = "host_shared_library"
33 HostStaticLibrary = "host_static_library"
34 HostExecutable = "host_executable"
35)
36
Colin Crossae887032017-10-23 17:16:14 -070037type BuildParams struct {
Dan Willemsen9f3c5742016-11-03 14:28:31 -070038 Rule blueprint.Rule
Colin Cross33bfb0a2016-11-21 17:23:08 -080039 Deps blueprint.Deps
40 Depfile WritablePath
Colin Cross67a5c132017-05-09 13:45:28 -070041 Description string
Dan Willemsen9f3c5742016-11-03 14:28:31 -070042 Output WritablePath
43 Outputs WritablePaths
44 ImplicitOutput WritablePath
45 ImplicitOutputs WritablePaths
46 Input Path
47 Inputs Paths
48 Implicit Path
49 Implicits Paths
50 OrderOnly Paths
51 Default bool
52 Args map[string]string
Dan Willemsen34cc69e2015-09-23 15:26:20 -070053}
54
Colin Crossae887032017-10-23 17:16:14 -070055type ModuleBuildParams BuildParams
56
Colin Crossf6566ed2015-03-24 11:13:38 -070057type androidBaseContext interface {
Colin Crossa1ad8d12016-06-01 17:09:44 -070058 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -070059 TargetPrimary() bool
Colin Crossf6566ed2015-03-24 11:13:38 -070060 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -070061 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -070062 Host() bool
63 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -070064 Darwin() bool
Colin Cross3edeee12017-04-04 12:59:48 -070065 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -070066 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -070067 PrimaryArch() bool
Jiyong Park2db76922017-11-08 16:03:48 +090068 Platform() bool
69 DeviceSpecific() bool
70 SocSpecific() bool
71 ProductSpecific() bool
Colin Cross1332b002015-04-07 17:11:30 -070072 AConfig() Config
Colin Cross9272ade2016-08-17 15:24:12 -070073 DeviceConfig() DeviceConfig
Colin Crossf6566ed2015-03-24 11:13:38 -070074}
75
Colin Cross635c3b02016-05-18 15:37:25 -070076type BaseContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -080077 BaseModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -070078 androidBaseContext
79}
80
Colin Crossaabf6792017-11-29 00:27:14 -080081// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
82// a Config instead of an interface{}.
83type BaseModuleContext interface {
84 ModuleName() string
85 ModuleDir() string
86 Config() Config
87
88 ContainsProperty(name string) bool
89 Errorf(pos scanner.Position, fmt string, args ...interface{})
90 ModuleErrorf(fmt string, args ...interface{})
91 PropertyErrorf(property, fmt string, args ...interface{})
92 Failed() bool
93
94 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
95 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
96 // builder whenever a file matching the pattern as added or removed, without rerunning if a
97 // file that does not match the pattern is added to a searched directory.
98 GlobWithDeps(pattern string, excludes []string) ([]string, error)
99
100 Fs() pathtools.FileSystem
101 AddNinjaFileDeps(deps ...string)
102}
103
Colin Cross635c3b02016-05-18 15:37:25 -0700104type ModuleContext interface {
Colin Crossf6566ed2015-03-24 11:13:38 -0700105 androidBaseContext
Colin Crossaabf6792017-11-29 00:27:14 -0800106 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800107
Colin Crossae887032017-10-23 17:16:14 -0700108 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800109 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700110
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700111 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800112 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800113 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Colin Crossfaeb7aa2017-02-01 14:12:44 -0800114 ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths
Colin Cross7f19f372016-11-01 11:10:25 -0700115 Glob(globPattern string, excludes []string) Paths
Nan Zhang581fd212018-01-10 16:06:12 -0800116 GlobFiles(globPattern string, excludes []string) Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700117
Colin Cross5c517922017-08-31 12:29:17 -0700118 InstallExecutable(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
119 InstallFile(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
Colin Cross3854a602016-01-11 12:49:11 -0800120 InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700121 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800122
123 AddMissingDependencies(deps []string)
Colin Cross8d8f8e22016-08-03 11:57:50 -0700124
Colin Cross8d8f8e22016-08-03 11:57:50 -0700125 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700126 InstallInSanitizerDir() bool
Nan Zhang6d34b302017-02-04 17:47:46 -0800127
128 RequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700129
130 // android.ModuleContext methods
131 // These are duplicated instead of embedded so that can eventually be wrapped to take an
132 // android.Module instead of a blueprint.Module
133 OtherModuleName(m blueprint.Module) string
134 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
135 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
136
137 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
138 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
139
140 ModuleSubDir() string
141
Colin Cross35143d02017-11-16 00:11:20 -0800142 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700143 VisitDirectDeps(visit func(Module))
Colin Crossee6143c2017-12-30 17:54:27 -0800144 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700145 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
146 VisitDepsDepthFirst(visit func(Module))
147 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
148 WalkDeps(visit func(Module, Module) bool)
Colin Cross3f68a132017-10-23 17:10:29 -0700149
Colin Cross0875c522017-11-28 17:34:01 -0800150 Variable(pctx PackageContext, name, value string)
151 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700152 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
153 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800154 Build(pctx PackageContext, params BuildParams)
Colin Cross3f68a132017-10-23 17:10:29 -0700155
Colin Cross0875c522017-11-28 17:34:01 -0800156 PrimaryModule() Module
157 FinalModule() Module
158 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700159
160 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800161 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800162}
163
Colin Cross635c3b02016-05-18 15:37:25 -0700164type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800165 blueprint.Module
166
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700167 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
168 // but GenerateAndroidBuildActions also has access to Android-specific information.
169 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700170 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700171
Colin Cross1e676be2016-10-12 14:38:15 -0700172 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800173
Colin Cross635c3b02016-05-18 15:37:25 -0700174 base() *ModuleBase
Dan Willemsen0effe062015-11-30 16:06:01 -0800175 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700176 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800177 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700178 InstallInSanitizerDir() bool
Colin Crossa2f296f2016-11-29 15:16:18 -0800179 SkipInstall()
Jiyong Park374510b2018-03-19 18:23:01 +0900180 ExportedToMake() bool
Colin Cross36242852017-06-23 15:06:31 -0700181
182 AddProperties(props ...interface{})
183 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700184
Colin Crossae887032017-10-23 17:16:14 -0700185 BuildParamsForTests() []BuildParams
Colin Cross3f40fa42015-01-30 17:27:36 -0800186}
187
Colin Crossfc754582016-05-17 16:34:16 -0700188type nameProperties struct {
189 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800190 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700191}
192
193type commonProperties struct {
Colin Crossc77f9d12015-04-02 13:54:39 -0700194 Tags []string
Colin Cross3f40fa42015-01-30 17:27:36 -0800195
Dan Willemsen0effe062015-11-30 16:06:01 -0800196 // emit build rules for this module
197 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800198
Colin Cross7d5136f2015-05-11 13:39:40 -0700199 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800200 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
201 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
202 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700203 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700204
205 Target struct {
206 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700207 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700208 }
209 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700210 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700211 }
212 }
213
214 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800215
Dan Willemsen782a2d12015-12-21 14:55:28 -0800216 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700217 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800218
Colin Cross55708f32017-03-20 13:23:34 -0700219 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700220 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700221
Jiyong Park2db76922017-11-08 16:03:48 +0900222 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
223 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
224 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700225 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700226
Jiyong Park2db76922017-11-08 16:03:48 +0900227 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
228 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
229 Soc_specific *bool
230
231 // whether this module is specific to a device, not only for SoC, but also for off-chip
232 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
233 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
234 // This implies `soc_specific:true`.
235 Device_specific *bool
236
237 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900238 // network operator, etc). When set to true, it is installed into /product (or
239 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900240 Product_specific *bool
241
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700242 // init.rc files to be installed if this module is installed
243 Init_rc []string
244
Steven Moreland57a23d22018-04-04 15:42:19 -0700245 // VINTF manifest fragments to be installed if this module is installed
246 Vintf_fragments []string
247
Chris Wolfe998306e2016-08-15 14:47:23 -0400248 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700249 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400250
Colin Cross5aac3622017-08-31 15:07:09 -0700251 // relative path to a file to include in the list of notices for the device
252 Notice *string
253
Colin Crossa1ad8d12016-06-01 17:09:44 -0700254 // Set by TargetMutator
Colin Cross8b74d172016-09-13 09:59:14 -0700255 CompileTarget Target `blueprint:"mutated"`
256 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800257
258 // Set by InitAndroidModule
259 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700260 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700261
262 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800263
264 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800265}
266
267type hostAndDeviceProperties struct {
Colin Crossa4190c12016-07-12 13:11:25 -0700268 Host_supported *bool
269 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800270}
271
Colin Crossc472d572015-03-17 15:06:21 -0700272type Multilib string
273
274const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800275 MultilibBoth Multilib = "both"
276 MultilibFirst Multilib = "first"
277 MultilibCommon Multilib = "common"
278 MultilibCommonFirst Multilib = "common_first"
279 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700280)
281
Colin Crossa1ad8d12016-06-01 17:09:44 -0700282type HostOrDeviceSupported int
283
284const (
285 _ HostOrDeviceSupported = iota
286 HostSupported
Dan Albertc6345fb2016-10-20 01:36:11 -0700287 HostSupportedNoCross
Colin Crossa1ad8d12016-06-01 17:09:44 -0700288 DeviceSupported
289 HostAndDeviceSupported
290 HostAndDeviceDefault
Dan Willemsen0b24c742016-10-04 15:13:37 -0700291 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700292)
293
Jiyong Park2db76922017-11-08 16:03:48 +0900294type moduleKind int
295
296const (
297 platformModule moduleKind = iota
298 deviceSpecificModule
299 socSpecificModule
300 productSpecificModule
301)
302
303func (k moduleKind) String() string {
304 switch k {
305 case platformModule:
306 return "platform"
307 case deviceSpecificModule:
308 return "device-specific"
309 case socSpecificModule:
310 return "soc-specific"
311 case productSpecificModule:
312 return "product-specific"
313 default:
314 panic(fmt.Errorf("unknown module kind %d", k))
315 }
316}
317
Colin Cross36242852017-06-23 15:06:31 -0700318func InitAndroidModule(m Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800319 base := m.base()
320 base.module = m
Colin Cross5049f022015-03-18 13:28:46 -0700321
Colin Cross36242852017-06-23 15:06:31 -0700322 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700323 &base.nameProperties,
324 &base.commonProperties,
325 &base.variableProperties)
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700326 base.customizableProperties = m.GetProperties()
Colin Cross5049f022015-03-18 13:28:46 -0700327}
328
Colin Cross36242852017-06-23 15:06:31 -0700329func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
330 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700331
332 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800333 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700334 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700335 base.commonProperties.ArchSpecific = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800336
Dan Willemsen218f6562015-07-08 18:13:11 -0700337 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700338 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700339 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800340 }
341
Colin Cross36242852017-06-23 15:06:31 -0700342 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800343}
344
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800345// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800346// modules. It should be included as an anonymous field in every module
347// struct definition. InitAndroidModule should then be called from the module's
348// factory function, and the return values from InitAndroidModule should be
349// returned from the factory function.
350//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800351// The ModuleBase type is responsible for implementing the GenerateBuildActions
352// method to support the blueprint.Module interface. This method will then call
353// the module's GenerateAndroidBuildActions method once for each build variant
354// that is to be built. GenerateAndroidBuildActions is passed a
355// AndroidModuleContext rather than the usual blueprint.ModuleContext.
Colin Cross3f40fa42015-01-30 17:27:36 -0800356// AndroidModuleContext exposes extra functionality specific to the Android build
357// system including details about the particular build variant that is to be
358// generated.
359//
360// For example:
361//
362// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800363// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800364// )
365//
366// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800367// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800368// properties struct {
369// MyProperty string
370// }
371// }
372//
Colin Cross36242852017-06-23 15:06:31 -0700373// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800374// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700375// m.AddProperties(&m.properties)
376// android.InitAndroidModule(m)
377// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800378// }
379//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800380// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800381// // Get the CPU architecture for the current build variant.
382// variantArch := ctx.Arch()
383//
384// // ...
385// }
Colin Cross635c3b02016-05-18 15:37:25 -0700386type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800387 // Putting the curiously recurring thing pointing to the thing that contains
388 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700389 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700390 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800391
Colin Crossfc754582016-05-17 16:34:16 -0700392 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800393 commonProperties commonProperties
Colin Cross7f64b6d2015-07-09 13:57:48 -0700394 variableProperties variableProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800395 hostAndDeviceProperties hostAndDeviceProperties
396 generalProperties []interface{}
Dan Willemsenb1957a52016-06-23 23:44:54 -0700397 archProperties []interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700398 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800399
400 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700401 installFiles Paths
402 checkbuildFiles Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700403
404 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
405 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800406 installTarget WritablePath
407 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700408 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700409
Colin Cross178a5092016-09-13 13:42:32 -0700410 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700411
412 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700413
414 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700415 buildParams []BuildParams
Colin Cross36242852017-06-23 15:06:31 -0700416}
417
418func (a *ModuleBase) AddProperties(props ...interface{}) {
419 a.registerProps = append(a.registerProps, props...)
420}
421
422func (a *ModuleBase) GetProperties() []interface{} {
423 return a.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800424}
425
Colin Crossae887032017-10-23 17:16:14 -0700426func (a *ModuleBase) BuildParamsForTests() []BuildParams {
Colin Crosscec81712017-07-13 14:43:27 -0700427 return a.buildParams
428}
429
Colin Crossce75d2c2016-10-06 16:12:58 -0700430// Name returns the name of the module. It may be overridden by individual module types, for
431// example prebuilts will prepend prebuilt_ to the name.
Colin Crossfc754582016-05-17 16:34:16 -0700432func (a *ModuleBase) Name() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800433 return String(a.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700434}
435
Colin Crossce75d2c2016-10-06 16:12:58 -0700436// BaseModuleName returns the name of the module as specified in the blueprints file.
437func (a *ModuleBase) BaseModuleName() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800438 return String(a.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700439}
440
Colin Cross635c3b02016-05-18 15:37:25 -0700441func (a *ModuleBase) base() *ModuleBase {
Colin Cross3f40fa42015-01-30 17:27:36 -0800442 return a
443}
444
Colin Cross8b74d172016-09-13 09:59:14 -0700445func (a *ModuleBase) SetTarget(target Target, primary bool) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700446 a.commonProperties.CompileTarget = target
Colin Cross8b74d172016-09-13 09:59:14 -0700447 a.commonProperties.CompilePrimary = primary
Colin Crossd3ba0392015-05-07 14:11:29 -0700448}
449
Colin Crossa1ad8d12016-06-01 17:09:44 -0700450func (a *ModuleBase) Target() Target {
451 return a.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800452}
453
Colin Cross8b74d172016-09-13 09:59:14 -0700454func (a *ModuleBase) TargetPrimary() bool {
455 return a.commonProperties.CompilePrimary
456}
457
Colin Crossa1ad8d12016-06-01 17:09:44 -0700458func (a *ModuleBase) Os() OsType {
459 return a.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800460}
461
Colin Cross635c3b02016-05-18 15:37:25 -0700462func (a *ModuleBase) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700463 return a.Os().Class == Host || a.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800464}
465
Colin Cross635c3b02016-05-18 15:37:25 -0700466func (a *ModuleBase) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700467 return a.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800468}
469
Dan Willemsen0b24c742016-10-04 15:13:37 -0700470func (a *ModuleBase) ArchSpecific() bool {
471 return a.commonProperties.ArchSpecific
472}
473
Colin Crossa1ad8d12016-06-01 17:09:44 -0700474func (a *ModuleBase) OsClassSupported() []OsClass {
475 switch a.commonProperties.HostOrDeviceSupported {
476 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700477 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700478 case HostSupportedNoCross:
479 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700480 case DeviceSupported:
481 return []OsClass{Device}
482 case HostAndDeviceSupported:
483 var supported []OsClass
Colin Crossa4190c12016-07-12 13:11:25 -0700484 if Bool(a.hostAndDeviceProperties.Host_supported) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700485 supported = append(supported, Host, HostCross)
486 }
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700487 if a.hostAndDeviceProperties.Device_supported == nil ||
488 *a.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700489 supported = append(supported, Device)
490 }
491 return supported
492 default:
493 return nil
494 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800495}
496
Colin Cross635c3b02016-05-18 15:37:25 -0700497func (a *ModuleBase) DeviceSupported() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800498 return a.commonProperties.HostOrDeviceSupported == DeviceSupported ||
499 a.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700500 (a.hostAndDeviceProperties.Device_supported == nil ||
501 *a.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800502}
503
Colin Cross635c3b02016-05-18 15:37:25 -0700504func (a *ModuleBase) Enabled() bool {
Dan Willemsen0effe062015-11-30 16:06:01 -0800505 if a.commonProperties.Enabled == nil {
Dan Willemsen0a37a2a2016-11-13 10:16:05 -0800506 return !a.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800507 }
Dan Willemsen0effe062015-11-30 16:06:01 -0800508 return *a.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800509}
510
Colin Crossce75d2c2016-10-06 16:12:58 -0700511func (a *ModuleBase) SkipInstall() {
512 a.commonProperties.SkipInstall = true
513}
514
Jiyong Park374510b2018-03-19 18:23:01 +0900515func (a *ModuleBase) ExportedToMake() bool {
516 return a.commonProperties.NamespaceExportedToMake
517}
518
Colin Cross635c3b02016-05-18 15:37:25 -0700519func (a *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700520 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800521
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700522 result := Paths{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800523 ctx.VisitDepsDepthFirstIf(isFileInstaller,
524 func(m blueprint.Module) {
525 fileInstaller := m.(fileInstaller)
526 files := fileInstaller.filesToInstall()
527 result = append(result, files...)
528 })
529
530 return result
531}
532
Colin Cross635c3b02016-05-18 15:37:25 -0700533func (a *ModuleBase) filesToInstall() Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800534 return a.installFiles
535}
536
Colin Cross635c3b02016-05-18 15:37:25 -0700537func (p *ModuleBase) NoAddressSanitizer() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800538 return p.noAddressSanitizer
539}
540
Colin Cross635c3b02016-05-18 15:37:25 -0700541func (p *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800542 return false
543}
544
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700545func (p *ModuleBase) InstallInSanitizerDir() bool {
546 return false
547}
548
Colin Cross0875c522017-11-28 17:34:01 -0800549func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700550 allInstalledFiles := Paths{}
551 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800552 ctx.VisitAllModuleVariants(func(module Module) {
553 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700554 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
555 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800556 })
557
Colin Cross0875c522017-11-28 17:34:01 -0800558 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700559
Jeff Gaston088e29e2017-11-29 16:47:17 -0800560 namespacePrefix := ctx.Namespace().(*Namespace).id
561 if namespacePrefix != "" {
562 namespacePrefix = namespacePrefix + "-"
563 }
564
Colin Cross3f40fa42015-01-30 17:27:36 -0800565 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800566 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800567 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700568 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800569 Output: name,
570 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800571 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700572 })
573 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700574 a.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700575 }
576
577 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800578 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
Colin Cross0875c522017-11-28 17:34:01 -0800579 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700580 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800581 Output: name,
582 Implicits: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700583 })
584 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700585 a.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700586 }
587
588 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800589 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800590 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800591 suffix = "-soong"
592 }
593
Jeff Gaston088e29e2017-11-29 16:47:17 -0800594 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800595 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700596 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800597 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700598 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800599 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700600
601 a.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800602 }
603}
604
Jiyong Park2db76922017-11-08 16:03:48 +0900605func determineModuleKind(a *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
606 var socSpecific = Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
607 var deviceSpecific = Bool(a.commonProperties.Device_specific)
608 var productSpecific = Bool(a.commonProperties.Product_specific)
609
610 if ((socSpecific || deviceSpecific) && productSpecific) || (socSpecific && deviceSpecific) {
611 msg := "conflicting value set here"
612 if productSpecific {
613 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
614 if deviceSpecific {
615 ctx.PropertyErrorf("device_specific", msg)
616 }
617 } else {
618 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
619 }
620 if Bool(a.commonProperties.Vendor) {
621 ctx.PropertyErrorf("vendor", msg)
622 }
623 if Bool(a.commonProperties.Proprietary) {
624 ctx.PropertyErrorf("proprietary", msg)
625 }
626 if Bool(a.commonProperties.Soc_specific) {
627 ctx.PropertyErrorf("soc_specific", msg)
628 }
629 }
630
631 if productSpecific {
632 return productSpecificModule
633 } else if deviceSpecific {
634 return deviceSpecificModule
635 } else if socSpecific {
636 return socSpecificModule
637 } else {
638 return platformModule
639 }
640}
641
Colin Cross635c3b02016-05-18 15:37:25 -0700642func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
Colin Cross6362e272015-10-29 15:25:03 -0700643 return androidBaseContextImpl{
Colin Cross8b74d172016-09-13 09:59:14 -0700644 target: a.commonProperties.CompileTarget,
645 targetPrimary: a.commonProperties.CompilePrimary,
Jiyong Park2db76922017-11-08 16:03:48 +0900646 kind: determineModuleKind(a, ctx),
Colin Cross8b74d172016-09-13 09:59:14 -0700647 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -0800648 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800649}
650
Colin Cross0875c522017-11-28 17:34:01 -0800651func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
652 ctx := &androidModuleContext{
Colin Cross8d8f8e22016-08-03 11:57:50 -0700653 module: a.module,
Colin Cross0875c522017-11-28 17:34:01 -0800654 ModuleContext: blueprintCtx,
655 androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx),
656 installDeps: a.computeInstallDeps(blueprintCtx),
Colin Cross6362e272015-10-29 15:25:03 -0700657 installFiles: a.installFiles,
Colin Cross0875c522017-11-28 17:34:01 -0800658 missingDeps: blueprintCtx.GetMissingDependencies(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 }
660
Colin Cross67a5c132017-05-09 13:45:28 -0700661 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
662 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -0800663 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
664 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -0700665 }
Colin Cross0875c522017-11-28 17:34:01 -0800666 if !ctx.PrimaryArch() {
667 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -0700668 }
669
670 ctx.Variable(pctx, "moduleDesc", desc)
671
672 s := ""
673 if len(suffix) > 0 {
674 s = " [" + strings.Join(suffix, " ") + "]"
675 }
676 ctx.Variable(pctx, "moduleDescSuffix", s)
677
Colin Cross9b1d13d2016-09-19 15:18:11 -0700678 if a.Enabled() {
Colin Cross0875c522017-11-28 17:34:01 -0800679 a.module.GenerateAndroidBuildActions(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -0700680 if ctx.Failed() {
681 return
682 }
683
Colin Cross0875c522017-11-28 17:34:01 -0800684 a.installFiles = append(a.installFiles, ctx.installFiles...)
685 a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800686 }
687
Colin Cross9b1d13d2016-09-19 15:18:11 -0700688 if a == ctx.FinalModule().(Module).base() {
689 a.generateModuleTarget(ctx)
690 if ctx.Failed() {
691 return
692 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800693 }
Colin Crosscec81712017-07-13 14:43:27 -0700694
Colin Cross0875c522017-11-28 17:34:01 -0800695 a.buildParams = ctx.buildParams
Colin Cross3f40fa42015-01-30 17:27:36 -0800696}
697
Colin Crossf6566ed2015-03-24 11:13:38 -0700698type androidBaseContextImpl struct {
Colin Cross8b74d172016-09-13 09:59:14 -0700699 target Target
700 targetPrimary bool
701 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +0900702 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -0700703 config Config
Colin Crossf6566ed2015-03-24 11:13:38 -0700704}
705
Colin Cross3f40fa42015-01-30 17:27:36 -0800706type androidModuleContext struct {
707 blueprint.ModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -0700708 androidBaseContextImpl
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700709 installDeps Paths
710 installFiles Paths
711 checkbuildFiles Paths
Colin Cross6ff51382015-12-17 16:39:19 -0800712 missingDeps []string
Colin Cross8d8f8e22016-08-03 11:57:50 -0700713 module Module
Colin Crosscec81712017-07-13 14:43:27 -0700714
715 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700716 buildParams []BuildParams
Colin Cross6ff51382015-12-17 16:39:19 -0800717}
718
Colin Cross67a5c132017-05-09 13:45:28 -0700719func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
Colin Cross0875c522017-11-28 17:34:01 -0800720 a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700721 Rule: ErrorRule,
722 Description: desc,
723 Outputs: outputs,
724 Optional: true,
Colin Cross6ff51382015-12-17 16:39:19 -0800725 Args: map[string]string{
726 "error": err.Error(),
727 },
728 })
729 return
Colin Cross3f40fa42015-01-30 17:27:36 -0800730}
731
Colin Crossaabf6792017-11-29 00:27:14 -0800732func (a *androidModuleContext) Config() Config {
733 return a.ModuleContext.Config().(Config)
734}
735
Colin Cross0875c522017-11-28 17:34:01 -0800736func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
Colin Crossae887032017-10-23 17:16:14 -0700737 a.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -0800738}
739
Colin Cross0875c522017-11-28 17:34:01 -0800740func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700741 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700742 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -0800743 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -0800744 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700745 Outputs: params.Outputs.Strings(),
746 ImplicitOutputs: params.ImplicitOutputs.Strings(),
747 Inputs: params.Inputs.Strings(),
748 Implicits: params.Implicits.Strings(),
749 OrderOnly: params.OrderOnly.Strings(),
750 Args: params.Args,
751 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700752 }
753
Colin Cross33bfb0a2016-11-21 17:23:08 -0800754 if params.Depfile != nil {
755 bparams.Depfile = params.Depfile.String()
756 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700757 if params.Output != nil {
758 bparams.Outputs = append(bparams.Outputs, params.Output.String())
759 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700760 if params.ImplicitOutput != nil {
761 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
762 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700763 if params.Input != nil {
764 bparams.Inputs = append(bparams.Inputs, params.Input.String())
765 }
766 if params.Implicit != nil {
767 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
768 }
769
Colin Cross0875c522017-11-28 17:34:01 -0800770 return bparams
771}
772
773func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
774 a.ModuleContext.Variable(pctx.PackageContext, name, value)
775}
776
777func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
778 argNames ...string) blueprint.Rule {
779
780 return a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...)
781}
782
783func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) {
784 if a.config.captureBuild {
785 a.buildParams = append(a.buildParams, params)
786 }
787
788 bparams := convertBuildParams(params)
789
790 if bparams.Description != "" {
791 bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
792 }
793
Colin Cross6ff51382015-12-17 16:39:19 -0800794 if a.missingDeps != nil {
Colin Cross67a5c132017-05-09 13:45:28 -0700795 a.ninjaError(bparams.Description, bparams.Outputs,
796 fmt.Errorf("module %s missing dependencies: %s\n",
797 a.ModuleName(), strings.Join(a.missingDeps, ", ")))
Colin Cross6ff51382015-12-17 16:39:19 -0800798 return
799 }
800
Colin Cross0875c522017-11-28 17:34:01 -0800801 a.ModuleContext.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700802}
803
Colin Cross6ff51382015-12-17 16:39:19 -0800804func (a *androidModuleContext) GetMissingDependencies() []string {
805 return a.missingDeps
806}
807
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800808func (a *androidModuleContext) AddMissingDependencies(deps []string) {
809 if deps != nil {
810 a.missingDeps = append(a.missingDeps, deps...)
Colin Crossd11fcda2017-10-23 17:59:01 -0700811 a.missingDeps = FirstUniqueStrings(a.missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800812 }
813}
814
Colin Crossd11fcda2017-10-23 17:59:01 -0700815func (a *androidModuleContext) validateAndroidModule(module blueprint.Module) Module {
816 aModule, _ := module.(Module)
817 if aModule == nil {
818 a.ModuleErrorf("module %q not an android module", a.OtherModuleName(aModule))
819 return nil
820 }
821
822 if !aModule.Enabled() {
Colin Cross6510f912017-11-29 00:27:14 -0800823 if a.Config().AllowMissingDependencies() {
Colin Crossd11fcda2017-10-23 17:59:01 -0700824 a.AddMissingDependencies([]string{a.OtherModuleName(aModule)})
825 } else {
826 a.ModuleErrorf("depends on disabled module %q", a.OtherModuleName(aModule))
827 }
828 return nil
829 }
830
831 return aModule
832}
833
Colin Cross35143d02017-11-16 00:11:20 -0800834func (a *androidModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
835 a.ModuleContext.VisitDirectDeps(visit)
836}
837
Colin Crossd11fcda2017-10-23 17:59:01 -0700838func (a *androidModuleContext) VisitDirectDeps(visit func(Module)) {
839 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
840 if aModule := a.validateAndroidModule(module); aModule != nil {
841 visit(aModule)
842 }
843 })
844}
845
Colin Crossee6143c2017-12-30 17:54:27 -0800846func (a *androidModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
847 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
848 if aModule := a.validateAndroidModule(module); aModule != nil {
849 if a.ModuleContext.OtherModuleDependencyTag(aModule) == tag {
850 visit(aModule)
851 }
852 }
853 })
854}
855
Colin Crossd11fcda2017-10-23 17:59:01 -0700856func (a *androidModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
857 a.ModuleContext.VisitDirectDepsIf(
858 // pred
859 func(module blueprint.Module) bool {
860 if aModule := a.validateAndroidModule(module); aModule != nil {
861 return pred(aModule)
862 } else {
863 return false
864 }
865 },
866 // visit
867 func(module blueprint.Module) {
868 visit(module.(Module))
869 })
870}
871
872func (a *androidModuleContext) VisitDepsDepthFirst(visit func(Module)) {
873 a.ModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
874 if aModule := a.validateAndroidModule(module); aModule != nil {
875 visit(aModule)
876 }
877 })
878}
879
880func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
881 a.ModuleContext.VisitDepsDepthFirstIf(
882 // pred
883 func(module blueprint.Module) bool {
884 if aModule := a.validateAndroidModule(module); aModule != nil {
885 return pred(aModule)
886 } else {
887 return false
888 }
889 },
890 // visit
891 func(module blueprint.Module) {
892 visit(module.(Module))
893 })
894}
895
896func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) {
897 a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
898 childAndroidModule := a.validateAndroidModule(child)
899 parentAndroidModule := a.validateAndroidModule(parent)
900 if childAndroidModule != nil && parentAndroidModule != nil {
901 return visit(childAndroidModule, parentAndroidModule)
902 } else {
903 return false
904 }
905 })
906}
907
Colin Cross0875c522017-11-28 17:34:01 -0800908func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) {
909 a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) {
910 visit(module.(Module))
911 })
912}
913
914func (a *androidModuleContext) PrimaryModule() Module {
915 return a.ModuleContext.PrimaryModule().(Module)
916}
917
918func (a *androidModuleContext) FinalModule() Module {
919 return a.ModuleContext.FinalModule().(Module)
920}
921
Colin Crossa1ad8d12016-06-01 17:09:44 -0700922func (a *androidBaseContextImpl) Target() Target {
923 return a.target
924}
925
Colin Cross8b74d172016-09-13 09:59:14 -0700926func (a *androidBaseContextImpl) TargetPrimary() bool {
927 return a.targetPrimary
928}
929
Colin Crossf6566ed2015-03-24 11:13:38 -0700930func (a *androidBaseContextImpl) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700931 return a.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -0800932}
933
Colin Crossa1ad8d12016-06-01 17:09:44 -0700934func (a *androidBaseContextImpl) Os() OsType {
935 return a.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800936}
937
Colin Crossf6566ed2015-03-24 11:13:38 -0700938func (a *androidBaseContextImpl) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700939 return a.target.Os.Class == Host || a.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -0700940}
941
942func (a *androidBaseContextImpl) Device() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700943 return a.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -0700944}
945
Colin Cross0af4b842015-04-30 16:36:18 -0700946func (a *androidBaseContextImpl) Darwin() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700947 return a.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -0700948}
949
Colin Cross3edeee12017-04-04 12:59:48 -0700950func (a *androidBaseContextImpl) Windows() bool {
951 return a.target.Os == Windows
952}
953
Colin Crossf6566ed2015-03-24 11:13:38 -0700954func (a *androidBaseContextImpl) Debug() bool {
955 return a.debug
956}
957
Colin Cross1e7d3702016-08-24 15:25:47 -0700958func (a *androidBaseContextImpl) PrimaryArch() bool {
Colin Cross67a5c132017-05-09 13:45:28 -0700959 if len(a.config.Targets[a.target.Os.Class]) <= 1 {
960 return true
961 }
Colin Cross1e7d3702016-08-24 15:25:47 -0700962 return a.target.Arch.ArchType == a.config.Targets[a.target.Os.Class][0].Arch.ArchType
963}
964
Colin Cross1332b002015-04-07 17:11:30 -0700965func (a *androidBaseContextImpl) AConfig() Config {
966 return a.config
967}
968
Colin Cross9272ade2016-08-17 15:24:12 -0700969func (a *androidBaseContextImpl) DeviceConfig() DeviceConfig {
970 return DeviceConfig{a.config.deviceConfig}
971}
972
Jiyong Park2db76922017-11-08 16:03:48 +0900973func (a *androidBaseContextImpl) Platform() bool {
974 return a.kind == platformModule
975}
976
977func (a *androidBaseContextImpl) DeviceSpecific() bool {
978 return a.kind == deviceSpecificModule
979}
980
981func (a *androidBaseContextImpl) SocSpecific() bool {
982 return a.kind == socSpecificModule
983}
984
985func (a *androidBaseContextImpl) ProductSpecific() bool {
986 return a.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -0800987}
988
Colin Cross8d8f8e22016-08-03 11:57:50 -0700989func (a *androidModuleContext) InstallInData() bool {
990 return a.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -0800991}
992
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700993func (a *androidModuleContext) InstallInSanitizerDir() bool {
994 return a.module.InstallInSanitizerDir()
995}
996
Colin Cross893d8162017-04-26 17:34:03 -0700997func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool {
998 if a.module.base().commonProperties.SkipInstall {
999 return true
1000 }
1001
1002 if a.Device() {
Colin Cross6510f912017-11-29 00:27:14 -08001003 if a.Config().SkipDeviceInstall() {
Colin Cross893d8162017-04-26 17:34:03 -07001004 return true
1005 }
1006
Colin Cross6510f912017-11-29 00:27:14 -08001007 if a.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07001008 return true
1009 }
1010 }
1011
1012 return false
1013}
1014
Colin Cross5c517922017-08-31 12:29:17 -07001015func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
Colin Crossa2344662016-03-24 13:14:12 -07001016 deps ...Path) OutputPath {
Colin Cross5c517922017-08-31 12:29:17 -07001017 return a.installFile(installPath, name, srcPath, Cp, deps)
1018}
1019
1020func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
1021 deps ...Path) OutputPath {
1022 return a.installFile(installPath, name, srcPath, CpExecutable, deps)
1023}
1024
1025func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path,
1026 rule blueprint.Rule, deps []Path) OutputPath {
Colin Cross35cec122015-04-02 14:37:16 -07001027
Dan Willemsen782a2d12015-12-21 14:55:28 -08001028 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001029 a.module.base().hooks.runInstallHooks(a, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001030
Colin Cross893d8162017-04-26 17:34:03 -07001031 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001032
Dan Willemsen322acaf2016-01-12 23:07:05 -08001033 deps = append(deps, a.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001034
Colin Cross89562dc2016-10-03 17:47:19 -07001035 var implicitDeps, orderOnlyDeps Paths
1036
1037 if a.Host() {
1038 // Installed host modules might be used during the build, depend directly on their
1039 // dependencies so their timestamp is updated whenever their dependency is updated
1040 implicitDeps = deps
1041 } else {
1042 orderOnlyDeps = deps
1043 }
1044
Colin Crossae887032017-10-23 17:16:14 -07001045 a.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001046 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001047 Description: "install " + fullInstallPath.Base(),
1048 Output: fullInstallPath,
1049 Input: srcPath,
1050 Implicits: implicitDeps,
1051 OrderOnly: orderOnlyDeps,
Colin Cross6510f912017-11-29 00:27:14 -08001052 Default: !a.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001053 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001054
Dan Willemsen322acaf2016-01-12 23:07:05 -08001055 a.installFiles = append(a.installFiles, fullInstallPath)
1056 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001057 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001058 return fullInstallPath
1059}
1060
Colin Cross3854a602016-01-11 12:49:11 -08001061func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
1062 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001063 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001064
Colin Cross893d8162017-04-26 17:34:03 -07001065 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001066
Colin Crossae887032017-10-23 17:16:14 -07001067 a.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001068 Rule: Symlink,
1069 Description: "install symlink " + fullInstallPath.Base(),
1070 Output: fullInstallPath,
1071 OrderOnly: Paths{srcPath},
Colin Cross6510f912017-11-29 00:27:14 -08001072 Default: !a.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001073 Args: map[string]string{
1074 "fromPath": srcPath.String(),
1075 },
1076 })
Colin Cross3854a602016-01-11 12:49:11 -08001077
Colin Cross12fc4972016-01-11 12:49:11 -08001078 a.installFiles = append(a.installFiles, fullInstallPath)
1079 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1080 }
Colin Cross3854a602016-01-11 12:49:11 -08001081 return fullInstallPath
1082}
1083
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001084func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
Colin Cross3f40fa42015-01-30 17:27:36 -08001085 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1086}
1087
Colin Cross3f40fa42015-01-30 17:27:36 -08001088type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001089 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001090}
1091
1092func isFileInstaller(m blueprint.Module) bool {
1093 _, ok := m.(fileInstaller)
1094 return ok
1095}
1096
1097func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001098 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001099 return ok
1100}
Colin Crossfce53272015-04-08 11:21:40 -07001101
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001102func findStringInSlice(str string, slice []string) int {
1103 for i, s := range slice {
1104 if s == str {
1105 return i
Colin Crossfce53272015-04-08 11:21:40 -07001106 }
1107 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001108 return -1
1109}
1110
Colin Cross068e0fe2016-12-13 15:23:47 -08001111func SrcIsModule(s string) string {
1112 if len(s) > 1 && s[0] == ':' {
1113 return s[1:]
1114 }
1115 return ""
1116}
1117
1118type sourceDependencyTag struct {
1119 blueprint.BaseDependencyTag
1120}
1121
1122var SourceDepTag sourceDependencyTag
1123
Colin Cross366938f2017-12-11 16:29:02 -08001124// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1125// using ":module" syntax, if any.
Colin Cross068e0fe2016-12-13 15:23:47 -08001126func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
1127 var deps []string
Nan Zhang2439eb72017-04-10 11:27:50 -07001128 set := make(map[string]bool)
1129
Colin Cross068e0fe2016-12-13 15:23:47 -08001130 for _, s := range srcFiles {
1131 if m := SrcIsModule(s); m != "" {
Nan Zhang2439eb72017-04-10 11:27:50 -07001132 if _, found := set[m]; found {
1133 ctx.ModuleErrorf("found source dependency duplicate: %q!", m)
1134 } else {
1135 set[m] = true
1136 deps = append(deps, m)
1137 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001138 }
1139 }
1140
1141 ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
1142}
1143
Colin Cross366938f2017-12-11 16:29:02 -08001144// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1145// using ":module" syntax, if any.
1146func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1147 if s != nil {
1148 if m := SrcIsModule(*s); m != "" {
1149 ctx.AddDependency(ctx.Module(), SourceDepTag, m)
1150 }
1151 }
1152}
1153
Colin Cross068e0fe2016-12-13 15:23:47 -08001154type SourceFileProducer interface {
1155 Srcs() Paths
1156}
1157
1158// Returns a list of paths expanded from globs and modules referenced using ":module" syntax.
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001159// ExtractSourcesDeps must have already been called during the dependency resolution phase.
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001160func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001161 return ctx.ExpandSourcesSubDir(srcFiles, excludes, "")
1162}
1163
Colin Cross366938f2017-12-11 16:29:02 -08001164// Returns a single path expanded from globs and modules referenced using ":module" syntax.
1165// ExtractSourceDeps must have already been called during the dependency resolution phase.
1166func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
1167 srcFiles := ctx.ExpandSourcesSubDir([]string{srcFile}, nil, "")
1168 if len(srcFiles) == 1 {
1169 return srcFiles[0]
1170 } else {
1171 ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop)
1172 return nil
1173 }
1174}
1175
Colin Cross2383f3b2018-02-06 14:40:13 -08001176// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
1177// the srcFile is non-nil.
1178// ExtractSourceDeps must have already been called during the dependency resolution phase.
1179func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
1180 if srcFile != nil {
1181 return OptionalPathForPath(ctx.ExpandSource(*srcFile, prop))
1182 }
1183 return OptionalPath{}
1184}
1185
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001186func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001187 prefix := PathForModuleSrc(ctx).String()
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001188
Colin Cross461b4452018-02-23 09:22:42 -08001189 var expandedExcludes []string
1190 if excludes != nil {
1191 expandedExcludes = make([]string, 0, len(excludes))
1192 }
Nan Zhang27e284d2018-02-09 21:03:53 +00001193
1194 for _, e := range excludes {
1195 if m := SrcIsModule(e); m != "" {
1196 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
1197 if module == nil {
1198 // Error will have been handled by ExtractSourcesDeps
1199 continue
1200 }
1201 if srcProducer, ok := module.(SourceFileProducer); ok {
1202 expandedExcludes = append(expandedExcludes, srcProducer.Srcs().Strings()...)
1203 } else {
1204 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1205 }
1206 } else {
1207 expandedExcludes = append(expandedExcludes, filepath.Join(prefix, e))
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001208 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001209 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001210 expandedSrcFiles := make(Paths, 0, len(srcFiles))
Colin Cross8f101b42015-06-17 15:09:06 -07001211 for _, s := range srcFiles {
Colin Cross068e0fe2016-12-13 15:23:47 -08001212 if m := SrcIsModule(s); m != "" {
1213 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
Colin Cross0617bb82017-10-24 13:01:18 -07001214 if module == nil {
1215 // Error will have been handled by ExtractSourcesDeps
1216 continue
1217 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001218 if srcProducer, ok := module.(SourceFileProducer); ok {
Nan Zhang27e284d2018-02-09 21:03:53 +00001219 moduleSrcs := srcProducer.Srcs()
1220 for _, e := range expandedExcludes {
1221 for j, ms := range moduleSrcs {
1222 if ms.String() == e {
1223 moduleSrcs = append(moduleSrcs[:j], moduleSrcs[j+1:]...)
1224 }
1225 }
1226 }
1227 expandedSrcFiles = append(expandedSrcFiles, moduleSrcs...)
Colin Cross068e0fe2016-12-13 15:23:47 -08001228 } else {
1229 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1230 }
1231 } else if pathtools.IsGlob(s) {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001232 globbedSrcFiles := ctx.GlobFiles(filepath.Join(prefix, s), expandedExcludes)
Colin Cross05a39cb2017-10-09 13:35:19 -07001233 for i, s := range globbedSrcFiles {
1234 globbedSrcFiles[i] = s.(ModuleSrcPath).WithSubDir(ctx, subDir)
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001235 }
Colin Cross05a39cb2017-10-09 13:35:19 -07001236 expandedSrcFiles = append(expandedSrcFiles, globbedSrcFiles...)
Colin Cross8f101b42015-06-17 15:09:06 -07001237 } else {
Nan Zhang27e284d2018-02-09 21:03:53 +00001238 p := PathForModuleSrc(ctx, s).WithSubDir(ctx, subDir)
1239 j := findStringInSlice(p.String(), expandedExcludes)
1240 if j == -1 {
1241 expandedSrcFiles = append(expandedSrcFiles, p)
1242 }
1243
Colin Cross8f101b42015-06-17 15:09:06 -07001244 }
1245 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001246 return expandedSrcFiles
Colin Cross8f101b42015-06-17 15:09:06 -07001247}
1248
Nan Zhang6d34b302017-02-04 17:47:46 -08001249func (ctx *androidModuleContext) RequiredModuleNames() []string {
1250 return ctx.module.base().commonProperties.Required
1251}
1252
Colin Cross7f19f372016-11-01 11:10:25 -07001253func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
1254 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001255 if err != nil {
1256 ctx.ModuleErrorf("glob: %s", err.Error())
1257 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001258 return pathsForModuleSrcFromFullPath(ctx, ret, true)
Colin Crossfce53272015-04-08 11:21:40 -07001259}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001260
Nan Zhang581fd212018-01-10 16:06:12 -08001261func (ctx *androidModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001262 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Nan Zhang581fd212018-01-10 16:06:12 -08001263 if err != nil {
1264 ctx.ModuleErrorf("glob: %s", err.Error())
1265 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001266 return pathsForModuleSrcFromFullPath(ctx, ret, false)
Nan Zhang581fd212018-01-10 16:06:12 -08001267}
1268
Colin Cross463a90e2015-06-17 14:20:06 -07001269func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001270 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001271}
1272
Colin Cross0875c522017-11-28 17:34:01 -08001273func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001274 return &buildTargetSingleton{}
1275}
1276
Colin Cross87d8b562017-04-25 10:01:55 -07001277func parentDir(dir string) string {
1278 dir, _ = filepath.Split(dir)
1279 return filepath.Clean(dir)
1280}
1281
Colin Cross1f8c52b2015-06-16 16:38:17 -07001282type buildTargetSingleton struct{}
1283
Colin Cross0875c522017-11-28 17:34:01 -08001284func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1285 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001286
Colin Cross0875c522017-11-28 17:34:01 -08001287 mmTarget := func(dir string) WritablePath {
1288 return PathForPhony(ctx,
1289 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001290 }
1291
Colin Cross0875c522017-11-28 17:34:01 -08001292 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001293
Colin Cross0875c522017-11-28 17:34:01 -08001294 ctx.VisitAllModules(func(module Module) {
1295 blueprintDir := module.base().blueprintDir
1296 installTarget := module.base().installTarget
1297 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001298
Colin Cross0875c522017-11-28 17:34:01 -08001299 if checkbuildTarget != nil {
1300 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1301 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1302 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001303
Colin Cross0875c522017-11-28 17:34:01 -08001304 if installTarget != nil {
1305 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001306 }
1307 })
1308
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001309 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001310 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001311 suffix = "-soong"
1312 }
1313
Colin Cross1f8c52b2015-06-16 16:38:17 -07001314 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001315 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001316 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001317 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001318 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001319 })
1320
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001321 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001322 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001323 return
1324 }
1325
Colin Cross0875c522017-11-28 17:34:01 -08001326 sortedKeys := func(m map[string]Paths) []string {
1327 s := make([]string, 0, len(m))
1328 for k := range m {
1329 s = append(s, k)
1330 }
1331 sort.Strings(s)
1332 return s
1333 }
1334
Colin Cross87d8b562017-04-25 10:01:55 -07001335 // Ensure ancestor directories are in modulesInDir
1336 dirs := sortedKeys(modulesInDir)
1337 for _, dir := range dirs {
1338 dir := parentDir(dir)
1339 for dir != "." && dir != "/" {
1340 if _, exists := modulesInDir[dir]; exists {
1341 break
1342 }
1343 modulesInDir[dir] = nil
1344 dir = parentDir(dir)
1345 }
1346 }
1347
1348 // Make directories build their direct subdirectories
1349 dirs = sortedKeys(modulesInDir)
1350 for _, dir := range dirs {
1351 p := parentDir(dir)
1352 if p != "." && p != "/" {
1353 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1354 }
1355 }
1356
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001357 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1358 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1359 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001360 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001361 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001362 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001363 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001364 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001365 // HACK: checkbuild should be an optional build, but force it
1366 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001367 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001368 })
1369 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001370
1371 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1372 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001373 ctx.VisitAllModules(func(module Module) {
1374 if module.Enabled() {
1375 os := module.Target().Os
1376 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001377 }
1378 })
1379
Colin Cross0875c522017-11-28 17:34:01 -08001380 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001381 for os, deps := range osDeps {
1382 var className string
1383
1384 switch os.Class {
1385 case Host:
1386 className = "host"
1387 case HostCross:
1388 className = "host-cross"
1389 case Device:
1390 className = "target"
1391 default:
1392 continue
1393 }
1394
Colin Cross0875c522017-11-28 17:34:01 -08001395 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001396 osClass[className] = append(osClass[className], name)
1397
Colin Cross0875c522017-11-28 17:34:01 -08001398 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001399 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001400 Output: name,
1401 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001402 })
1403 }
1404
1405 // Wrap those into host|host-cross|target phony rules
1406 osClasses := sortedKeys(osClass)
1407 for _, class := range osClasses {
Colin Cross0875c522017-11-28 17:34:01 -08001408 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001409 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001410 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001411 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001412 })
1413 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001414}
Colin Crossd779da42015-12-17 18:00:23 -08001415
1416type AndroidModulesByName struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001417 slice []Module
Colin Crossd779da42015-12-17 18:00:23 -08001418 ctx interface {
1419 ModuleName(blueprint.Module) string
1420 ModuleSubDir(blueprint.Module) string
1421 }
1422}
1423
1424func (s AndroidModulesByName) Len() int { return len(s.slice) }
1425func (s AndroidModulesByName) Less(i, j int) bool {
1426 mi, mj := s.slice[i], s.slice[j]
1427 ni, nj := s.ctx.ModuleName(mi), s.ctx.ModuleName(mj)
1428
1429 if ni != nj {
1430 return ni < nj
1431 } else {
1432 return s.ctx.ModuleSubDir(mi) < s.ctx.ModuleSubDir(mj)
1433 }
1434}
1435func (s AndroidModulesByName) Swap(i, j int) { s.slice[i], s.slice[j] = s.slice[j], s.slice[i] }