blob: cb068abba7786a424de5667fb798f58ac96fc6a0 [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 Crossfaeb7aa2017-02-01 14:12:44 -0800113 ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths
Colin Cross7f19f372016-11-01 11:10:25 -0700114 Glob(globPattern string, excludes []string) Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700115
Colin Cross5c517922017-08-31 12:29:17 -0700116 InstallExecutable(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
117 InstallFile(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
Colin Cross3854a602016-01-11 12:49:11 -0800118 InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700119 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800120
121 AddMissingDependencies(deps []string)
Colin Cross8d8f8e22016-08-03 11:57:50 -0700122
Colin Cross8d8f8e22016-08-03 11:57:50 -0700123 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700124 InstallInSanitizerDir() bool
Nan Zhang6d34b302017-02-04 17:47:46 -0800125
126 RequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700127
128 // android.ModuleContext methods
129 // These are duplicated instead of embedded so that can eventually be wrapped to take an
130 // android.Module instead of a blueprint.Module
131 OtherModuleName(m blueprint.Module) string
132 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
133 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
134
135 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
136 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
137
138 ModuleSubDir() string
139
Colin Cross35143d02017-11-16 00:11:20 -0800140 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700141 VisitDirectDeps(visit func(Module))
142 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
143 VisitDepsDepthFirst(visit func(Module))
144 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
145 WalkDeps(visit func(Module, Module) bool)
Colin Cross3f68a132017-10-23 17:10:29 -0700146
Colin Cross0875c522017-11-28 17:34:01 -0800147 Variable(pctx PackageContext, name, value string)
148 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700149 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
150 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800151 Build(pctx PackageContext, params BuildParams)
Colin Cross3f68a132017-10-23 17:10:29 -0700152
Colin Cross0875c522017-11-28 17:34:01 -0800153 PrimaryModule() Module
154 FinalModule() Module
155 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700156
157 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800158 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800159}
160
Colin Cross635c3b02016-05-18 15:37:25 -0700161type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800162 blueprint.Module
163
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700164 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
165 // but GenerateAndroidBuildActions also has access to Android-specific information.
166 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700167 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700168
Colin Cross1e676be2016-10-12 14:38:15 -0700169 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800170
Colin Cross635c3b02016-05-18 15:37:25 -0700171 base() *ModuleBase
Dan Willemsen0effe062015-11-30 16:06:01 -0800172 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700173 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800174 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700175 InstallInSanitizerDir() bool
Colin Crossa2f296f2016-11-29 15:16:18 -0800176 SkipInstall()
Colin Cross36242852017-06-23 15:06:31 -0700177
178 AddProperties(props ...interface{})
179 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700180
Colin Crossae887032017-10-23 17:16:14 -0700181 BuildParamsForTests() []BuildParams
Colin Cross3f40fa42015-01-30 17:27:36 -0800182}
183
Colin Crossfc754582016-05-17 16:34:16 -0700184type nameProperties struct {
185 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800186 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700187}
188
189type commonProperties struct {
Colin Crossc77f9d12015-04-02 13:54:39 -0700190 Tags []string
Colin Cross3f40fa42015-01-30 17:27:36 -0800191
Dan Willemsen0effe062015-11-30 16:06:01 -0800192 // emit build rules for this module
193 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800194
Colin Cross7d5136f2015-05-11 13:39:40 -0700195 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800196 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
197 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
198 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700199 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700200
201 Target struct {
202 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700203 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700204 }
205 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700206 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700207 }
208 }
209
210 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800211
Dan Willemsen782a2d12015-12-21 14:55:28 -0800212 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700213 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800214
Colin Cross55708f32017-03-20 13:23:34 -0700215 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700216 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700217
Jiyong Park2db76922017-11-08 16:03:48 +0900218 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
219 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
220 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700221 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700222
Jiyong Park2db76922017-11-08 16:03:48 +0900223 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
224 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
225 Soc_specific *bool
226
227 // whether this module is specific to a device, not only for SoC, but also for off-chip
228 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
229 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
230 // This implies `soc_specific:true`.
231 Device_specific *bool
232
233 // whether this module is specific to a software configuration of a product (e.g. country,
234 // network operator, etc). When set to true, it is installed into /oem (or /system/oem if
235 // oem partition does not exist).
236 Product_specific *bool
237
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700238 // init.rc files to be installed if this module is installed
239 Init_rc []string
240
Chris Wolfe998306e2016-08-15 14:47:23 -0400241 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700242 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400243
Colin Cross5aac3622017-08-31 15:07:09 -0700244 // relative path to a file to include in the list of notices for the device
245 Notice *string
246
Colin Crossa1ad8d12016-06-01 17:09:44 -0700247 // Set by TargetMutator
Colin Cross8b74d172016-09-13 09:59:14 -0700248 CompileTarget Target `blueprint:"mutated"`
249 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800250
251 // Set by InitAndroidModule
252 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700253 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700254
255 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800256
257 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800258}
259
260type hostAndDeviceProperties struct {
Colin Crossa4190c12016-07-12 13:11:25 -0700261 Host_supported *bool
262 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800263}
264
Colin Crossc472d572015-03-17 15:06:21 -0700265type Multilib string
266
267const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800268 MultilibBoth Multilib = "both"
269 MultilibFirst Multilib = "first"
270 MultilibCommon Multilib = "common"
271 MultilibCommonFirst Multilib = "common_first"
272 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700273)
274
Colin Crossa1ad8d12016-06-01 17:09:44 -0700275type HostOrDeviceSupported int
276
277const (
278 _ HostOrDeviceSupported = iota
279 HostSupported
Dan Albertc6345fb2016-10-20 01:36:11 -0700280 HostSupportedNoCross
Colin Crossa1ad8d12016-06-01 17:09:44 -0700281 DeviceSupported
282 HostAndDeviceSupported
283 HostAndDeviceDefault
Dan Willemsen0b24c742016-10-04 15:13:37 -0700284 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700285)
286
Jiyong Park2db76922017-11-08 16:03:48 +0900287type moduleKind int
288
289const (
290 platformModule moduleKind = iota
291 deviceSpecificModule
292 socSpecificModule
293 productSpecificModule
294)
295
296func (k moduleKind) String() string {
297 switch k {
298 case platformModule:
299 return "platform"
300 case deviceSpecificModule:
301 return "device-specific"
302 case socSpecificModule:
303 return "soc-specific"
304 case productSpecificModule:
305 return "product-specific"
306 default:
307 panic(fmt.Errorf("unknown module kind %d", k))
308 }
309}
310
Colin Cross36242852017-06-23 15:06:31 -0700311func InitAndroidModule(m Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800312 base := m.base()
313 base.module = m
Colin Cross5049f022015-03-18 13:28:46 -0700314
Colin Cross36242852017-06-23 15:06:31 -0700315 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700316 &base.nameProperties,
317 &base.commonProperties,
318 &base.variableProperties)
Colin Cross5049f022015-03-18 13:28:46 -0700319}
320
Colin Cross36242852017-06-23 15:06:31 -0700321func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
322 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700323
324 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800325 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700326 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700327 base.commonProperties.ArchSpecific = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800328
Dan Willemsen218f6562015-07-08 18:13:11 -0700329 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700330 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700331 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800332 }
333
Colin Cross36242852017-06-23 15:06:31 -0700334 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800335}
336
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800337// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800338// modules. It should be included as an anonymous field in every module
339// struct definition. InitAndroidModule should then be called from the module's
340// factory function, and the return values from InitAndroidModule should be
341// returned from the factory function.
342//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800343// The ModuleBase type is responsible for implementing the GenerateBuildActions
344// method to support the blueprint.Module interface. This method will then call
345// the module's GenerateAndroidBuildActions method once for each build variant
346// that is to be built. GenerateAndroidBuildActions is passed a
347// AndroidModuleContext rather than the usual blueprint.ModuleContext.
Colin Cross3f40fa42015-01-30 17:27:36 -0800348// AndroidModuleContext exposes extra functionality specific to the Android build
349// system including details about the particular build variant that is to be
350// generated.
351//
352// For example:
353//
354// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800355// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800356// )
357//
358// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800359// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800360// properties struct {
361// MyProperty string
362// }
363// }
364//
Colin Cross36242852017-06-23 15:06:31 -0700365// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800366// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700367// m.AddProperties(&m.properties)
368// android.InitAndroidModule(m)
369// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800370// }
371//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800372// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800373// // Get the CPU architecture for the current build variant.
374// variantArch := ctx.Arch()
375//
376// // ...
377// }
Colin Cross635c3b02016-05-18 15:37:25 -0700378type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800379 // Putting the curiously recurring thing pointing to the thing that contains
380 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700381 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700382 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800383
Colin Crossfc754582016-05-17 16:34:16 -0700384 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800385 commonProperties commonProperties
Colin Cross7f64b6d2015-07-09 13:57:48 -0700386 variableProperties variableProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800387 hostAndDeviceProperties hostAndDeviceProperties
388 generalProperties []interface{}
Dan Willemsenb1957a52016-06-23 23:44:54 -0700389 archProperties []interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700390 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800391
392 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700393 installFiles Paths
394 checkbuildFiles Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700395
396 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
397 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800398 installTarget WritablePath
399 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700400 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700401
Colin Cross178a5092016-09-13 13:42:32 -0700402 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700403
404 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700405
406 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700407 buildParams []BuildParams
Colin Cross36242852017-06-23 15:06:31 -0700408}
409
410func (a *ModuleBase) AddProperties(props ...interface{}) {
411 a.registerProps = append(a.registerProps, props...)
412}
413
414func (a *ModuleBase) GetProperties() []interface{} {
415 return a.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800416}
417
Colin Crossae887032017-10-23 17:16:14 -0700418func (a *ModuleBase) BuildParamsForTests() []BuildParams {
Colin Crosscec81712017-07-13 14:43:27 -0700419 return a.buildParams
420}
421
Colin Crossce75d2c2016-10-06 16:12:58 -0700422// Name returns the name of the module. It may be overridden by individual module types, for
423// example prebuilts will prepend prebuilt_ to the name.
Colin Crossfc754582016-05-17 16:34:16 -0700424func (a *ModuleBase) Name() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800425 return String(a.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700426}
427
Colin Crossce75d2c2016-10-06 16:12:58 -0700428// BaseModuleName returns the name of the module as specified in the blueprints file.
429func (a *ModuleBase) BaseModuleName() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800430 return String(a.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700431}
432
Colin Cross635c3b02016-05-18 15:37:25 -0700433func (a *ModuleBase) base() *ModuleBase {
Colin Cross3f40fa42015-01-30 17:27:36 -0800434 return a
435}
436
Colin Cross8b74d172016-09-13 09:59:14 -0700437func (a *ModuleBase) SetTarget(target Target, primary bool) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700438 a.commonProperties.CompileTarget = target
Colin Cross8b74d172016-09-13 09:59:14 -0700439 a.commonProperties.CompilePrimary = primary
Colin Crossd3ba0392015-05-07 14:11:29 -0700440}
441
Colin Crossa1ad8d12016-06-01 17:09:44 -0700442func (a *ModuleBase) Target() Target {
443 return a.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800444}
445
Colin Cross8b74d172016-09-13 09:59:14 -0700446func (a *ModuleBase) TargetPrimary() bool {
447 return a.commonProperties.CompilePrimary
448}
449
Colin Crossa1ad8d12016-06-01 17:09:44 -0700450func (a *ModuleBase) Os() OsType {
451 return a.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800452}
453
Colin Cross635c3b02016-05-18 15:37:25 -0700454func (a *ModuleBase) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700455 return a.Os().Class == Host || a.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800456}
457
Colin Cross635c3b02016-05-18 15:37:25 -0700458func (a *ModuleBase) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700459 return a.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800460}
461
Dan Willemsen0b24c742016-10-04 15:13:37 -0700462func (a *ModuleBase) ArchSpecific() bool {
463 return a.commonProperties.ArchSpecific
464}
465
Colin Crossa1ad8d12016-06-01 17:09:44 -0700466func (a *ModuleBase) OsClassSupported() []OsClass {
467 switch a.commonProperties.HostOrDeviceSupported {
468 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700469 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700470 case HostSupportedNoCross:
471 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700472 case DeviceSupported:
473 return []OsClass{Device}
474 case HostAndDeviceSupported:
475 var supported []OsClass
Colin Crossa4190c12016-07-12 13:11:25 -0700476 if Bool(a.hostAndDeviceProperties.Host_supported) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700477 supported = append(supported, Host, HostCross)
478 }
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700479 if a.hostAndDeviceProperties.Device_supported == nil ||
480 *a.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700481 supported = append(supported, Device)
482 }
483 return supported
484 default:
485 return nil
486 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800487}
488
Colin Cross635c3b02016-05-18 15:37:25 -0700489func (a *ModuleBase) DeviceSupported() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800490 return a.commonProperties.HostOrDeviceSupported == DeviceSupported ||
491 a.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700492 (a.hostAndDeviceProperties.Device_supported == nil ||
493 *a.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800494}
495
Colin Cross635c3b02016-05-18 15:37:25 -0700496func (a *ModuleBase) Enabled() bool {
Dan Willemsen0effe062015-11-30 16:06:01 -0800497 if a.commonProperties.Enabled == nil {
Dan Willemsen0a37a2a2016-11-13 10:16:05 -0800498 return !a.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800499 }
Dan Willemsen0effe062015-11-30 16:06:01 -0800500 return *a.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800501}
502
Colin Crossce75d2c2016-10-06 16:12:58 -0700503func (a *ModuleBase) SkipInstall() {
504 a.commonProperties.SkipInstall = true
505}
506
Colin Cross635c3b02016-05-18 15:37:25 -0700507func (a *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700508 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800509
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700510 result := Paths{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800511 ctx.VisitDepsDepthFirstIf(isFileInstaller,
512 func(m blueprint.Module) {
513 fileInstaller := m.(fileInstaller)
514 files := fileInstaller.filesToInstall()
515 result = append(result, files...)
516 })
517
518 return result
519}
520
Colin Cross635c3b02016-05-18 15:37:25 -0700521func (a *ModuleBase) filesToInstall() Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800522 return a.installFiles
523}
524
Colin Cross635c3b02016-05-18 15:37:25 -0700525func (p *ModuleBase) NoAddressSanitizer() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800526 return p.noAddressSanitizer
527}
528
Colin Cross635c3b02016-05-18 15:37:25 -0700529func (p *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800530 return false
531}
532
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700533func (p *ModuleBase) InstallInSanitizerDir() bool {
534 return false
535}
536
Colin Cross0875c522017-11-28 17:34:01 -0800537func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700538 allInstalledFiles := Paths{}
539 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800540 ctx.VisitAllModuleVariants(func(module Module) {
541 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700542 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
543 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800544 })
545
Colin Cross0875c522017-11-28 17:34:01 -0800546 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700547
Jeff Gaston088e29e2017-11-29 16:47:17 -0800548 namespacePrefix := ctx.Namespace().(*Namespace).id
549 if namespacePrefix != "" {
550 namespacePrefix = namespacePrefix + "-"
551 }
552
Colin Cross3f40fa42015-01-30 17:27:36 -0800553 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800554 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800555 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700556 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800557 Output: name,
558 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800559 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700560 })
561 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700562 a.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700563 }
564
565 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800566 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
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: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700571 })
572 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700573 a.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700574 }
575
576 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800577 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800578 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800579 suffix = "-soong"
580 }
581
Jeff Gaston088e29e2017-11-29 16:47:17 -0800582 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800583 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700584 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800585 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700586 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800587 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700588
589 a.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800590 }
591}
592
Jiyong Park2db76922017-11-08 16:03:48 +0900593func determineModuleKind(a *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
594 var socSpecific = Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
595 var deviceSpecific = Bool(a.commonProperties.Device_specific)
596 var productSpecific = Bool(a.commonProperties.Product_specific)
597
598 if ((socSpecific || deviceSpecific) && productSpecific) || (socSpecific && deviceSpecific) {
599 msg := "conflicting value set here"
600 if productSpecific {
601 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
602 if deviceSpecific {
603 ctx.PropertyErrorf("device_specific", msg)
604 }
605 } else {
606 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
607 }
608 if Bool(a.commonProperties.Vendor) {
609 ctx.PropertyErrorf("vendor", msg)
610 }
611 if Bool(a.commonProperties.Proprietary) {
612 ctx.PropertyErrorf("proprietary", msg)
613 }
614 if Bool(a.commonProperties.Soc_specific) {
615 ctx.PropertyErrorf("soc_specific", msg)
616 }
617 }
618
619 if productSpecific {
620 return productSpecificModule
621 } else if deviceSpecific {
622 return deviceSpecificModule
623 } else if socSpecific {
624 return socSpecificModule
625 } else {
626 return platformModule
627 }
628}
629
Colin Cross635c3b02016-05-18 15:37:25 -0700630func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
Colin Cross6362e272015-10-29 15:25:03 -0700631 return androidBaseContextImpl{
Colin Cross8b74d172016-09-13 09:59:14 -0700632 target: a.commonProperties.CompileTarget,
633 targetPrimary: a.commonProperties.CompilePrimary,
Jiyong Park2db76922017-11-08 16:03:48 +0900634 kind: determineModuleKind(a, ctx),
Colin Cross8b74d172016-09-13 09:59:14 -0700635 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -0800636 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800637}
638
Colin Cross0875c522017-11-28 17:34:01 -0800639func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
640 ctx := &androidModuleContext{
Colin Cross8d8f8e22016-08-03 11:57:50 -0700641 module: a.module,
Colin Cross0875c522017-11-28 17:34:01 -0800642 ModuleContext: blueprintCtx,
643 androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx),
644 installDeps: a.computeInstallDeps(blueprintCtx),
Colin Cross6362e272015-10-29 15:25:03 -0700645 installFiles: a.installFiles,
Colin Cross0875c522017-11-28 17:34:01 -0800646 missingDeps: blueprintCtx.GetMissingDependencies(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 }
648
Colin Cross67a5c132017-05-09 13:45:28 -0700649 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
650 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -0800651 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
652 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -0700653 }
Colin Cross0875c522017-11-28 17:34:01 -0800654 if !ctx.PrimaryArch() {
655 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -0700656 }
657
658 ctx.Variable(pctx, "moduleDesc", desc)
659
660 s := ""
661 if len(suffix) > 0 {
662 s = " [" + strings.Join(suffix, " ") + "]"
663 }
664 ctx.Variable(pctx, "moduleDescSuffix", s)
665
Colin Cross9b1d13d2016-09-19 15:18:11 -0700666 if a.Enabled() {
Colin Cross0875c522017-11-28 17:34:01 -0800667 a.module.GenerateAndroidBuildActions(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -0700668 if ctx.Failed() {
669 return
670 }
671
Colin Cross0875c522017-11-28 17:34:01 -0800672 a.installFiles = append(a.installFiles, ctx.installFiles...)
673 a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800674 }
675
Colin Cross9b1d13d2016-09-19 15:18:11 -0700676 if a == ctx.FinalModule().(Module).base() {
677 a.generateModuleTarget(ctx)
678 if ctx.Failed() {
679 return
680 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800681 }
Colin Crosscec81712017-07-13 14:43:27 -0700682
Colin Cross0875c522017-11-28 17:34:01 -0800683 a.buildParams = ctx.buildParams
Colin Cross3f40fa42015-01-30 17:27:36 -0800684}
685
Colin Crossf6566ed2015-03-24 11:13:38 -0700686type androidBaseContextImpl struct {
Colin Cross8b74d172016-09-13 09:59:14 -0700687 target Target
688 targetPrimary bool
689 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +0900690 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -0700691 config Config
Colin Crossf6566ed2015-03-24 11:13:38 -0700692}
693
Colin Cross3f40fa42015-01-30 17:27:36 -0800694type androidModuleContext struct {
695 blueprint.ModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -0700696 androidBaseContextImpl
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700697 installDeps Paths
698 installFiles Paths
699 checkbuildFiles Paths
Colin Cross6ff51382015-12-17 16:39:19 -0800700 missingDeps []string
Colin Cross8d8f8e22016-08-03 11:57:50 -0700701 module Module
Colin Crosscec81712017-07-13 14:43:27 -0700702
703 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700704 buildParams []BuildParams
Colin Cross6ff51382015-12-17 16:39:19 -0800705}
706
Colin Cross67a5c132017-05-09 13:45:28 -0700707func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
Colin Cross0875c522017-11-28 17:34:01 -0800708 a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700709 Rule: ErrorRule,
710 Description: desc,
711 Outputs: outputs,
712 Optional: true,
Colin Cross6ff51382015-12-17 16:39:19 -0800713 Args: map[string]string{
714 "error": err.Error(),
715 },
716 })
717 return
Colin Cross3f40fa42015-01-30 17:27:36 -0800718}
719
Colin Crossaabf6792017-11-29 00:27:14 -0800720func (a *androidModuleContext) Config() Config {
721 return a.ModuleContext.Config().(Config)
722}
723
Colin Cross0875c522017-11-28 17:34:01 -0800724func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
Colin Crossae887032017-10-23 17:16:14 -0700725 a.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -0800726}
727
Colin Cross0875c522017-11-28 17:34:01 -0800728func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700729 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700730 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -0800731 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -0800732 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700733 Outputs: params.Outputs.Strings(),
734 ImplicitOutputs: params.ImplicitOutputs.Strings(),
735 Inputs: params.Inputs.Strings(),
736 Implicits: params.Implicits.Strings(),
737 OrderOnly: params.OrderOnly.Strings(),
738 Args: params.Args,
739 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700740 }
741
Colin Cross33bfb0a2016-11-21 17:23:08 -0800742 if params.Depfile != nil {
743 bparams.Depfile = params.Depfile.String()
744 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700745 if params.Output != nil {
746 bparams.Outputs = append(bparams.Outputs, params.Output.String())
747 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700748 if params.ImplicitOutput != nil {
749 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
750 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700751 if params.Input != nil {
752 bparams.Inputs = append(bparams.Inputs, params.Input.String())
753 }
754 if params.Implicit != nil {
755 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
756 }
757
Colin Cross0875c522017-11-28 17:34:01 -0800758 return bparams
759}
760
761func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
762 a.ModuleContext.Variable(pctx.PackageContext, name, value)
763}
764
765func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
766 argNames ...string) blueprint.Rule {
767
768 return a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...)
769}
770
771func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) {
772 if a.config.captureBuild {
773 a.buildParams = append(a.buildParams, params)
774 }
775
776 bparams := convertBuildParams(params)
777
778 if bparams.Description != "" {
779 bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
780 }
781
Colin Cross6ff51382015-12-17 16:39:19 -0800782 if a.missingDeps != nil {
Colin Cross67a5c132017-05-09 13:45:28 -0700783 a.ninjaError(bparams.Description, bparams.Outputs,
784 fmt.Errorf("module %s missing dependencies: %s\n",
785 a.ModuleName(), strings.Join(a.missingDeps, ", ")))
Colin Cross6ff51382015-12-17 16:39:19 -0800786 return
787 }
788
Colin Cross0875c522017-11-28 17:34:01 -0800789 a.ModuleContext.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700790}
791
Colin Cross6ff51382015-12-17 16:39:19 -0800792func (a *androidModuleContext) GetMissingDependencies() []string {
793 return a.missingDeps
794}
795
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800796func (a *androidModuleContext) AddMissingDependencies(deps []string) {
797 if deps != nil {
798 a.missingDeps = append(a.missingDeps, deps...)
Colin Crossd11fcda2017-10-23 17:59:01 -0700799 a.missingDeps = FirstUniqueStrings(a.missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800800 }
801}
802
Colin Crossd11fcda2017-10-23 17:59:01 -0700803func (a *androidModuleContext) validateAndroidModule(module blueprint.Module) Module {
804 aModule, _ := module.(Module)
805 if aModule == nil {
806 a.ModuleErrorf("module %q not an android module", a.OtherModuleName(aModule))
807 return nil
808 }
809
810 if !aModule.Enabled() {
Colin Cross6510f912017-11-29 00:27:14 -0800811 if a.Config().AllowMissingDependencies() {
Colin Crossd11fcda2017-10-23 17:59:01 -0700812 a.AddMissingDependencies([]string{a.OtherModuleName(aModule)})
813 } else {
814 a.ModuleErrorf("depends on disabled module %q", a.OtherModuleName(aModule))
815 }
816 return nil
817 }
818
819 return aModule
820}
821
Colin Cross35143d02017-11-16 00:11:20 -0800822func (a *androidModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
823 a.ModuleContext.VisitDirectDeps(visit)
824}
825
Colin Crossd11fcda2017-10-23 17:59:01 -0700826func (a *androidModuleContext) VisitDirectDeps(visit func(Module)) {
827 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
828 if aModule := a.validateAndroidModule(module); aModule != nil {
829 visit(aModule)
830 }
831 })
832}
833
834func (a *androidModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
835 a.ModuleContext.VisitDirectDepsIf(
836 // pred
837 func(module blueprint.Module) bool {
838 if aModule := a.validateAndroidModule(module); aModule != nil {
839 return pred(aModule)
840 } else {
841 return false
842 }
843 },
844 // visit
845 func(module blueprint.Module) {
846 visit(module.(Module))
847 })
848}
849
850func (a *androidModuleContext) VisitDepsDepthFirst(visit func(Module)) {
851 a.ModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
852 if aModule := a.validateAndroidModule(module); aModule != nil {
853 visit(aModule)
854 }
855 })
856}
857
858func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
859 a.ModuleContext.VisitDepsDepthFirstIf(
860 // pred
861 func(module blueprint.Module) bool {
862 if aModule := a.validateAndroidModule(module); aModule != nil {
863 return pred(aModule)
864 } else {
865 return false
866 }
867 },
868 // visit
869 func(module blueprint.Module) {
870 visit(module.(Module))
871 })
872}
873
874func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) {
875 a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
876 childAndroidModule := a.validateAndroidModule(child)
877 parentAndroidModule := a.validateAndroidModule(parent)
878 if childAndroidModule != nil && parentAndroidModule != nil {
879 return visit(childAndroidModule, parentAndroidModule)
880 } else {
881 return false
882 }
883 })
884}
885
Colin Cross0875c522017-11-28 17:34:01 -0800886func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) {
887 a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) {
888 visit(module.(Module))
889 })
890}
891
892func (a *androidModuleContext) PrimaryModule() Module {
893 return a.ModuleContext.PrimaryModule().(Module)
894}
895
896func (a *androidModuleContext) FinalModule() Module {
897 return a.ModuleContext.FinalModule().(Module)
898}
899
Colin Crossa1ad8d12016-06-01 17:09:44 -0700900func (a *androidBaseContextImpl) Target() Target {
901 return a.target
902}
903
Colin Cross8b74d172016-09-13 09:59:14 -0700904func (a *androidBaseContextImpl) TargetPrimary() bool {
905 return a.targetPrimary
906}
907
Colin Crossf6566ed2015-03-24 11:13:38 -0700908func (a *androidBaseContextImpl) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700909 return a.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -0800910}
911
Colin Crossa1ad8d12016-06-01 17:09:44 -0700912func (a *androidBaseContextImpl) Os() OsType {
913 return a.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800914}
915
Colin Crossf6566ed2015-03-24 11:13:38 -0700916func (a *androidBaseContextImpl) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700917 return a.target.Os.Class == Host || a.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -0700918}
919
920func (a *androidBaseContextImpl) Device() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700921 return a.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -0700922}
923
Colin Cross0af4b842015-04-30 16:36:18 -0700924func (a *androidBaseContextImpl) Darwin() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700925 return a.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -0700926}
927
Colin Cross3edeee12017-04-04 12:59:48 -0700928func (a *androidBaseContextImpl) Windows() bool {
929 return a.target.Os == Windows
930}
931
Colin Crossf6566ed2015-03-24 11:13:38 -0700932func (a *androidBaseContextImpl) Debug() bool {
933 return a.debug
934}
935
Colin Cross1e7d3702016-08-24 15:25:47 -0700936func (a *androidBaseContextImpl) PrimaryArch() bool {
Colin Cross67a5c132017-05-09 13:45:28 -0700937 if len(a.config.Targets[a.target.Os.Class]) <= 1 {
938 return true
939 }
Colin Cross1e7d3702016-08-24 15:25:47 -0700940 return a.target.Arch.ArchType == a.config.Targets[a.target.Os.Class][0].Arch.ArchType
941}
942
Colin Cross1332b002015-04-07 17:11:30 -0700943func (a *androidBaseContextImpl) AConfig() Config {
944 return a.config
945}
946
Colin Cross9272ade2016-08-17 15:24:12 -0700947func (a *androidBaseContextImpl) DeviceConfig() DeviceConfig {
948 return DeviceConfig{a.config.deviceConfig}
949}
950
Jiyong Park2db76922017-11-08 16:03:48 +0900951func (a *androidBaseContextImpl) Platform() bool {
952 return a.kind == platformModule
953}
954
955func (a *androidBaseContextImpl) DeviceSpecific() bool {
956 return a.kind == deviceSpecificModule
957}
958
959func (a *androidBaseContextImpl) SocSpecific() bool {
960 return a.kind == socSpecificModule
961}
962
963func (a *androidBaseContextImpl) ProductSpecific() bool {
964 return a.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -0800965}
966
Colin Cross8d8f8e22016-08-03 11:57:50 -0700967func (a *androidModuleContext) InstallInData() bool {
968 return a.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -0800969}
970
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700971func (a *androidModuleContext) InstallInSanitizerDir() bool {
972 return a.module.InstallInSanitizerDir()
973}
974
Colin Cross893d8162017-04-26 17:34:03 -0700975func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool {
976 if a.module.base().commonProperties.SkipInstall {
977 return true
978 }
979
980 if a.Device() {
Colin Cross6510f912017-11-29 00:27:14 -0800981 if a.Config().SkipDeviceInstall() {
Colin Cross893d8162017-04-26 17:34:03 -0700982 return true
983 }
984
Colin Cross6510f912017-11-29 00:27:14 -0800985 if a.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -0700986 return true
987 }
988 }
989
990 return false
991}
992
Colin Cross5c517922017-08-31 12:29:17 -0700993func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
Colin Crossa2344662016-03-24 13:14:12 -0700994 deps ...Path) OutputPath {
Colin Cross5c517922017-08-31 12:29:17 -0700995 return a.installFile(installPath, name, srcPath, Cp, deps)
996}
997
998func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
999 deps ...Path) OutputPath {
1000 return a.installFile(installPath, name, srcPath, CpExecutable, deps)
1001}
1002
1003func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path,
1004 rule blueprint.Rule, deps []Path) OutputPath {
Colin Cross35cec122015-04-02 14:37:16 -07001005
Dan Willemsen782a2d12015-12-21 14:55:28 -08001006 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001007 a.module.base().hooks.runInstallHooks(a, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001008
Colin Cross893d8162017-04-26 17:34:03 -07001009 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001010
Dan Willemsen322acaf2016-01-12 23:07:05 -08001011 deps = append(deps, a.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001012
Colin Cross89562dc2016-10-03 17:47:19 -07001013 var implicitDeps, orderOnlyDeps Paths
1014
1015 if a.Host() {
1016 // Installed host modules might be used during the build, depend directly on their
1017 // dependencies so their timestamp is updated whenever their dependency is updated
1018 implicitDeps = deps
1019 } else {
1020 orderOnlyDeps = deps
1021 }
1022
Colin Crossae887032017-10-23 17:16:14 -07001023 a.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001024 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001025 Description: "install " + fullInstallPath.Base(),
1026 Output: fullInstallPath,
1027 Input: srcPath,
1028 Implicits: implicitDeps,
1029 OrderOnly: orderOnlyDeps,
Colin Cross6510f912017-11-29 00:27:14 -08001030 Default: !a.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001031 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001032
Dan Willemsen322acaf2016-01-12 23:07:05 -08001033 a.installFiles = append(a.installFiles, fullInstallPath)
1034 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001035 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001036 return fullInstallPath
1037}
1038
Colin Cross3854a602016-01-11 12:49:11 -08001039func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
1040 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001041 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001042
Colin Cross893d8162017-04-26 17:34:03 -07001043 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001044
Colin Crossae887032017-10-23 17:16:14 -07001045 a.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001046 Rule: Symlink,
1047 Description: "install symlink " + fullInstallPath.Base(),
1048 Output: fullInstallPath,
1049 OrderOnly: Paths{srcPath},
Colin Cross6510f912017-11-29 00:27:14 -08001050 Default: !a.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001051 Args: map[string]string{
1052 "fromPath": srcPath.String(),
1053 },
1054 })
Colin Cross3854a602016-01-11 12:49:11 -08001055
Colin Cross12fc4972016-01-11 12:49:11 -08001056 a.installFiles = append(a.installFiles, fullInstallPath)
1057 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1058 }
Colin Cross3854a602016-01-11 12:49:11 -08001059 return fullInstallPath
1060}
1061
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001062func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
Colin Cross3f40fa42015-01-30 17:27:36 -08001063 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1064}
1065
Colin Cross3f40fa42015-01-30 17:27:36 -08001066type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001067 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001068}
1069
1070func isFileInstaller(m blueprint.Module) bool {
1071 _, ok := m.(fileInstaller)
1072 return ok
1073}
1074
1075func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001076 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001077 return ok
1078}
Colin Crossfce53272015-04-08 11:21:40 -07001079
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001080func findStringInSlice(str string, slice []string) int {
1081 for i, s := range slice {
1082 if s == str {
1083 return i
Colin Crossfce53272015-04-08 11:21:40 -07001084 }
1085 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001086 return -1
1087}
1088
Colin Cross068e0fe2016-12-13 15:23:47 -08001089func SrcIsModule(s string) string {
1090 if len(s) > 1 && s[0] == ':' {
1091 return s[1:]
1092 }
1093 return ""
1094}
1095
1096type sourceDependencyTag struct {
1097 blueprint.BaseDependencyTag
1098}
1099
1100var SourceDepTag sourceDependencyTag
1101
Colin Cross366938f2017-12-11 16:29:02 -08001102// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1103// using ":module" syntax, if any.
Colin Cross068e0fe2016-12-13 15:23:47 -08001104func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
1105 var deps []string
Nan Zhang2439eb72017-04-10 11:27:50 -07001106 set := make(map[string]bool)
1107
Colin Cross068e0fe2016-12-13 15:23:47 -08001108 for _, s := range srcFiles {
1109 if m := SrcIsModule(s); m != "" {
Nan Zhang2439eb72017-04-10 11:27:50 -07001110 if _, found := set[m]; found {
1111 ctx.ModuleErrorf("found source dependency duplicate: %q!", m)
1112 } else {
1113 set[m] = true
1114 deps = append(deps, m)
1115 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001116 }
1117 }
1118
1119 ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
1120}
1121
Colin Cross366938f2017-12-11 16:29:02 -08001122// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1123// using ":module" syntax, if any.
1124func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1125 if s != nil {
1126 if m := SrcIsModule(*s); m != "" {
1127 ctx.AddDependency(ctx.Module(), SourceDepTag, m)
1128 }
1129 }
1130}
1131
Colin Cross068e0fe2016-12-13 15:23:47 -08001132type SourceFileProducer interface {
1133 Srcs() Paths
1134}
1135
1136// Returns a list of paths expanded from globs and modules referenced using ":module" syntax.
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001137// ExtractSourcesDeps must have already been called during the dependency resolution phase.
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001138func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001139 return ctx.ExpandSourcesSubDir(srcFiles, excludes, "")
1140}
1141
Colin Cross366938f2017-12-11 16:29:02 -08001142// Returns a single path expanded from globs and modules referenced using ":module" syntax.
1143// ExtractSourceDeps must have already been called during the dependency resolution phase.
1144func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
1145 srcFiles := ctx.ExpandSourcesSubDir([]string{srcFile}, nil, "")
1146 if len(srcFiles) == 1 {
1147 return srcFiles[0]
1148 } else {
1149 ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop)
1150 return nil
1151 }
1152}
1153
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001154func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001155 prefix := PathForModuleSrc(ctx).String()
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001156
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001157 for i, e := range excludes {
1158 j := findStringInSlice(e, srcFiles)
1159 if j != -1 {
1160 srcFiles = append(srcFiles[:j], srcFiles[j+1:]...)
1161 }
1162
1163 excludes[i] = filepath.Join(prefix, e)
1164 }
1165
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001166 expandedSrcFiles := make(Paths, 0, len(srcFiles))
Colin Cross8f101b42015-06-17 15:09:06 -07001167 for _, s := range srcFiles {
Colin Cross068e0fe2016-12-13 15:23:47 -08001168 if m := SrcIsModule(s); m != "" {
1169 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
Colin Cross0617bb82017-10-24 13:01:18 -07001170 if module == nil {
1171 // Error will have been handled by ExtractSourcesDeps
1172 continue
1173 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001174 if srcProducer, ok := module.(SourceFileProducer); ok {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001175 expandedSrcFiles = append(expandedSrcFiles, srcProducer.Srcs()...)
Colin Cross068e0fe2016-12-13 15:23:47 -08001176 } else {
1177 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1178 }
1179 } else if pathtools.IsGlob(s) {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001180 globbedSrcFiles := ctx.Glob(filepath.Join(prefix, s), excludes)
Colin Cross05a39cb2017-10-09 13:35:19 -07001181 for i, s := range globbedSrcFiles {
1182 globbedSrcFiles[i] = s.(ModuleSrcPath).WithSubDir(ctx, subDir)
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001183 }
Colin Cross05a39cb2017-10-09 13:35:19 -07001184 expandedSrcFiles = append(expandedSrcFiles, globbedSrcFiles...)
Colin Cross8f101b42015-06-17 15:09:06 -07001185 } else {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001186 s := PathForModuleSrc(ctx, s).WithSubDir(ctx, subDir)
1187 expandedSrcFiles = append(expandedSrcFiles, s)
Colin Cross8f101b42015-06-17 15:09:06 -07001188 }
1189 }
1190
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001191 return expandedSrcFiles
Colin Cross8f101b42015-06-17 15:09:06 -07001192}
1193
Nan Zhang6d34b302017-02-04 17:47:46 -08001194func (ctx *androidModuleContext) RequiredModuleNames() []string {
1195 return ctx.module.base().commonProperties.Required
1196}
1197
Colin Cross7f19f372016-11-01 11:10:25 -07001198func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
1199 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001200 if err != nil {
1201 ctx.ModuleErrorf("glob: %s", err.Error())
1202 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001203 return pathsForModuleSrcFromFullPath(ctx, ret)
Colin Crossfce53272015-04-08 11:21:40 -07001204}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001205
Colin Cross463a90e2015-06-17 14:20:06 -07001206func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001207 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001208}
1209
Colin Cross0875c522017-11-28 17:34:01 -08001210func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001211 return &buildTargetSingleton{}
1212}
1213
Colin Cross87d8b562017-04-25 10:01:55 -07001214func parentDir(dir string) string {
1215 dir, _ = filepath.Split(dir)
1216 return filepath.Clean(dir)
1217}
1218
Colin Cross1f8c52b2015-06-16 16:38:17 -07001219type buildTargetSingleton struct{}
1220
Colin Cross0875c522017-11-28 17:34:01 -08001221func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1222 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001223
Colin Cross0875c522017-11-28 17:34:01 -08001224 mmTarget := func(dir string) WritablePath {
1225 return PathForPhony(ctx,
1226 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001227 }
1228
Colin Cross0875c522017-11-28 17:34:01 -08001229 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001230
Colin Cross0875c522017-11-28 17:34:01 -08001231 ctx.VisitAllModules(func(module Module) {
1232 blueprintDir := module.base().blueprintDir
1233 installTarget := module.base().installTarget
1234 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001235
Colin Cross0875c522017-11-28 17:34:01 -08001236 if checkbuildTarget != nil {
1237 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1238 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1239 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001240
Colin Cross0875c522017-11-28 17:34:01 -08001241 if installTarget != nil {
1242 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001243 }
1244 })
1245
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001246 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001247 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001248 suffix = "-soong"
1249 }
1250
Colin Cross1f8c52b2015-06-16 16:38:17 -07001251 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001252 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001253 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001254 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001255 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001256 })
1257
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001258 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001259 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001260 return
1261 }
1262
Colin Cross0875c522017-11-28 17:34:01 -08001263 sortedKeys := func(m map[string]Paths) []string {
1264 s := make([]string, 0, len(m))
1265 for k := range m {
1266 s = append(s, k)
1267 }
1268 sort.Strings(s)
1269 return s
1270 }
1271
Colin Cross87d8b562017-04-25 10:01:55 -07001272 // Ensure ancestor directories are in modulesInDir
1273 dirs := sortedKeys(modulesInDir)
1274 for _, dir := range dirs {
1275 dir := parentDir(dir)
1276 for dir != "." && dir != "/" {
1277 if _, exists := modulesInDir[dir]; exists {
1278 break
1279 }
1280 modulesInDir[dir] = nil
1281 dir = parentDir(dir)
1282 }
1283 }
1284
1285 // Make directories build their direct subdirectories
1286 dirs = sortedKeys(modulesInDir)
1287 for _, dir := range dirs {
1288 p := parentDir(dir)
1289 if p != "." && p != "/" {
1290 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1291 }
1292 }
1293
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001294 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1295 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1296 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001297 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001298 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001299 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001300 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001301 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001302 // HACK: checkbuild should be an optional build, but force it
1303 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001304 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001305 })
1306 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001307
1308 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1309 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001310 ctx.VisitAllModules(func(module Module) {
1311 if module.Enabled() {
1312 os := module.Target().Os
1313 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001314 }
1315 })
1316
Colin Cross0875c522017-11-28 17:34:01 -08001317 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001318 for os, deps := range osDeps {
1319 var className string
1320
1321 switch os.Class {
1322 case Host:
1323 className = "host"
1324 case HostCross:
1325 className = "host-cross"
1326 case Device:
1327 className = "target"
1328 default:
1329 continue
1330 }
1331
Colin Cross0875c522017-11-28 17:34:01 -08001332 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001333 osClass[className] = append(osClass[className], name)
1334
Colin Cross0875c522017-11-28 17:34:01 -08001335 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001336 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001337 Output: name,
1338 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001339 })
1340 }
1341
1342 // Wrap those into host|host-cross|target phony rules
1343 osClasses := sortedKeys(osClass)
1344 for _, class := range osClasses {
Colin Cross0875c522017-11-28 17:34:01 -08001345 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001346 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001347 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001348 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001349 })
1350 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001351}
Colin Crossd779da42015-12-17 18:00:23 -08001352
1353type AndroidModulesByName struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001354 slice []Module
Colin Crossd779da42015-12-17 18:00:23 -08001355 ctx interface {
1356 ModuleName(blueprint.Module) string
1357 ModuleSubDir(blueprint.Module) string
1358 }
1359}
1360
1361func (s AndroidModulesByName) Len() int { return len(s.slice) }
1362func (s AndroidModulesByName) Less(i, j int) bool {
1363 mi, mj := s.slice[i], s.slice[j]
1364 ni, nj := s.ctx.ModuleName(mi), s.ctx.ModuleName(mj)
1365
1366 if ni != nj {
1367 return ni < nj
1368 } else {
1369 return s.ctx.ModuleSubDir(mi) < s.ctx.ModuleSubDir(mj)
1370 }
1371}
1372func (s AndroidModulesByName) Swap(i, j int) { s.slice[i], s.slice[j] = s.slice[j], s.slice[i] }