blob: b4f8f1ae001ca2e9354b37c76cfca8cad8d38d42 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
17import (
Colin Cross6ff51382015-12-17 16:39:19 -080018 "fmt"
Alex Lightfb4353d2019-01-17 13:57:45 -080019 "path"
Colin Cross3f40fa42015-01-30 17:27:36 -080020 "path/filepath"
Colin 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 Crossfe4bc362018-09-12 10:02:13 -070026 "github.com/google/blueprint/proptools"
Colin Cross3f40fa42015-01-30 17:27:36 -080027)
28
29var (
30 DeviceSharedLibrary = "shared_library"
31 DeviceStaticLibrary = "static_library"
32 DeviceExecutable = "executable"
33 HostSharedLibrary = "host_shared_library"
34 HostStaticLibrary = "host_static_library"
35 HostExecutable = "host_executable"
36)
37
Colin Crossae887032017-10-23 17:16:14 -070038type BuildParams struct {
Dan Willemsen9f3c5742016-11-03 14:28:31 -070039 Rule blueprint.Rule
Colin Cross33bfb0a2016-11-21 17:23:08 -080040 Deps blueprint.Deps
41 Depfile WritablePath
Colin Cross67a5c132017-05-09 13:45:28 -070042 Description string
Dan Willemsen9f3c5742016-11-03 14:28:31 -070043 Output WritablePath
44 Outputs WritablePaths
45 ImplicitOutput WritablePath
46 ImplicitOutputs WritablePaths
47 Input Path
48 Inputs Paths
49 Implicit Path
50 Implicits Paths
51 OrderOnly Paths
52 Default bool
53 Args map[string]string
Dan Willemsen34cc69e2015-09-23 15:26:20 -070054}
55
Colin Crossae887032017-10-23 17:16:14 -070056type ModuleBuildParams BuildParams
57
Colin Cross0ea8ba82019-06-06 14:33:29 -070058// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
Colin Crossdc35e212019-06-06 16:13:11 -070059// a Config instead of an interface{}, and some methods have been wrapped to use an android.Module
60// instead of a blueprint.Module, plus some extra methods that return Android-specific information
Colin Cross0ea8ba82019-06-06 14:33:29 -070061// about the current module.
62type BaseModuleContext interface {
Colin Crossdc35e212019-06-06 16:13:11 -070063 Module() Module
Colin Cross0ea8ba82019-06-06 14:33:29 -070064 ModuleName() string
65 ModuleDir() string
66 ModuleType() string
67 Config() Config
68
Colin Crossdc35e212019-06-06 16:13:11 -070069 OtherModuleName(m blueprint.Module) string
70 OtherModuleDir(m blueprint.Module) string
71 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
72 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
73 OtherModuleExists(name string) bool
Jiyong Park9e6c2422019-08-09 20:39:45 +090074 OtherModuleType(m blueprint.Module) string
Colin Crossdc35e212019-06-06 16:13:11 -070075
76 GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module
77 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
78 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
79
80 VisitDirectDepsBlueprint(visit func(blueprint.Module))
81 VisitDirectDeps(visit func(Module))
82 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
83 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
84 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
85 VisitDepsDepthFirst(visit func(Module))
86 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
87 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
88 WalkDeps(visit func(Module, Module) bool)
89 WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool)
90 // GetWalkPath is supposed to be called in visit function passed in WalkDeps()
91 // and returns a top-down dependency path from a start module to current child module.
92 GetWalkPath() []Module
93
Colin Cross0ea8ba82019-06-06 14:33:29 -070094 ContainsProperty(name string) bool
95 Errorf(pos scanner.Position, fmt string, args ...interface{})
96 ModuleErrorf(fmt string, args ...interface{})
97 PropertyErrorf(property, fmt string, args ...interface{})
98 Failed() bool
99
100 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
101 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
102 // builder whenever a file matching the pattern as added or removed, without rerunning if a
103 // file that does not match the pattern is added to a searched directory.
104 GlobWithDeps(pattern string, excludes []string) ([]string, error)
105
Colin Crossdc35e212019-06-06 16:13:11 -0700106 Glob(globPattern string, excludes []string) Paths
107 GlobFiles(globPattern string, excludes []string) Paths
108
Colin Cross0ea8ba82019-06-06 14:33:29 -0700109 Fs() pathtools.FileSystem
110 AddNinjaFileDeps(deps ...string)
111
Colin Crossdc35e212019-06-06 16:13:11 -0700112 AddMissingDependencies(missingDeps []string)
113
Colin Crossa1ad8d12016-06-01 17:09:44 -0700114 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -0700115 TargetPrimary() bool
Colin Crossee0bc3b2018-10-02 22:01:37 -0700116 MultiTargets() []Target
Colin Crossf6566ed2015-03-24 11:13:38 -0700117 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -0700118 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -0700119 Host() bool
120 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -0700121 Darwin() bool
Doug Horn21b94272019-01-16 12:06:11 -0800122 Fuchsia() bool
Colin Cross3edeee12017-04-04 12:59:48 -0700123 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700124 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700125 PrimaryArch() bool
Jiyong Park2db76922017-11-08 16:03:48 +0900126 Platform() bool
127 DeviceSpecific() bool
128 SocSpecific() bool
129 ProductSpecific() bool
Justin Yund5f6c822019-06-25 16:47:17 +0900130 SystemExtSpecific() bool
Colin Cross1332b002015-04-07 17:11:30 -0700131 AConfig() Config
Colin Cross9272ade2016-08-17 15:24:12 -0700132 DeviceConfig() DeviceConfig
Colin Crossf6566ed2015-03-24 11:13:38 -0700133}
134
Colin Cross0ea8ba82019-06-06 14:33:29 -0700135// Deprecated: use BaseModuleContext instead
Colin Cross635c3b02016-05-18 15:37:25 -0700136type BaseContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -0800137 BaseModuleContext
Colin Crossaabf6792017-11-29 00:27:14 -0800138}
139
Colin Cross635c3b02016-05-18 15:37:25 -0700140type ModuleContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -0800141 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800142
Colin Crossae887032017-10-23 17:16:14 -0700143 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800144 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700145
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700146 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800147 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800148 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700149
Colin Cross70dda7e2019-10-01 22:05:35 -0700150 InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
151 InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
152 InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath
153 InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700154 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800155
Colin Cross8d8f8e22016-08-03 11:57:50 -0700156 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700157 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700158 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900159 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700160 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700161 InstallBypassMake() bool
Nan Zhang6d34b302017-02-04 17:47:46 -0800162
163 RequiredModuleNames() []string
Sasha Smundakb6d23052019-04-01 18:37:36 -0700164 HostRequiredModuleNames() []string
165 TargetRequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700166
Colin Cross3f68a132017-10-23 17:10:29 -0700167 ModuleSubDir() string
168
Colin Cross0875c522017-11-28 17:34:01 -0800169 Variable(pctx PackageContext, name, value string)
170 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700171 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
172 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800173 Build(pctx PackageContext, params BuildParams)
Colin Cross3f68a132017-10-23 17:10:29 -0700174
Colin Cross0875c522017-11-28 17:34:01 -0800175 PrimaryModule() Module
176 FinalModule() Module
177 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700178
179 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800180 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800181}
182
Colin Cross635c3b02016-05-18 15:37:25 -0700183type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800184 blueprint.Module
185
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700186 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
187 // but GenerateAndroidBuildActions also has access to Android-specific information.
188 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700189 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700190
Colin Cross1e676be2016-10-12 14:38:15 -0700191 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800192
Colin Cross635c3b02016-05-18 15:37:25 -0700193 base() *ModuleBase
Dan Willemsen0effe062015-11-30 16:06:01 -0800194 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700195 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800196 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700197 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700198 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900199 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700200 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700201 InstallBypassMake() bool
Colin Crossa2f296f2016-11-29 15:16:18 -0800202 SkipInstall()
Jiyong Park374510b2018-03-19 18:23:01 +0900203 ExportedToMake() bool
Jiyong Park52818fc2019-03-18 12:01:38 +0900204 NoticeFile() OptionalPath
Colin Cross36242852017-06-23 15:06:31 -0700205
206 AddProperties(props ...interface{})
207 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700208
Colin Crossae887032017-10-23 17:16:14 -0700209 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800210 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800211 VariablesForTests() map[string]string
Paul Duffine2453c72019-05-31 14:00:04 +0100212
Colin Cross9a362232019-07-01 15:32:45 -0700213 // String returns a string that includes the module name and variants for printing during debugging.
214 String() string
215
Paul Duffine2453c72019-05-31 14:00:04 +0100216 // Get the qualified module id for this module.
217 qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName
218
219 // Get information about the properties that can contain visibility rules.
220 visibilityProperties() []visibilityProperty
Paul Duffin63c6e182019-07-24 14:24:38 +0100221
222 // Get the visibility rules that control the visibility of this module.
223 visibility() []string
Paul Duffine2453c72019-05-31 14:00:04 +0100224}
225
226// Qualified id for a module
227type qualifiedModuleName struct {
228 // The package (i.e. directory) in which the module is defined, without trailing /
229 pkg string
230
231 // The name of the module, empty string if package.
232 name string
233}
234
235func (q qualifiedModuleName) String() string {
236 if q.name == "" {
237 return "//" + q.pkg
238 }
239 return "//" + q.pkg + ":" + q.name
240}
241
Paul Duffine484f472019-06-20 16:38:08 +0100242func (q qualifiedModuleName) isRootPackage() bool {
243 return q.pkg == "" && q.name == ""
244}
245
Paul Duffine2453c72019-05-31 14:00:04 +0100246// Get the id for the package containing this module.
247func (q qualifiedModuleName) getContainingPackageId() qualifiedModuleName {
248 pkg := q.pkg
249 if q.name == "" {
Paul Duffine484f472019-06-20 16:38:08 +0100250 if pkg == "" {
251 panic(fmt.Errorf("Cannot get containing package id of root package"))
252 }
253
254 index := strings.LastIndex(pkg, "/")
255 if index == -1 {
256 pkg = ""
257 } else {
258 pkg = pkg[:index]
259 }
Paul Duffine2453c72019-05-31 14:00:04 +0100260 }
261 return newPackageId(pkg)
262}
263
264func newPackageId(pkg string) qualifiedModuleName {
265 // A qualified id for a package module has no name.
266 return qualifiedModuleName{pkg: pkg, name: ""}
Colin Cross3f40fa42015-01-30 17:27:36 -0800267}
268
Colin Crossfc754582016-05-17 16:34:16 -0700269type nameProperties struct {
270 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800271 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700272}
273
274type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800275 // emit build rules for this module
276 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800277
Paul Duffin2e61fa62019-03-28 14:10:57 +0000278 // Controls the visibility of this module to other modules. Allowable values are one or more of
279 // these formats:
280 //
281 // ["//visibility:public"]: Anyone can use this module.
282 // ["//visibility:private"]: Only rules in the module's package (not its subpackages) can use
283 // this module.
284 // ["//some/package:__pkg__", "//other/package:__pkg__"]: Only modules in some/package and
285 // other/package (defined in some/package/*.bp and other/package/*.bp) have access to
286 // this module. Note that sub-packages do not have access to the rule; for example,
287 // //some/package/foo:bar or //other/package/testing:bla wouldn't have access. __pkg__
288 // is a special module and must be used verbatim. It represents all of the modules in the
289 // package.
290 // ["//project:__subpackages__", "//other:__subpackages__"]: Only modules in packages project
291 // or other or in one of their sub-packages have access to this module. For example,
292 // //project:rule, //project/library:lib or //other/testing/internal:munge are allowed
293 // to depend on this rule (but not //independent:evil)
294 // ["//project"]: This is shorthand for ["//project:__pkg__"]
295 // [":__subpackages__"]: This is shorthand for ["//project:__subpackages__"] where
296 // //project is the module's package. e.g. using [":__subpackages__"] in
297 // packages/apps/Settings/Android.bp is equivalent to
298 // //packages/apps/Settings:__subpackages__.
299 // ["//visibility:legacy_public"]: The default visibility, behaves as //visibility:public
300 // for now. It is an error if it is used in a module.
Paul Duffine2453c72019-05-31 14:00:04 +0100301 //
302 // If a module does not specify the `visibility` property then it uses the
303 // `default_visibility` property of the `package` module in the module's package.
304 //
Paul Duffine484f472019-06-20 16:38:08 +0100305 // If a module does not specify the `visibility` property then it uses the
306 // `default_visibility` property of the `package` module in the module's package.
307 //
Paul Duffine2453c72019-05-31 14:00:04 +0100308 // If the `default_visibility` property is not set for the module's package then
Paul Duffine484f472019-06-20 16:38:08 +0100309 // it will use the `default_visibility` of its closest ancestor package for which
310 // a `default_visibility` property is specified.
311 //
312 // If no `default_visibility` property can be found then the module uses the
313 // global default of `//visibility:legacy_public`.
Paul Duffine2453c72019-05-31 14:00:04 +0100314 //
Paul Duffin95d53b52019-07-24 13:45:05 +0100315 // The `visibility` property has no effect on a defaults module although it does
316 // apply to any non-defaults module that uses it. To set the visibility of a
317 // defaults module, use the `defaults_visibility` property on the defaults module;
318 // not to be confused with the `default_visibility` property on the package module.
319 //
Paul Duffin2e61fa62019-03-28 14:10:57 +0000320 // See https://android.googlesource.com/platform/build/soong/+/master/README.md#visibility for
321 // more details.
322 Visibility []string
323
Colin Cross7d5136f2015-05-11 13:39:40 -0700324 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800325 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
326 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
327 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700328 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700329
330 Target struct {
331 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700332 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700333 }
334 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700335 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700336 }
337 }
338
Colin Crossee0bc3b2018-10-02 22:01:37 -0700339 UseTargetVariants bool `blueprint:"mutated"`
340 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800341
Dan Willemsen782a2d12015-12-21 14:55:28 -0800342 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700343 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800344
Colin Cross55708f32017-03-20 13:23:34 -0700345 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700346 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700347
Jiyong Park2db76922017-11-08 16:03:48 +0900348 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
349 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
350 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700351 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700352
Jiyong Park2db76922017-11-08 16:03:48 +0900353 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
354 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
355 Soc_specific *bool
356
357 // whether this module is specific to a device, not only for SoC, but also for off-chip
358 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
359 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
360 // This implies `soc_specific:true`.
361 Device_specific *bool
362
363 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900364 // network operator, etc). When set to true, it is installed into /product (or
365 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900366 Product_specific *bool
367
Justin Yund5f6c822019-06-25 16:47:17 +0900368 // whether this module extends system. When set to true, it is installed into /system_ext
369 // (or /system/system_ext if system_ext partition does not exist).
370 System_ext_specific *bool
371
Jiyong Parkf9332f12018-02-01 00:54:12 +0900372 // Whether this module is installed to recovery partition
373 Recovery *bool
374
dimitry1f33e402019-03-26 12:39:31 +0100375 // Whether this module is built for non-native architecures (also known as native bridge binary)
376 Native_bridge_supported *bool `android:"arch_variant"`
377
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700378 // init.rc files to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800379 Init_rc []string `android:"path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700380
Steven Moreland57a23d22018-04-04 15:42:19 -0700381 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800382 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700383
Chris Wolfe998306e2016-08-15 14:47:23 -0400384 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700385 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400386
Sasha Smundakb6d23052019-04-01 18:37:36 -0700387 // names of other modules to install on host if this module is installed
388 Host_required []string `android:"arch_variant"`
389
390 // names of other modules to install on target if this module is installed
391 Target_required []string `android:"arch_variant"`
392
Colin Cross5aac3622017-08-31 15:07:09 -0700393 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800394 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700395
Dan Willemsen569edc52018-11-19 09:33:29 -0800396 Dist struct {
397 // copy the output of this module to the $DIST_DIR when `dist` is specified on the
398 // command line and any of these targets are also on the command line, or otherwise
399 // built
400 Targets []string `android:"arch_variant"`
401
402 // The name of the output artifact. This defaults to the basename of the output of
403 // the module.
404 Dest *string `android:"arch_variant"`
405
406 // The directory within the dist directory to store the artifact. Defaults to the
407 // top level directory ("").
408 Dir *string `android:"arch_variant"`
409
410 // A suffix to add to the artifact file name (before any extension).
411 Suffix *string `android:"arch_variant"`
412 } `android:"arch_variant"`
413
Colin Crossa1ad8d12016-06-01 17:09:44 -0700414 // Set by TargetMutator
Colin Crossa195f912019-10-16 11:07:20 -0700415 CompileOS OsType `blueprint:"mutated"`
Colin Crossee0bc3b2018-10-02 22:01:37 -0700416 CompileTarget Target `blueprint:"mutated"`
417 CompileMultiTargets []Target `blueprint:"mutated"`
418 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800419
420 // Set by InitAndroidModule
421 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700422 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700423
424 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800425
426 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross6c4f21f2019-06-06 15:41:36 -0700427
428 MissingDeps []string `blueprint:"mutated"`
Colin Cross9a362232019-07-01 15:32:45 -0700429
430 // Name and variant strings stored by mutators to enable Module.String()
431 DebugName string `blueprint:"mutated"`
432 DebugMutators []string `blueprint:"mutated"`
433 DebugVariations []string `blueprint:"mutated"`
Colin Cross7228ecd2019-11-18 16:00:16 -0800434
435 // set by ImageMutator
436 ImageVariation string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800437}
438
439type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800440 // If set to true, build a variant of the module for the host. Defaults to false.
441 Host_supported *bool
442
443 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700444 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800445}
446
Colin Crossc472d572015-03-17 15:06:21 -0700447type Multilib string
448
449const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800450 MultilibBoth Multilib = "both"
451 MultilibFirst Multilib = "first"
452 MultilibCommon Multilib = "common"
453 MultilibCommonFirst Multilib = "common_first"
454 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700455)
456
Colin Crossa1ad8d12016-06-01 17:09:44 -0700457type HostOrDeviceSupported int
458
459const (
460 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700461
462 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700463 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700464
465 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700466 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700467
468 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700469 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700470
471 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700472 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700473
474 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700475 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700476
477 // Nothing is supported. This is not exposed to the user, but used to mark a
478 // host only module as unsupported when the module type is not supported on
479 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700480 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700481)
482
Jiyong Park2db76922017-11-08 16:03:48 +0900483type moduleKind int
484
485const (
486 platformModule moduleKind = iota
487 deviceSpecificModule
488 socSpecificModule
489 productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900490 systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900491)
492
493func (k moduleKind) String() string {
494 switch k {
495 case platformModule:
496 return "platform"
497 case deviceSpecificModule:
498 return "device-specific"
499 case socSpecificModule:
500 return "soc-specific"
501 case productSpecificModule:
502 return "product-specific"
Justin Yund5f6c822019-06-25 16:47:17 +0900503 case systemExtSpecificModule:
504 return "systemext-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900505 default:
506 panic(fmt.Errorf("unknown module kind %d", k))
507 }
508}
509
Colin Cross36242852017-06-23 15:06:31 -0700510func InitAndroidModule(m Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800511 base := m.base()
512 base.module = m
Colin Cross5049f022015-03-18 13:28:46 -0700513
Colin Cross36242852017-06-23 15:06:31 -0700514 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700515 &base.nameProperties,
Colin Cross18c46802019-09-24 22:19:02 -0700516 &base.commonProperties)
517
518 // Allow tests to override the default product variables
519 if base.variableProperties == nil {
520 base.variableProperties = zeroProductVariables
521 }
522
523 // Filter the product variables properties to the ones that exist on this module
524 base.variableProperties = createVariableProperties(m.GetProperties(), base.variableProperties)
525 if base.variableProperties != nil {
526 m.AddProperties(base.variableProperties)
527 }
528
Colin Crossa3a97412019-03-18 12:24:29 -0700529 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700530 base.customizableProperties = m.GetProperties()
Paul Duffin63c6e182019-07-24 14:24:38 +0100531
532 // The default_visibility property needs to be checked and parsed by the visibility module during
533 // its checking and parsing phases.
534 base.primaryVisibilityProperty =
535 newVisibilityProperty("visibility", &base.commonProperties.Visibility)
536 base.visibilityPropertyInfo = []visibilityProperty{base.primaryVisibilityProperty}
Colin Cross5049f022015-03-18 13:28:46 -0700537}
538
Colin Cross36242852017-06-23 15:06:31 -0700539func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
540 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700541
542 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800543 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700544 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700545 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700546 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800547
Dan Willemsen218f6562015-07-08 18:13:11 -0700548 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700549 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700550 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800551 }
552
Colin Cross36242852017-06-23 15:06:31 -0700553 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800554}
555
Colin Crossee0bc3b2018-10-02 22:01:37 -0700556func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
557 InitAndroidArchModule(m, hod, defaultMultilib)
558 m.base().commonProperties.UseTargetVariants = false
559}
560
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800561// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800562// modules. It should be included as an anonymous field in every module
563// struct definition. InitAndroidModule should then be called from the module's
564// factory function, and the return values from InitAndroidModule should be
565// returned from the factory function.
566//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800567// The ModuleBase type is responsible for implementing the GenerateBuildActions
568// method to support the blueprint.Module interface. This method will then call
569// the module's GenerateAndroidBuildActions method once for each build variant
Colin Cross25de6c32019-06-06 14:29:25 -0700570// that is to be built. GenerateAndroidBuildActions is passed a ModuleContext
571// rather than the usual blueprint.ModuleContext.
572// ModuleContext exposes extra functionality specific to the Android build
Colin Cross3f40fa42015-01-30 17:27:36 -0800573// system including details about the particular build variant that is to be
574// generated.
575//
576// For example:
577//
578// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800579// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800580// )
581//
582// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800583// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800584// properties struct {
585// MyProperty string
586// }
587// }
588//
Colin Cross36242852017-06-23 15:06:31 -0700589// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800590// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700591// m.AddProperties(&m.properties)
592// android.InitAndroidModule(m)
593// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800594// }
595//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800596// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800597// // Get the CPU architecture for the current build variant.
598// variantArch := ctx.Arch()
599//
600// // ...
601// }
Colin Cross635c3b02016-05-18 15:37:25 -0700602type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800603 // Putting the curiously recurring thing pointing to the thing that contains
604 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700605 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700606 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800607
Colin Crossfc754582016-05-17 16:34:16 -0700608 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800609 commonProperties commonProperties
Colin Cross18c46802019-09-24 22:19:02 -0700610 variableProperties interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800611 hostAndDeviceProperties hostAndDeviceProperties
612 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700613 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700614 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800615
Paul Duffin63c6e182019-07-24 14:24:38 +0100616 // Information about all the properties on the module that contains visibility rules that need
617 // checking.
618 visibilityPropertyInfo []visibilityProperty
619
620 // The primary visibility property, may be nil, that controls access to the module.
621 primaryVisibilityProperty visibilityProperty
622
Colin Cross3f40fa42015-01-30 17:27:36 -0800623 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700624 installFiles Paths
625 checkbuildFiles Paths
Jiyong Park52818fc2019-03-18 12:01:38 +0900626 noticeFile OptionalPath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700627
628 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
629 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800630 installTarget WritablePath
631 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700632 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700633
Colin Cross178a5092016-09-13 13:42:32 -0700634 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700635
636 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700637
638 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700639 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800640 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800641 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700642
643 prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
Colin Cross36242852017-06-23 15:06:31 -0700644}
645
Colin Cross4157e882019-06-06 16:57:04 -0700646func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
Colin Cross5f692ec2019-02-01 16:53:07 -0800647
Colin Cross4157e882019-06-06 16:57:04 -0700648func (m *ModuleBase) AddProperties(props ...interface{}) {
649 m.registerProps = append(m.registerProps, props...)
Colin Cross36242852017-06-23 15:06:31 -0700650}
651
Colin Cross4157e882019-06-06 16:57:04 -0700652func (m *ModuleBase) GetProperties() []interface{} {
653 return m.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800654}
655
Colin Cross4157e882019-06-06 16:57:04 -0700656func (m *ModuleBase) BuildParamsForTests() []BuildParams {
657 return m.buildParams
Colin Crosscec81712017-07-13 14:43:27 -0700658}
659
Colin Cross4157e882019-06-06 16:57:04 -0700660func (m *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
661 return m.ruleParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800662}
663
Colin Cross4157e882019-06-06 16:57:04 -0700664func (m *ModuleBase) VariablesForTests() map[string]string {
665 return m.variables
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800666}
667
Colin Cross4157e882019-06-06 16:57:04 -0700668func (m *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
669 m.prefer32 = prefer32
Colin Crossa9d8bee2018-10-02 13:59:46 -0700670}
671
Colin Crossce75d2c2016-10-06 16:12:58 -0700672// Name returns the name of the module. It may be overridden by individual module types, for
673// example prebuilts will prepend prebuilt_ to the name.
Colin Cross4157e882019-06-06 16:57:04 -0700674func (m *ModuleBase) Name() string {
675 return String(m.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700676}
677
Colin Cross9a362232019-07-01 15:32:45 -0700678// String returns a string that includes the module name and variants for printing during debugging.
679func (m *ModuleBase) String() string {
680 sb := strings.Builder{}
681 sb.WriteString(m.commonProperties.DebugName)
682 sb.WriteString("{")
683 for i := range m.commonProperties.DebugMutators {
684 if i != 0 {
685 sb.WriteString(",")
686 }
687 sb.WriteString(m.commonProperties.DebugMutators[i])
688 sb.WriteString(":")
689 sb.WriteString(m.commonProperties.DebugVariations[i])
690 }
691 sb.WriteString("}")
692 return sb.String()
693}
694
Colin Crossce75d2c2016-10-06 16:12:58 -0700695// BaseModuleName returns the name of the module as specified in the blueprints file.
Colin Cross4157e882019-06-06 16:57:04 -0700696func (m *ModuleBase) BaseModuleName() string {
697 return String(m.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700698}
699
Colin Cross4157e882019-06-06 16:57:04 -0700700func (m *ModuleBase) base() *ModuleBase {
701 return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800702}
703
Paul Duffine2453c72019-05-31 14:00:04 +0100704func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
705 return qualifiedModuleName{pkg: ctx.ModuleDir(), name: ctx.ModuleName()}
706}
707
708func (m *ModuleBase) visibilityProperties() []visibilityProperty {
Paul Duffin63c6e182019-07-24 14:24:38 +0100709 return m.visibilityPropertyInfo
710}
711
712func (m *ModuleBase) visibility() []string {
713 // The soong_namespace module does not initialize the primaryVisibilityProperty.
714 if m.primaryVisibilityProperty != nil {
715 return m.primaryVisibilityProperty.getStrings()
716 } else {
717 return nil
Paul Duffine2453c72019-05-31 14:00:04 +0100718 }
719}
720
Colin Cross4157e882019-06-06 16:57:04 -0700721func (m *ModuleBase) Target() Target {
722 return m.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800723}
724
Colin Cross4157e882019-06-06 16:57:04 -0700725func (m *ModuleBase) TargetPrimary() bool {
726 return m.commonProperties.CompilePrimary
Colin Cross8b74d172016-09-13 09:59:14 -0700727}
728
Colin Cross4157e882019-06-06 16:57:04 -0700729func (m *ModuleBase) MultiTargets() []Target {
730 return m.commonProperties.CompileMultiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -0700731}
732
Colin Cross4157e882019-06-06 16:57:04 -0700733func (m *ModuleBase) Os() OsType {
734 return m.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800735}
736
Colin Cross4157e882019-06-06 16:57:04 -0700737func (m *ModuleBase) Host() bool {
738 return m.Os().Class == Host || m.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800739}
740
Colin Cross4157e882019-06-06 16:57:04 -0700741func (m *ModuleBase) Arch() Arch {
742 return m.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800743}
744
Colin Cross4157e882019-06-06 16:57:04 -0700745func (m *ModuleBase) ArchSpecific() bool {
746 return m.commonProperties.ArchSpecific
Dan Willemsen0b24c742016-10-04 15:13:37 -0700747}
748
Colin Cross4157e882019-06-06 16:57:04 -0700749func (m *ModuleBase) OsClassSupported() []OsClass {
750 switch m.commonProperties.HostOrDeviceSupported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700751 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700752 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700753 case HostSupportedNoCross:
754 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700755 case DeviceSupported:
756 return []OsClass{Device}
Dan Albert0981b5c2018-08-02 13:46:35 -0700757 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700758 var supported []OsClass
Colin Cross4157e882019-06-06 16:57:04 -0700759 if Bool(m.hostAndDeviceProperties.Host_supported) ||
760 (m.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
761 m.hostAndDeviceProperties.Host_supported == nil) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700762 supported = append(supported, Host, HostCross)
763 }
Colin Cross4157e882019-06-06 16:57:04 -0700764 if m.hostAndDeviceProperties.Device_supported == nil ||
765 *m.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700766 supported = append(supported, Device)
767 }
768 return supported
769 default:
770 return nil
771 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800772}
773
Colin Cross4157e882019-06-06 16:57:04 -0700774func (m *ModuleBase) DeviceSupported() bool {
775 return m.commonProperties.HostOrDeviceSupported == DeviceSupported ||
776 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
777 (m.hostAndDeviceProperties.Device_supported == nil ||
778 *m.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800779}
780
Paul Duffine44358f2019-11-26 18:04:12 +0000781func (m *ModuleBase) HostSupported() bool {
782 return m.commonProperties.HostOrDeviceSupported == HostSupported ||
783 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
784 (m.hostAndDeviceProperties.Host_supported != nil &&
785 *m.hostAndDeviceProperties.Host_supported)
786}
787
Colin Cross4157e882019-06-06 16:57:04 -0700788func (m *ModuleBase) Platform() bool {
Justin Yund5f6c822019-06-25 16:47:17 +0900789 return !m.DeviceSpecific() && !m.SocSpecific() && !m.ProductSpecific() && !m.SystemExtSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900790}
791
Colin Cross4157e882019-06-06 16:57:04 -0700792func (m *ModuleBase) DeviceSpecific() bool {
793 return Bool(m.commonProperties.Device_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900794}
795
Colin Cross4157e882019-06-06 16:57:04 -0700796func (m *ModuleBase) SocSpecific() bool {
797 return Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900798}
799
Colin Cross4157e882019-06-06 16:57:04 -0700800func (m *ModuleBase) ProductSpecific() bool {
801 return Bool(m.commonProperties.Product_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900802}
803
Justin Yund5f6c822019-06-25 16:47:17 +0900804func (m *ModuleBase) SystemExtSpecific() bool {
805 return Bool(m.commonProperties.System_ext_specific)
Dario Frenifd05a742018-05-29 13:28:54 +0100806}
807
Colin Cross4157e882019-06-06 16:57:04 -0700808func (m *ModuleBase) Enabled() bool {
809 if m.commonProperties.Enabled == nil {
810 return !m.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800811 }
Colin Cross4157e882019-06-06 16:57:04 -0700812 return *m.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800813}
814
Colin Cross4157e882019-06-06 16:57:04 -0700815func (m *ModuleBase) SkipInstall() {
816 m.commonProperties.SkipInstall = true
Colin Crossce75d2c2016-10-06 16:12:58 -0700817}
818
Colin Cross4157e882019-06-06 16:57:04 -0700819func (m *ModuleBase) ExportedToMake() bool {
820 return m.commonProperties.NamespaceExportedToMake
Jiyong Park374510b2018-03-19 18:23:01 +0900821}
822
Colin Cross4157e882019-06-06 16:57:04 -0700823func (m *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700824 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800825
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700826 result := Paths{}
Colin Cross6b753602018-06-21 13:03:07 -0700827 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross3f40fa42015-01-30 17:27:36 -0800828 ctx.VisitDepsDepthFirstIf(isFileInstaller,
829 func(m blueprint.Module) {
830 fileInstaller := m.(fileInstaller)
831 files := fileInstaller.filesToInstall()
832 result = append(result, files...)
833 })
834
835 return result
836}
837
Colin Cross4157e882019-06-06 16:57:04 -0700838func (m *ModuleBase) filesToInstall() Paths {
839 return m.installFiles
Colin Cross3f40fa42015-01-30 17:27:36 -0800840}
841
Colin Cross4157e882019-06-06 16:57:04 -0700842func (m *ModuleBase) NoAddressSanitizer() bool {
843 return m.noAddressSanitizer
Colin Cross3f40fa42015-01-30 17:27:36 -0800844}
845
Colin Cross4157e882019-06-06 16:57:04 -0700846func (m *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800847 return false
848}
849
Jaewoong Jung0949f312019-09-11 10:25:18 -0700850func (m *ModuleBase) InstallInTestcases() bool {
851 return false
852}
853
Colin Cross4157e882019-06-06 16:57:04 -0700854func (m *ModuleBase) InstallInSanitizerDir() bool {
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700855 return false
856}
857
Colin Cross4157e882019-06-06 16:57:04 -0700858func (m *ModuleBase) InstallInRecovery() bool {
859 return Bool(m.commonProperties.Recovery)
Jiyong Parkf9332f12018-02-01 00:54:12 +0900860}
861
Colin Cross90ba5f42019-10-02 11:10:58 -0700862func (m *ModuleBase) InstallInRoot() bool {
863 return false
864}
865
Colin Cross607d8582019-07-29 16:44:46 -0700866func (m *ModuleBase) InstallBypassMake() bool {
867 return false
868}
869
Colin Cross4157e882019-06-06 16:57:04 -0700870func (m *ModuleBase) Owner() string {
871 return String(m.commonProperties.Owner)
Sundong Ahn4fd04bb2018-08-31 18:01:37 +0900872}
873
Colin Cross4157e882019-06-06 16:57:04 -0700874func (m *ModuleBase) NoticeFile() OptionalPath {
875 return m.noticeFile
Jiyong Park52818fc2019-03-18 12:01:38 +0900876}
877
Colin Cross7228ecd2019-11-18 16:00:16 -0800878func (m *ModuleBase) setImageVariation(variant string) {
879 m.commonProperties.ImageVariation = variant
880}
881
882func (m *ModuleBase) ImageVariation() blueprint.Variation {
883 return blueprint.Variation{
884 Mutator: "image",
885 Variation: m.base().commonProperties.ImageVariation,
886 }
887}
888
889func (m *ModuleBase) InRecovery() bool {
890 return m.base().commonProperties.ImageVariation == RecoveryVariation
891}
892
Colin Cross4157e882019-06-06 16:57:04 -0700893func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700894 allInstalledFiles := Paths{}
895 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800896 ctx.VisitAllModuleVariants(func(module Module) {
897 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700898 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
899 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800900 })
901
Colin Cross0875c522017-11-28 17:34:01 -0800902 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700903
Jeff Gaston088e29e2017-11-29 16:47:17 -0800904 namespacePrefix := ctx.Namespace().(*Namespace).id
905 if namespacePrefix != "" {
906 namespacePrefix = namespacePrefix + "-"
907 }
908
Colin Cross3f40fa42015-01-30 17:27:36 -0800909 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800910 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800911 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700912 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800913 Output: name,
914 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800915 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700916 })
917 deps = append(deps, name)
Colin Cross4157e882019-06-06 16:57:04 -0700918 m.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700919 }
920
921 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800922 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
Colin Cross0875c522017-11-28 17:34:01 -0800923 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700924 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800925 Output: name,
926 Implicits: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700927 })
928 deps = append(deps, name)
Colin Cross4157e882019-06-06 16:57:04 -0700929 m.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700930 }
931
932 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800933 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800934 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800935 suffix = "-soong"
936 }
937
Jeff Gaston088e29e2017-11-29 16:47:17 -0800938 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800939 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700940 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800941 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700942 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800943 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700944
Colin Cross4157e882019-06-06 16:57:04 -0700945 m.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800946 }
947}
948
Colin Cross4157e882019-06-06 16:57:04 -0700949func determineModuleKind(m *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
950 var socSpecific = Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
951 var deviceSpecific = Bool(m.commonProperties.Device_specific)
952 var productSpecific = Bool(m.commonProperties.Product_specific)
Justin Yund5f6c822019-06-25 16:47:17 +0900953 var systemExtSpecific = Bool(m.commonProperties.System_ext_specific)
Jiyong Park2db76922017-11-08 16:03:48 +0900954
Dario Frenifd05a742018-05-29 13:28:54 +0100955 msg := "conflicting value set here"
956 if socSpecific && deviceSpecific {
957 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Colin Cross4157e882019-06-06 16:57:04 -0700958 if Bool(m.commonProperties.Vendor) {
Jiyong Park2db76922017-11-08 16:03:48 +0900959 ctx.PropertyErrorf("vendor", msg)
960 }
Colin Cross4157e882019-06-06 16:57:04 -0700961 if Bool(m.commonProperties.Proprietary) {
Jiyong Park2db76922017-11-08 16:03:48 +0900962 ctx.PropertyErrorf("proprietary", msg)
963 }
Colin Cross4157e882019-06-06 16:57:04 -0700964 if Bool(m.commonProperties.Soc_specific) {
Jiyong Park2db76922017-11-08 16:03:48 +0900965 ctx.PropertyErrorf("soc_specific", msg)
966 }
967 }
968
Justin Yund5f6c822019-06-25 16:47:17 +0900969 if productSpecific && systemExtSpecific {
970 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and system_ext at the same time.")
971 ctx.PropertyErrorf("system_ext_specific", msg)
Dario Frenifd05a742018-05-29 13:28:54 +0100972 }
973
Justin Yund5f6c822019-06-25 16:47:17 +0900974 if (socSpecific || deviceSpecific) && (productSpecific || systemExtSpecific) {
Dario Frenifd05a742018-05-29 13:28:54 +0100975 if productSpecific {
976 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
977 } else {
Justin Yund5f6c822019-06-25 16:47:17 +0900978 ctx.PropertyErrorf("system_ext_specific", "a module cannot be specific to SoC or device and system_ext at the same time.")
Dario Frenifd05a742018-05-29 13:28:54 +0100979 }
980 if deviceSpecific {
981 ctx.PropertyErrorf("device_specific", msg)
982 } else {
Colin Cross4157e882019-06-06 16:57:04 -0700983 if Bool(m.commonProperties.Vendor) {
Dario Frenifd05a742018-05-29 13:28:54 +0100984 ctx.PropertyErrorf("vendor", msg)
985 }
Colin Cross4157e882019-06-06 16:57:04 -0700986 if Bool(m.commonProperties.Proprietary) {
Dario Frenifd05a742018-05-29 13:28:54 +0100987 ctx.PropertyErrorf("proprietary", msg)
988 }
Colin Cross4157e882019-06-06 16:57:04 -0700989 if Bool(m.commonProperties.Soc_specific) {
Dario Frenifd05a742018-05-29 13:28:54 +0100990 ctx.PropertyErrorf("soc_specific", msg)
991 }
992 }
993 }
994
Jiyong Park2db76922017-11-08 16:03:48 +0900995 if productSpecific {
996 return productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900997 } else if systemExtSpecific {
998 return systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900999 } else if deviceSpecific {
1000 return deviceSpecificModule
1001 } else if socSpecific {
1002 return socSpecificModule
1003 } else {
1004 return platformModule
1005 }
1006}
1007
Colin Cross0ea8ba82019-06-06 14:33:29 -07001008func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
1009 return baseModuleContext{
1010 BaseModuleContext: ctx,
1011 target: m.commonProperties.CompileTarget,
1012 targetPrimary: m.commonProperties.CompilePrimary,
1013 multiTargets: m.commonProperties.CompileMultiTargets,
1014 kind: determineModuleKind(m, ctx),
1015 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -08001016 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001017}
1018
Colin Cross4157e882019-06-06 16:57:04 -07001019func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
Colin Cross25de6c32019-06-06 14:29:25 -07001020 ctx := &moduleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001021 module: m.module,
Colin Crossdc35e212019-06-06 16:13:11 -07001022 bp: blueprintCtx,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001023 baseModuleContext: m.baseModuleContextFactory(blueprintCtx),
1024 installDeps: m.computeInstallDeps(blueprintCtx),
1025 installFiles: m.installFiles,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001026 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -08001027 }
1028
Colin Cross6c4f21f2019-06-06 15:41:36 -07001029 // Temporarily continue to call blueprintCtx.GetMissingDependencies() to maintain the previous behavior of never
1030 // reporting missing dependency errors in Blueprint when AllowMissingDependencies == true.
1031 // TODO: This will be removed once defaults modules handle missing dependency errors
1032 blueprintCtx.GetMissingDependencies()
1033
Colin Crossdc35e212019-06-06 16:13:11 -07001034 // For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
1035 // are enabled.
1036 ctx.baseModuleContext.strictVisitDeps = true
1037
Colin Cross4c83e5c2019-02-25 14:54:28 -08001038 if ctx.config.captureBuild {
1039 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
1040 }
1041
Colin Cross67a5c132017-05-09 13:45:28 -07001042 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
1043 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -08001044 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
1045 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -07001046 }
Colin Cross0875c522017-11-28 17:34:01 -08001047 if !ctx.PrimaryArch() {
1048 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -07001049 }
1050
1051 ctx.Variable(pctx, "moduleDesc", desc)
1052
1053 s := ""
1054 if len(suffix) > 0 {
1055 s = " [" + strings.Join(suffix, " ") + "]"
1056 }
1057 ctx.Variable(pctx, "moduleDescSuffix", s)
1058
Dan Willemsen569edc52018-11-19 09:33:29 -08001059 // Some common property checks for properties that will be used later in androidmk.go
Colin Cross4157e882019-06-06 16:57:04 -07001060 if m.commonProperties.Dist.Dest != nil {
1061 _, err := validateSafePath(*m.commonProperties.Dist.Dest)
Dan Willemsen569edc52018-11-19 09:33:29 -08001062 if err != nil {
1063 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
1064 }
1065 }
Colin Cross4157e882019-06-06 16:57:04 -07001066 if m.commonProperties.Dist.Dir != nil {
1067 _, err := validateSafePath(*m.commonProperties.Dist.Dir)
Dan Willemsen569edc52018-11-19 09:33:29 -08001068 if err != nil {
1069 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
1070 }
1071 }
Colin Cross4157e882019-06-06 16:57:04 -07001072 if m.commonProperties.Dist.Suffix != nil {
1073 if strings.Contains(*m.commonProperties.Dist.Suffix, "/") {
Dan Willemsen569edc52018-11-19 09:33:29 -08001074 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
1075 }
1076 }
1077
Colin Cross4157e882019-06-06 16:57:04 -07001078 if m.Enabled() {
Jooyung Hand48f3c32019-08-23 11:18:57 +09001079 // ensure all direct android.Module deps are enabled
1080 ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) {
1081 if _, ok := bm.(Module); ok {
1082 ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps)
1083 }
1084 })
1085
Colin Cross4157e882019-06-06 16:57:04 -07001086 notice := proptools.StringDefault(m.commonProperties.Notice, "NOTICE")
1087 if module := SrcIsModule(notice); module != "" {
1088 m.noticeFile = ctx.ExpandOptionalSource(&notice, "notice")
Jiyong Park52818fc2019-03-18 12:01:38 +09001089 } else {
1090 noticePath := filepath.Join(ctx.ModuleDir(), notice)
Colin Cross4157e882019-06-06 16:57:04 -07001091 m.noticeFile = ExistentPathForSource(ctx, noticePath)
Jaewoong Jung62707f72018-11-16 13:26:43 -08001092 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001093
1094 m.module.GenerateAndroidBuildActions(ctx)
1095 if ctx.Failed() {
1096 return
1097 }
1098
1099 m.installFiles = append(m.installFiles, ctx.installFiles...)
1100 m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...)
Colin Crossdc35e212019-06-06 16:13:11 -07001101 } else if ctx.Config().AllowMissingDependencies() {
1102 // If the module is not enabled it will not create any build rules, nothing will call
1103 // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled
1104 // and report them as an error even when AllowMissingDependencies = true. Call
1105 // ctx.GetMissingDependencies() here to tell blueprint not to handle them.
1106 ctx.GetMissingDependencies()
Colin Cross3f40fa42015-01-30 17:27:36 -08001107 }
1108
Colin Cross4157e882019-06-06 16:57:04 -07001109 if m == ctx.FinalModule().(Module).base() {
1110 m.generateModuleTarget(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -07001111 if ctx.Failed() {
1112 return
1113 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001114 }
Colin Crosscec81712017-07-13 14:43:27 -07001115
Colin Cross4157e882019-06-06 16:57:04 -07001116 m.buildParams = ctx.buildParams
1117 m.ruleParams = ctx.ruleParams
1118 m.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -08001119}
1120
Colin Cross0ea8ba82019-06-06 14:33:29 -07001121type baseModuleContext struct {
1122 blueprint.BaseModuleContext
Colin Cross8b74d172016-09-13 09:59:14 -07001123 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -07001124 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -07001125 targetPrimary bool
1126 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +09001127 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -07001128 config Config
Colin Crossdc35e212019-06-06 16:13:11 -07001129
1130 walkPath []Module
1131
1132 strictVisitDeps bool // If true, enforce that all dependencies are enabled
Colin Crossf6566ed2015-03-24 11:13:38 -07001133}
1134
Colin Cross25de6c32019-06-06 14:29:25 -07001135type moduleContext struct {
Colin Crossdc35e212019-06-06 16:13:11 -07001136 bp blueprint.ModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -07001137 baseModuleContext
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001138 installDeps Paths
1139 installFiles Paths
1140 checkbuildFiles Paths
Colin Cross8d8f8e22016-08-03 11:57:50 -07001141 module Module
Colin Crosscec81712017-07-13 14:43:27 -07001142
1143 // For tests
Colin Crossae887032017-10-23 17:16:14 -07001144 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -08001145 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001146 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -08001147}
1148
Colin Crossb88b3c52019-06-10 15:15:17 -07001149func (m *moduleContext) ninjaError(params BuildParams, err error) (PackageContext, BuildParams) {
1150 return pctx, BuildParams{
Colin Cross4b69c492019-06-07 13:06:06 -07001151 Rule: ErrorRule,
1152 Description: params.Description,
1153 Output: params.Output,
1154 Outputs: params.Outputs,
1155 ImplicitOutput: params.ImplicitOutput,
1156 ImplicitOutputs: params.ImplicitOutputs,
Colin Cross6ff51382015-12-17 16:39:19 -08001157 Args: map[string]string{
1158 "error": err.Error(),
1159 },
Colin Crossb88b3c52019-06-10 15:15:17 -07001160 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001161}
1162
Colin Cross25de6c32019-06-06 14:29:25 -07001163func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
1164 m.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -08001165}
1166
Colin Cross0875c522017-11-28 17:34:01 -08001167func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001168 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001169 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -08001170 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -08001171 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001172 Outputs: params.Outputs.Strings(),
1173 ImplicitOutputs: params.ImplicitOutputs.Strings(),
1174 Inputs: params.Inputs.Strings(),
1175 Implicits: params.Implicits.Strings(),
1176 OrderOnly: params.OrderOnly.Strings(),
1177 Args: params.Args,
1178 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001179 }
1180
Colin Cross33bfb0a2016-11-21 17:23:08 -08001181 if params.Depfile != nil {
1182 bparams.Depfile = params.Depfile.String()
1183 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001184 if params.Output != nil {
1185 bparams.Outputs = append(bparams.Outputs, params.Output.String())
1186 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001187 if params.ImplicitOutput != nil {
1188 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
1189 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001190 if params.Input != nil {
1191 bparams.Inputs = append(bparams.Inputs, params.Input.String())
1192 }
1193 if params.Implicit != nil {
1194 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
1195 }
1196
Colin Cross0b9f31f2019-02-28 11:00:01 -08001197 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
1198 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
1199 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
1200 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
1201 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
1202 bparams.Depfile = proptools.NinjaEscapeList([]string{bparams.Depfile})[0]
Colin Crossfe4bc362018-09-12 10:02:13 -07001203
Colin Cross0875c522017-11-28 17:34:01 -08001204 return bparams
1205}
1206
Colin Cross25de6c32019-06-06 14:29:25 -07001207func (m *moduleContext) Variable(pctx PackageContext, name, value string) {
1208 if m.config.captureBuild {
1209 m.variables[name] = value
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001210 }
1211
Colin Crossdc35e212019-06-06 16:13:11 -07001212 m.bp.Variable(pctx.PackageContext, name, value)
Colin Cross0875c522017-11-28 17:34:01 -08001213}
1214
Colin Cross25de6c32019-06-06 14:29:25 -07001215func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
Colin Cross0875c522017-11-28 17:34:01 -08001216 argNames ...string) blueprint.Rule {
1217
Ramy Medhatdd0418a2019-11-04 18:16:11 -05001218 if (m.config.UseGoma() || m.config.UseRBE()) && params.Pool == nil {
1219 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
1220 // jobs to the local parallelism value
Colin Cross2e2dbc22019-09-25 13:31:46 -07001221 params.Pool = localPool
1222 }
1223
Colin Crossdc35e212019-06-06 16:13:11 -07001224 rule := m.bp.Rule(pctx.PackageContext, name, params, argNames...)
Colin Cross4c83e5c2019-02-25 14:54:28 -08001225
Colin Cross25de6c32019-06-06 14:29:25 -07001226 if m.config.captureBuild {
1227 m.ruleParams[rule] = params
Colin Cross4c83e5c2019-02-25 14:54:28 -08001228 }
1229
1230 return rule
Colin Cross0875c522017-11-28 17:34:01 -08001231}
1232
Colin Cross25de6c32019-06-06 14:29:25 -07001233func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
Colin Crossb88b3c52019-06-10 15:15:17 -07001234 if params.Description != "" {
1235 params.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1236 }
1237
1238 if missingDeps := m.GetMissingDependencies(); len(missingDeps) > 0 {
1239 pctx, params = m.ninjaError(params, fmt.Errorf("module %s missing dependencies: %s\n",
1240 m.ModuleName(), strings.Join(missingDeps, ", ")))
1241 }
1242
Colin Cross25de6c32019-06-06 14:29:25 -07001243 if m.config.captureBuild {
1244 m.buildParams = append(m.buildParams, params)
Colin Cross0875c522017-11-28 17:34:01 -08001245 }
1246
Colin Crossdc35e212019-06-06 16:13:11 -07001247 m.bp.Build(pctx.PackageContext, convertBuildParams(params))
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001248}
1249
Colin Crossdc35e212019-06-06 16:13:11 -07001250func (b *baseModuleContext) Module() Module {
1251 module, _ := b.BaseModuleContext.Module().(Module)
1252 return module
1253}
1254
1255func (b *baseModuleContext) Config() Config {
1256 return b.BaseModuleContext.Config().(Config)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001257}
1258
Colin Cross25de6c32019-06-06 14:29:25 -07001259func (m *moduleContext) GetMissingDependencies() []string {
Colin Cross6c4f21f2019-06-06 15:41:36 -07001260 var missingDeps []string
1261 missingDeps = append(missingDeps, m.Module().base().commonProperties.MissingDeps...)
Colin Crossdc35e212019-06-06 16:13:11 -07001262 missingDeps = append(missingDeps, m.bp.GetMissingDependencies()...)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001263 missingDeps = FirstUniqueStrings(missingDeps)
1264 return missingDeps
Colin Cross6ff51382015-12-17 16:39:19 -08001265}
1266
Colin Crossdc35e212019-06-06 16:13:11 -07001267func (b *baseModuleContext) AddMissingDependencies(deps []string) {
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001268 if deps != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001269 missingDeps := &b.Module().base().commonProperties.MissingDeps
Colin Cross6c4f21f2019-06-06 15:41:36 -07001270 *missingDeps = append(*missingDeps, deps...)
1271 *missingDeps = FirstUniqueStrings(*missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001272 }
1273}
1274
Colin Crossdc35e212019-06-06 16:13:11 -07001275func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, strict bool) Module {
Colin Crossd11fcda2017-10-23 17:59:01 -07001276 aModule, _ := module.(Module)
Colin Crossdc35e212019-06-06 16:13:11 -07001277
1278 if !strict {
1279 return aModule
1280 }
1281
Colin Cross380c69a2019-06-10 17:49:58 +00001282 if aModule == nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001283 b.ModuleErrorf("module %q not an android module", b.OtherModuleName(module))
Colin Cross380c69a2019-06-10 17:49:58 +00001284 return nil
1285 }
1286
1287 if !aModule.Enabled() {
Colin Crossdc35e212019-06-06 16:13:11 -07001288 if b.Config().AllowMissingDependencies() {
1289 b.AddMissingDependencies([]string{b.OtherModuleName(aModule)})
Colin Cross380c69a2019-06-10 17:49:58 +00001290 } else {
Colin Crossdc35e212019-06-06 16:13:11 -07001291 b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule))
Colin Cross380c69a2019-06-10 17:49:58 +00001292 }
1293 return nil
1294 }
Colin Crossd11fcda2017-10-23 17:59:01 -07001295 return aModule
1296}
1297
Colin Crossdc35e212019-06-06 16:13:11 -07001298func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
Jiyong Parkf2976302019-04-17 21:47:37 +09001299 type dep struct {
1300 mod blueprint.Module
1301 tag blueprint.DependencyTag
1302 }
1303 var deps []dep
Colin Crossdc35e212019-06-06 16:13:11 -07001304 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001305 if aModule, _ := module.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
Colin Crossdc35e212019-06-06 16:13:11 -07001306 returnedTag := b.BaseModuleContext.OtherModuleDependencyTag(aModule)
Jiyong Parkf2976302019-04-17 21:47:37 +09001307 if tag == nil || returnedTag == tag {
1308 deps = append(deps, dep{aModule, returnedTag})
1309 }
1310 }
1311 })
1312 if len(deps) == 1 {
1313 return deps[0].mod, deps[0].tag
1314 } else if len(deps) >= 2 {
1315 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
Colin Crossdc35e212019-06-06 16:13:11 -07001316 name, b.ModuleName()))
Jiyong Parkf2976302019-04-17 21:47:37 +09001317 } else {
1318 return nil, nil
1319 }
1320}
1321
Colin Crossdc35e212019-06-06 16:13:11 -07001322func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module {
Colin Cross0ef08162019-05-01 15:50:51 -07001323 var deps []Module
Colin Crossdc35e212019-06-06 16:13:11 -07001324 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001325 if aModule, _ := module.(Module); aModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001326 if b.BaseModuleContext.OtherModuleDependencyTag(aModule) == tag {
Colin Cross0ef08162019-05-01 15:50:51 -07001327 deps = append(deps, aModule)
1328 }
1329 }
1330 })
1331 return deps
1332}
1333
Colin Cross25de6c32019-06-06 14:29:25 -07001334func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1335 module, _ := m.getDirectDepInternal(name, tag)
1336 return module
Jiyong Parkf2976302019-04-17 21:47:37 +09001337}
1338
Colin Crossdc35e212019-06-06 16:13:11 -07001339func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
1340 return b.getDirectDepInternal(name, nil)
Jiyong Parkf2976302019-04-17 21:47:37 +09001341}
1342
Colin Crossdc35e212019-06-06 16:13:11 -07001343func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
1344 b.BaseModuleContext.VisitDirectDeps(visit)
Colin Cross35143d02017-11-16 00:11:20 -08001345}
1346
Colin Crossdc35e212019-06-06 16:13:11 -07001347func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) {
1348 b.BaseModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1349 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001350 visit(aModule)
1351 }
1352 })
1353}
1354
Colin Crossdc35e212019-06-06 16:13:11 -07001355func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
1356 b.BaseModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1357 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
1358 if b.BaseModuleContext.OtherModuleDependencyTag(aModule) == tag {
Colin Crossee6143c2017-12-30 17:54:27 -08001359 visit(aModule)
1360 }
1361 }
1362 })
1363}
1364
Colin Crossdc35e212019-06-06 16:13:11 -07001365func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
1366 b.BaseModuleContext.VisitDirectDepsIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07001367 // pred
1368 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001369 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001370 return pred(aModule)
1371 } else {
1372 return false
1373 }
1374 },
1375 // visit
1376 func(module blueprint.Module) {
1377 visit(module.(Module))
1378 })
1379}
1380
Colin Crossdc35e212019-06-06 16:13:11 -07001381func (b *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
1382 b.BaseModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
1383 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001384 visit(aModule)
1385 }
1386 })
1387}
1388
Colin Crossdc35e212019-06-06 16:13:11 -07001389func (b *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
1390 b.BaseModuleContext.VisitDepsDepthFirstIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07001391 // pred
1392 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001393 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001394 return pred(aModule)
1395 } else {
1396 return false
1397 }
1398 },
1399 // visit
1400 func(module blueprint.Module) {
1401 visit(module.(Module))
1402 })
1403}
1404
Colin Crossdc35e212019-06-06 16:13:11 -07001405func (b *baseModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
1406 b.BaseModuleContext.WalkDeps(visit)
Alex Light778127a2019-02-27 14:19:50 -08001407}
1408
Colin Crossdc35e212019-06-06 16:13:11 -07001409func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
1410 b.walkPath = []Module{b.Module()}
1411 b.BaseModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
1412 childAndroidModule, _ := child.(Module)
1413 parentAndroidModule, _ := parent.(Module)
Colin Crossd11fcda2017-10-23 17:59:01 -07001414 if childAndroidModule != nil && parentAndroidModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001415 // record walkPath before visit
1416 for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
1417 b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
1418 }
1419 b.walkPath = append(b.walkPath, childAndroidModule)
Colin Crossd11fcda2017-10-23 17:59:01 -07001420 return visit(childAndroidModule, parentAndroidModule)
1421 } else {
1422 return false
1423 }
1424 })
1425}
1426
Colin Crossdc35e212019-06-06 16:13:11 -07001427func (b *baseModuleContext) GetWalkPath() []Module {
1428 return b.walkPath
1429}
1430
Colin Cross25de6c32019-06-06 14:29:25 -07001431func (m *moduleContext) VisitAllModuleVariants(visit func(Module)) {
Colin Crossdc35e212019-06-06 16:13:11 -07001432 m.bp.VisitAllModuleVariants(func(module blueprint.Module) {
Colin Cross0875c522017-11-28 17:34:01 -08001433 visit(module.(Module))
1434 })
1435}
1436
Colin Cross25de6c32019-06-06 14:29:25 -07001437func (m *moduleContext) PrimaryModule() Module {
Colin Crossdc35e212019-06-06 16:13:11 -07001438 return m.bp.PrimaryModule().(Module)
Colin Cross0875c522017-11-28 17:34:01 -08001439}
1440
Colin Cross25de6c32019-06-06 14:29:25 -07001441func (m *moduleContext) FinalModule() Module {
Colin Crossdc35e212019-06-06 16:13:11 -07001442 return m.bp.FinalModule().(Module)
1443}
1444
1445func (m *moduleContext) ModuleSubDir() string {
1446 return m.bp.ModuleSubDir()
Colin Cross0875c522017-11-28 17:34:01 -08001447}
1448
Colin Cross0ea8ba82019-06-06 14:33:29 -07001449func (b *baseModuleContext) Target() Target {
Colin Cross25de6c32019-06-06 14:29:25 -07001450 return b.target
Colin Crossa1ad8d12016-06-01 17:09:44 -07001451}
1452
Colin Cross0ea8ba82019-06-06 14:33:29 -07001453func (b *baseModuleContext) TargetPrimary() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001454 return b.targetPrimary
Colin Cross8b74d172016-09-13 09:59:14 -07001455}
1456
Colin Cross0ea8ba82019-06-06 14:33:29 -07001457func (b *baseModuleContext) MultiTargets() []Target {
Colin Cross25de6c32019-06-06 14:29:25 -07001458 return b.multiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07001459}
1460
Colin Cross0ea8ba82019-06-06 14:33:29 -07001461func (b *baseModuleContext) Arch() Arch {
Colin Cross25de6c32019-06-06 14:29:25 -07001462 return b.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08001463}
1464
Colin Cross0ea8ba82019-06-06 14:33:29 -07001465func (b *baseModuleContext) Os() OsType {
Colin Cross25de6c32019-06-06 14:29:25 -07001466 return b.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001467}
1468
Colin Cross0ea8ba82019-06-06 14:33:29 -07001469func (b *baseModuleContext) Host() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001470 return b.target.Os.Class == Host || b.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -07001471}
1472
Colin Cross0ea8ba82019-06-06 14:33:29 -07001473func (b *baseModuleContext) Device() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001474 return b.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07001475}
1476
Colin Cross0ea8ba82019-06-06 14:33:29 -07001477func (b *baseModuleContext) Darwin() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001478 return b.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07001479}
1480
Colin Cross0ea8ba82019-06-06 14:33:29 -07001481func (b *baseModuleContext) Fuchsia() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001482 return b.target.Os == Fuchsia
Doug Horn21b94272019-01-16 12:06:11 -08001483}
1484
Colin Cross0ea8ba82019-06-06 14:33:29 -07001485func (b *baseModuleContext) Windows() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001486 return b.target.Os == Windows
Colin Cross3edeee12017-04-04 12:59:48 -07001487}
1488
Colin Cross0ea8ba82019-06-06 14:33:29 -07001489func (b *baseModuleContext) Debug() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001490 return b.debug
Colin Crossf6566ed2015-03-24 11:13:38 -07001491}
1492
Colin Cross0ea8ba82019-06-06 14:33:29 -07001493func (b *baseModuleContext) PrimaryArch() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001494 if len(b.config.Targets[b.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07001495 return true
1496 }
Colin Cross25de6c32019-06-06 14:29:25 -07001497 return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07001498}
1499
Colin Cross0ea8ba82019-06-06 14:33:29 -07001500func (b *baseModuleContext) AConfig() Config {
Colin Cross25de6c32019-06-06 14:29:25 -07001501 return b.config
Colin Cross1332b002015-04-07 17:11:30 -07001502}
1503
Colin Cross0ea8ba82019-06-06 14:33:29 -07001504func (b *baseModuleContext) DeviceConfig() DeviceConfig {
Colin Cross25de6c32019-06-06 14:29:25 -07001505 return DeviceConfig{b.config.deviceConfig}
Colin Cross9272ade2016-08-17 15:24:12 -07001506}
1507
Colin Cross0ea8ba82019-06-06 14:33:29 -07001508func (b *baseModuleContext) Platform() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001509 return b.kind == platformModule
Jiyong Park2db76922017-11-08 16:03:48 +09001510}
1511
Colin Cross0ea8ba82019-06-06 14:33:29 -07001512func (b *baseModuleContext) DeviceSpecific() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001513 return b.kind == deviceSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001514}
1515
Colin Cross0ea8ba82019-06-06 14:33:29 -07001516func (b *baseModuleContext) SocSpecific() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001517 return b.kind == socSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001518}
1519
Colin Cross0ea8ba82019-06-06 14:33:29 -07001520func (b *baseModuleContext) ProductSpecific() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001521 return b.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -08001522}
1523
Justin Yund5f6c822019-06-25 16:47:17 +09001524func (b *baseModuleContext) SystemExtSpecific() bool {
1525 return b.kind == systemExtSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +01001526}
1527
Jiyong Park5baac542018-08-28 09:55:37 +09001528// Makes this module a platform module, i.e. not specific to soc, device,
Justin Yund5f6c822019-06-25 16:47:17 +09001529// product, or system_ext.
Colin Cross4157e882019-06-06 16:57:04 -07001530func (m *ModuleBase) MakeAsPlatform() {
1531 m.commonProperties.Vendor = boolPtr(false)
1532 m.commonProperties.Proprietary = boolPtr(false)
1533 m.commonProperties.Soc_specific = boolPtr(false)
1534 m.commonProperties.Product_specific = boolPtr(false)
Justin Yund5f6c822019-06-25 16:47:17 +09001535 m.commonProperties.System_ext_specific = boolPtr(false)
Jiyong Park5baac542018-08-28 09:55:37 +09001536}
1537
Colin Cross4157e882019-06-06 16:57:04 -07001538func (m *ModuleBase) EnableNativeBridgeSupportByDefault() {
1539 m.commonProperties.Native_bridge_supported = boolPtr(true)
dimitry03dc3f62019-05-09 14:07:34 +02001540}
1541
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09001542func (m *ModuleBase) MakeAsSystemExt() {
Jooyung Han91df2082019-11-20 01:49:42 +09001543 m.commonProperties.Vendor = boolPtr(false)
1544 m.commonProperties.Proprietary = boolPtr(false)
1545 m.commonProperties.Soc_specific = boolPtr(false)
1546 m.commonProperties.Product_specific = boolPtr(false)
1547 m.commonProperties.System_ext_specific = boolPtr(true)
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09001548}
1549
Jooyung Han344d5432019-08-23 11:17:39 +09001550// IsNativeBridgeSupported returns true if "native_bridge_supported" is explicitly set as "true"
1551func (m *ModuleBase) IsNativeBridgeSupported() bool {
1552 return proptools.Bool(m.commonProperties.Native_bridge_supported)
1553}
1554
Colin Cross25de6c32019-06-06 14:29:25 -07001555func (m *moduleContext) InstallInData() bool {
1556 return m.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08001557}
1558
Jaewoong Jung0949f312019-09-11 10:25:18 -07001559func (m *moduleContext) InstallInTestcases() bool {
1560 return m.module.InstallInTestcases()
1561}
1562
Colin Cross25de6c32019-06-06 14:29:25 -07001563func (m *moduleContext) InstallInSanitizerDir() bool {
1564 return m.module.InstallInSanitizerDir()
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001565}
1566
Colin Cross25de6c32019-06-06 14:29:25 -07001567func (m *moduleContext) InstallInRecovery() bool {
1568 return m.module.InstallInRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09001569}
1570
Colin Cross90ba5f42019-10-02 11:10:58 -07001571func (m *moduleContext) InstallInRoot() bool {
1572 return m.module.InstallInRoot()
1573}
1574
Colin Cross607d8582019-07-29 16:44:46 -07001575func (m *moduleContext) InstallBypassMake() bool {
1576 return m.module.InstallBypassMake()
1577}
1578
Colin Cross70dda7e2019-10-01 22:05:35 -07001579func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001580 if m.module.base().commonProperties.SkipInstall {
Colin Cross893d8162017-04-26 17:34:03 -07001581 return true
1582 }
1583
Colin Cross3607f212018-05-07 15:28:05 -07001584 // We'll need a solution for choosing which of modules with the same name in different
1585 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
1586 // list of namespaces to install in a Soong-only build.
Colin Cross25de6c32019-06-06 14:29:25 -07001587 if !m.module.base().commonProperties.NamespaceExportedToMake {
Colin Cross3607f212018-05-07 15:28:05 -07001588 return true
1589 }
1590
Colin Cross25de6c32019-06-06 14:29:25 -07001591 if m.Device() {
Colin Cross607d8582019-07-29 16:44:46 -07001592 if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
Colin Cross893d8162017-04-26 17:34:03 -07001593 return true
1594 }
1595
Colin Cross25de6c32019-06-06 14:29:25 -07001596 if m.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07001597 return true
1598 }
1599 }
1600
1601 return false
1602}
1603
Colin Cross70dda7e2019-10-01 22:05:35 -07001604func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
1605 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07001606 return m.installFile(installPath, name, srcPath, Cp, deps)
Colin Cross5c517922017-08-31 12:29:17 -07001607}
1608
Colin Cross70dda7e2019-10-01 22:05:35 -07001609func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
1610 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07001611 return m.installFile(installPath, name, srcPath, CpExecutable, deps)
Colin Cross5c517922017-08-31 12:29:17 -07001612}
1613
Colin Cross70dda7e2019-10-01 22:05:35 -07001614func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
1615 rule blueprint.Rule, deps []Path) InstallPath {
Colin Cross35cec122015-04-02 14:37:16 -07001616
Colin Cross25de6c32019-06-06 14:29:25 -07001617 fullInstallPath := installPath.Join(m, name)
1618 m.module.base().hooks.runInstallHooks(m, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001619
Colin Cross25de6c32019-06-06 14:29:25 -07001620 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001621
Colin Cross25de6c32019-06-06 14:29:25 -07001622 deps = append(deps, m.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001623
Colin Cross89562dc2016-10-03 17:47:19 -07001624 var implicitDeps, orderOnlyDeps Paths
1625
Colin Cross25de6c32019-06-06 14:29:25 -07001626 if m.Host() {
Colin Cross89562dc2016-10-03 17:47:19 -07001627 // Installed host modules might be used during the build, depend directly on their
1628 // dependencies so their timestamp is updated whenever their dependency is updated
1629 implicitDeps = deps
1630 } else {
1631 orderOnlyDeps = deps
1632 }
1633
Colin Cross25de6c32019-06-06 14:29:25 -07001634 m.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001635 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001636 Description: "install " + fullInstallPath.Base(),
1637 Output: fullInstallPath,
1638 Input: srcPath,
1639 Implicits: implicitDeps,
1640 OrderOnly: orderOnlyDeps,
Colin Cross25de6c32019-06-06 14:29:25 -07001641 Default: !m.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001642 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001643
Colin Cross25de6c32019-06-06 14:29:25 -07001644 m.installFiles = append(m.installFiles, fullInstallPath)
Dan Willemsen322acaf2016-01-12 23:07:05 -08001645 }
Colin Cross25de6c32019-06-06 14:29:25 -07001646 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001647 return fullInstallPath
1648}
1649
Colin Cross70dda7e2019-10-01 22:05:35 -07001650func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07001651 fullInstallPath := installPath.Join(m, name)
1652 m.module.base().hooks.runInstallHooks(m, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001653
Colin Cross25de6c32019-06-06 14:29:25 -07001654 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001655
Alex Lightfb4353d2019-01-17 13:57:45 -08001656 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
1657 if err != nil {
1658 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
1659 }
Colin Cross25de6c32019-06-06 14:29:25 -07001660 m.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001661 Rule: Symlink,
1662 Description: "install symlink " + fullInstallPath.Base(),
1663 Output: fullInstallPath,
1664 OrderOnly: Paths{srcPath},
Colin Cross25de6c32019-06-06 14:29:25 -07001665 Default: !m.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001666 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08001667 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08001668 },
1669 })
Colin Cross3854a602016-01-11 12:49:11 -08001670
Colin Cross25de6c32019-06-06 14:29:25 -07001671 m.installFiles = append(m.installFiles, fullInstallPath)
1672 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross12fc4972016-01-11 12:49:11 -08001673 }
Colin Cross3854a602016-01-11 12:49:11 -08001674 return fullInstallPath
1675}
1676
Jiyong Parkf1194352019-02-25 11:05:47 +09001677// installPath/name -> absPath where absPath might be a path that is available only at runtime
1678// (e.g. /apex/...)
Colin Cross70dda7e2019-10-01 22:05:35 -07001679func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07001680 fullInstallPath := installPath.Join(m, name)
1681 m.module.base().hooks.runInstallHooks(m, fullInstallPath, true)
Jiyong Parkf1194352019-02-25 11:05:47 +09001682
Colin Cross25de6c32019-06-06 14:29:25 -07001683 if !m.skipInstall(fullInstallPath) {
1684 m.Build(pctx, BuildParams{
Jiyong Parkf1194352019-02-25 11:05:47 +09001685 Rule: Symlink,
1686 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
1687 Output: fullInstallPath,
Colin Cross25de6c32019-06-06 14:29:25 -07001688 Default: !m.Config().EmbeddedInMake(),
Jiyong Parkf1194352019-02-25 11:05:47 +09001689 Args: map[string]string{
1690 "fromPath": absPath,
1691 },
1692 })
1693
Colin Cross25de6c32019-06-06 14:29:25 -07001694 m.installFiles = append(m.installFiles, fullInstallPath)
Jiyong Parkf1194352019-02-25 11:05:47 +09001695 }
1696 return fullInstallPath
1697}
1698
Colin Cross25de6c32019-06-06 14:29:25 -07001699func (m *moduleContext) CheckbuildFile(srcPath Path) {
1700 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross3f40fa42015-01-30 17:27:36 -08001701}
1702
Colin Cross3f40fa42015-01-30 17:27:36 -08001703type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001704 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001705}
1706
1707func isFileInstaller(m blueprint.Module) bool {
1708 _, ok := m.(fileInstaller)
1709 return ok
1710}
1711
1712func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001713 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001714 return ok
1715}
Colin Crossfce53272015-04-08 11:21:40 -07001716
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001717func findStringInSlice(str string, slice []string) int {
1718 for i, s := range slice {
1719 if s == str {
1720 return i
Colin Crossfce53272015-04-08 11:21:40 -07001721 }
1722 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001723 return -1
1724}
1725
Colin Cross41955e82019-05-29 14:40:35 -07001726// SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input
1727// was not a module reference.
1728func SrcIsModule(s string) (module string) {
Colin Cross068e0fe2016-12-13 15:23:47 -08001729 if len(s) > 1 && s[0] == ':' {
1730 return s[1:]
1731 }
1732 return ""
1733}
1734
Colin Cross41955e82019-05-29 14:40:35 -07001735// SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the
1736// module name and an empty string for the tag, or empty strings if the input was not a module reference.
1737func SrcIsModuleWithTag(s string) (module, tag string) {
1738 if len(s) > 1 && s[0] == ':' {
1739 module = s[1:]
1740 if tagStart := strings.IndexByte(module, '{'); tagStart > 0 {
1741 if module[len(module)-1] == '}' {
1742 tag = module[tagStart+1 : len(module)-1]
1743 module = module[:tagStart]
1744 return module, tag
1745 }
1746 }
1747 return module, ""
1748 }
1749 return "", ""
Colin Cross068e0fe2016-12-13 15:23:47 -08001750}
1751
Colin Cross41955e82019-05-29 14:40:35 -07001752type sourceOrOutputDependencyTag struct {
1753 blueprint.BaseDependencyTag
1754 tag string
1755}
1756
1757func sourceOrOutputDepTag(tag string) blueprint.DependencyTag {
1758 return sourceOrOutputDependencyTag{tag: tag}
1759}
1760
1761var SourceDepTag = sourceOrOutputDepTag("")
Colin Cross068e0fe2016-12-13 15:23:47 -08001762
Colin Cross366938f2017-12-11 16:29:02 -08001763// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1764// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08001765//
1766// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08001767func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
Nan Zhang2439eb72017-04-10 11:27:50 -07001768 set := make(map[string]bool)
1769
Colin Cross068e0fe2016-12-13 15:23:47 -08001770 for _, s := range srcFiles {
Colin Cross41955e82019-05-29 14:40:35 -07001771 if m, t := SrcIsModuleWithTag(s); m != "" {
1772 if _, found := set[s]; found {
1773 ctx.ModuleErrorf("found source dependency duplicate: %q!", s)
Nan Zhang2439eb72017-04-10 11:27:50 -07001774 } else {
Colin Cross41955e82019-05-29 14:40:35 -07001775 set[s] = true
1776 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Nan Zhang2439eb72017-04-10 11:27:50 -07001777 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001778 }
1779 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001780}
1781
Colin Cross366938f2017-12-11 16:29:02 -08001782// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1783// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08001784//
1785// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08001786func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1787 if s != nil {
Colin Cross41955e82019-05-29 14:40:35 -07001788 if m, t := SrcIsModuleWithTag(*s); m != "" {
1789 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Colin Cross366938f2017-12-11 16:29:02 -08001790 }
1791 }
1792}
1793
Colin Cross41955e82019-05-29 14:40:35 -07001794// A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"`
1795// using the ":module" syntax and provides a list of paths to be used as if they were listed in the property.
Colin Cross068e0fe2016-12-13 15:23:47 -08001796type SourceFileProducer interface {
1797 Srcs() Paths
1798}
1799
Colin Cross41955e82019-05-29 14:40:35 -07001800// A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"`
Roland Levillain97c1f342019-11-22 14:20:54 +00001801// using the ":module" syntax or ":module{.tag}" syntax and provides a list of output files to be used as if they were
Colin Cross41955e82019-05-29 14:40:35 -07001802// listed in the property.
1803type OutputFileProducer interface {
1804 OutputFiles(tag string) (Paths, error)
1805}
1806
Colin Crossfe17f6f2019-03-28 19:30:56 -07001807type HostToolProvider interface {
1808 HostToolPath() OptionalPath
1809}
1810
Colin Cross27b922f2019-03-04 22:35:41 -08001811// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
1812// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08001813//
1814// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Colin Cross25de6c32019-06-06 14:29:25 -07001815func (m *moduleContext) ExpandSources(srcFiles, excludes []string) Paths {
1816 return PathsForModuleSrcExcludes(m, srcFiles, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001817}
1818
Colin Cross2fafa3e2019-03-05 12:39:51 -08001819// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
1820// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08001821//
1822// Deprecated: use PathForModuleSrc instead.
Colin Cross25de6c32019-06-06 14:29:25 -07001823func (m *moduleContext) ExpandSource(srcFile, prop string) Path {
1824 return PathForModuleSrc(m, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08001825}
1826
1827// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
1828// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
1829// dependency resolution.
Colin Cross25de6c32019-06-06 14:29:25 -07001830func (m *moduleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
Colin Cross2fafa3e2019-03-05 12:39:51 -08001831 if srcFile != nil {
Colin Cross25de6c32019-06-06 14:29:25 -07001832 return OptionalPathForPath(PathForModuleSrc(m, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08001833 }
1834 return OptionalPath{}
1835}
1836
Colin Cross25de6c32019-06-06 14:29:25 -07001837func (m *moduleContext) RequiredModuleNames() []string {
1838 return m.module.base().commonProperties.Required
Nan Zhang6d34b302017-02-04 17:47:46 -08001839}
1840
Colin Cross25de6c32019-06-06 14:29:25 -07001841func (m *moduleContext) HostRequiredModuleNames() []string {
1842 return m.module.base().commonProperties.Host_required
Sasha Smundakb6d23052019-04-01 18:37:36 -07001843}
1844
Colin Cross25de6c32019-06-06 14:29:25 -07001845func (m *moduleContext) TargetRequiredModuleNames() []string {
1846 return m.module.base().commonProperties.Target_required
Sasha Smundakb6d23052019-04-01 18:37:36 -07001847}
1848
Colin Crossdc35e212019-06-06 16:13:11 -07001849func (b *baseModuleContext) Glob(globPattern string, excludes []string) Paths {
1850 ret, err := b.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001851 if err != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001852 b.ModuleErrorf("glob: %s", err.Error())
Colin Cross8f101b42015-06-17 15:09:06 -07001853 }
Colin Crossdc35e212019-06-06 16:13:11 -07001854 return pathsForModuleSrcFromFullPath(b, ret, true)
Colin Crossfce53272015-04-08 11:21:40 -07001855}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001856
Colin Crossdc35e212019-06-06 16:13:11 -07001857func (b *baseModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
1858 ret, err := b.GlobWithDeps(globPattern, excludes)
Nan Zhang581fd212018-01-10 16:06:12 -08001859 if err != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001860 b.ModuleErrorf("glob: %s", err.Error())
Nan Zhang581fd212018-01-10 16:06:12 -08001861 }
Colin Crossdc35e212019-06-06 16:13:11 -07001862 return pathsForModuleSrcFromFullPath(b, ret, false)
Nan Zhang581fd212018-01-10 16:06:12 -08001863}
1864
Colin Cross463a90e2015-06-17 14:20:06 -07001865func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001866 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001867}
1868
Colin Cross0875c522017-11-28 17:34:01 -08001869func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001870 return &buildTargetSingleton{}
1871}
1872
Colin Cross87d8b562017-04-25 10:01:55 -07001873func parentDir(dir string) string {
1874 dir, _ = filepath.Split(dir)
1875 return filepath.Clean(dir)
1876}
1877
Colin Cross1f8c52b2015-06-16 16:38:17 -07001878type buildTargetSingleton struct{}
1879
Colin Cross0875c522017-11-28 17:34:01 -08001880func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1881 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001882
Colin Cross0875c522017-11-28 17:34:01 -08001883 mmTarget := func(dir string) WritablePath {
1884 return PathForPhony(ctx,
1885 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001886 }
1887
Colin Cross0875c522017-11-28 17:34:01 -08001888 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001889
Colin Cross0875c522017-11-28 17:34:01 -08001890 ctx.VisitAllModules(func(module Module) {
1891 blueprintDir := module.base().blueprintDir
1892 installTarget := module.base().installTarget
1893 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001894
Colin Cross0875c522017-11-28 17:34:01 -08001895 if checkbuildTarget != nil {
1896 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1897 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1898 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001899
Colin Cross0875c522017-11-28 17:34:01 -08001900 if installTarget != nil {
1901 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001902 }
1903 })
1904
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001905 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001906 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001907 suffix = "-soong"
1908 }
1909
Colin Cross1f8c52b2015-06-16 16:38:17 -07001910 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001911 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001912 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001913 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001914 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001915 })
1916
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001917 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001918 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001919 return
1920 }
1921
Colin Cross87d8b562017-04-25 10:01:55 -07001922 // Ensure ancestor directories are in modulesInDir
Inseob Kim1a365c62019-06-08 15:47:51 +09001923 dirs := SortedStringKeys(modulesInDir)
Colin Cross87d8b562017-04-25 10:01:55 -07001924 for _, dir := range dirs {
1925 dir := parentDir(dir)
1926 for dir != "." && dir != "/" {
1927 if _, exists := modulesInDir[dir]; exists {
1928 break
1929 }
1930 modulesInDir[dir] = nil
1931 dir = parentDir(dir)
1932 }
1933 }
1934
1935 // Make directories build their direct subdirectories
Colin Cross87d8b562017-04-25 10:01:55 -07001936 for _, dir := range dirs {
1937 p := parentDir(dir)
1938 if p != "." && p != "/" {
1939 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1940 }
1941 }
1942
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001943 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1944 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1945 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001946 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001947 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001948 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001949 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001950 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001951 // HACK: checkbuild should be an optional build, but force it
1952 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001953 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001954 })
1955 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001956
1957 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1958 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001959 ctx.VisitAllModules(func(module Module) {
1960 if module.Enabled() {
1961 os := module.Target().Os
1962 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001963 }
1964 })
1965
Colin Cross0875c522017-11-28 17:34:01 -08001966 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001967 for os, deps := range osDeps {
1968 var className string
1969
1970 switch os.Class {
1971 case Host:
1972 className = "host"
1973 case HostCross:
1974 className = "host-cross"
1975 case Device:
1976 className = "target"
1977 default:
1978 continue
1979 }
1980
Colin Cross0875c522017-11-28 17:34:01 -08001981 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001982 osClass[className] = append(osClass[className], name)
1983
Colin Cross0875c522017-11-28 17:34:01 -08001984 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001985 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001986 Output: name,
1987 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001988 })
1989 }
1990
1991 // Wrap those into host|host-cross|target phony rules
Inseob Kim1a365c62019-06-08 15:47:51 +09001992 for _, class := range SortedStringKeys(osClass) {
Colin Cross0875c522017-11-28 17:34:01 -08001993 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001994 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001995 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001996 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001997 })
1998 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001999}
Colin Crossd779da42015-12-17 18:00:23 -08002000
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002001// Collect information for opening IDE project files in java/jdeps.go.
2002type IDEInfo interface {
2003 IDEInfo(ideInfo *IdeInfo)
2004 BaseModuleName() string
2005}
2006
2007// Extract the base module name from the Import name.
2008// Often the Import name has a prefix "prebuilt_".
2009// Remove the prefix explicitly if needed
2010// until we find a better solution to get the Import name.
2011type IDECustomizedModuleName interface {
2012 IDECustomizedModuleName() string
2013}
2014
2015type IdeInfo struct {
2016 Deps []string `json:"dependencies,omitempty"`
2017 Srcs []string `json:"srcs,omitempty"`
2018 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
2019 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
2020 Jars []string `json:"jars,omitempty"`
2021 Classes []string `json:"class,omitempty"`
2022 Installed_paths []string `json:"installed,omitempty"`
patricktu18c82ff2019-05-10 15:48:50 +08002023 SrcJars []string `json:"srcjars,omitempty"`
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002024}