blob: a011f571782e82ada6d35449bd24be8b0bfd72f2 [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)
Colin Cross5049f022015-03-18 13:28:46 -0700326}
327
Colin Cross36242852017-06-23 15:06:31 -0700328func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
329 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700330
331 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800332 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700333 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700334 base.commonProperties.ArchSpecific = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800335
Dan Willemsen218f6562015-07-08 18:13:11 -0700336 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700337 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700338 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800339 }
340
Colin Cross36242852017-06-23 15:06:31 -0700341 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800342}
343
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800344// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800345// modules. It should be included as an anonymous field in every module
346// struct definition. InitAndroidModule should then be called from the module's
347// factory function, and the return values from InitAndroidModule should be
348// returned from the factory function.
349//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800350// The ModuleBase type is responsible for implementing the GenerateBuildActions
351// method to support the blueprint.Module interface. This method will then call
352// the module's GenerateAndroidBuildActions method once for each build variant
353// that is to be built. GenerateAndroidBuildActions is passed a
354// AndroidModuleContext rather than the usual blueprint.ModuleContext.
Colin Cross3f40fa42015-01-30 17:27:36 -0800355// AndroidModuleContext exposes extra functionality specific to the Android build
356// system including details about the particular build variant that is to be
357// generated.
358//
359// For example:
360//
361// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800362// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800363// )
364//
365// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800366// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800367// properties struct {
368// MyProperty string
369// }
370// }
371//
Colin Cross36242852017-06-23 15:06:31 -0700372// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800373// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700374// m.AddProperties(&m.properties)
375// android.InitAndroidModule(m)
376// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800377// }
378//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800379// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800380// // Get the CPU architecture for the current build variant.
381// variantArch := ctx.Arch()
382//
383// // ...
384// }
Colin Cross635c3b02016-05-18 15:37:25 -0700385type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800386 // Putting the curiously recurring thing pointing to the thing that contains
387 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700388 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700389 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800390
Colin Crossfc754582016-05-17 16:34:16 -0700391 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800392 commonProperties commonProperties
Colin Cross7f64b6d2015-07-09 13:57:48 -0700393 variableProperties variableProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800394 hostAndDeviceProperties hostAndDeviceProperties
395 generalProperties []interface{}
Dan Willemsenb1957a52016-06-23 23:44:54 -0700396 archProperties []interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700397 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800398
399 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700400 installFiles Paths
401 checkbuildFiles Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700402
403 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
404 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800405 installTarget WritablePath
406 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700407 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700408
Colin Cross178a5092016-09-13 13:42:32 -0700409 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700410
411 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700412
413 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700414 buildParams []BuildParams
Colin Cross36242852017-06-23 15:06:31 -0700415}
416
417func (a *ModuleBase) AddProperties(props ...interface{}) {
418 a.registerProps = append(a.registerProps, props...)
419}
420
421func (a *ModuleBase) GetProperties() []interface{} {
422 return a.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800423}
424
Colin Crossae887032017-10-23 17:16:14 -0700425func (a *ModuleBase) BuildParamsForTests() []BuildParams {
Colin Crosscec81712017-07-13 14:43:27 -0700426 return a.buildParams
427}
428
Colin Crossce75d2c2016-10-06 16:12:58 -0700429// Name returns the name of the module. It may be overridden by individual module types, for
430// example prebuilts will prepend prebuilt_ to the name.
Colin Crossfc754582016-05-17 16:34:16 -0700431func (a *ModuleBase) Name() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800432 return String(a.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700433}
434
Colin Crossce75d2c2016-10-06 16:12:58 -0700435// BaseModuleName returns the name of the module as specified in the blueprints file.
436func (a *ModuleBase) BaseModuleName() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800437 return String(a.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700438}
439
Colin Cross635c3b02016-05-18 15:37:25 -0700440func (a *ModuleBase) base() *ModuleBase {
Colin Cross3f40fa42015-01-30 17:27:36 -0800441 return a
442}
443
Colin Cross8b74d172016-09-13 09:59:14 -0700444func (a *ModuleBase) SetTarget(target Target, primary bool) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700445 a.commonProperties.CompileTarget = target
Colin Cross8b74d172016-09-13 09:59:14 -0700446 a.commonProperties.CompilePrimary = primary
Colin Crossd3ba0392015-05-07 14:11:29 -0700447}
448
Colin Crossa1ad8d12016-06-01 17:09:44 -0700449func (a *ModuleBase) Target() Target {
450 return a.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800451}
452
Colin Cross8b74d172016-09-13 09:59:14 -0700453func (a *ModuleBase) TargetPrimary() bool {
454 return a.commonProperties.CompilePrimary
455}
456
Colin Crossa1ad8d12016-06-01 17:09:44 -0700457func (a *ModuleBase) Os() OsType {
458 return a.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800459}
460
Colin Cross635c3b02016-05-18 15:37:25 -0700461func (a *ModuleBase) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700462 return a.Os().Class == Host || a.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800463}
464
Colin Cross635c3b02016-05-18 15:37:25 -0700465func (a *ModuleBase) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700466 return a.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800467}
468
Dan Willemsen0b24c742016-10-04 15:13:37 -0700469func (a *ModuleBase) ArchSpecific() bool {
470 return a.commonProperties.ArchSpecific
471}
472
Colin Crossa1ad8d12016-06-01 17:09:44 -0700473func (a *ModuleBase) OsClassSupported() []OsClass {
474 switch a.commonProperties.HostOrDeviceSupported {
475 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700476 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700477 case HostSupportedNoCross:
478 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700479 case DeviceSupported:
480 return []OsClass{Device}
481 case HostAndDeviceSupported:
482 var supported []OsClass
Colin Crossa4190c12016-07-12 13:11:25 -0700483 if Bool(a.hostAndDeviceProperties.Host_supported) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700484 supported = append(supported, Host, HostCross)
485 }
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700486 if a.hostAndDeviceProperties.Device_supported == nil ||
487 *a.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700488 supported = append(supported, Device)
489 }
490 return supported
491 default:
492 return nil
493 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800494}
495
Colin Cross635c3b02016-05-18 15:37:25 -0700496func (a *ModuleBase) DeviceSupported() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800497 return a.commonProperties.HostOrDeviceSupported == DeviceSupported ||
498 a.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700499 (a.hostAndDeviceProperties.Device_supported == nil ||
500 *a.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800501}
502
Colin Cross635c3b02016-05-18 15:37:25 -0700503func (a *ModuleBase) Enabled() bool {
Dan Willemsen0effe062015-11-30 16:06:01 -0800504 if a.commonProperties.Enabled == nil {
Dan Willemsen0a37a2a2016-11-13 10:16:05 -0800505 return !a.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800506 }
Dan Willemsen0effe062015-11-30 16:06:01 -0800507 return *a.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800508}
509
Colin Crossce75d2c2016-10-06 16:12:58 -0700510func (a *ModuleBase) SkipInstall() {
511 a.commonProperties.SkipInstall = true
512}
513
Jiyong Park374510b2018-03-19 18:23:01 +0900514func (a *ModuleBase) ExportedToMake() bool {
515 return a.commonProperties.NamespaceExportedToMake
516}
517
Colin Cross635c3b02016-05-18 15:37:25 -0700518func (a *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700519 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800520
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700521 result := Paths{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800522 ctx.VisitDepsDepthFirstIf(isFileInstaller,
523 func(m blueprint.Module) {
524 fileInstaller := m.(fileInstaller)
525 files := fileInstaller.filesToInstall()
526 result = append(result, files...)
527 })
528
529 return result
530}
531
Colin Cross635c3b02016-05-18 15:37:25 -0700532func (a *ModuleBase) filesToInstall() Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800533 return a.installFiles
534}
535
Colin Cross635c3b02016-05-18 15:37:25 -0700536func (p *ModuleBase) NoAddressSanitizer() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800537 return p.noAddressSanitizer
538}
539
Colin Cross635c3b02016-05-18 15:37:25 -0700540func (p *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800541 return false
542}
543
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700544func (p *ModuleBase) InstallInSanitizerDir() bool {
545 return false
546}
547
Colin Cross0875c522017-11-28 17:34:01 -0800548func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700549 allInstalledFiles := Paths{}
550 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800551 ctx.VisitAllModuleVariants(func(module Module) {
552 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700553 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
554 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800555 })
556
Colin Cross0875c522017-11-28 17:34:01 -0800557 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700558
Jeff Gaston088e29e2017-11-29 16:47:17 -0800559 namespacePrefix := ctx.Namespace().(*Namespace).id
560 if namespacePrefix != "" {
561 namespacePrefix = namespacePrefix + "-"
562 }
563
Colin Cross3f40fa42015-01-30 17:27:36 -0800564 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800565 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800566 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700567 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800568 Output: name,
569 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800570 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700571 })
572 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700573 a.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700574 }
575
576 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800577 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
Colin Cross0875c522017-11-28 17:34:01 -0800578 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700579 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800580 Output: name,
581 Implicits: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700582 })
583 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700584 a.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700585 }
586
587 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800588 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800589 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800590 suffix = "-soong"
591 }
592
Jeff Gaston088e29e2017-11-29 16:47:17 -0800593 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800594 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700595 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800596 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700597 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800598 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700599
600 a.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800601 }
602}
603
Jiyong Park2db76922017-11-08 16:03:48 +0900604func determineModuleKind(a *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
605 var socSpecific = Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
606 var deviceSpecific = Bool(a.commonProperties.Device_specific)
607 var productSpecific = Bool(a.commonProperties.Product_specific)
608
609 if ((socSpecific || deviceSpecific) && productSpecific) || (socSpecific && deviceSpecific) {
610 msg := "conflicting value set here"
611 if productSpecific {
612 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
613 if deviceSpecific {
614 ctx.PropertyErrorf("device_specific", msg)
615 }
616 } else {
617 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
618 }
619 if Bool(a.commonProperties.Vendor) {
620 ctx.PropertyErrorf("vendor", msg)
621 }
622 if Bool(a.commonProperties.Proprietary) {
623 ctx.PropertyErrorf("proprietary", msg)
624 }
625 if Bool(a.commonProperties.Soc_specific) {
626 ctx.PropertyErrorf("soc_specific", msg)
627 }
628 }
629
630 if productSpecific {
631 return productSpecificModule
632 } else if deviceSpecific {
633 return deviceSpecificModule
634 } else if socSpecific {
635 return socSpecificModule
636 } else {
637 return platformModule
638 }
639}
640
Colin Cross635c3b02016-05-18 15:37:25 -0700641func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
Colin Cross6362e272015-10-29 15:25:03 -0700642 return androidBaseContextImpl{
Colin Cross8b74d172016-09-13 09:59:14 -0700643 target: a.commonProperties.CompileTarget,
644 targetPrimary: a.commonProperties.CompilePrimary,
Jiyong Park2db76922017-11-08 16:03:48 +0900645 kind: determineModuleKind(a, ctx),
Colin Cross8b74d172016-09-13 09:59:14 -0700646 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800648}
649
Colin Cross0875c522017-11-28 17:34:01 -0800650func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
651 ctx := &androidModuleContext{
Colin Cross8d8f8e22016-08-03 11:57:50 -0700652 module: a.module,
Colin Cross0875c522017-11-28 17:34:01 -0800653 ModuleContext: blueprintCtx,
654 androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx),
655 installDeps: a.computeInstallDeps(blueprintCtx),
Colin Cross6362e272015-10-29 15:25:03 -0700656 installFiles: a.installFiles,
Colin Cross0875c522017-11-28 17:34:01 -0800657 missingDeps: blueprintCtx.GetMissingDependencies(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800658 }
659
Colin Cross67a5c132017-05-09 13:45:28 -0700660 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
661 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -0800662 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
663 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -0700664 }
Colin Cross0875c522017-11-28 17:34:01 -0800665 if !ctx.PrimaryArch() {
666 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -0700667 }
668
669 ctx.Variable(pctx, "moduleDesc", desc)
670
671 s := ""
672 if len(suffix) > 0 {
673 s = " [" + strings.Join(suffix, " ") + "]"
674 }
675 ctx.Variable(pctx, "moduleDescSuffix", s)
676
Colin Cross9b1d13d2016-09-19 15:18:11 -0700677 if a.Enabled() {
Colin Cross0875c522017-11-28 17:34:01 -0800678 a.module.GenerateAndroidBuildActions(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -0700679 if ctx.Failed() {
680 return
681 }
682
Colin Cross0875c522017-11-28 17:34:01 -0800683 a.installFiles = append(a.installFiles, ctx.installFiles...)
684 a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800685 }
686
Colin Cross9b1d13d2016-09-19 15:18:11 -0700687 if a == ctx.FinalModule().(Module).base() {
688 a.generateModuleTarget(ctx)
689 if ctx.Failed() {
690 return
691 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800692 }
Colin Crosscec81712017-07-13 14:43:27 -0700693
Colin Cross0875c522017-11-28 17:34:01 -0800694 a.buildParams = ctx.buildParams
Colin Cross3f40fa42015-01-30 17:27:36 -0800695}
696
Colin Crossf6566ed2015-03-24 11:13:38 -0700697type androidBaseContextImpl struct {
Colin Cross8b74d172016-09-13 09:59:14 -0700698 target Target
699 targetPrimary bool
700 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +0900701 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -0700702 config Config
Colin Crossf6566ed2015-03-24 11:13:38 -0700703}
704
Colin Cross3f40fa42015-01-30 17:27:36 -0800705type androidModuleContext struct {
706 blueprint.ModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -0700707 androidBaseContextImpl
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700708 installDeps Paths
709 installFiles Paths
710 checkbuildFiles Paths
Colin Cross6ff51382015-12-17 16:39:19 -0800711 missingDeps []string
Colin Cross8d8f8e22016-08-03 11:57:50 -0700712 module Module
Colin Crosscec81712017-07-13 14:43:27 -0700713
714 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700715 buildParams []BuildParams
Colin Cross6ff51382015-12-17 16:39:19 -0800716}
717
Colin Cross67a5c132017-05-09 13:45:28 -0700718func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
Colin Cross0875c522017-11-28 17:34:01 -0800719 a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700720 Rule: ErrorRule,
721 Description: desc,
722 Outputs: outputs,
723 Optional: true,
Colin Cross6ff51382015-12-17 16:39:19 -0800724 Args: map[string]string{
725 "error": err.Error(),
726 },
727 })
728 return
Colin Cross3f40fa42015-01-30 17:27:36 -0800729}
730
Colin Crossaabf6792017-11-29 00:27:14 -0800731func (a *androidModuleContext) Config() Config {
732 return a.ModuleContext.Config().(Config)
733}
734
Colin Cross0875c522017-11-28 17:34:01 -0800735func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
Colin Crossae887032017-10-23 17:16:14 -0700736 a.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -0800737}
738
Colin Cross0875c522017-11-28 17:34:01 -0800739func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700740 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700741 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -0800742 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -0800743 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700744 Outputs: params.Outputs.Strings(),
745 ImplicitOutputs: params.ImplicitOutputs.Strings(),
746 Inputs: params.Inputs.Strings(),
747 Implicits: params.Implicits.Strings(),
748 OrderOnly: params.OrderOnly.Strings(),
749 Args: params.Args,
750 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700751 }
752
Colin Cross33bfb0a2016-11-21 17:23:08 -0800753 if params.Depfile != nil {
754 bparams.Depfile = params.Depfile.String()
755 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700756 if params.Output != nil {
757 bparams.Outputs = append(bparams.Outputs, params.Output.String())
758 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700759 if params.ImplicitOutput != nil {
760 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
761 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700762 if params.Input != nil {
763 bparams.Inputs = append(bparams.Inputs, params.Input.String())
764 }
765 if params.Implicit != nil {
766 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
767 }
768
Colin Cross0875c522017-11-28 17:34:01 -0800769 return bparams
770}
771
772func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
773 a.ModuleContext.Variable(pctx.PackageContext, name, value)
774}
775
776func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
777 argNames ...string) blueprint.Rule {
778
779 return a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...)
780}
781
782func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) {
783 if a.config.captureBuild {
784 a.buildParams = append(a.buildParams, params)
785 }
786
787 bparams := convertBuildParams(params)
788
789 if bparams.Description != "" {
790 bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
791 }
792
Colin Cross6ff51382015-12-17 16:39:19 -0800793 if a.missingDeps != nil {
Colin Cross67a5c132017-05-09 13:45:28 -0700794 a.ninjaError(bparams.Description, bparams.Outputs,
795 fmt.Errorf("module %s missing dependencies: %s\n",
796 a.ModuleName(), strings.Join(a.missingDeps, ", ")))
Colin Cross6ff51382015-12-17 16:39:19 -0800797 return
798 }
799
Colin Cross0875c522017-11-28 17:34:01 -0800800 a.ModuleContext.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700801}
802
Colin Cross6ff51382015-12-17 16:39:19 -0800803func (a *androidModuleContext) GetMissingDependencies() []string {
804 return a.missingDeps
805}
806
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800807func (a *androidModuleContext) AddMissingDependencies(deps []string) {
808 if deps != nil {
809 a.missingDeps = append(a.missingDeps, deps...)
Colin Crossd11fcda2017-10-23 17:59:01 -0700810 a.missingDeps = FirstUniqueStrings(a.missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800811 }
812}
813
Colin Crossd11fcda2017-10-23 17:59:01 -0700814func (a *androidModuleContext) validateAndroidModule(module blueprint.Module) Module {
815 aModule, _ := module.(Module)
816 if aModule == nil {
817 a.ModuleErrorf("module %q not an android module", a.OtherModuleName(aModule))
818 return nil
819 }
820
821 if !aModule.Enabled() {
Colin Cross6510f912017-11-29 00:27:14 -0800822 if a.Config().AllowMissingDependencies() {
Colin Crossd11fcda2017-10-23 17:59:01 -0700823 a.AddMissingDependencies([]string{a.OtherModuleName(aModule)})
824 } else {
825 a.ModuleErrorf("depends on disabled module %q", a.OtherModuleName(aModule))
826 }
827 return nil
828 }
829
830 return aModule
831}
832
Colin Cross35143d02017-11-16 00:11:20 -0800833func (a *androidModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
834 a.ModuleContext.VisitDirectDeps(visit)
835}
836
Colin Crossd11fcda2017-10-23 17:59:01 -0700837func (a *androidModuleContext) VisitDirectDeps(visit func(Module)) {
838 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
839 if aModule := a.validateAndroidModule(module); aModule != nil {
840 visit(aModule)
841 }
842 })
843}
844
Colin Crossee6143c2017-12-30 17:54:27 -0800845func (a *androidModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
846 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
847 if aModule := a.validateAndroidModule(module); aModule != nil {
848 if a.ModuleContext.OtherModuleDependencyTag(aModule) == tag {
849 visit(aModule)
850 }
851 }
852 })
853}
854
Colin Crossd11fcda2017-10-23 17:59:01 -0700855func (a *androidModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
856 a.ModuleContext.VisitDirectDepsIf(
857 // pred
858 func(module blueprint.Module) bool {
859 if aModule := a.validateAndroidModule(module); aModule != nil {
860 return pred(aModule)
861 } else {
862 return false
863 }
864 },
865 // visit
866 func(module blueprint.Module) {
867 visit(module.(Module))
868 })
869}
870
871func (a *androidModuleContext) VisitDepsDepthFirst(visit func(Module)) {
872 a.ModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
873 if aModule := a.validateAndroidModule(module); aModule != nil {
874 visit(aModule)
875 }
876 })
877}
878
879func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
880 a.ModuleContext.VisitDepsDepthFirstIf(
881 // pred
882 func(module blueprint.Module) bool {
883 if aModule := a.validateAndroidModule(module); aModule != nil {
884 return pred(aModule)
885 } else {
886 return false
887 }
888 },
889 // visit
890 func(module blueprint.Module) {
891 visit(module.(Module))
892 })
893}
894
895func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) {
896 a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
897 childAndroidModule := a.validateAndroidModule(child)
898 parentAndroidModule := a.validateAndroidModule(parent)
899 if childAndroidModule != nil && parentAndroidModule != nil {
900 return visit(childAndroidModule, parentAndroidModule)
901 } else {
902 return false
903 }
904 })
905}
906
Colin Cross0875c522017-11-28 17:34:01 -0800907func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) {
908 a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) {
909 visit(module.(Module))
910 })
911}
912
913func (a *androidModuleContext) PrimaryModule() Module {
914 return a.ModuleContext.PrimaryModule().(Module)
915}
916
917func (a *androidModuleContext) FinalModule() Module {
918 return a.ModuleContext.FinalModule().(Module)
919}
920
Colin Crossa1ad8d12016-06-01 17:09:44 -0700921func (a *androidBaseContextImpl) Target() Target {
922 return a.target
923}
924
Colin Cross8b74d172016-09-13 09:59:14 -0700925func (a *androidBaseContextImpl) TargetPrimary() bool {
926 return a.targetPrimary
927}
928
Colin Crossf6566ed2015-03-24 11:13:38 -0700929func (a *androidBaseContextImpl) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700930 return a.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -0800931}
932
Colin Crossa1ad8d12016-06-01 17:09:44 -0700933func (a *androidBaseContextImpl) Os() OsType {
934 return a.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800935}
936
Colin Crossf6566ed2015-03-24 11:13:38 -0700937func (a *androidBaseContextImpl) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700938 return a.target.Os.Class == Host || a.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -0700939}
940
941func (a *androidBaseContextImpl) Device() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700942 return a.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -0700943}
944
Colin Cross0af4b842015-04-30 16:36:18 -0700945func (a *androidBaseContextImpl) Darwin() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700946 return a.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -0700947}
948
Colin Cross3edeee12017-04-04 12:59:48 -0700949func (a *androidBaseContextImpl) Windows() bool {
950 return a.target.Os == Windows
951}
952
Colin Crossf6566ed2015-03-24 11:13:38 -0700953func (a *androidBaseContextImpl) Debug() bool {
954 return a.debug
955}
956
Colin Cross1e7d3702016-08-24 15:25:47 -0700957func (a *androidBaseContextImpl) PrimaryArch() bool {
Colin Cross67a5c132017-05-09 13:45:28 -0700958 if len(a.config.Targets[a.target.Os.Class]) <= 1 {
959 return true
960 }
Colin Cross1e7d3702016-08-24 15:25:47 -0700961 return a.target.Arch.ArchType == a.config.Targets[a.target.Os.Class][0].Arch.ArchType
962}
963
Colin Cross1332b002015-04-07 17:11:30 -0700964func (a *androidBaseContextImpl) AConfig() Config {
965 return a.config
966}
967
Colin Cross9272ade2016-08-17 15:24:12 -0700968func (a *androidBaseContextImpl) DeviceConfig() DeviceConfig {
969 return DeviceConfig{a.config.deviceConfig}
970}
971
Jiyong Park2db76922017-11-08 16:03:48 +0900972func (a *androidBaseContextImpl) Platform() bool {
973 return a.kind == platformModule
974}
975
976func (a *androidBaseContextImpl) DeviceSpecific() bool {
977 return a.kind == deviceSpecificModule
978}
979
980func (a *androidBaseContextImpl) SocSpecific() bool {
981 return a.kind == socSpecificModule
982}
983
984func (a *androidBaseContextImpl) ProductSpecific() bool {
985 return a.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -0800986}
987
Colin Cross8d8f8e22016-08-03 11:57:50 -0700988func (a *androidModuleContext) InstallInData() bool {
989 return a.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -0800990}
991
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700992func (a *androidModuleContext) InstallInSanitizerDir() bool {
993 return a.module.InstallInSanitizerDir()
994}
995
Colin Cross893d8162017-04-26 17:34:03 -0700996func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool {
997 if a.module.base().commonProperties.SkipInstall {
998 return true
999 }
1000
1001 if a.Device() {
Colin Cross6510f912017-11-29 00:27:14 -08001002 if a.Config().SkipDeviceInstall() {
Colin Cross893d8162017-04-26 17:34:03 -07001003 return true
1004 }
1005
Colin Cross6510f912017-11-29 00:27:14 -08001006 if a.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07001007 return true
1008 }
1009 }
1010
1011 return false
1012}
1013
Colin Cross5c517922017-08-31 12:29:17 -07001014func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
Colin Crossa2344662016-03-24 13:14:12 -07001015 deps ...Path) OutputPath {
Colin Cross5c517922017-08-31 12:29:17 -07001016 return a.installFile(installPath, name, srcPath, Cp, deps)
1017}
1018
1019func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
1020 deps ...Path) OutputPath {
1021 return a.installFile(installPath, name, srcPath, CpExecutable, deps)
1022}
1023
1024func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path,
1025 rule blueprint.Rule, deps []Path) OutputPath {
Colin Cross35cec122015-04-02 14:37:16 -07001026
Dan Willemsen782a2d12015-12-21 14:55:28 -08001027 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001028 a.module.base().hooks.runInstallHooks(a, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001029
Colin Cross893d8162017-04-26 17:34:03 -07001030 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001031
Dan Willemsen322acaf2016-01-12 23:07:05 -08001032 deps = append(deps, a.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001033
Colin Cross89562dc2016-10-03 17:47:19 -07001034 var implicitDeps, orderOnlyDeps Paths
1035
1036 if a.Host() {
1037 // Installed host modules might be used during the build, depend directly on their
1038 // dependencies so their timestamp is updated whenever their dependency is updated
1039 implicitDeps = deps
1040 } else {
1041 orderOnlyDeps = deps
1042 }
1043
Colin Crossae887032017-10-23 17:16:14 -07001044 a.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001045 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001046 Description: "install " + fullInstallPath.Base(),
1047 Output: fullInstallPath,
1048 Input: srcPath,
1049 Implicits: implicitDeps,
1050 OrderOnly: orderOnlyDeps,
Colin Cross6510f912017-11-29 00:27:14 -08001051 Default: !a.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001052 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001053
Dan Willemsen322acaf2016-01-12 23:07:05 -08001054 a.installFiles = append(a.installFiles, fullInstallPath)
1055 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001056 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001057 return fullInstallPath
1058}
1059
Colin Cross3854a602016-01-11 12:49:11 -08001060func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
1061 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001062 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001063
Colin Cross893d8162017-04-26 17:34:03 -07001064 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001065
Colin Crossae887032017-10-23 17:16:14 -07001066 a.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001067 Rule: Symlink,
1068 Description: "install symlink " + fullInstallPath.Base(),
1069 Output: fullInstallPath,
1070 OrderOnly: Paths{srcPath},
Colin Cross6510f912017-11-29 00:27:14 -08001071 Default: !a.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001072 Args: map[string]string{
1073 "fromPath": srcPath.String(),
1074 },
1075 })
Colin Cross3854a602016-01-11 12:49:11 -08001076
Colin Cross12fc4972016-01-11 12:49:11 -08001077 a.installFiles = append(a.installFiles, fullInstallPath)
1078 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1079 }
Colin Cross3854a602016-01-11 12:49:11 -08001080 return fullInstallPath
1081}
1082
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001083func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
Colin Cross3f40fa42015-01-30 17:27:36 -08001084 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1085}
1086
Colin Cross3f40fa42015-01-30 17:27:36 -08001087type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001088 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001089}
1090
1091func isFileInstaller(m blueprint.Module) bool {
1092 _, ok := m.(fileInstaller)
1093 return ok
1094}
1095
1096func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001097 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001098 return ok
1099}
Colin Crossfce53272015-04-08 11:21:40 -07001100
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001101func findStringInSlice(str string, slice []string) int {
1102 for i, s := range slice {
1103 if s == str {
1104 return i
Colin Crossfce53272015-04-08 11:21:40 -07001105 }
1106 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001107 return -1
1108}
1109
Colin Cross068e0fe2016-12-13 15:23:47 -08001110func SrcIsModule(s string) string {
1111 if len(s) > 1 && s[0] == ':' {
1112 return s[1:]
1113 }
1114 return ""
1115}
1116
1117type sourceDependencyTag struct {
1118 blueprint.BaseDependencyTag
1119}
1120
1121var SourceDepTag sourceDependencyTag
1122
Colin Cross366938f2017-12-11 16:29:02 -08001123// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1124// using ":module" syntax, if any.
Colin Cross068e0fe2016-12-13 15:23:47 -08001125func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
1126 var deps []string
Nan Zhang2439eb72017-04-10 11:27:50 -07001127 set := make(map[string]bool)
1128
Colin Cross068e0fe2016-12-13 15:23:47 -08001129 for _, s := range srcFiles {
1130 if m := SrcIsModule(s); m != "" {
Nan Zhang2439eb72017-04-10 11:27:50 -07001131 if _, found := set[m]; found {
1132 ctx.ModuleErrorf("found source dependency duplicate: %q!", m)
1133 } else {
1134 set[m] = true
1135 deps = append(deps, m)
1136 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001137 }
1138 }
1139
1140 ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
1141}
1142
Colin Cross366938f2017-12-11 16:29:02 -08001143// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1144// using ":module" syntax, if any.
1145func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1146 if s != nil {
1147 if m := SrcIsModule(*s); m != "" {
1148 ctx.AddDependency(ctx.Module(), SourceDepTag, m)
1149 }
1150 }
1151}
1152
Colin Cross068e0fe2016-12-13 15:23:47 -08001153type SourceFileProducer interface {
1154 Srcs() Paths
1155}
1156
1157// Returns a list of paths expanded from globs and modules referenced using ":module" syntax.
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001158// ExtractSourcesDeps must have already been called during the dependency resolution phase.
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001159func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001160 return ctx.ExpandSourcesSubDir(srcFiles, excludes, "")
1161}
1162
Colin Cross366938f2017-12-11 16:29:02 -08001163// Returns a single path expanded from globs and modules referenced using ":module" syntax.
1164// ExtractSourceDeps must have already been called during the dependency resolution phase.
1165func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
1166 srcFiles := ctx.ExpandSourcesSubDir([]string{srcFile}, nil, "")
1167 if len(srcFiles) == 1 {
1168 return srcFiles[0]
1169 } else {
1170 ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop)
1171 return nil
1172 }
1173}
1174
Colin Cross2383f3b2018-02-06 14:40:13 -08001175// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
1176// the srcFile is non-nil.
1177// ExtractSourceDeps must have already been called during the dependency resolution phase.
1178func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
1179 if srcFile != nil {
1180 return OptionalPathForPath(ctx.ExpandSource(*srcFile, prop))
1181 }
1182 return OptionalPath{}
1183}
1184
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001185func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001186 prefix := PathForModuleSrc(ctx).String()
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001187
Colin Cross461b4452018-02-23 09:22:42 -08001188 var expandedExcludes []string
1189 if excludes != nil {
1190 expandedExcludes = make([]string, 0, len(excludes))
1191 }
Nan Zhang27e284d2018-02-09 21:03:53 +00001192
1193 for _, e := range excludes {
1194 if m := SrcIsModule(e); m != "" {
1195 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
1196 if module == nil {
1197 // Error will have been handled by ExtractSourcesDeps
1198 continue
1199 }
1200 if srcProducer, ok := module.(SourceFileProducer); ok {
1201 expandedExcludes = append(expandedExcludes, srcProducer.Srcs().Strings()...)
1202 } else {
1203 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1204 }
1205 } else {
1206 expandedExcludes = append(expandedExcludes, filepath.Join(prefix, e))
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001207 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001208 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001209 expandedSrcFiles := make(Paths, 0, len(srcFiles))
Colin Cross8f101b42015-06-17 15:09:06 -07001210 for _, s := range srcFiles {
Colin Cross068e0fe2016-12-13 15:23:47 -08001211 if m := SrcIsModule(s); m != "" {
1212 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
Colin Cross0617bb82017-10-24 13:01:18 -07001213 if module == nil {
1214 // Error will have been handled by ExtractSourcesDeps
1215 continue
1216 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001217 if srcProducer, ok := module.(SourceFileProducer); ok {
Nan Zhang27e284d2018-02-09 21:03:53 +00001218 moduleSrcs := srcProducer.Srcs()
1219 for _, e := range expandedExcludes {
1220 for j, ms := range moduleSrcs {
1221 if ms.String() == e {
1222 moduleSrcs = append(moduleSrcs[:j], moduleSrcs[j+1:]...)
1223 }
1224 }
1225 }
1226 expandedSrcFiles = append(expandedSrcFiles, moduleSrcs...)
Colin Cross068e0fe2016-12-13 15:23:47 -08001227 } else {
1228 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1229 }
1230 } else if pathtools.IsGlob(s) {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001231 globbedSrcFiles := ctx.GlobFiles(filepath.Join(prefix, s), expandedExcludes)
Colin Cross05a39cb2017-10-09 13:35:19 -07001232 for i, s := range globbedSrcFiles {
1233 globbedSrcFiles[i] = s.(ModuleSrcPath).WithSubDir(ctx, subDir)
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001234 }
Colin Cross05a39cb2017-10-09 13:35:19 -07001235 expandedSrcFiles = append(expandedSrcFiles, globbedSrcFiles...)
Colin Cross8f101b42015-06-17 15:09:06 -07001236 } else {
Nan Zhang27e284d2018-02-09 21:03:53 +00001237 p := PathForModuleSrc(ctx, s).WithSubDir(ctx, subDir)
1238 j := findStringInSlice(p.String(), expandedExcludes)
1239 if j == -1 {
1240 expandedSrcFiles = append(expandedSrcFiles, p)
1241 }
1242
Colin Cross8f101b42015-06-17 15:09:06 -07001243 }
1244 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001245 return expandedSrcFiles
Colin Cross8f101b42015-06-17 15:09:06 -07001246}
1247
Nan Zhang6d34b302017-02-04 17:47:46 -08001248func (ctx *androidModuleContext) RequiredModuleNames() []string {
1249 return ctx.module.base().commonProperties.Required
1250}
1251
Colin Cross7f19f372016-11-01 11:10:25 -07001252func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
1253 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001254 if err != nil {
1255 ctx.ModuleErrorf("glob: %s", err.Error())
1256 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001257 return pathsForModuleSrcFromFullPath(ctx, ret, true)
Colin Crossfce53272015-04-08 11:21:40 -07001258}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001259
Nan Zhang581fd212018-01-10 16:06:12 -08001260func (ctx *androidModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001261 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Nan Zhang581fd212018-01-10 16:06:12 -08001262 if err != nil {
1263 ctx.ModuleErrorf("glob: %s", err.Error())
1264 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001265 return pathsForModuleSrcFromFullPath(ctx, ret, false)
Nan Zhang581fd212018-01-10 16:06:12 -08001266}
1267
Colin Cross463a90e2015-06-17 14:20:06 -07001268func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001269 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001270}
1271
Colin Cross0875c522017-11-28 17:34:01 -08001272func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001273 return &buildTargetSingleton{}
1274}
1275
Colin Cross87d8b562017-04-25 10:01:55 -07001276func parentDir(dir string) string {
1277 dir, _ = filepath.Split(dir)
1278 return filepath.Clean(dir)
1279}
1280
Colin Cross1f8c52b2015-06-16 16:38:17 -07001281type buildTargetSingleton struct{}
1282
Colin Cross0875c522017-11-28 17:34:01 -08001283func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1284 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001285
Colin Cross0875c522017-11-28 17:34:01 -08001286 mmTarget := func(dir string) WritablePath {
1287 return PathForPhony(ctx,
1288 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001289 }
1290
Colin Cross0875c522017-11-28 17:34:01 -08001291 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001292
Colin Cross0875c522017-11-28 17:34:01 -08001293 ctx.VisitAllModules(func(module Module) {
1294 blueprintDir := module.base().blueprintDir
1295 installTarget := module.base().installTarget
1296 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001297
Colin Cross0875c522017-11-28 17:34:01 -08001298 if checkbuildTarget != nil {
1299 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1300 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1301 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001302
Colin Cross0875c522017-11-28 17:34:01 -08001303 if installTarget != nil {
1304 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001305 }
1306 })
1307
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001308 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001309 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001310 suffix = "-soong"
1311 }
1312
Colin Cross1f8c52b2015-06-16 16:38:17 -07001313 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001314 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001315 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001316 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001317 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001318 })
1319
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001320 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001321 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001322 return
1323 }
1324
Colin Cross0875c522017-11-28 17:34:01 -08001325 sortedKeys := func(m map[string]Paths) []string {
1326 s := make([]string, 0, len(m))
1327 for k := range m {
1328 s = append(s, k)
1329 }
1330 sort.Strings(s)
1331 return s
1332 }
1333
Colin Cross87d8b562017-04-25 10:01:55 -07001334 // Ensure ancestor directories are in modulesInDir
1335 dirs := sortedKeys(modulesInDir)
1336 for _, dir := range dirs {
1337 dir := parentDir(dir)
1338 for dir != "." && dir != "/" {
1339 if _, exists := modulesInDir[dir]; exists {
1340 break
1341 }
1342 modulesInDir[dir] = nil
1343 dir = parentDir(dir)
1344 }
1345 }
1346
1347 // Make directories build their direct subdirectories
1348 dirs = sortedKeys(modulesInDir)
1349 for _, dir := range dirs {
1350 p := parentDir(dir)
1351 if p != "." && p != "/" {
1352 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1353 }
1354 }
1355
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001356 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1357 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1358 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001359 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001360 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001361 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001362 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001363 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001364 // HACK: checkbuild should be an optional build, but force it
1365 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001366 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001367 })
1368 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001369
1370 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1371 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001372 ctx.VisitAllModules(func(module Module) {
1373 if module.Enabled() {
1374 os := module.Target().Os
1375 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001376 }
1377 })
1378
Colin Cross0875c522017-11-28 17:34:01 -08001379 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001380 for os, deps := range osDeps {
1381 var className string
1382
1383 switch os.Class {
1384 case Host:
1385 className = "host"
1386 case HostCross:
1387 className = "host-cross"
1388 case Device:
1389 className = "target"
1390 default:
1391 continue
1392 }
1393
Colin Cross0875c522017-11-28 17:34:01 -08001394 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001395 osClass[className] = append(osClass[className], name)
1396
Colin Cross0875c522017-11-28 17:34:01 -08001397 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001398 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001399 Output: name,
1400 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001401 })
1402 }
1403
1404 // Wrap those into host|host-cross|target phony rules
1405 osClasses := sortedKeys(osClass)
1406 for _, class := range osClasses {
Colin Cross0875c522017-11-28 17:34:01 -08001407 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001408 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001409 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001410 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001411 })
1412 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001413}
Colin Crossd779da42015-12-17 18:00:23 -08001414
1415type AndroidModulesByName struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001416 slice []Module
Colin Crossd779da42015-12-17 18:00:23 -08001417 ctx interface {
1418 ModuleName(blueprint.Module) string
1419 ModuleSubDir(blueprint.Module) string
1420 }
1421}
1422
1423func (s AndroidModulesByName) Len() int { return len(s.slice) }
1424func (s AndroidModulesByName) Less(i, j int) bool {
1425 mi, mj := s.slice[i], s.slice[j]
1426 ni, nj := s.ctx.ModuleName(mi), s.ctx.ModuleName(mj)
1427
1428 if ni != nj {
1429 return ni < nj
1430 } else {
1431 return s.ctx.ModuleSubDir(mi) < s.ctx.ModuleSubDir(mj)
1432 }
1433}
1434func (s AndroidModulesByName) Swap(i, j int) { s.slice[i], s.slice[j] = s.slice[j], s.slice[i] }