blob: e4fb509c32c99d07d2b6327dde84b60c7d9d641e [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Cross3f40fa42015-01-30 17:27:36 -080016
17import (
Colin Cross6ff51382015-12-17 16:39:19 -080018 "fmt"
Colin Cross988414c2020-01-11 01:11:46 +000019 "os"
Alex Lightfb4353d2019-01-17 13:57:45 -080020 "path"
Colin Cross3f40fa42015-01-30 17:27:36 -080021 "path/filepath"
Jiyong Park1c7e9622020-05-07 16:12:13 +090022 "regexp"
Colin Cross6ff51382015-12-17 16:39:19 -080023 "strings"
Colin Crossaabf6792017-11-29 00:27:14 -080024 "text/scanner"
Colin Crossf6566ed2015-03-24 11:13:38 -070025
26 "github.com/google/blueprint"
Colin Crossfe4bc362018-09-12 10:02:13 -070027 "github.com/google/blueprint/proptools"
Colin Cross3f40fa42015-01-30 17:27:36 -080028)
29
30var (
31 DeviceSharedLibrary = "shared_library"
32 DeviceStaticLibrary = "static_library"
33 DeviceExecutable = "executable"
34 HostSharedLibrary = "host_shared_library"
35 HostStaticLibrary = "host_static_library"
36 HostExecutable = "host_executable"
37)
38
Colin Crossae887032017-10-23 17:16:14 -070039type BuildParams struct {
Dan Willemsen9f3c5742016-11-03 14:28:31 -070040 Rule blueprint.Rule
Colin Cross33bfb0a2016-11-21 17:23:08 -080041 Deps blueprint.Deps
42 Depfile WritablePath
Colin Cross67a5c132017-05-09 13:45:28 -070043 Description string
Dan Willemsen9f3c5742016-11-03 14:28:31 -070044 Output WritablePath
45 Outputs WritablePaths
46 ImplicitOutput WritablePath
47 ImplicitOutputs WritablePaths
48 Input Path
49 Inputs Paths
50 Implicit Path
51 Implicits Paths
52 OrderOnly Paths
Colin Cross824f1162020-07-16 13:07:51 -070053 Validation Path
54 Validations Paths
Dan Willemsen9f3c5742016-11-03 14:28:31 -070055 Default bool
56 Args map[string]string
Dan Willemsen34cc69e2015-09-23 15:26:20 -070057}
58
Colin Crossae887032017-10-23 17:16:14 -070059type ModuleBuildParams BuildParams
60
Colin Cross1184b642019-12-30 18:43:07 -080061// EarlyModuleContext provides methods that can be called early, as soon as the properties have
62// been parsed into the module and before any mutators have run.
63type EarlyModuleContext interface {
64 Module() Module
65 ModuleName() string
66 ModuleDir() string
67 ModuleType() string
Colin Cross9d34f352019-11-22 16:03:51 -080068 BlueprintsFile() string
Colin Cross1184b642019-12-30 18:43:07 -080069
70 ContainsProperty(name string) bool
71 Errorf(pos scanner.Position, fmt string, args ...interface{})
72 ModuleErrorf(fmt string, args ...interface{})
73 PropertyErrorf(property, fmt string, args ...interface{})
74 Failed() bool
75
76 AddNinjaFileDeps(deps ...string)
77
78 DeviceSpecific() bool
79 SocSpecific() bool
80 ProductSpecific() bool
81 SystemExtSpecific() bool
82 Platform() bool
83
84 Config() Config
85 DeviceConfig() DeviceConfig
86
87 // Deprecated: use Config()
88 AConfig() Config
89
90 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
91 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
92 // builder whenever a file matching the pattern as added or removed, without rerunning if a
93 // file that does not match the pattern is added to a searched directory.
94 GlobWithDeps(pattern string, excludes []string) ([]string, error)
95
96 Glob(globPattern string, excludes []string) Paths
97 GlobFiles(globPattern string, excludes []string) Paths
Colin Cross988414c2020-01-11 01:11:46 +000098 IsSymlink(path Path) bool
99 Readlink(path Path) string
Colin Cross1184b642019-12-30 18:43:07 -0800100}
101
Colin Cross0ea8ba82019-06-06 14:33:29 -0700102// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
Colin Crossdc35e212019-06-06 16:13:11 -0700103// a Config instead of an interface{}, and some methods have been wrapped to use an android.Module
104// instead of a blueprint.Module, plus some extra methods that return Android-specific information
Colin Cross0ea8ba82019-06-06 14:33:29 -0700105// about the current module.
106type BaseModuleContext interface {
Colin Cross1184b642019-12-30 18:43:07 -0800107 EarlyModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -0700108
Paul Duffinf88d8e02020-05-07 20:21:34 +0100109 blueprintBaseModuleContext() blueprint.BaseModuleContext
110
Colin Crossdc35e212019-06-06 16:13:11 -0700111 OtherModuleName(m blueprint.Module) string
112 OtherModuleDir(m blueprint.Module) string
113 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
114 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
115 OtherModuleExists(name string) bool
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000116 OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool
117 OtherModuleReverseDependencyVariantExists(name string) bool
Jiyong Park9e6c2422019-08-09 20:39:45 +0900118 OtherModuleType(m blueprint.Module) string
Colin Crossdc35e212019-06-06 16:13:11 -0700119
120 GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module
121 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
122 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
123
124 VisitDirectDepsBlueprint(visit func(blueprint.Module))
125 VisitDirectDeps(visit func(Module))
126 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
127 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
128 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
129 VisitDepsDepthFirst(visit func(Module))
130 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
131 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
132 WalkDeps(visit func(Module, Module) bool)
133 WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool)
134 // GetWalkPath is supposed to be called in visit function passed in WalkDeps()
135 // and returns a top-down dependency path from a start module to current child module.
136 GetWalkPath() []Module
137
Paul Duffinc5192442020-03-31 11:31:36 +0100138 // GetTagPath is supposed to be called in visit function passed in WalkDeps()
139 // and returns a top-down dependency tags path from a start module to current child module.
140 // It has one less entry than GetWalkPath() as it contains the dependency tags that
141 // exist between each adjacent pair of modules in the GetWalkPath().
142 // GetTagPath()[i] is the tag between GetWalkPath()[i] and GetWalkPath()[i+1]
143 GetTagPath() []blueprint.DependencyTag
144
Jiyong Park1c7e9622020-05-07 16:12:13 +0900145 // GetPathString is supposed to be called in visit function passed in WalkDeps()
146 // and returns a multi-line string showing the modules and dependency tags
147 // among them along the top-down dependency path from a start module to current child module.
148 // skipFirst when set to true, the output doesn't include the start module,
149 // which is already printed when this function is used along with ModuleErrorf().
150 GetPathString(skipFirst bool) string
151
Colin Crossdc35e212019-06-06 16:13:11 -0700152 AddMissingDependencies(missingDeps []string)
153
Colin Crossa1ad8d12016-06-01 17:09:44 -0700154 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -0700155 TargetPrimary() bool
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000156
157 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
158 // responsible for creating.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700159 MultiTargets() []Target
Colin Crossf6566ed2015-03-24 11:13:38 -0700160 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -0700161 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -0700162 Host() bool
163 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -0700164 Darwin() bool
Doug Horn21b94272019-01-16 12:06:11 -0800165 Fuchsia() bool
Colin Cross3edeee12017-04-04 12:59:48 -0700166 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700167 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700168 PrimaryArch() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700169}
170
Colin Cross1184b642019-12-30 18:43:07 -0800171// Deprecated: use EarlyModuleContext instead
Colin Cross635c3b02016-05-18 15:37:25 -0700172type BaseContext interface {
Colin Cross1184b642019-12-30 18:43:07 -0800173 EarlyModuleContext
Colin Crossaabf6792017-11-29 00:27:14 -0800174}
175
Colin Cross635c3b02016-05-18 15:37:25 -0700176type ModuleContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -0800177 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800178
Colin Crossae887032017-10-23 17:16:14 -0700179 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800180 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700181
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700182 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800183 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800184 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700185
Colin Cross70dda7e2019-10-01 22:05:35 -0700186 InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
187 InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
188 InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath
189 InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700190 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800191
Colin Cross8d8f8e22016-08-03 11:57:50 -0700192 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700193 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700194 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800195 InstallInRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900196 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700197 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700198 InstallBypassMake() bool
Colin Cross6e359402020-02-10 15:29:54 -0800199 InstallForceOS() *OsType
Nan Zhang6d34b302017-02-04 17:47:46 -0800200
201 RequiredModuleNames() []string
Sasha Smundakb6d23052019-04-01 18:37:36 -0700202 HostRequiredModuleNames() []string
203 TargetRequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700204
Colin Cross3f68a132017-10-23 17:10:29 -0700205 ModuleSubDir() string
206
Colin Cross0875c522017-11-28 17:34:01 -0800207 Variable(pctx PackageContext, name, value string)
208 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700209 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
210 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800211 Build(pctx PackageContext, params BuildParams)
Colin Crossc3d87d32020-06-04 13:25:17 -0700212 // Phony creates a Make-style phony rule, a rule with no commands that can depend on other
213 // phony rules or real files. Phony can be called on the same name multiple times to add
214 // additional dependencies.
215 Phony(phony string, deps ...Path)
Colin Cross3f68a132017-10-23 17:10:29 -0700216
Colin Cross0875c522017-11-28 17:34:01 -0800217 PrimaryModule() Module
218 FinalModule() Module
219 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700220
221 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800222 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800223}
224
Colin Cross635c3b02016-05-18 15:37:25 -0700225type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800226 blueprint.Module
227
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700228 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
229 // but GenerateAndroidBuildActions also has access to Android-specific information.
230 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700231 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700232
Paul Duffin44f1d842020-06-26 20:17:02 +0100233 // Add dependencies to the components of a module, i.e. modules that are created
234 // by the module and which are considered to be part of the creating module.
235 //
236 // This is called before prebuilts are renamed so as to allow a dependency to be
237 // added directly to a prebuilt child module instead of depending on a source module
238 // and relying on prebuilt processing to switch to the prebuilt module if preferred.
239 //
240 // A dependency on a prebuilt must include the "prebuilt_" prefix.
241 ComponentDepsMutator(ctx BottomUpMutatorContext)
242
Colin Cross1e676be2016-10-12 14:38:15 -0700243 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800244
Colin Cross635c3b02016-05-18 15:37:25 -0700245 base() *ModuleBase
Inseob Kimeec88e12020-01-22 11:11:29 +0900246 Disable()
Dan Willemsen0effe062015-11-30 16:06:01 -0800247 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700248 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800249 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700250 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700251 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800252 InstallInRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900253 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700254 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700255 InstallBypassMake() bool
Colin Cross6e359402020-02-10 15:29:54 -0800256 InstallForceOS() *OsType
Colin Crossa2f296f2016-11-29 15:16:18 -0800257 SkipInstall()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +0000258 IsSkipInstall() bool
Jiyong Park374510b2018-03-19 18:23:01 +0900259 ExportedToMake() bool
Inseob Kim8471cda2019-11-15 09:59:12 +0900260 InitRc() Paths
261 VintfFragments() Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800262 NoticeFiles() Paths
Colin Cross36242852017-06-23 15:06:31 -0700263
264 AddProperties(props ...interface{})
265 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700266
Colin Crossae887032017-10-23 17:16:14 -0700267 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800268 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800269 VariablesForTests() map[string]string
Paul Duffine2453c72019-05-31 14:00:04 +0100270
Colin Cross9a362232019-07-01 15:32:45 -0700271 // String returns a string that includes the module name and variants for printing during debugging.
272 String() string
273
Paul Duffine2453c72019-05-31 14:00:04 +0100274 // Get the qualified module id for this module.
275 qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName
276
277 // Get information about the properties that can contain visibility rules.
278 visibilityProperties() []visibilityProperty
Paul Duffin63c6e182019-07-24 14:24:38 +0100279
Jiyong Park6a8cf5f2019-12-30 16:31:09 +0900280 RequiredModuleNames() []string
281 HostRequiredModuleNames() []string
282 TargetRequiredModuleNames() []string
Colin Cross897266e2020-02-13 13:22:08 -0800283
284 filesToInstall() InstallPaths
Paul Duffine2453c72019-05-31 14:00:04 +0100285}
286
287// Qualified id for a module
288type qualifiedModuleName struct {
289 // The package (i.e. directory) in which the module is defined, without trailing /
290 pkg string
291
292 // The name of the module, empty string if package.
293 name string
294}
295
296func (q qualifiedModuleName) String() string {
297 if q.name == "" {
298 return "//" + q.pkg
299 }
300 return "//" + q.pkg + ":" + q.name
301}
302
Paul Duffine484f472019-06-20 16:38:08 +0100303func (q qualifiedModuleName) isRootPackage() bool {
304 return q.pkg == "" && q.name == ""
305}
306
Paul Duffine2453c72019-05-31 14:00:04 +0100307// Get the id for the package containing this module.
308func (q qualifiedModuleName) getContainingPackageId() qualifiedModuleName {
309 pkg := q.pkg
310 if q.name == "" {
Paul Duffine484f472019-06-20 16:38:08 +0100311 if pkg == "" {
312 panic(fmt.Errorf("Cannot get containing package id of root package"))
313 }
314
315 index := strings.LastIndex(pkg, "/")
316 if index == -1 {
317 pkg = ""
318 } else {
319 pkg = pkg[:index]
320 }
Paul Duffine2453c72019-05-31 14:00:04 +0100321 }
322 return newPackageId(pkg)
323}
324
325func newPackageId(pkg string) qualifiedModuleName {
326 // A qualified id for a package module has no name.
327 return qualifiedModuleName{pkg: pkg, name: ""}
Colin Cross3f40fa42015-01-30 17:27:36 -0800328}
329
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000330type Dist struct {
331 // Copy the output of this module to the $DIST_DIR when `dist` is specified on the
332 // command line and any of these targets are also on the command line, or otherwise
333 // built
334 Targets []string `android:"arch_variant"`
335
336 // The name of the output artifact. This defaults to the basename of the output of
337 // the module.
338 Dest *string `android:"arch_variant"`
339
340 // The directory within the dist directory to store the artifact. Defaults to the
341 // top level directory ("").
342 Dir *string `android:"arch_variant"`
343
344 // A suffix to add to the artifact file name (before any extension).
345 Suffix *string `android:"arch_variant"`
346
347 // A string tag to select the OutputFiles associated with the tag. Defaults to the
348 // the empty "" string.
349 Tag *string `android:"arch_variant"`
350}
351
Colin Crossfc754582016-05-17 16:34:16 -0700352type nameProperties struct {
353 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800354 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700355}
356
357type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800358 // emit build rules for this module
Paul Duffin54d9bb72020-02-12 10:20:56 +0000359 //
360 // Disabling a module should only be done for those modules that cannot be built
361 // in the current environment. Modules that can build in the current environment
362 // but are not usually required (e.g. superceded by a prebuilt) should not be
363 // disabled as that will prevent them from being built by the checkbuild target
364 // and so prevent early detection of changes that have broken those modules.
Dan Willemsen0effe062015-11-30 16:06:01 -0800365 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800366
Paul Duffin2e61fa62019-03-28 14:10:57 +0000367 // Controls the visibility of this module to other modules. Allowable values are one or more of
368 // these formats:
369 //
370 // ["//visibility:public"]: Anyone can use this module.
371 // ["//visibility:private"]: Only rules in the module's package (not its subpackages) can use
372 // this module.
Paul Duffin51084ff2020-05-05 19:19:22 +0100373 // ["//visibility:override"]: Discards any rules inherited from defaults or a creating module.
374 // Can only be used at the beginning of a list of visibility rules.
Paul Duffin2e61fa62019-03-28 14:10:57 +0000375 // ["//some/package:__pkg__", "//other/package:__pkg__"]: Only modules in some/package and
376 // other/package (defined in some/package/*.bp and other/package/*.bp) have access to
377 // this module. Note that sub-packages do not have access to the rule; for example,
378 // //some/package/foo:bar or //other/package/testing:bla wouldn't have access. __pkg__
379 // is a special module and must be used verbatim. It represents all of the modules in the
380 // package.
381 // ["//project:__subpackages__", "//other:__subpackages__"]: Only modules in packages project
382 // or other or in one of their sub-packages have access to this module. For example,
383 // //project:rule, //project/library:lib or //other/testing/internal:munge are allowed
384 // to depend on this rule (but not //independent:evil)
385 // ["//project"]: This is shorthand for ["//project:__pkg__"]
386 // [":__subpackages__"]: This is shorthand for ["//project:__subpackages__"] where
387 // //project is the module's package. e.g. using [":__subpackages__"] in
388 // packages/apps/Settings/Android.bp is equivalent to
389 // //packages/apps/Settings:__subpackages__.
390 // ["//visibility:legacy_public"]: The default visibility, behaves as //visibility:public
391 // for now. It is an error if it is used in a module.
Paul Duffine2453c72019-05-31 14:00:04 +0100392 //
393 // If a module does not specify the `visibility` property then it uses the
394 // `default_visibility` property of the `package` module in the module's package.
395 //
396 // If the `default_visibility` property is not set for the module's package then
Paul Duffine484f472019-06-20 16:38:08 +0100397 // it will use the `default_visibility` of its closest ancestor package for which
398 // a `default_visibility` property is specified.
399 //
400 // If no `default_visibility` property can be found then the module uses the
401 // global default of `//visibility:legacy_public`.
Paul Duffine2453c72019-05-31 14:00:04 +0100402 //
Paul Duffin95d53b52019-07-24 13:45:05 +0100403 // The `visibility` property has no effect on a defaults module although it does
404 // apply to any non-defaults module that uses it. To set the visibility of a
405 // defaults module, use the `defaults_visibility` property on the defaults module;
406 // not to be confused with the `default_visibility` property on the package module.
407 //
Paul Duffin2e61fa62019-03-28 14:10:57 +0000408 // See https://android.googlesource.com/platform/build/soong/+/master/README.md#visibility for
409 // more details.
410 Visibility []string
411
Colin Cross7d5136f2015-05-11 13:39:40 -0700412 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800413 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
414 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
415 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700416 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700417
418 Target struct {
419 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700420 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700421 }
422 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700423 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700424 }
425 }
426
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000427 // If set to true then the archMutator will create variants for each arch specific target
428 // (e.g. 32/64) that the module is required to produce. If set to false then it will only
429 // create a variant for the architecture and will list the additional arch specific targets
430 // that the variant needs to produce in the CompileMultiTargets property.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700431 UseTargetVariants bool `blueprint:"mutated"`
432 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800433
Dan Willemsen782a2d12015-12-21 14:55:28 -0800434 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700435 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800436
Colin Cross55708f32017-03-20 13:23:34 -0700437 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700438 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700439
Jiyong Park2db76922017-11-08 16:03:48 +0900440 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
441 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
442 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700443 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700444
Jiyong Park2db76922017-11-08 16:03:48 +0900445 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
446 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
447 Soc_specific *bool
448
449 // whether this module is specific to a device, not only for SoC, but also for off-chip
450 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
451 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
452 // This implies `soc_specific:true`.
453 Device_specific *bool
454
455 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900456 // network operator, etc). When set to true, it is installed into /product (or
457 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900458 Product_specific *bool
459
Justin Yund5f6c822019-06-25 16:47:17 +0900460 // whether this module extends system. When set to true, it is installed into /system_ext
461 // (or /system/system_ext if system_ext partition does not exist).
462 System_ext_specific *bool
463
Jiyong Parkf9332f12018-02-01 00:54:12 +0900464 // Whether this module is installed to recovery partition
465 Recovery *bool
466
Yifan Hong1b3348d2020-01-21 15:53:22 -0800467 // Whether this module is installed to ramdisk
468 Ramdisk *bool
469
dimitry1f33e402019-03-26 12:39:31 +0100470 // Whether this module is built for non-native architecures (also known as native bridge binary)
471 Native_bridge_supported *bool `android:"arch_variant"`
472
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700473 // init.rc files to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800474 Init_rc []string `android:"path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700475
Steven Moreland57a23d22018-04-04 15:42:19 -0700476 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800477 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700478
Chris Wolfe998306e2016-08-15 14:47:23 -0400479 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700480 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400481
Sasha Smundakb6d23052019-04-01 18:37:36 -0700482 // names of other modules to install on host if this module is installed
483 Host_required []string `android:"arch_variant"`
484
485 // names of other modules to install on target if this module is installed
486 Target_required []string `android:"arch_variant"`
487
Colin Cross5aac3622017-08-31 15:07:09 -0700488 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800489 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700490
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000491 // configuration to distribute output files from this module to the distribution
492 // directory (default: $OUT/dist, configurable with $DIST_DIR)
493 Dist Dist `android:"arch_variant"`
Dan Willemsen569edc52018-11-19 09:33:29 -0800494
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000495 // a list of configurations to distribute output files from this module to the
496 // distribution directory (default: $OUT/dist, configurable with $DIST_DIR)
497 Dists []Dist `android:"arch_variant"`
Dan Willemsen569edc52018-11-19 09:33:29 -0800498
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000499 // The OsType of artifacts that this module variant is responsible for creating.
500 //
501 // Set by osMutator
502 CompileOS OsType `blueprint:"mutated"`
503
504 // The Target of artifacts that this module variant is responsible for creating.
505 //
506 // Set by archMutator
507 CompileTarget Target `blueprint:"mutated"`
508
509 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
510 // responsible for creating.
511 //
512 // By default this is nil as, where necessary, separate variants are created for the
513 // different multilib types supported and that information is encapsulated in the
514 // CompileTarget so the module variant simply needs to create artifacts for that.
515 //
516 // However, if UseTargetVariants is set to false (e.g. by
517 // InitAndroidMultiTargetsArchModule) then no separate variants are created for the
518 // multilib targets. Instead a single variant is created for the architecture and
519 // this contains the multilib specific targets that this variant should create.
520 //
521 // Set by archMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700522 CompileMultiTargets []Target `blueprint:"mutated"`
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000523
524 // True if the module variant's CompileTarget is the primary target
525 //
526 // Set by archMutator
527 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800528
529 // Set by InitAndroidModule
530 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700531 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700532
Paul Duffin1356d8c2020-02-25 19:26:33 +0000533 // If set to true then a CommonOS variant will be created which will have dependencies
534 // on all its OsType specific variants. Used by sdk/module_exports to create a snapshot
535 // that covers all os and architecture variants.
536 //
537 // The OsType specific variants can be retrieved by calling
538 // GetOsSpecificVariantsOfCommonOSVariant
539 //
540 // Set at module initialization time by calling InitCommonOSAndroidMultiTargetsArchModule
541 CreateCommonOSVariant bool `blueprint:"mutated"`
542
543 // If set to true then this variant is the CommonOS variant that has dependencies on its
544 // OsType specific variants.
545 //
546 // Set by osMutator.
547 CommonOSVariant bool `blueprint:"mutated"`
548
Colin Crossce75d2c2016-10-06 16:12:58 -0700549 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800550
551 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross6c4f21f2019-06-06 15:41:36 -0700552
553 MissingDeps []string `blueprint:"mutated"`
Colin Cross9a362232019-07-01 15:32:45 -0700554
555 // Name and variant strings stored by mutators to enable Module.String()
556 DebugName string `blueprint:"mutated"`
557 DebugMutators []string `blueprint:"mutated"`
558 DebugVariations []string `blueprint:"mutated"`
Colin Cross7228ecd2019-11-18 16:00:16 -0800559
560 // set by ImageMutator
561 ImageVariation string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800562}
563
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000564// A map of OutputFile tag keys to Paths, for disting purposes.
565type TaggedDistFiles map[string]Paths
566
567func MakeDefaultDistFiles(paths ...Path) TaggedDistFiles {
Jingwen Chen7b27ca72020-07-24 09:13:49 +0000568 for _, path := range paths {
569 if path == nil {
570 panic("The path to a dist file cannot be nil.")
571 }
572 }
573
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000574 // The default OutputFile tag is the empty "" string.
575 return TaggedDistFiles{"": paths}
576}
577
Colin Cross3f40fa42015-01-30 17:27:36 -0800578type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800579 // If set to true, build a variant of the module for the host. Defaults to false.
580 Host_supported *bool
581
582 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700583 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800584}
585
Colin Crossc472d572015-03-17 15:06:21 -0700586type Multilib string
587
588const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800589 MultilibBoth Multilib = "both"
590 MultilibFirst Multilib = "first"
591 MultilibCommon Multilib = "common"
592 MultilibCommonFirst Multilib = "common_first"
593 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700594)
595
Colin Crossa1ad8d12016-06-01 17:09:44 -0700596type HostOrDeviceSupported int
597
598const (
599 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700600
601 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700602 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700603
604 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700605 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700606
607 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700608 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700609
610 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700611 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700612
613 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700614 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700615
616 // Nothing is supported. This is not exposed to the user, but used to mark a
617 // host only module as unsupported when the module type is not supported on
618 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700619 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700620)
621
Jiyong Park2db76922017-11-08 16:03:48 +0900622type moduleKind int
623
624const (
625 platformModule moduleKind = iota
626 deviceSpecificModule
627 socSpecificModule
628 productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900629 systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900630)
631
632func (k moduleKind) String() string {
633 switch k {
634 case platformModule:
635 return "platform"
636 case deviceSpecificModule:
637 return "device-specific"
638 case socSpecificModule:
639 return "soc-specific"
640 case productSpecificModule:
641 return "product-specific"
Justin Yund5f6c822019-06-25 16:47:17 +0900642 case systemExtSpecificModule:
643 return "systemext-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900644 default:
645 panic(fmt.Errorf("unknown module kind %d", k))
646 }
647}
648
Colin Cross9d34f352019-11-22 16:03:51 -0800649func initAndroidModuleBase(m Module) {
650 m.base().module = m
651}
652
Colin Cross36242852017-06-23 15:06:31 -0700653func InitAndroidModule(m Module) {
Colin Cross9d34f352019-11-22 16:03:51 -0800654 initAndroidModuleBase(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800655 base := m.base()
Colin Cross5049f022015-03-18 13:28:46 -0700656
Colin Cross36242852017-06-23 15:06:31 -0700657 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700658 &base.nameProperties,
Colin Cross18c46802019-09-24 22:19:02 -0700659 &base.commonProperties)
660
Colin Crosseabaedd2020-02-06 17:01:55 -0800661 initProductVariableModule(m)
Colin Cross18c46802019-09-24 22:19:02 -0700662
Colin Crossa3a97412019-03-18 12:24:29 -0700663 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700664 base.customizableProperties = m.GetProperties()
Paul Duffin63c6e182019-07-24 14:24:38 +0100665
666 // The default_visibility property needs to be checked and parsed by the visibility module during
Paul Duffin5ec73ec2020-05-01 17:52:01 +0100667 // its checking and parsing phases so make it the primary visibility property.
668 setPrimaryVisibilityProperty(m, "visibility", &base.commonProperties.Visibility)
Colin Cross5049f022015-03-18 13:28:46 -0700669}
670
Colin Cross36242852017-06-23 15:06:31 -0700671func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
672 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700673
674 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800675 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700676 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700677 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700678 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800679
Dan Willemsen218f6562015-07-08 18:13:11 -0700680 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700681 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700682 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800683 }
684
Colin Cross36242852017-06-23 15:06:31 -0700685 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800686}
687
Colin Crossee0bc3b2018-10-02 22:01:37 -0700688func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
689 InitAndroidArchModule(m, hod, defaultMultilib)
690 m.base().commonProperties.UseTargetVariants = false
691}
692
Paul Duffin1356d8c2020-02-25 19:26:33 +0000693// As InitAndroidMultiTargetsArchModule except it creates an additional CommonOS variant that
694// has dependencies on all the OsType specific variants.
695func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
696 InitAndroidArchModule(m, hod, defaultMultilib)
697 m.base().commonProperties.UseTargetVariants = false
698 m.base().commonProperties.CreateCommonOSVariant = true
699}
700
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800701// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800702// modules. It should be included as an anonymous field in every module
703// struct definition. InitAndroidModule should then be called from the module's
704// factory function, and the return values from InitAndroidModule should be
705// returned from the factory function.
706//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800707// The ModuleBase type is responsible for implementing the GenerateBuildActions
708// method to support the blueprint.Module interface. This method will then call
709// the module's GenerateAndroidBuildActions method once for each build variant
Colin Cross25de6c32019-06-06 14:29:25 -0700710// that is to be built. GenerateAndroidBuildActions is passed a ModuleContext
711// rather than the usual blueprint.ModuleContext.
712// ModuleContext exposes extra functionality specific to the Android build
Colin Cross3f40fa42015-01-30 17:27:36 -0800713// system including details about the particular build variant that is to be
714// generated.
715//
716// For example:
717//
718// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800719// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800720// )
721//
722// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800723// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800724// properties struct {
725// MyProperty string
726// }
727// }
728//
Colin Cross36242852017-06-23 15:06:31 -0700729// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800730// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700731// m.AddProperties(&m.properties)
732// android.InitAndroidModule(m)
733// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800734// }
735//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800736// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800737// // Get the CPU architecture for the current build variant.
738// variantArch := ctx.Arch()
739//
740// // ...
741// }
Colin Cross635c3b02016-05-18 15:37:25 -0700742type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800743 // Putting the curiously recurring thing pointing to the thing that contains
744 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700745 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700746 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800747
Colin Crossfc754582016-05-17 16:34:16 -0700748 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800749 commonProperties commonProperties
Colin Cross18c46802019-09-24 22:19:02 -0700750 variableProperties interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800751 hostAndDeviceProperties hostAndDeviceProperties
752 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700753 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700754 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800755
Paul Duffin63c6e182019-07-24 14:24:38 +0100756 // Information about all the properties on the module that contains visibility rules that need
757 // checking.
758 visibilityPropertyInfo []visibilityProperty
759
760 // The primary visibility property, may be nil, that controls access to the module.
761 primaryVisibilityProperty visibilityProperty
762
Colin Cross3f40fa42015-01-30 17:27:36 -0800763 noAddressSanitizer bool
Colin Cross897266e2020-02-13 13:22:08 -0800764 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700765 checkbuildFiles Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800766 noticeFiles Paths
Colin Crossc3d87d32020-06-04 13:25:17 -0700767 phonies map[string]Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700768
769 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
770 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800771 installTarget WritablePath
772 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700773 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700774
Colin Cross178a5092016-09-13 13:42:32 -0700775 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700776
777 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700778
779 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700780 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800781 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800782 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700783
Inseob Kim8471cda2019-11-15 09:59:12 +0900784 initRcPaths Paths
785 vintfFragmentsPaths Paths
786
Colin Crossa9d8bee2018-10-02 13:59:46 -0700787 prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
Colin Cross36242852017-06-23 15:06:31 -0700788}
789
Paul Duffin44f1d842020-06-26 20:17:02 +0100790func (m *ModuleBase) ComponentDepsMutator(BottomUpMutatorContext) {}
791
Colin Cross4157e882019-06-06 16:57:04 -0700792func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
Colin Cross5f692ec2019-02-01 16:53:07 -0800793
Colin Cross4157e882019-06-06 16:57:04 -0700794func (m *ModuleBase) AddProperties(props ...interface{}) {
795 m.registerProps = append(m.registerProps, props...)
Colin Cross36242852017-06-23 15:06:31 -0700796}
797
Colin Cross4157e882019-06-06 16:57:04 -0700798func (m *ModuleBase) GetProperties() []interface{} {
799 return m.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800800}
801
Colin Cross4157e882019-06-06 16:57:04 -0700802func (m *ModuleBase) BuildParamsForTests() []BuildParams {
803 return m.buildParams
Colin Crosscec81712017-07-13 14:43:27 -0700804}
805
Colin Cross4157e882019-06-06 16:57:04 -0700806func (m *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
807 return m.ruleParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800808}
809
Colin Cross4157e882019-06-06 16:57:04 -0700810func (m *ModuleBase) VariablesForTests() map[string]string {
811 return m.variables
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800812}
813
Colin Cross4157e882019-06-06 16:57:04 -0700814func (m *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
815 m.prefer32 = prefer32
Colin Crossa9d8bee2018-10-02 13:59:46 -0700816}
817
Colin Crossce75d2c2016-10-06 16:12:58 -0700818// Name returns the name of the module. It may be overridden by individual module types, for
819// example prebuilts will prepend prebuilt_ to the name.
Colin Cross4157e882019-06-06 16:57:04 -0700820func (m *ModuleBase) Name() string {
821 return String(m.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700822}
823
Colin Cross9a362232019-07-01 15:32:45 -0700824// String returns a string that includes the module name and variants for printing during debugging.
825func (m *ModuleBase) String() string {
826 sb := strings.Builder{}
827 sb.WriteString(m.commonProperties.DebugName)
828 sb.WriteString("{")
829 for i := range m.commonProperties.DebugMutators {
830 if i != 0 {
831 sb.WriteString(",")
832 }
833 sb.WriteString(m.commonProperties.DebugMutators[i])
834 sb.WriteString(":")
835 sb.WriteString(m.commonProperties.DebugVariations[i])
836 }
837 sb.WriteString("}")
838 return sb.String()
839}
840
Colin Crossce75d2c2016-10-06 16:12:58 -0700841// BaseModuleName returns the name of the module as specified in the blueprints file.
Colin Cross4157e882019-06-06 16:57:04 -0700842func (m *ModuleBase) BaseModuleName() string {
843 return String(m.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700844}
845
Colin Cross4157e882019-06-06 16:57:04 -0700846func (m *ModuleBase) base() *ModuleBase {
847 return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800848}
849
Paul Duffine2453c72019-05-31 14:00:04 +0100850func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
851 return qualifiedModuleName{pkg: ctx.ModuleDir(), name: ctx.ModuleName()}
852}
853
854func (m *ModuleBase) visibilityProperties() []visibilityProperty {
Paul Duffin63c6e182019-07-24 14:24:38 +0100855 return m.visibilityPropertyInfo
856}
857
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000858func (m *ModuleBase) Dists() []Dist {
859 if len(m.commonProperties.Dist.Targets) > 0 {
860 // Make a copy of the underlying Dists slice to protect against
861 // backing array modifications with repeated calls to this method.
862 distsCopy := append([]Dist(nil), m.commonProperties.Dists...)
863 return append(distsCopy, m.commonProperties.Dist)
864 } else {
865 return m.commonProperties.Dists
866 }
867}
868
869func (m *ModuleBase) GenerateTaggedDistFiles(ctx BaseModuleContext) TaggedDistFiles {
870 distFiles := make(TaggedDistFiles)
871 for _, dist := range m.Dists() {
872 var tag string
873 var distFilesForTag Paths
874 if dist.Tag == nil {
875 tag = ""
876 } else {
877 tag = *dist.Tag
878 }
879 distFilesForTag, err := m.base().module.(OutputFileProducer).OutputFiles(tag)
880 if err != nil {
881 ctx.PropertyErrorf("dist.tag", "%s", err.Error())
882 }
883 for _, distFile := range distFilesForTag {
884 if distFile != nil && !distFiles[tag].containsPath(distFile) {
885 distFiles[tag] = append(distFiles[tag], distFile)
886 }
887 }
888 }
889
890 return distFiles
891}
892
Colin Cross4157e882019-06-06 16:57:04 -0700893func (m *ModuleBase) Target() Target {
894 return m.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800895}
896
Colin Cross4157e882019-06-06 16:57:04 -0700897func (m *ModuleBase) TargetPrimary() bool {
898 return m.commonProperties.CompilePrimary
Colin Cross8b74d172016-09-13 09:59:14 -0700899}
900
Colin Cross4157e882019-06-06 16:57:04 -0700901func (m *ModuleBase) MultiTargets() []Target {
902 return m.commonProperties.CompileMultiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -0700903}
904
Colin Cross4157e882019-06-06 16:57:04 -0700905func (m *ModuleBase) Os() OsType {
906 return m.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800907}
908
Colin Cross4157e882019-06-06 16:57:04 -0700909func (m *ModuleBase) Host() bool {
910 return m.Os().Class == Host || m.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800911}
912
Yo Chiangbba545e2020-06-09 16:15:37 +0800913func (m *ModuleBase) Device() bool {
914 return m.Os().Class == Device
915}
916
Colin Cross4157e882019-06-06 16:57:04 -0700917func (m *ModuleBase) Arch() Arch {
918 return m.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800919}
920
Colin Cross4157e882019-06-06 16:57:04 -0700921func (m *ModuleBase) ArchSpecific() bool {
922 return m.commonProperties.ArchSpecific
Dan Willemsen0b24c742016-10-04 15:13:37 -0700923}
924
Paul Duffin1356d8c2020-02-25 19:26:33 +0000925// True if the current variant is a CommonOS variant, false otherwise.
926func (m *ModuleBase) IsCommonOSVariant() bool {
927 return m.commonProperties.CommonOSVariant
928}
929
Colin Cross4157e882019-06-06 16:57:04 -0700930func (m *ModuleBase) OsClassSupported() []OsClass {
931 switch m.commonProperties.HostOrDeviceSupported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700932 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700933 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700934 case HostSupportedNoCross:
935 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700936 case DeviceSupported:
937 return []OsClass{Device}
Dan Albert0981b5c2018-08-02 13:46:35 -0700938 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700939 var supported []OsClass
Colin Cross4157e882019-06-06 16:57:04 -0700940 if Bool(m.hostAndDeviceProperties.Host_supported) ||
941 (m.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
942 m.hostAndDeviceProperties.Host_supported == nil) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700943 supported = append(supported, Host, HostCross)
944 }
Colin Cross4157e882019-06-06 16:57:04 -0700945 if m.hostAndDeviceProperties.Device_supported == nil ||
946 *m.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700947 supported = append(supported, Device)
948 }
949 return supported
950 default:
951 return nil
952 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800953}
954
Colin Cross4157e882019-06-06 16:57:04 -0700955func (m *ModuleBase) DeviceSupported() bool {
956 return m.commonProperties.HostOrDeviceSupported == DeviceSupported ||
957 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
958 (m.hostAndDeviceProperties.Device_supported == nil ||
959 *m.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800960}
961
Paul Duffine44358f2019-11-26 18:04:12 +0000962func (m *ModuleBase) HostSupported() bool {
963 return m.commonProperties.HostOrDeviceSupported == HostSupported ||
964 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
965 (m.hostAndDeviceProperties.Host_supported != nil &&
966 *m.hostAndDeviceProperties.Host_supported)
967}
968
Colin Cross4157e882019-06-06 16:57:04 -0700969func (m *ModuleBase) Platform() bool {
Justin Yund5f6c822019-06-25 16:47:17 +0900970 return !m.DeviceSpecific() && !m.SocSpecific() && !m.ProductSpecific() && !m.SystemExtSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900971}
972
Colin Cross4157e882019-06-06 16:57:04 -0700973func (m *ModuleBase) DeviceSpecific() bool {
974 return Bool(m.commonProperties.Device_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900975}
976
Colin Cross4157e882019-06-06 16:57:04 -0700977func (m *ModuleBase) SocSpecific() bool {
978 return Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900979}
980
Colin Cross4157e882019-06-06 16:57:04 -0700981func (m *ModuleBase) ProductSpecific() bool {
982 return Bool(m.commonProperties.Product_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900983}
984
Justin Yund5f6c822019-06-25 16:47:17 +0900985func (m *ModuleBase) SystemExtSpecific() bool {
986 return Bool(m.commonProperties.System_ext_specific)
Dario Frenifd05a742018-05-29 13:28:54 +0100987}
988
Colin Crossc2d24052020-05-13 11:05:02 -0700989// RequiresStableAPIs returns true if the module will be installed to a partition that may
990// be updated separately from the system image.
991func (m *ModuleBase) RequiresStableAPIs(ctx BaseModuleContext) bool {
992 return m.SocSpecific() || m.DeviceSpecific() ||
993 (m.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface())
994}
995
Bill Peckhamfff3f8a2020-03-20 18:33:20 -0700996func (m *ModuleBase) PartitionTag(config DeviceConfig) string {
997 partition := "system"
998 if m.SocSpecific() {
999 // A SoC-specific module could be on the vendor partition at
1000 // "vendor" or the system partition at "system/vendor".
1001 if config.VendorPath() == "vendor" {
1002 partition = "vendor"
1003 }
1004 } else if m.DeviceSpecific() {
1005 // A device-specific module could be on the odm partition at
1006 // "odm", the vendor partition at "vendor/odm", or the system
1007 // partition at "system/vendor/odm".
1008 if config.OdmPath() == "odm" {
1009 partition = "odm"
Ramy Medhat944839a2020-03-31 22:14:52 -04001010 } else if strings.HasPrefix(config.OdmPath(), "vendor/") {
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001011 partition = "vendor"
1012 }
1013 } else if m.ProductSpecific() {
1014 // A product-specific module could be on the product partition
1015 // at "product" or the system partition at "system/product".
1016 if config.ProductPath() == "product" {
1017 partition = "product"
1018 }
1019 } else if m.SystemExtSpecific() {
1020 // A system_ext-specific module could be on the system_ext
1021 // partition at "system_ext" or the system partition at
1022 // "system/system_ext".
1023 if config.SystemExtPath() == "system_ext" {
1024 partition = "system_ext"
1025 }
1026 }
1027 return partition
1028}
1029
Colin Cross4157e882019-06-06 16:57:04 -07001030func (m *ModuleBase) Enabled() bool {
1031 if m.commonProperties.Enabled == nil {
1032 return !m.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -08001033 }
Colin Cross4157e882019-06-06 16:57:04 -07001034 return *m.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -08001035}
1036
Inseob Kimeec88e12020-01-22 11:11:29 +09001037func (m *ModuleBase) Disable() {
1038 m.commonProperties.Enabled = proptools.BoolPtr(false)
1039}
1040
Colin Cross4157e882019-06-06 16:57:04 -07001041func (m *ModuleBase) SkipInstall() {
1042 m.commonProperties.SkipInstall = true
Colin Crossce75d2c2016-10-06 16:12:58 -07001043}
1044
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00001045func (m *ModuleBase) IsSkipInstall() bool {
1046 return m.commonProperties.SkipInstall == true
1047}
1048
Colin Cross4157e882019-06-06 16:57:04 -07001049func (m *ModuleBase) ExportedToMake() bool {
1050 return m.commonProperties.NamespaceExportedToMake
Jiyong Park374510b2018-03-19 18:23:01 +09001051}
1052
Colin Cross897266e2020-02-13 13:22:08 -08001053func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {
Colin Cross3f40fa42015-01-30 17:27:36 -08001054
Colin Cross897266e2020-02-13 13:22:08 -08001055 var result InstallPaths
Colin Cross6b753602018-06-21 13:03:07 -07001056 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross897266e2020-02-13 13:22:08 -08001057 ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
1058 if a, ok := m.(Module); ok {
1059 result = append(result, a.filesToInstall()...)
1060 }
1061 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001062
1063 return result
1064}
1065
Colin Cross897266e2020-02-13 13:22:08 -08001066func (m *ModuleBase) filesToInstall() InstallPaths {
Colin Cross4157e882019-06-06 16:57:04 -07001067 return m.installFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001068}
1069
Colin Cross4157e882019-06-06 16:57:04 -07001070func (m *ModuleBase) NoAddressSanitizer() bool {
1071 return m.noAddressSanitizer
Colin Cross3f40fa42015-01-30 17:27:36 -08001072}
1073
Colin Cross4157e882019-06-06 16:57:04 -07001074func (m *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -08001075 return false
1076}
1077
Jaewoong Jung0949f312019-09-11 10:25:18 -07001078func (m *ModuleBase) InstallInTestcases() bool {
1079 return false
1080}
1081
Colin Cross4157e882019-06-06 16:57:04 -07001082func (m *ModuleBase) InstallInSanitizerDir() bool {
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001083 return false
1084}
1085
Yifan Hong1b3348d2020-01-21 15:53:22 -08001086func (m *ModuleBase) InstallInRamdisk() bool {
1087 return Bool(m.commonProperties.Ramdisk)
1088}
1089
Colin Cross4157e882019-06-06 16:57:04 -07001090func (m *ModuleBase) InstallInRecovery() bool {
1091 return Bool(m.commonProperties.Recovery)
Jiyong Parkf9332f12018-02-01 00:54:12 +09001092}
1093
Colin Cross90ba5f42019-10-02 11:10:58 -07001094func (m *ModuleBase) InstallInRoot() bool {
1095 return false
1096}
1097
Colin Cross607d8582019-07-29 16:44:46 -07001098func (m *ModuleBase) InstallBypassMake() bool {
1099 return false
1100}
1101
Colin Cross6e359402020-02-10 15:29:54 -08001102func (m *ModuleBase) InstallForceOS() *OsType {
1103 return nil
1104}
1105
Colin Cross4157e882019-06-06 16:57:04 -07001106func (m *ModuleBase) Owner() string {
1107 return String(m.commonProperties.Owner)
Sundong Ahn4fd04bb2018-08-31 18:01:37 +09001108}
1109
Bob Badoura75b0572020-02-18 20:21:55 -08001110func (m *ModuleBase) NoticeFiles() Paths {
1111 return m.noticeFiles
Jiyong Park52818fc2019-03-18 12:01:38 +09001112}
1113
Colin Cross7228ecd2019-11-18 16:00:16 -08001114func (m *ModuleBase) setImageVariation(variant string) {
1115 m.commonProperties.ImageVariation = variant
1116}
1117
1118func (m *ModuleBase) ImageVariation() blueprint.Variation {
1119 return blueprint.Variation{
1120 Mutator: "image",
1121 Variation: m.base().commonProperties.ImageVariation,
1122 }
1123}
1124
Paul Duffin9b76c0b2020-03-12 10:24:35 +00001125func (m *ModuleBase) getVariationByMutatorName(mutator string) string {
1126 for i, v := range m.commonProperties.DebugMutators {
1127 if v == mutator {
1128 return m.commonProperties.DebugVariations[i]
1129 }
1130 }
1131
1132 return ""
1133}
1134
Yifan Hong1b3348d2020-01-21 15:53:22 -08001135func (m *ModuleBase) InRamdisk() bool {
1136 return m.base().commonProperties.ImageVariation == RamdiskVariation
1137}
1138
Colin Cross7228ecd2019-11-18 16:00:16 -08001139func (m *ModuleBase) InRecovery() bool {
1140 return m.base().commonProperties.ImageVariation == RecoveryVariation
1141}
1142
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09001143func (m *ModuleBase) RequiredModuleNames() []string {
1144 return m.base().commonProperties.Required
1145}
1146
1147func (m *ModuleBase) HostRequiredModuleNames() []string {
1148 return m.base().commonProperties.Host_required
1149}
1150
1151func (m *ModuleBase) TargetRequiredModuleNames() []string {
1152 return m.base().commonProperties.Target_required
1153}
1154
Inseob Kim8471cda2019-11-15 09:59:12 +09001155func (m *ModuleBase) InitRc() Paths {
1156 return append(Paths{}, m.initRcPaths...)
1157}
1158
1159func (m *ModuleBase) VintfFragments() Paths {
1160 return append(Paths{}, m.vintfFragmentsPaths...)
1161}
1162
Colin Cross4157e882019-06-06 16:57:04 -07001163func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Colin Cross897266e2020-02-13 13:22:08 -08001164 var allInstalledFiles InstallPaths
1165 var allCheckbuildFiles Paths
Colin Cross0875c522017-11-28 17:34:01 -08001166 ctx.VisitAllModuleVariants(func(module Module) {
1167 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -07001168 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
1169 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -08001170 })
1171
Colin Cross0875c522017-11-28 17:34:01 -08001172 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -07001173
Jeff Gaston088e29e2017-11-29 16:47:17 -08001174 namespacePrefix := ctx.Namespace().(*Namespace).id
1175 if namespacePrefix != "" {
1176 namespacePrefix = namespacePrefix + "-"
1177 }
1178
Colin Cross3f40fa42015-01-30 17:27:36 -08001179 if len(allInstalledFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001180 name := namespacePrefix + ctx.ModuleName() + "-install"
1181 ctx.Phony(name, allInstalledFiles.Paths()...)
1182 m.installTarget = PathForPhony(ctx, name)
1183 deps = append(deps, m.installTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001184 }
1185
1186 if len(allCheckbuildFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001187 name := namespacePrefix + ctx.ModuleName() + "-checkbuild"
1188 ctx.Phony(name, allCheckbuildFiles...)
1189 m.checkbuildTarget = PathForPhony(ctx, name)
1190 deps = append(deps, m.checkbuildTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001191 }
1192
1193 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001194 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001195 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001196 suffix = "-soong"
1197 }
1198
Colin Crossc3d87d32020-06-04 13:25:17 -07001199 ctx.Phony(namespacePrefix+ctx.ModuleName()+suffix, deps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001200
Colin Cross4157e882019-06-06 16:57:04 -07001201 m.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -08001202 }
1203}
1204
Colin Crossc34d2322020-01-03 15:23:27 -08001205func determineModuleKind(m *ModuleBase, ctx blueprint.EarlyModuleContext) moduleKind {
Colin Cross4157e882019-06-06 16:57:04 -07001206 var socSpecific = Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
1207 var deviceSpecific = Bool(m.commonProperties.Device_specific)
1208 var productSpecific = Bool(m.commonProperties.Product_specific)
Justin Yund5f6c822019-06-25 16:47:17 +09001209 var systemExtSpecific = Bool(m.commonProperties.System_ext_specific)
Jiyong Park2db76922017-11-08 16:03:48 +09001210
Dario Frenifd05a742018-05-29 13:28:54 +01001211 msg := "conflicting value set here"
1212 if socSpecific && deviceSpecific {
1213 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Colin Cross4157e882019-06-06 16:57:04 -07001214 if Bool(m.commonProperties.Vendor) {
Jiyong Park2db76922017-11-08 16:03:48 +09001215 ctx.PropertyErrorf("vendor", msg)
1216 }
Colin Cross4157e882019-06-06 16:57:04 -07001217 if Bool(m.commonProperties.Proprietary) {
Jiyong Park2db76922017-11-08 16:03:48 +09001218 ctx.PropertyErrorf("proprietary", msg)
1219 }
Colin Cross4157e882019-06-06 16:57:04 -07001220 if Bool(m.commonProperties.Soc_specific) {
Jiyong Park2db76922017-11-08 16:03:48 +09001221 ctx.PropertyErrorf("soc_specific", msg)
1222 }
1223 }
1224
Justin Yund5f6c822019-06-25 16:47:17 +09001225 if productSpecific && systemExtSpecific {
1226 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and system_ext at the same time.")
1227 ctx.PropertyErrorf("system_ext_specific", msg)
Dario Frenifd05a742018-05-29 13:28:54 +01001228 }
1229
Justin Yund5f6c822019-06-25 16:47:17 +09001230 if (socSpecific || deviceSpecific) && (productSpecific || systemExtSpecific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001231 if productSpecific {
1232 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
1233 } else {
Justin Yund5f6c822019-06-25 16:47:17 +09001234 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 +01001235 }
1236 if deviceSpecific {
1237 ctx.PropertyErrorf("device_specific", msg)
1238 } else {
Colin Cross4157e882019-06-06 16:57:04 -07001239 if Bool(m.commonProperties.Vendor) {
Dario Frenifd05a742018-05-29 13:28:54 +01001240 ctx.PropertyErrorf("vendor", msg)
1241 }
Colin Cross4157e882019-06-06 16:57:04 -07001242 if Bool(m.commonProperties.Proprietary) {
Dario Frenifd05a742018-05-29 13:28:54 +01001243 ctx.PropertyErrorf("proprietary", msg)
1244 }
Colin Cross4157e882019-06-06 16:57:04 -07001245 if Bool(m.commonProperties.Soc_specific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001246 ctx.PropertyErrorf("soc_specific", msg)
1247 }
1248 }
1249 }
1250
Jiyong Park2db76922017-11-08 16:03:48 +09001251 if productSpecific {
1252 return productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +09001253 } else if systemExtSpecific {
1254 return systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001255 } else if deviceSpecific {
1256 return deviceSpecificModule
1257 } else if socSpecific {
1258 return socSpecificModule
1259 } else {
1260 return platformModule
1261 }
1262}
1263
Colin Crossc34d2322020-01-03 15:23:27 -08001264func (m *ModuleBase) earlyModuleContextFactory(ctx blueprint.EarlyModuleContext) earlyModuleContext {
Colin Cross1184b642019-12-30 18:43:07 -08001265 return earlyModuleContext{
Colin Crossc34d2322020-01-03 15:23:27 -08001266 EarlyModuleContext: ctx,
1267 kind: determineModuleKind(m, ctx),
1268 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -08001269 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001270}
1271
Colin Cross1184b642019-12-30 18:43:07 -08001272func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
1273 return baseModuleContext{
1274 bp: ctx,
1275 earlyModuleContext: m.earlyModuleContextFactory(ctx),
1276 os: m.commonProperties.CompileOS,
1277 target: m.commonProperties.CompileTarget,
1278 targetPrimary: m.commonProperties.CompilePrimary,
1279 multiTargets: m.commonProperties.CompileMultiTargets,
1280 }
1281}
1282
Colin Cross4157e882019-06-06 16:57:04 -07001283func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
Colin Cross25de6c32019-06-06 14:29:25 -07001284 ctx := &moduleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001285 module: m.module,
Colin Crossdc35e212019-06-06 16:13:11 -07001286 bp: blueprintCtx,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001287 baseModuleContext: m.baseModuleContextFactory(blueprintCtx),
1288 installDeps: m.computeInstallDeps(blueprintCtx),
1289 installFiles: m.installFiles,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001290 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -08001291 }
1292
Colin Cross6c4f21f2019-06-06 15:41:36 -07001293 // Temporarily continue to call blueprintCtx.GetMissingDependencies() to maintain the previous behavior of never
1294 // reporting missing dependency errors in Blueprint when AllowMissingDependencies == true.
1295 // TODO: This will be removed once defaults modules handle missing dependency errors
1296 blueprintCtx.GetMissingDependencies()
1297
Colin Crossdc35e212019-06-06 16:13:11 -07001298 // For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
Paul Duffin1356d8c2020-02-25 19:26:33 +00001299 // are enabled. Unless the module is a CommonOS variant which may have dependencies on disabled variants
1300 // (because the dependencies are added before the modules are disabled). The
1301 // GetOsSpecificVariantsOfCommonOSVariant(...) method will ensure that the disabled variants are
1302 // ignored.
1303 ctx.baseModuleContext.strictVisitDeps = !m.IsCommonOSVariant()
Colin Crossdc35e212019-06-06 16:13:11 -07001304
Colin Cross4c83e5c2019-02-25 14:54:28 -08001305 if ctx.config.captureBuild {
1306 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
1307 }
1308
Colin Cross67a5c132017-05-09 13:45:28 -07001309 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
1310 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -08001311 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
1312 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -07001313 }
Colin Cross0875c522017-11-28 17:34:01 -08001314 if !ctx.PrimaryArch() {
1315 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -07001316 }
Dan Willemsenb13a9482020-02-14 11:25:54 -08001317 if apex, ok := m.module.(ApexModule); ok && !apex.IsForPlatform() {
1318 suffix = append(suffix, apex.ApexName())
1319 }
Colin Cross67a5c132017-05-09 13:45:28 -07001320
1321 ctx.Variable(pctx, "moduleDesc", desc)
1322
1323 s := ""
1324 if len(suffix) > 0 {
1325 s = " [" + strings.Join(suffix, " ") + "]"
1326 }
1327 ctx.Variable(pctx, "moduleDescSuffix", s)
1328
Dan Willemsen569edc52018-11-19 09:33:29 -08001329 // Some common property checks for properties that will be used later in androidmk.go
Colin Cross4157e882019-06-06 16:57:04 -07001330 if m.commonProperties.Dist.Dest != nil {
1331 _, err := validateSafePath(*m.commonProperties.Dist.Dest)
Dan Willemsen569edc52018-11-19 09:33:29 -08001332 if err != nil {
1333 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
1334 }
1335 }
Colin Cross4157e882019-06-06 16:57:04 -07001336 if m.commonProperties.Dist.Dir != nil {
1337 _, err := validateSafePath(*m.commonProperties.Dist.Dir)
Dan Willemsen569edc52018-11-19 09:33:29 -08001338 if err != nil {
1339 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
1340 }
1341 }
Colin Cross4157e882019-06-06 16:57:04 -07001342 if m.commonProperties.Dist.Suffix != nil {
1343 if strings.Contains(*m.commonProperties.Dist.Suffix, "/") {
Dan Willemsen569edc52018-11-19 09:33:29 -08001344 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
1345 }
1346 }
1347
Colin Cross4157e882019-06-06 16:57:04 -07001348 if m.Enabled() {
Jooyung Hand48f3c32019-08-23 11:18:57 +09001349 // ensure all direct android.Module deps are enabled
1350 ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) {
1351 if _, ok := bm.(Module); ok {
1352 ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps)
1353 }
1354 })
1355
Bob Badoura75b0572020-02-18 20:21:55 -08001356 m.noticeFiles = make([]Path, 0)
1357 optPath := OptionalPath{}
1358 notice := proptools.StringDefault(m.commonProperties.Notice, "")
Colin Cross4157e882019-06-06 16:57:04 -07001359 if module := SrcIsModule(notice); module != "" {
Bob Badoura75b0572020-02-18 20:21:55 -08001360 optPath = ctx.ExpandOptionalSource(&notice, "notice")
1361 } else if notice != "" {
Jiyong Park52818fc2019-03-18 12:01:38 +09001362 noticePath := filepath.Join(ctx.ModuleDir(), notice)
Bob Badoura75b0572020-02-18 20:21:55 -08001363 optPath = ExistentPathForSource(ctx, noticePath)
1364 }
1365 if optPath.Valid() {
1366 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1367 } else {
1368 for _, notice = range []string{"LICENSE", "LICENCE", "NOTICE"} {
1369 noticePath := filepath.Join(ctx.ModuleDir(), notice)
1370 optPath = ExistentPathForSource(ctx, noticePath)
1371 if optPath.Valid() {
1372 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1373 }
1374 }
Jaewoong Jung62707f72018-11-16 13:26:43 -08001375 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001376
1377 m.module.GenerateAndroidBuildActions(ctx)
1378 if ctx.Failed() {
1379 return
1380 }
1381
1382 m.installFiles = append(m.installFiles, ctx.installFiles...)
1383 m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...)
Inseob Kim8471cda2019-11-15 09:59:12 +09001384 m.initRcPaths = PathsForModuleSrc(ctx, m.commonProperties.Init_rc)
1385 m.vintfFragmentsPaths = PathsForModuleSrc(ctx, m.commonProperties.Vintf_fragments)
Colin Crossc3d87d32020-06-04 13:25:17 -07001386 for k, v := range ctx.phonies {
1387 m.phonies[k] = append(m.phonies[k], v...)
1388 }
Colin Crossdc35e212019-06-06 16:13:11 -07001389 } else if ctx.Config().AllowMissingDependencies() {
1390 // If the module is not enabled it will not create any build rules, nothing will call
1391 // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled
1392 // and report them as an error even when AllowMissingDependencies = true. Call
1393 // ctx.GetMissingDependencies() here to tell blueprint not to handle them.
1394 ctx.GetMissingDependencies()
Colin Cross3f40fa42015-01-30 17:27:36 -08001395 }
1396
Colin Cross4157e882019-06-06 16:57:04 -07001397 if m == ctx.FinalModule().(Module).base() {
1398 m.generateModuleTarget(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -07001399 if ctx.Failed() {
1400 return
1401 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001402 }
Colin Crosscec81712017-07-13 14:43:27 -07001403
Colin Cross4157e882019-06-06 16:57:04 -07001404 m.buildParams = ctx.buildParams
1405 m.ruleParams = ctx.ruleParams
1406 m.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -08001407}
1408
Colin Cross1184b642019-12-30 18:43:07 -08001409type earlyModuleContext struct {
Colin Crossc34d2322020-01-03 15:23:27 -08001410 blueprint.EarlyModuleContext
Colin Cross1184b642019-12-30 18:43:07 -08001411
1412 kind moduleKind
1413 config Config
1414}
1415
1416func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths {
1417 ret, err := e.GlobWithDeps(globPattern, excludes)
1418 if err != nil {
1419 e.ModuleErrorf("glob: %s", err.Error())
1420 }
1421 return pathsForModuleSrcFromFullPath(e, ret, true)
1422}
1423
1424func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
1425 ret, err := e.GlobWithDeps(globPattern, excludes)
1426 if err != nil {
1427 e.ModuleErrorf("glob: %s", err.Error())
1428 }
1429 return pathsForModuleSrcFromFullPath(e, ret, false)
1430}
1431
Colin Cross988414c2020-01-11 01:11:46 +00001432func (b *earlyModuleContext) IsSymlink(path Path) bool {
1433 fileInfo, err := b.config.fs.Lstat(path.String())
1434 if err != nil {
1435 b.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
1436 }
1437 return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
1438}
1439
1440func (b *earlyModuleContext) Readlink(path Path) string {
1441 dest, err := b.config.fs.Readlink(path.String())
1442 if err != nil {
1443 b.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
1444 }
1445 return dest
1446}
1447
Colin Cross1184b642019-12-30 18:43:07 -08001448func (e *earlyModuleContext) Module() Module {
Colin Crossc34d2322020-01-03 15:23:27 -08001449 module, _ := e.EarlyModuleContext.Module().(Module)
Colin Cross1184b642019-12-30 18:43:07 -08001450 return module
1451}
1452
1453func (e *earlyModuleContext) Config() Config {
Colin Crossc34d2322020-01-03 15:23:27 -08001454 return e.EarlyModuleContext.Config().(Config)
Colin Cross1184b642019-12-30 18:43:07 -08001455}
1456
1457func (e *earlyModuleContext) AConfig() Config {
1458 return e.config
1459}
1460
1461func (e *earlyModuleContext) DeviceConfig() DeviceConfig {
1462 return DeviceConfig{e.config.deviceConfig}
1463}
1464
1465func (e *earlyModuleContext) Platform() bool {
1466 return e.kind == platformModule
1467}
1468
1469func (e *earlyModuleContext) DeviceSpecific() bool {
1470 return e.kind == deviceSpecificModule
1471}
1472
1473func (e *earlyModuleContext) SocSpecific() bool {
1474 return e.kind == socSpecificModule
1475}
1476
1477func (e *earlyModuleContext) ProductSpecific() bool {
1478 return e.kind == productSpecificModule
1479}
1480
1481func (e *earlyModuleContext) SystemExtSpecific() bool {
1482 return e.kind == systemExtSpecificModule
1483}
1484
1485type baseModuleContext struct {
1486 bp blueprint.BaseModuleContext
1487 earlyModuleContext
Colin Crossfb0c16e2019-11-20 17:12:35 -08001488 os OsType
Colin Cross8b74d172016-09-13 09:59:14 -07001489 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -07001490 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -07001491 targetPrimary bool
1492 debug bool
Colin Crossdc35e212019-06-06 16:13:11 -07001493
1494 walkPath []Module
Paul Duffinc5192442020-03-31 11:31:36 +01001495 tagPath []blueprint.DependencyTag
Colin Crossdc35e212019-06-06 16:13:11 -07001496
1497 strictVisitDeps bool // If true, enforce that all dependencies are enabled
Colin Crossf6566ed2015-03-24 11:13:38 -07001498}
1499
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001500func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string {
1501 return b.bp.OtherModuleName(m)
1502}
1503func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) }
Colin Cross1184b642019-12-30 18:43:07 -08001504func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) {
Jooyung Hancd87c692020-02-26 02:05:18 +09001505 b.bp.OtherModuleErrorf(m, fmt, args...)
Colin Cross1184b642019-12-30 18:43:07 -08001506}
1507func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag {
1508 return b.bp.OtherModuleDependencyTag(m)
1509}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001510func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +00001511func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
1512 return b.bp.OtherModuleDependencyVariantExists(variations, name)
1513}
1514func (b *baseModuleContext) OtherModuleReverseDependencyVariantExists(name string) bool {
1515 return b.bp.OtherModuleReverseDependencyVariantExists(name)
1516}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001517func (b *baseModuleContext) OtherModuleType(m blueprint.Module) string {
1518 return b.bp.OtherModuleType(m)
1519}
Colin Cross1184b642019-12-30 18:43:07 -08001520
1521func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1522 return b.bp.GetDirectDepWithTag(name, tag)
1523}
1524
Paul Duffinf88d8e02020-05-07 20:21:34 +01001525func (b *baseModuleContext) blueprintBaseModuleContext() blueprint.BaseModuleContext {
1526 return b.bp
1527}
1528
Colin Cross25de6c32019-06-06 14:29:25 -07001529type moduleContext struct {
Colin Crossdc35e212019-06-06 16:13:11 -07001530 bp blueprint.ModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -07001531 baseModuleContext
Colin Cross897266e2020-02-13 13:22:08 -08001532 installDeps InstallPaths
1533 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001534 checkbuildFiles Paths
Colin Cross8d8f8e22016-08-03 11:57:50 -07001535 module Module
Colin Crossc3d87d32020-06-04 13:25:17 -07001536 phonies map[string]Paths
Colin Crosscec81712017-07-13 14:43:27 -07001537
1538 // For tests
Colin Crossae887032017-10-23 17:16:14 -07001539 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -08001540 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001541 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -08001542}
1543
Colin Crossb88b3c52019-06-10 15:15:17 -07001544func (m *moduleContext) ninjaError(params BuildParams, err error) (PackageContext, BuildParams) {
1545 return pctx, BuildParams{
Colin Cross4b69c492019-06-07 13:06:06 -07001546 Rule: ErrorRule,
1547 Description: params.Description,
1548 Output: params.Output,
1549 Outputs: params.Outputs,
1550 ImplicitOutput: params.ImplicitOutput,
1551 ImplicitOutputs: params.ImplicitOutputs,
Colin Cross6ff51382015-12-17 16:39:19 -08001552 Args: map[string]string{
1553 "error": err.Error(),
1554 },
Colin Crossb88b3c52019-06-10 15:15:17 -07001555 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001556}
1557
Colin Cross25de6c32019-06-06 14:29:25 -07001558func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
1559 m.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -08001560}
1561
Colin Cross0875c522017-11-28 17:34:01 -08001562func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001563 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001564 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -08001565 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -08001566 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001567 Outputs: params.Outputs.Strings(),
1568 ImplicitOutputs: params.ImplicitOutputs.Strings(),
1569 Inputs: params.Inputs.Strings(),
1570 Implicits: params.Implicits.Strings(),
1571 OrderOnly: params.OrderOnly.Strings(),
Colin Cross824f1162020-07-16 13:07:51 -07001572 Validations: params.Validations.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001573 Args: params.Args,
1574 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001575 }
1576
Colin Cross33bfb0a2016-11-21 17:23:08 -08001577 if params.Depfile != nil {
1578 bparams.Depfile = params.Depfile.String()
1579 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001580 if params.Output != nil {
1581 bparams.Outputs = append(bparams.Outputs, params.Output.String())
1582 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001583 if params.ImplicitOutput != nil {
1584 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
1585 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001586 if params.Input != nil {
1587 bparams.Inputs = append(bparams.Inputs, params.Input.String())
1588 }
1589 if params.Implicit != nil {
1590 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
1591 }
Colin Cross824f1162020-07-16 13:07:51 -07001592 if params.Validation != nil {
1593 bparams.Validations = append(bparams.Validations, params.Validation.String())
1594 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001595
Colin Cross0b9f31f2019-02-28 11:00:01 -08001596 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
1597 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
1598 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
1599 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
1600 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
Colin Cross824f1162020-07-16 13:07:51 -07001601 bparams.Validations = proptools.NinjaEscapeList(bparams.Validations)
1602 bparams.Depfile = proptools.NinjaEscape(bparams.Depfile)
Colin Crossfe4bc362018-09-12 10:02:13 -07001603
Colin Cross0875c522017-11-28 17:34:01 -08001604 return bparams
1605}
1606
Colin Cross25de6c32019-06-06 14:29:25 -07001607func (m *moduleContext) Variable(pctx PackageContext, name, value string) {
1608 if m.config.captureBuild {
1609 m.variables[name] = value
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001610 }
1611
Colin Crossdc35e212019-06-06 16:13:11 -07001612 m.bp.Variable(pctx.PackageContext, name, value)
Colin Cross0875c522017-11-28 17:34:01 -08001613}
1614
Colin Cross25de6c32019-06-06 14:29:25 -07001615func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
Colin Cross0875c522017-11-28 17:34:01 -08001616 argNames ...string) blueprint.Rule {
1617
Ramy Medhat944839a2020-03-31 22:14:52 -04001618 if m.config.UseRemoteBuild() {
1619 if params.Pool == nil {
1620 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
1621 // jobs to the local parallelism value
1622 params.Pool = localPool
1623 } else if params.Pool == remotePool {
1624 // remotePool is a fake pool used to identify rule that are supported for remoting. If the rule's
1625 // pool is the remotePool, replace with nil so that ninja runs it at NINJA_REMOTE_NUM_JOBS
1626 // parallelism.
1627 params.Pool = nil
1628 }
Colin Cross2e2dbc22019-09-25 13:31:46 -07001629 }
1630
Colin Crossdc35e212019-06-06 16:13:11 -07001631 rule := m.bp.Rule(pctx.PackageContext, name, params, argNames...)
Colin Cross4c83e5c2019-02-25 14:54:28 -08001632
Colin Cross25de6c32019-06-06 14:29:25 -07001633 if m.config.captureBuild {
1634 m.ruleParams[rule] = params
Colin Cross4c83e5c2019-02-25 14:54:28 -08001635 }
1636
1637 return rule
Colin Cross0875c522017-11-28 17:34:01 -08001638}
1639
Colin Cross25de6c32019-06-06 14:29:25 -07001640func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
Colin Crossb88b3c52019-06-10 15:15:17 -07001641 if params.Description != "" {
1642 params.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1643 }
1644
1645 if missingDeps := m.GetMissingDependencies(); len(missingDeps) > 0 {
1646 pctx, params = m.ninjaError(params, fmt.Errorf("module %s missing dependencies: %s\n",
1647 m.ModuleName(), strings.Join(missingDeps, ", ")))
1648 }
1649
Colin Cross25de6c32019-06-06 14:29:25 -07001650 if m.config.captureBuild {
1651 m.buildParams = append(m.buildParams, params)
Colin Cross0875c522017-11-28 17:34:01 -08001652 }
1653
Colin Crossdc35e212019-06-06 16:13:11 -07001654 m.bp.Build(pctx.PackageContext, convertBuildParams(params))
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001655}
Colin Crossc3d87d32020-06-04 13:25:17 -07001656
1657func (m *moduleContext) Phony(name string, deps ...Path) {
1658 addPhony(m.config, name, deps...)
1659}
1660
Colin Cross25de6c32019-06-06 14:29:25 -07001661func (m *moduleContext) GetMissingDependencies() []string {
Colin Cross6c4f21f2019-06-06 15:41:36 -07001662 var missingDeps []string
1663 missingDeps = append(missingDeps, m.Module().base().commonProperties.MissingDeps...)
Colin Crossdc35e212019-06-06 16:13:11 -07001664 missingDeps = append(missingDeps, m.bp.GetMissingDependencies()...)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001665 missingDeps = FirstUniqueStrings(missingDeps)
1666 return missingDeps
Colin Cross6ff51382015-12-17 16:39:19 -08001667}
1668
Colin Crossdc35e212019-06-06 16:13:11 -07001669func (b *baseModuleContext) AddMissingDependencies(deps []string) {
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001670 if deps != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001671 missingDeps := &b.Module().base().commonProperties.MissingDeps
Colin Cross6c4f21f2019-06-06 15:41:36 -07001672 *missingDeps = append(*missingDeps, deps...)
1673 *missingDeps = FirstUniqueStrings(*missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001674 }
1675}
1676
Colin Crossdc35e212019-06-06 16:13:11 -07001677func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, strict bool) Module {
Colin Crossd11fcda2017-10-23 17:59:01 -07001678 aModule, _ := module.(Module)
Colin Crossdc35e212019-06-06 16:13:11 -07001679
1680 if !strict {
1681 return aModule
1682 }
1683
Colin Cross380c69a2019-06-10 17:49:58 +00001684 if aModule == nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001685 b.ModuleErrorf("module %q not an android module", b.OtherModuleName(module))
Colin Cross380c69a2019-06-10 17:49:58 +00001686 return nil
1687 }
1688
1689 if !aModule.Enabled() {
Colin Crossdc35e212019-06-06 16:13:11 -07001690 if b.Config().AllowMissingDependencies() {
1691 b.AddMissingDependencies([]string{b.OtherModuleName(aModule)})
Colin Cross380c69a2019-06-10 17:49:58 +00001692 } else {
Colin Crossdc35e212019-06-06 16:13:11 -07001693 b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule))
Colin Cross380c69a2019-06-10 17:49:58 +00001694 }
1695 return nil
1696 }
Colin Crossd11fcda2017-10-23 17:59:01 -07001697 return aModule
1698}
1699
Colin Crossdc35e212019-06-06 16:13:11 -07001700func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
Jiyong Parkf2976302019-04-17 21:47:37 +09001701 type dep struct {
1702 mod blueprint.Module
1703 tag blueprint.DependencyTag
1704 }
1705 var deps []dep
Colin Crossdc35e212019-06-06 16:13:11 -07001706 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001707 if aModule, _ := module.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
Colin Cross1184b642019-12-30 18:43:07 -08001708 returnedTag := b.bp.OtherModuleDependencyTag(aModule)
Jiyong Parkf2976302019-04-17 21:47:37 +09001709 if tag == nil || returnedTag == tag {
1710 deps = append(deps, dep{aModule, returnedTag})
1711 }
1712 }
1713 })
1714 if len(deps) == 1 {
1715 return deps[0].mod, deps[0].tag
1716 } else if len(deps) >= 2 {
1717 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
Colin Crossdc35e212019-06-06 16:13:11 -07001718 name, b.ModuleName()))
Jiyong Parkf2976302019-04-17 21:47:37 +09001719 } else {
1720 return nil, nil
1721 }
1722}
1723
Colin Crossdc35e212019-06-06 16:13:11 -07001724func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module {
Colin Cross0ef08162019-05-01 15:50:51 -07001725 var deps []Module
Colin Crossdc35e212019-06-06 16:13:11 -07001726 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001727 if aModule, _ := module.(Module); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001728 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Cross0ef08162019-05-01 15:50:51 -07001729 deps = append(deps, aModule)
1730 }
1731 }
1732 })
1733 return deps
1734}
1735
Colin Cross25de6c32019-06-06 14:29:25 -07001736func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1737 module, _ := m.getDirectDepInternal(name, tag)
1738 return module
Jiyong Parkf2976302019-04-17 21:47:37 +09001739}
1740
Colin Crossdc35e212019-06-06 16:13:11 -07001741func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
1742 return b.getDirectDepInternal(name, nil)
Jiyong Parkf2976302019-04-17 21:47:37 +09001743}
1744
Colin Crossdc35e212019-06-06 16:13:11 -07001745func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001746 b.bp.VisitDirectDeps(visit)
Colin Cross35143d02017-11-16 00:11:20 -08001747}
1748
Colin Crossdc35e212019-06-06 16:13:11 -07001749func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001750 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001751 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001752 visit(aModule)
1753 }
1754 })
1755}
1756
Colin Crossdc35e212019-06-06 16:13:11 -07001757func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001758 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001759 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001760 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Crossee6143c2017-12-30 17:54:27 -08001761 visit(aModule)
1762 }
1763 }
1764 })
1765}
1766
Colin Crossdc35e212019-06-06 16:13:11 -07001767func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001768 b.bp.VisitDirectDepsIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07001769 // pred
1770 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001771 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001772 return pred(aModule)
1773 } else {
1774 return false
1775 }
1776 },
1777 // visit
1778 func(module blueprint.Module) {
1779 visit(module.(Module))
1780 })
1781}
1782
Colin Crossdc35e212019-06-06 16:13:11 -07001783func (b *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001784 b.bp.VisitDepsDepthFirst(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001785 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001786 visit(aModule)
1787 }
1788 })
1789}
1790
Colin Crossdc35e212019-06-06 16:13:11 -07001791func (b *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001792 b.bp.VisitDepsDepthFirstIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07001793 // pred
1794 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001795 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001796 return pred(aModule)
1797 } else {
1798 return false
1799 }
1800 },
1801 // visit
1802 func(module blueprint.Module) {
1803 visit(module.(Module))
1804 })
1805}
1806
Colin Crossdc35e212019-06-06 16:13:11 -07001807func (b *baseModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
Colin Cross1184b642019-12-30 18:43:07 -08001808 b.bp.WalkDeps(visit)
Alex Light778127a2019-02-27 14:19:50 -08001809}
1810
Colin Crossdc35e212019-06-06 16:13:11 -07001811func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
1812 b.walkPath = []Module{b.Module()}
Paul Duffinc5192442020-03-31 11:31:36 +01001813 b.tagPath = []blueprint.DependencyTag{}
Colin Cross1184b642019-12-30 18:43:07 -08001814 b.bp.WalkDeps(func(child, parent blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001815 childAndroidModule, _ := child.(Module)
1816 parentAndroidModule, _ := parent.(Module)
Colin Crossd11fcda2017-10-23 17:59:01 -07001817 if childAndroidModule != nil && parentAndroidModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001818 // record walkPath before visit
1819 for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
1820 b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
Paul Duffinc5192442020-03-31 11:31:36 +01001821 b.tagPath = b.tagPath[0 : len(b.tagPath)-1]
Colin Crossdc35e212019-06-06 16:13:11 -07001822 }
1823 b.walkPath = append(b.walkPath, childAndroidModule)
Paul Duffinc5192442020-03-31 11:31:36 +01001824 b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule))
Colin Crossd11fcda2017-10-23 17:59:01 -07001825 return visit(childAndroidModule, parentAndroidModule)
1826 } else {
1827 return false
1828 }
1829 })
1830}
1831
Colin Crossdc35e212019-06-06 16:13:11 -07001832func (b *baseModuleContext) GetWalkPath() []Module {
1833 return b.walkPath
1834}
1835
Paul Duffinc5192442020-03-31 11:31:36 +01001836func (b *baseModuleContext) GetTagPath() []blueprint.DependencyTag {
1837 return b.tagPath
1838}
1839
Jiyong Park1c7e9622020-05-07 16:12:13 +09001840// A regexp for removing boilerplate from BaseDependencyTag from the string representation of
1841// a dependency tag.
1842var tagCleaner = regexp.MustCompile(`\QBaseDependencyTag:blueprint.BaseDependencyTag{}\E(, )?`)
1843
1844// PrettyPrintTag returns string representation of the tag, but prefers
1845// custom String() method if available.
1846func PrettyPrintTag(tag blueprint.DependencyTag) string {
1847 // Use tag's custom String() method if available.
1848 if stringer, ok := tag.(fmt.Stringer); ok {
1849 return stringer.String()
1850 }
1851
1852 // Otherwise, get a default string representation of the tag's struct.
1853 tagString := fmt.Sprintf("%#v", tag)
1854
1855 // Remove the boilerplate from BaseDependencyTag as it adds no value.
1856 tagString = tagCleaner.ReplaceAllString(tagString, "")
1857 return tagString
1858}
1859
1860func (b *baseModuleContext) GetPathString(skipFirst bool) string {
1861 sb := strings.Builder{}
1862 tagPath := b.GetTagPath()
1863 walkPath := b.GetWalkPath()
1864 if !skipFirst {
1865 sb.WriteString(walkPath[0].String())
1866 }
1867 for i, m := range walkPath[1:] {
1868 sb.WriteString("\n")
1869 sb.WriteString(fmt.Sprintf(" via tag %s\n", PrettyPrintTag(tagPath[i])))
1870 sb.WriteString(fmt.Sprintf(" -> %s", m.String()))
1871 }
1872 return sb.String()
1873}
1874
Colin Cross25de6c32019-06-06 14:29:25 -07001875func (m *moduleContext) VisitAllModuleVariants(visit func(Module)) {
Colin Crossdc35e212019-06-06 16:13:11 -07001876 m.bp.VisitAllModuleVariants(func(module blueprint.Module) {
Colin Cross0875c522017-11-28 17:34:01 -08001877 visit(module.(Module))
1878 })
1879}
1880
Colin Cross25de6c32019-06-06 14:29:25 -07001881func (m *moduleContext) PrimaryModule() Module {
Colin Crossdc35e212019-06-06 16:13:11 -07001882 return m.bp.PrimaryModule().(Module)
Colin Cross0875c522017-11-28 17:34:01 -08001883}
1884
Colin Cross25de6c32019-06-06 14:29:25 -07001885func (m *moduleContext) FinalModule() Module {
Colin Crossdc35e212019-06-06 16:13:11 -07001886 return m.bp.FinalModule().(Module)
1887}
1888
1889func (m *moduleContext) ModuleSubDir() string {
1890 return m.bp.ModuleSubDir()
Colin Cross0875c522017-11-28 17:34:01 -08001891}
1892
Colin Cross0ea8ba82019-06-06 14:33:29 -07001893func (b *baseModuleContext) Target() Target {
Colin Cross25de6c32019-06-06 14:29:25 -07001894 return b.target
Colin Crossa1ad8d12016-06-01 17:09:44 -07001895}
1896
Colin Cross0ea8ba82019-06-06 14:33:29 -07001897func (b *baseModuleContext) TargetPrimary() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001898 return b.targetPrimary
Colin Cross8b74d172016-09-13 09:59:14 -07001899}
1900
Colin Cross0ea8ba82019-06-06 14:33:29 -07001901func (b *baseModuleContext) MultiTargets() []Target {
Colin Cross25de6c32019-06-06 14:29:25 -07001902 return b.multiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07001903}
1904
Colin Cross0ea8ba82019-06-06 14:33:29 -07001905func (b *baseModuleContext) Arch() Arch {
Colin Cross25de6c32019-06-06 14:29:25 -07001906 return b.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08001907}
1908
Colin Cross0ea8ba82019-06-06 14:33:29 -07001909func (b *baseModuleContext) Os() OsType {
Colin Crossfb0c16e2019-11-20 17:12:35 -08001910 return b.os
Dan Willemsen490fd492015-11-24 17:53:15 -08001911}
1912
Colin Cross0ea8ba82019-06-06 14:33:29 -07001913func (b *baseModuleContext) Host() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08001914 return b.os.Class == Host || b.os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -07001915}
1916
Colin Cross0ea8ba82019-06-06 14:33:29 -07001917func (b *baseModuleContext) Device() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08001918 return b.os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07001919}
1920
Colin Cross0ea8ba82019-06-06 14:33:29 -07001921func (b *baseModuleContext) Darwin() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08001922 return b.os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07001923}
1924
Colin Cross0ea8ba82019-06-06 14:33:29 -07001925func (b *baseModuleContext) Fuchsia() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08001926 return b.os == Fuchsia
Doug Horn21b94272019-01-16 12:06:11 -08001927}
1928
Colin Cross0ea8ba82019-06-06 14:33:29 -07001929func (b *baseModuleContext) Windows() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08001930 return b.os == Windows
Colin Cross3edeee12017-04-04 12:59:48 -07001931}
1932
Colin Cross0ea8ba82019-06-06 14:33:29 -07001933func (b *baseModuleContext) Debug() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001934 return b.debug
Colin Crossf6566ed2015-03-24 11:13:38 -07001935}
1936
Colin Cross0ea8ba82019-06-06 14:33:29 -07001937func (b *baseModuleContext) PrimaryArch() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07001938 if len(b.config.Targets[b.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07001939 return true
1940 }
Colin Cross25de6c32019-06-06 14:29:25 -07001941 return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07001942}
1943
Jiyong Park5baac542018-08-28 09:55:37 +09001944// Makes this module a platform module, i.e. not specific to soc, device,
Justin Yund5f6c822019-06-25 16:47:17 +09001945// product, or system_ext.
Colin Cross4157e882019-06-06 16:57:04 -07001946func (m *ModuleBase) MakeAsPlatform() {
1947 m.commonProperties.Vendor = boolPtr(false)
1948 m.commonProperties.Proprietary = boolPtr(false)
1949 m.commonProperties.Soc_specific = boolPtr(false)
1950 m.commonProperties.Product_specific = boolPtr(false)
Justin Yund5f6c822019-06-25 16:47:17 +09001951 m.commonProperties.System_ext_specific = boolPtr(false)
Jiyong Park5baac542018-08-28 09:55:37 +09001952}
1953
Colin Cross4157e882019-06-06 16:57:04 -07001954func (m *ModuleBase) EnableNativeBridgeSupportByDefault() {
1955 m.commonProperties.Native_bridge_supported = boolPtr(true)
dimitry03dc3f62019-05-09 14:07:34 +02001956}
1957
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09001958func (m *ModuleBase) MakeAsSystemExt() {
Jooyung Han91df2082019-11-20 01:49:42 +09001959 m.commonProperties.Vendor = boolPtr(false)
1960 m.commonProperties.Proprietary = boolPtr(false)
1961 m.commonProperties.Soc_specific = boolPtr(false)
1962 m.commonProperties.Product_specific = boolPtr(false)
1963 m.commonProperties.System_ext_specific = boolPtr(true)
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09001964}
1965
Jooyung Han344d5432019-08-23 11:17:39 +09001966// IsNativeBridgeSupported returns true if "native_bridge_supported" is explicitly set as "true"
1967func (m *ModuleBase) IsNativeBridgeSupported() bool {
1968 return proptools.Bool(m.commonProperties.Native_bridge_supported)
1969}
1970
Colin Cross25de6c32019-06-06 14:29:25 -07001971func (m *moduleContext) InstallInData() bool {
1972 return m.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08001973}
1974
Jaewoong Jung0949f312019-09-11 10:25:18 -07001975func (m *moduleContext) InstallInTestcases() bool {
1976 return m.module.InstallInTestcases()
1977}
1978
Colin Cross25de6c32019-06-06 14:29:25 -07001979func (m *moduleContext) InstallInSanitizerDir() bool {
1980 return m.module.InstallInSanitizerDir()
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001981}
1982
Yifan Hong1b3348d2020-01-21 15:53:22 -08001983func (m *moduleContext) InstallInRamdisk() bool {
1984 return m.module.InstallInRamdisk()
1985}
1986
Colin Cross25de6c32019-06-06 14:29:25 -07001987func (m *moduleContext) InstallInRecovery() bool {
1988 return m.module.InstallInRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09001989}
1990
Colin Cross90ba5f42019-10-02 11:10:58 -07001991func (m *moduleContext) InstallInRoot() bool {
1992 return m.module.InstallInRoot()
1993}
1994
Colin Cross607d8582019-07-29 16:44:46 -07001995func (m *moduleContext) InstallBypassMake() bool {
1996 return m.module.InstallBypassMake()
1997}
1998
Colin Cross6e359402020-02-10 15:29:54 -08001999func (m *moduleContext) InstallForceOS() *OsType {
2000 return m.module.InstallForceOS()
2001}
2002
Colin Cross70dda7e2019-10-01 22:05:35 -07002003func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002004 if m.module.base().commonProperties.SkipInstall {
Colin Cross893d8162017-04-26 17:34:03 -07002005 return true
2006 }
2007
Colin Cross3607f212018-05-07 15:28:05 -07002008 // We'll need a solution for choosing which of modules with the same name in different
2009 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
2010 // list of namespaces to install in a Soong-only build.
Colin Cross25de6c32019-06-06 14:29:25 -07002011 if !m.module.base().commonProperties.NamespaceExportedToMake {
Colin Cross3607f212018-05-07 15:28:05 -07002012 return true
2013 }
2014
Colin Cross25de6c32019-06-06 14:29:25 -07002015 if m.Device() {
Colin Cross607d8582019-07-29 16:44:46 -07002016 if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
Colin Cross893d8162017-04-26 17:34:03 -07002017 return true
2018 }
2019
Colin Cross25de6c32019-06-06 14:29:25 -07002020 if m.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07002021 return true
2022 }
2023 }
2024
2025 return false
2026}
2027
Colin Cross70dda7e2019-10-01 22:05:35 -07002028func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
2029 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002030 return m.installFile(installPath, name, srcPath, Cp, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002031}
2032
Colin Cross70dda7e2019-10-01 22:05:35 -07002033func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
2034 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002035 return m.installFile(installPath, name, srcPath, CpExecutable, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002036}
2037
Colin Cross70dda7e2019-10-01 22:05:35 -07002038func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
2039 rule blueprint.Rule, deps []Path) InstallPath {
Colin Cross35cec122015-04-02 14:37:16 -07002040
Colin Cross25de6c32019-06-06 14:29:25 -07002041 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002042 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08002043
Colin Cross25de6c32019-06-06 14:29:25 -07002044 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002045
Colin Cross897266e2020-02-13 13:22:08 -08002046 deps = append(deps, m.installDeps.Paths()...)
Colin Cross35cec122015-04-02 14:37:16 -07002047
Colin Cross89562dc2016-10-03 17:47:19 -07002048 var implicitDeps, orderOnlyDeps Paths
2049
Colin Cross25de6c32019-06-06 14:29:25 -07002050 if m.Host() {
Colin Cross89562dc2016-10-03 17:47:19 -07002051 // Installed host modules might be used during the build, depend directly on their
2052 // dependencies so their timestamp is updated whenever their dependency is updated
2053 implicitDeps = deps
2054 } else {
2055 orderOnlyDeps = deps
2056 }
2057
Colin Cross25de6c32019-06-06 14:29:25 -07002058 m.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07002059 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07002060 Description: "install " + fullInstallPath.Base(),
2061 Output: fullInstallPath,
2062 Input: srcPath,
2063 Implicits: implicitDeps,
2064 OrderOnly: orderOnlyDeps,
Colin Cross25de6c32019-06-06 14:29:25 -07002065 Default: !m.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08002066 })
Colin Cross3f40fa42015-01-30 17:27:36 -08002067
Colin Cross25de6c32019-06-06 14:29:25 -07002068 m.installFiles = append(m.installFiles, fullInstallPath)
Dan Willemsen322acaf2016-01-12 23:07:05 -08002069 }
Colin Cross25de6c32019-06-06 14:29:25 -07002070 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07002071 return fullInstallPath
2072}
2073
Colin Cross70dda7e2019-10-01 22:05:35 -07002074func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002075 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002076 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08002077
Colin Cross25de6c32019-06-06 14:29:25 -07002078 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002079
Alex Lightfb4353d2019-01-17 13:57:45 -08002080 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
2081 if err != nil {
2082 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
2083 }
Colin Cross25de6c32019-06-06 14:29:25 -07002084 m.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07002085 Rule: Symlink,
2086 Description: "install symlink " + fullInstallPath.Base(),
2087 Output: fullInstallPath,
Dan Willemsen40efa1c2020-01-14 15:19:52 -08002088 Input: srcPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002089 Default: !m.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08002090 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08002091 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08002092 },
2093 })
Colin Cross3854a602016-01-11 12:49:11 -08002094
Colin Cross25de6c32019-06-06 14:29:25 -07002095 m.installFiles = append(m.installFiles, fullInstallPath)
2096 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross12fc4972016-01-11 12:49:11 -08002097 }
Colin Cross3854a602016-01-11 12:49:11 -08002098 return fullInstallPath
2099}
2100
Jiyong Parkf1194352019-02-25 11:05:47 +09002101// installPath/name -> absPath where absPath might be a path that is available only at runtime
2102// (e.g. /apex/...)
Colin Cross70dda7e2019-10-01 22:05:35 -07002103func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002104 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002105 m.module.base().hooks.runInstallHooks(m, nil, fullInstallPath, true)
Jiyong Parkf1194352019-02-25 11:05:47 +09002106
Colin Cross25de6c32019-06-06 14:29:25 -07002107 if !m.skipInstall(fullInstallPath) {
2108 m.Build(pctx, BuildParams{
Jiyong Parkf1194352019-02-25 11:05:47 +09002109 Rule: Symlink,
2110 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
2111 Output: fullInstallPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002112 Default: !m.Config().EmbeddedInMake(),
Jiyong Parkf1194352019-02-25 11:05:47 +09002113 Args: map[string]string{
2114 "fromPath": absPath,
2115 },
2116 })
2117
Colin Cross25de6c32019-06-06 14:29:25 -07002118 m.installFiles = append(m.installFiles, fullInstallPath)
Jiyong Parkf1194352019-02-25 11:05:47 +09002119 }
2120 return fullInstallPath
2121}
2122
Colin Cross25de6c32019-06-06 14:29:25 -07002123func (m *moduleContext) CheckbuildFile(srcPath Path) {
2124 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross3f40fa42015-01-30 17:27:36 -08002125}
2126
Colin Cross41955e82019-05-29 14:40:35 -07002127// SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input
2128// was not a module reference.
2129func SrcIsModule(s string) (module string) {
Colin Cross068e0fe2016-12-13 15:23:47 -08002130 if len(s) > 1 && s[0] == ':' {
2131 return s[1:]
2132 }
2133 return ""
2134}
2135
Colin Cross41955e82019-05-29 14:40:35 -07002136// SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the
2137// module name and an empty string for the tag, or empty strings if the input was not a module reference.
2138func SrcIsModuleWithTag(s string) (module, tag string) {
2139 if len(s) > 1 && s[0] == ':' {
2140 module = s[1:]
2141 if tagStart := strings.IndexByte(module, '{'); tagStart > 0 {
2142 if module[len(module)-1] == '}' {
2143 tag = module[tagStart+1 : len(module)-1]
2144 module = module[:tagStart]
2145 return module, tag
2146 }
2147 }
2148 return module, ""
2149 }
2150 return "", ""
Colin Cross068e0fe2016-12-13 15:23:47 -08002151}
2152
Colin Cross41955e82019-05-29 14:40:35 -07002153type sourceOrOutputDependencyTag struct {
2154 blueprint.BaseDependencyTag
2155 tag string
2156}
2157
2158func sourceOrOutputDepTag(tag string) blueprint.DependencyTag {
2159 return sourceOrOutputDependencyTag{tag: tag}
2160}
2161
2162var SourceDepTag = sourceOrOutputDepTag("")
Colin Cross068e0fe2016-12-13 15:23:47 -08002163
Colin Cross366938f2017-12-11 16:29:02 -08002164// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
2165// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002166//
2167// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08002168func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
Nan Zhang2439eb72017-04-10 11:27:50 -07002169 set := make(map[string]bool)
2170
Colin Cross068e0fe2016-12-13 15:23:47 -08002171 for _, s := range srcFiles {
Colin Cross41955e82019-05-29 14:40:35 -07002172 if m, t := SrcIsModuleWithTag(s); m != "" {
2173 if _, found := set[s]; found {
2174 ctx.ModuleErrorf("found source dependency duplicate: %q!", s)
Nan Zhang2439eb72017-04-10 11:27:50 -07002175 } else {
Colin Cross41955e82019-05-29 14:40:35 -07002176 set[s] = true
2177 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Nan Zhang2439eb72017-04-10 11:27:50 -07002178 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002179 }
2180 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002181}
2182
Colin Cross366938f2017-12-11 16:29:02 -08002183// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
2184// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002185//
2186// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08002187func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
2188 if s != nil {
Colin Cross41955e82019-05-29 14:40:35 -07002189 if m, t := SrcIsModuleWithTag(*s); m != "" {
2190 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Colin Cross366938f2017-12-11 16:29:02 -08002191 }
2192 }
2193}
2194
Colin Cross41955e82019-05-29 14:40:35 -07002195// A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"`
2196// 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 -08002197type SourceFileProducer interface {
2198 Srcs() Paths
2199}
2200
Colin Cross41955e82019-05-29 14:40:35 -07002201// A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"`
Roland Levillain97c1f342019-11-22 14:20:54 +00002202// 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 -07002203// listed in the property.
2204type OutputFileProducer interface {
2205 OutputFiles(tag string) (Paths, error)
2206}
2207
Colin Cross5e708052019-08-06 13:59:50 -07002208// OutputFilesForModule returns the paths from an OutputFileProducer with the given tag. On error, including if the
2209// module produced zero paths, it reports errors to the ctx and returns nil.
2210func OutputFilesForModule(ctx PathContext, module blueprint.Module, tag string) Paths {
2211 paths, err := outputFilesForModule(ctx, module, tag)
2212 if err != nil {
2213 reportPathError(ctx, err)
2214 return nil
2215 }
2216 return paths
2217}
2218
2219// OutputFileForModule returns the path from an OutputFileProducer with the given tag. On error, including if the
2220// module produced zero or multiple paths, it reports errors to the ctx and returns nil.
2221func OutputFileForModule(ctx PathContext, module blueprint.Module, tag string) Path {
2222 paths, err := outputFilesForModule(ctx, module, tag)
2223 if err != nil {
2224 reportPathError(ctx, err)
2225 return nil
2226 }
2227 if len(paths) > 1 {
2228 reportPathErrorf(ctx, "got multiple output files from module %q, expected exactly one",
2229 pathContextName(ctx, module))
2230 return nil
2231 }
2232 return paths[0]
2233}
2234
2235func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
2236 if outputFileProducer, ok := module.(OutputFileProducer); ok {
2237 paths, err := outputFileProducer.OutputFiles(tag)
2238 if err != nil {
2239 return nil, fmt.Errorf("failed to get output file from module %q: %s",
2240 pathContextName(ctx, module), err.Error())
2241 }
2242 if len(paths) == 0 {
2243 return nil, fmt.Errorf("failed to get output files from module %q", pathContextName(ctx, module))
2244 }
2245 return paths, nil
2246 } else {
2247 return nil, fmt.Errorf("module %q is not an OutputFileProducer", pathContextName(ctx, module))
2248 }
2249}
2250
Colin Crossfe17f6f2019-03-28 19:30:56 -07002251type HostToolProvider interface {
2252 HostToolPath() OptionalPath
2253}
2254
Colin Cross27b922f2019-03-04 22:35:41 -08002255// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
2256// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002257//
2258// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002259func (m *moduleContext) ExpandSources(srcFiles, excludes []string) Paths {
2260 return PathsForModuleSrcExcludes(m, srcFiles, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07002261}
2262
Colin Cross2fafa3e2019-03-05 12:39:51 -08002263// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
2264// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002265//
2266// Deprecated: use PathForModuleSrc instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002267func (m *moduleContext) ExpandSource(srcFile, prop string) Path {
2268 return PathForModuleSrc(m, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08002269}
2270
2271// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
2272// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
2273// dependency resolution.
Colin Cross25de6c32019-06-06 14:29:25 -07002274func (m *moduleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
Colin Cross2fafa3e2019-03-05 12:39:51 -08002275 if srcFile != nil {
Colin Cross25de6c32019-06-06 14:29:25 -07002276 return OptionalPathForPath(PathForModuleSrc(m, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08002277 }
2278 return OptionalPath{}
2279}
2280
Colin Cross25de6c32019-06-06 14:29:25 -07002281func (m *moduleContext) RequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002282 return m.module.RequiredModuleNames()
Nan Zhang6d34b302017-02-04 17:47:46 -08002283}
2284
Colin Cross25de6c32019-06-06 14:29:25 -07002285func (m *moduleContext) HostRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002286 return m.module.HostRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002287}
2288
Colin Cross25de6c32019-06-06 14:29:25 -07002289func (m *moduleContext) TargetRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002290 return m.module.TargetRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002291}
2292
Colin Cross463a90e2015-06-17 14:20:06 -07002293func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07002294 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07002295}
2296
Colin Cross0875c522017-11-28 17:34:01 -08002297func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07002298 return &buildTargetSingleton{}
2299}
2300
Colin Cross87d8b562017-04-25 10:01:55 -07002301func parentDir(dir string) string {
2302 dir, _ = filepath.Split(dir)
2303 return filepath.Clean(dir)
2304}
2305
Colin Cross1f8c52b2015-06-16 16:38:17 -07002306type buildTargetSingleton struct{}
2307
Colin Cross0875c522017-11-28 17:34:01 -08002308func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
2309 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07002310
Colin Crossc3d87d32020-06-04 13:25:17 -07002311 mmTarget := func(dir string) string {
2312 return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1)
Colin Cross87d8b562017-04-25 10:01:55 -07002313 }
2314
Colin Cross0875c522017-11-28 17:34:01 -08002315 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002316
Colin Cross0875c522017-11-28 17:34:01 -08002317 ctx.VisitAllModules(func(module Module) {
2318 blueprintDir := module.base().blueprintDir
2319 installTarget := module.base().installTarget
2320 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07002321
Colin Cross0875c522017-11-28 17:34:01 -08002322 if checkbuildTarget != nil {
2323 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
2324 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
2325 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002326
Colin Cross0875c522017-11-28 17:34:01 -08002327 if installTarget != nil {
2328 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002329 }
2330 })
2331
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002332 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08002333 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002334 suffix = "-soong"
2335 }
2336
Colin Cross1f8c52b2015-06-16 16:38:17 -07002337 // Create a top-level checkbuild target that depends on all modules
Colin Crossc3d87d32020-06-04 13:25:17 -07002338 ctx.Phony("checkbuild"+suffix, checkbuildDeps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002339
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002340 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08002341 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002342 return
2343 }
2344
Colin Cross87d8b562017-04-25 10:01:55 -07002345 // Ensure ancestor directories are in modulesInDir
Inseob Kim1a365c62019-06-08 15:47:51 +09002346 dirs := SortedStringKeys(modulesInDir)
Colin Cross87d8b562017-04-25 10:01:55 -07002347 for _, dir := range dirs {
2348 dir := parentDir(dir)
2349 for dir != "." && dir != "/" {
2350 if _, exists := modulesInDir[dir]; exists {
2351 break
2352 }
2353 modulesInDir[dir] = nil
2354 dir = parentDir(dir)
2355 }
2356 }
2357
2358 // Make directories build their direct subdirectories
Colin Cross87d8b562017-04-25 10:01:55 -07002359 for _, dir := range dirs {
2360 p := parentDir(dir)
2361 if p != "." && p != "/" {
Colin Crossc3d87d32020-06-04 13:25:17 -07002362 modulesInDir[p] = append(modulesInDir[p], PathForPhony(ctx, mmTarget(dir)))
Colin Cross87d8b562017-04-25 10:01:55 -07002363 }
2364 }
2365
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002366 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
2367 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
2368 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07002369 for _, dir := range dirs {
Colin Crossc3d87d32020-06-04 13:25:17 -07002370 ctx.Phony(mmTarget(dir), modulesInDir[dir]...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002371 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002372
2373 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
2374 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08002375 ctx.VisitAllModules(func(module Module) {
2376 if module.Enabled() {
2377 os := module.Target().Os
2378 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002379 }
2380 })
2381
Colin Cross0875c522017-11-28 17:34:01 -08002382 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002383 for os, deps := range osDeps {
2384 var className string
2385
2386 switch os.Class {
2387 case Host:
2388 className = "host"
2389 case HostCross:
2390 className = "host-cross"
2391 case Device:
2392 className = "target"
2393 default:
2394 continue
2395 }
2396
Colin Crossc3d87d32020-06-04 13:25:17 -07002397 name := className + "-" + os.Name
2398 osClass[className] = append(osClass[className], PathForPhony(ctx, name))
Dan Willemsen61d88b82017-09-20 17:29:08 -07002399
Colin Crossc3d87d32020-06-04 13:25:17 -07002400 ctx.Phony(name, deps...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002401 }
2402
2403 // Wrap those into host|host-cross|target phony rules
Inseob Kim1a365c62019-06-08 15:47:51 +09002404 for _, class := range SortedStringKeys(osClass) {
Colin Crossc3d87d32020-06-04 13:25:17 -07002405 ctx.Phony(class, osClass[class]...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002406 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002407}
Colin Crossd779da42015-12-17 18:00:23 -08002408
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002409// Collect information for opening IDE project files in java/jdeps.go.
2410type IDEInfo interface {
2411 IDEInfo(ideInfo *IdeInfo)
2412 BaseModuleName() string
2413}
2414
2415// Extract the base module name from the Import name.
2416// Often the Import name has a prefix "prebuilt_".
2417// Remove the prefix explicitly if needed
2418// until we find a better solution to get the Import name.
2419type IDECustomizedModuleName interface {
2420 IDECustomizedModuleName() string
2421}
2422
2423type IdeInfo struct {
2424 Deps []string `json:"dependencies,omitempty"`
2425 Srcs []string `json:"srcs,omitempty"`
2426 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
2427 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
2428 Jars []string `json:"jars,omitempty"`
2429 Classes []string `json:"class,omitempty"`
2430 Installed_paths []string `json:"installed,omitempty"`
patricktu18c82ff2019-05-10 15:48:50 +08002431 SrcJars []string `json:"srcjars,omitempty"`
bralee1fbf4402020-05-21 10:11:59 +08002432 Paths []string `json:"path,omitempty"`
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002433}
Paul Duffinf88d8e02020-05-07 20:21:34 +01002434
2435func CheckBlueprintSyntax(ctx BaseModuleContext, filename string, contents string) []error {
2436 bpctx := ctx.blueprintBaseModuleContext()
2437 return blueprint.CheckBlueprintSyntax(bpctx.ModuleFactories(), filename, contents)
2438}