blob: 1424f7694df82ec4af9ebe7985ee1b54c52e93e9 [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 {
Colin Cross9f35c3d2020-09-16 19:04:41 -070064 // Module returns the current module as a Module. It should rarely be necessary, as the module already has a
65 // reference to itself.
Colin Cross1184b642019-12-30 18:43:07 -080066 Module() Module
Colin Cross9f35c3d2020-09-16 19:04:41 -070067
68 // ModuleName returns the name of the module. This is generally the value that was returned by Module.Name() when
69 // the module was created, but may have been modified by calls to BaseMutatorContext.Rename.
Colin Cross1184b642019-12-30 18:43:07 -080070 ModuleName() string
Colin Cross9f35c3d2020-09-16 19:04:41 -070071
72 // ModuleDir returns the path to the directory that contains the definition of the module.
Colin Cross1184b642019-12-30 18:43:07 -080073 ModuleDir() string
Colin Cross9f35c3d2020-09-16 19:04:41 -070074
75 // ModuleType returns the name of the module type that was used to create the module, as specified in
76 // RegisterModuleType.
Colin Cross1184b642019-12-30 18:43:07 -080077 ModuleType() string
Colin Cross9f35c3d2020-09-16 19:04:41 -070078
79 // BlueprintFile returns the name of the blueprint file that contains the definition of this
80 // module.
Colin Cross9d34f352019-11-22 16:03:51 -080081 BlueprintsFile() string
Colin Cross1184b642019-12-30 18:43:07 -080082
Colin Cross9f35c3d2020-09-16 19:04:41 -070083 // ContainsProperty returns true if the specified property name was set in the module definition.
Colin Cross1184b642019-12-30 18:43:07 -080084 ContainsProperty(name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -070085
86 // Errorf reports an error at the specified position of the module definition file.
Colin Cross1184b642019-12-30 18:43:07 -080087 Errorf(pos scanner.Position, fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -070088
89 // ModuleErrorf reports an error at the line number of the module type in the module definition.
Colin Cross1184b642019-12-30 18:43:07 -080090 ModuleErrorf(fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -070091
92 // PropertyErrorf reports an error at the line number of a property in the module definition.
Colin Cross1184b642019-12-30 18:43:07 -080093 PropertyErrorf(property, fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -070094
95 // Failed returns true if any errors have been reported. In most cases the module can continue with generating
96 // build rules after an error, allowing it to report additional errors in a single run, but in cases where the error
97 // has prevented the module from creating necessary data it can return early when Failed returns true.
Colin Cross1184b642019-12-30 18:43:07 -080098 Failed() bool
99
Colin Cross9f35c3d2020-09-16 19:04:41 -0700100 // AddNinjaFileDeps adds dependencies on the specified files to the rule that creates the ninja manifest. The
101 // primary builder will be rerun whenever the specified files are modified.
Colin Cross1184b642019-12-30 18:43:07 -0800102 AddNinjaFileDeps(deps ...string)
103
104 DeviceSpecific() bool
105 SocSpecific() bool
106 ProductSpecific() bool
107 SystemExtSpecific() bool
108 Platform() bool
109
110 Config() Config
111 DeviceConfig() DeviceConfig
112
113 // Deprecated: use Config()
114 AConfig() Config
115
116 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
117 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
118 // builder whenever a file matching the pattern as added or removed, without rerunning if a
119 // file that does not match the pattern is added to a searched directory.
120 GlobWithDeps(pattern string, excludes []string) ([]string, error)
121
122 Glob(globPattern string, excludes []string) Paths
123 GlobFiles(globPattern string, excludes []string) Paths
Colin Cross988414c2020-01-11 01:11:46 +0000124 IsSymlink(path Path) bool
125 Readlink(path Path) string
Colin Cross133ebef2020-08-14 17:38:45 -0700126
Colin Cross9f35c3d2020-09-16 19:04:41 -0700127 // Namespace returns the Namespace object provided by the NameInterface set by Context.SetNameInterface, or the
128 // default SimpleNameInterface if Context.SetNameInterface was not called.
Colin Cross133ebef2020-08-14 17:38:45 -0700129 Namespace() *Namespace
Colin Cross1184b642019-12-30 18:43:07 -0800130}
131
Colin Cross0ea8ba82019-06-06 14:33:29 -0700132// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
Colin Crossdc35e212019-06-06 16:13:11 -0700133// a Config instead of an interface{}, and some methods have been wrapped to use an android.Module
134// instead of a blueprint.Module, plus some extra methods that return Android-specific information
Colin Cross0ea8ba82019-06-06 14:33:29 -0700135// about the current module.
136type BaseModuleContext interface {
Colin Cross1184b642019-12-30 18:43:07 -0800137 EarlyModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -0700138
Paul Duffinf88d8e02020-05-07 20:21:34 +0100139 blueprintBaseModuleContext() blueprint.BaseModuleContext
140
Colin Cross9f35c3d2020-09-16 19:04:41 -0700141 // OtherModuleName returns the name of another Module. See BaseModuleContext.ModuleName for more information.
142 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Colin Crossdc35e212019-06-06 16:13:11 -0700143 OtherModuleName(m blueprint.Module) string
Colin Cross9f35c3d2020-09-16 19:04:41 -0700144
145 // OtherModuleDir returns the directory of another Module. See BaseModuleContext.ModuleDir for more information.
146 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Colin Crossdc35e212019-06-06 16:13:11 -0700147 OtherModuleDir(m blueprint.Module) string
Colin Cross9f35c3d2020-09-16 19:04:41 -0700148
149 // OtherModuleErrorf reports an error on another Module. See BaseModuleContext.ModuleErrorf for more information.
150 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Colin Crossdc35e212019-06-06 16:13:11 -0700151 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -0700152
153 // OtherModuleDependencyTag returns the dependency tag used to depend on a module, or nil if there is no dependency
154 // on the module. When called inside a Visit* method with current module being visited, and there are multiple
155 // dependencies on the module being visited, it returns the dependency tag used for the current dependency.
Colin Crossdc35e212019-06-06 16:13:11 -0700156 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
Colin Cross9f35c3d2020-09-16 19:04:41 -0700157
158 // OtherModuleExists returns true if a module with the specified name exists, as determined by the NameInterface
159 // passed to Context.SetNameInterface, or SimpleNameInterface if it was not called.
Colin Crossdc35e212019-06-06 16:13:11 -0700160 OtherModuleExists(name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -0700161
162 // OtherModuleDependencyVariantExists returns true if a module with the
163 // specified name and variant exists. The variant must match the given
164 // variations. It must also match all the non-local variations of the current
165 // module. In other words, it checks for the module AddVariationDependencies
166 // would add a dependency on with the same arguments.
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000167 OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -0700168
169 // OtherModuleReverseDependencyVariantExists returns true if a module with the
170 // specified name exists with the same variations as the current module. In
171 // other words, it checks for the module AddReverseDependency would add a
172 // dependency on with the same argument.
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000173 OtherModuleReverseDependencyVariantExists(name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -0700174
175 // OtherModuleType returns the type of another Module. See BaseModuleContext.ModuleType for more information.
176 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Jiyong Park9e6c2422019-08-09 20:39:45 +0900177 OtherModuleType(m blueprint.Module) string
Colin Crossdc35e212019-06-06 16:13:11 -0700178
179 GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module
Colin Cross9f35c3d2020-09-16 19:04:41 -0700180
181 // GetDirectDepWithTag returns the Module the direct dependency with the specified name, or nil if
182 // none exists. It panics if the dependency does not have the specified tag. It skips any
183 // dependencies that are not an android.Module.
Colin Crossdc35e212019-06-06 16:13:11 -0700184 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
Colin Cross9f35c3d2020-09-16 19:04:41 -0700185
186 // GetDirectDep returns the Module and DependencyTag for the direct dependency with the specified
187 // name, or nil if none exists. If there are multiple dependencies on the same module it returns
188 // the first DependencyTag. It skips any dependencies that are not an android.Module.
Colin Crossdc35e212019-06-06 16:13:11 -0700189 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
190
Colin Cross9f35c3d2020-09-16 19:04:41 -0700191 // VisitDirectDepsBlueprint calls visit for each direct dependency. If there are multiple
192 // direct dependencies on the same module visit will be called multiple times on that module
193 // and OtherModuleDependencyTag will return a different tag for each.
194 //
195 // The Module passed to the visit function should not be retained outside of the visit
196 // function, it may be invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700197 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700198
199 // VisitDirectDeps calls visit for each direct dependency. If there are multiple
200 // direct dependencies on the same module visit will be called multiple times on that module
201 // and OtherModuleDependencyTag will return a different tag for each. It skips any
202 // dependencies that are not an android.Module.
203 //
204 // The Module passed to the visit function should not be retained outside of the visit
205 // function, it may be invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700206 VisitDirectDeps(visit func(Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700207
Colin Crossdc35e212019-06-06 16:13:11 -0700208 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700209
210 // VisitDirectDepsIf calls pred for each direct dependency, and if pred returns true calls visit. If there are
211 // multiple direct dependencies on the same module pred and visit will be called multiple times on that module and
212 // OtherModuleDependencyTag will return a different tag for each. It skips any
213 // dependencies that are not an android.Module.
214 //
215 // The Module passed to the visit function should not be retained outside of the visit function, it may be
216 // invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700217 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
218 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
219 VisitDepsDepthFirst(visit func(Module))
220 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
221 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700222
223 // WalkDeps calls visit for each transitive dependency, traversing the dependency tree in top down order. visit may
224 // be called multiple times for the same (child, parent) pair if there are multiple direct dependencies between the
225 // child and parent with different tags. OtherModuleDependencyTag will return the tag for the currently visited
226 // (child, parent) pair. If visit returns false WalkDeps will not continue recursing down to child. It skips
227 // any dependencies that are not an android.Module.
228 //
229 // The Modules passed to the visit function should not be retained outside of the visit function, they may be
230 // invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700231 WalkDeps(visit func(Module, Module) bool)
Colin Cross9f35c3d2020-09-16 19:04:41 -0700232
233 // WalkDepsBlueprint calls visit for each transitive dependency, traversing the dependency
234 // tree in top down order. visit may be called multiple times for the same (child, parent)
235 // pair if there are multiple direct dependencies between the child and parent with different
236 // tags. OtherModuleDependencyTag will return the tag for the currently visited
237 // (child, parent) pair. If visit returns false WalkDeps will not continue recursing down
238 // to child.
239 //
240 // The Modules passed to the visit function should not be retained outside of the visit function, they may be
241 // invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700242 WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool)
Colin Cross9f35c3d2020-09-16 19:04:41 -0700243
Colin Crossdc35e212019-06-06 16:13:11 -0700244 // GetWalkPath is supposed to be called in visit function passed in WalkDeps()
245 // and returns a top-down dependency path from a start module to current child module.
246 GetWalkPath() []Module
247
Paul Duffinc5192442020-03-31 11:31:36 +0100248 // GetTagPath is supposed to be called in visit function passed in WalkDeps()
249 // and returns a top-down dependency tags path from a start module to current child module.
250 // It has one less entry than GetWalkPath() as it contains the dependency tags that
251 // exist between each adjacent pair of modules in the GetWalkPath().
252 // GetTagPath()[i] is the tag between GetWalkPath()[i] and GetWalkPath()[i+1]
253 GetTagPath() []blueprint.DependencyTag
254
Jiyong Park1c7e9622020-05-07 16:12:13 +0900255 // GetPathString is supposed to be called in visit function passed in WalkDeps()
256 // and returns a multi-line string showing the modules and dependency tags
257 // among them along the top-down dependency path from a start module to current child module.
258 // skipFirst when set to true, the output doesn't include the start module,
259 // which is already printed when this function is used along with ModuleErrorf().
260 GetPathString(skipFirst bool) string
261
Colin Crossdc35e212019-06-06 16:13:11 -0700262 AddMissingDependencies(missingDeps []string)
263
Colin Crossa1ad8d12016-06-01 17:09:44 -0700264 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -0700265 TargetPrimary() bool
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000266
267 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
268 // responsible for creating.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700269 MultiTargets() []Target
Colin Crossf6566ed2015-03-24 11:13:38 -0700270 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -0700271 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -0700272 Host() bool
273 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -0700274 Darwin() bool
Doug Horn21b94272019-01-16 12:06:11 -0800275 Fuchsia() bool
Colin Cross3edeee12017-04-04 12:59:48 -0700276 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700277 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700278 PrimaryArch() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700279}
280
Colin Cross1184b642019-12-30 18:43:07 -0800281// Deprecated: use EarlyModuleContext instead
Colin Cross635c3b02016-05-18 15:37:25 -0700282type BaseContext interface {
Colin Cross1184b642019-12-30 18:43:07 -0800283 EarlyModuleContext
Colin Crossaabf6792017-11-29 00:27:14 -0800284}
285
Colin Cross635c3b02016-05-18 15:37:25 -0700286type ModuleContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -0800287 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800288
Colin Crossae887032017-10-23 17:16:14 -0700289 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800290 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700291
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700292 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800293 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800294 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700295
Colin Cross70dda7e2019-10-01 22:05:35 -0700296 InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
297 InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
298 InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath
299 InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700300 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800301
Colin Cross8d8f8e22016-08-03 11:57:50 -0700302 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700303 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700304 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800305 InstallInRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900306 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700307 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700308 InstallBypassMake() bool
Jiyong Park87788b52020-09-01 12:37:45 +0900309 InstallForceOS() (*OsType, *ArchType)
Nan Zhang6d34b302017-02-04 17:47:46 -0800310
311 RequiredModuleNames() []string
Sasha Smundakb6d23052019-04-01 18:37:36 -0700312 HostRequiredModuleNames() []string
313 TargetRequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700314
Colin Cross3f68a132017-10-23 17:10:29 -0700315 ModuleSubDir() string
316
Colin Cross0875c522017-11-28 17:34:01 -0800317 Variable(pctx PackageContext, name, value string)
318 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700319 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
320 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800321 Build(pctx PackageContext, params BuildParams)
Colin Crossc3d87d32020-06-04 13:25:17 -0700322 // Phony creates a Make-style phony rule, a rule with no commands that can depend on other
323 // phony rules or real files. Phony can be called on the same name multiple times to add
324 // additional dependencies.
325 Phony(phony string, deps ...Path)
Colin Cross3f68a132017-10-23 17:10:29 -0700326
Colin Cross9f35c3d2020-09-16 19:04:41 -0700327 // PrimaryModule returns the first variant of the current module. Variants of a module are always visited in
328 // order by mutators and GenerateBuildActions, so the data created by the current mutator can be read from the
329 // Module returned by PrimaryModule without data races. This can be used to perform singleton actions that are
330 // only done once for all variants of a module.
Colin Cross0875c522017-11-28 17:34:01 -0800331 PrimaryModule() Module
Colin Cross9f35c3d2020-09-16 19:04:41 -0700332
333 // FinalModule returns the last variant of the current module. Variants of a module are always visited in
334 // order by mutators and GenerateBuildActions, so the data created by the current mutator can be read from all
335 // variants using VisitAllModuleVariants if the current module == FinalModule(). This can be used to perform
336 // singleton actions that are only done once for all variants of a module.
Colin Cross0875c522017-11-28 17:34:01 -0800337 FinalModule() Module
Colin Cross9f35c3d2020-09-16 19:04:41 -0700338
339 // VisitAllModuleVariants calls visit for each variant of the current module. Variants of a module are always
340 // visited in order by mutators and GenerateBuildActions, so the data created by the current mutator can be read
341 // from all variants if the current module == FinalModule(). Otherwise, care must be taken to not access any
342 // data modified by the current mutator.
Colin Cross0875c522017-11-28 17:34:01 -0800343 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700344
Colin Cross9f35c3d2020-09-16 19:04:41 -0700345 // GetMissingDependencies returns the list of dependencies that were passed to AddDependencies or related methods,
346 // but do not exist.
Colin Cross3f68a132017-10-23 17:10:29 -0700347 GetMissingDependencies() []string
Colin Cross3f40fa42015-01-30 17:27:36 -0800348}
349
Colin Cross635c3b02016-05-18 15:37:25 -0700350type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800351 blueprint.Module
352
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700353 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
354 // but GenerateAndroidBuildActions also has access to Android-specific information.
355 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700356 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700357
Paul Duffin44f1d842020-06-26 20:17:02 +0100358 // Add dependencies to the components of a module, i.e. modules that are created
359 // by the module and which are considered to be part of the creating module.
360 //
361 // This is called before prebuilts are renamed so as to allow a dependency to be
362 // added directly to a prebuilt child module instead of depending on a source module
363 // and relying on prebuilt processing to switch to the prebuilt module if preferred.
364 //
365 // A dependency on a prebuilt must include the "prebuilt_" prefix.
366 ComponentDepsMutator(ctx BottomUpMutatorContext)
367
Colin Cross1e676be2016-10-12 14:38:15 -0700368 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800369
Colin Cross635c3b02016-05-18 15:37:25 -0700370 base() *ModuleBase
Inseob Kimeec88e12020-01-22 11:11:29 +0900371 Disable()
Dan Willemsen0effe062015-11-30 16:06:01 -0800372 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700373 Target() Target
Anton Hansson1ee62c02020-06-30 11:51:53 +0100374 Owner() string
Dan Willemsen782a2d12015-12-21 14:55:28 -0800375 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700376 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700377 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800378 InstallInRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900379 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700380 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700381 InstallBypassMake() bool
Jiyong Park87788b52020-09-01 12:37:45 +0900382 InstallForceOS() (*OsType, *ArchType)
Colin Crossa2f296f2016-11-29 15:16:18 -0800383 SkipInstall()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +0000384 IsSkipInstall() bool
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100385 MakeUninstallable()
Jiyong Park374510b2018-03-19 18:23:01 +0900386 ExportedToMake() bool
Inseob Kim8471cda2019-11-15 09:59:12 +0900387 InitRc() Paths
388 VintfFragments() Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800389 NoticeFiles() Paths
Colin Cross36242852017-06-23 15:06:31 -0700390
391 AddProperties(props ...interface{})
392 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700393
Colin Crossae887032017-10-23 17:16:14 -0700394 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800395 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800396 VariablesForTests() map[string]string
Paul Duffine2453c72019-05-31 14:00:04 +0100397
Colin Cross9a362232019-07-01 15:32:45 -0700398 // String returns a string that includes the module name and variants for printing during debugging.
399 String() string
400
Paul Duffine2453c72019-05-31 14:00:04 +0100401 // Get the qualified module id for this module.
402 qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName
403
404 // Get information about the properties that can contain visibility rules.
405 visibilityProperties() []visibilityProperty
Paul Duffin63c6e182019-07-24 14:24:38 +0100406
Jiyong Park6a8cf5f2019-12-30 16:31:09 +0900407 RequiredModuleNames() []string
408 HostRequiredModuleNames() []string
409 TargetRequiredModuleNames() []string
Colin Cross897266e2020-02-13 13:22:08 -0800410
411 filesToInstall() InstallPaths
Paul Duffine2453c72019-05-31 14:00:04 +0100412}
413
414// Qualified id for a module
415type qualifiedModuleName struct {
416 // The package (i.e. directory) in which the module is defined, without trailing /
417 pkg string
418
419 // The name of the module, empty string if package.
420 name string
421}
422
423func (q qualifiedModuleName) String() string {
424 if q.name == "" {
425 return "//" + q.pkg
426 }
427 return "//" + q.pkg + ":" + q.name
428}
429
Paul Duffine484f472019-06-20 16:38:08 +0100430func (q qualifiedModuleName) isRootPackage() bool {
431 return q.pkg == "" && q.name == ""
432}
433
Paul Duffine2453c72019-05-31 14:00:04 +0100434// Get the id for the package containing this module.
435func (q qualifiedModuleName) getContainingPackageId() qualifiedModuleName {
436 pkg := q.pkg
437 if q.name == "" {
Paul Duffine484f472019-06-20 16:38:08 +0100438 if pkg == "" {
439 panic(fmt.Errorf("Cannot get containing package id of root package"))
440 }
441
442 index := strings.LastIndex(pkg, "/")
443 if index == -1 {
444 pkg = ""
445 } else {
446 pkg = pkg[:index]
447 }
Paul Duffine2453c72019-05-31 14:00:04 +0100448 }
449 return newPackageId(pkg)
450}
451
452func newPackageId(pkg string) qualifiedModuleName {
453 // A qualified id for a package module has no name.
454 return qualifiedModuleName{pkg: pkg, name: ""}
Colin Cross3f40fa42015-01-30 17:27:36 -0800455}
456
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000457type Dist struct {
458 // Copy the output of this module to the $DIST_DIR when `dist` is specified on the
459 // command line and any of these targets are also on the command line, or otherwise
460 // built
461 Targets []string `android:"arch_variant"`
462
463 // The name of the output artifact. This defaults to the basename of the output of
464 // the module.
465 Dest *string `android:"arch_variant"`
466
467 // The directory within the dist directory to store the artifact. Defaults to the
468 // top level directory ("").
469 Dir *string `android:"arch_variant"`
470
471 // A suffix to add to the artifact file name (before any extension).
472 Suffix *string `android:"arch_variant"`
473
474 // A string tag to select the OutputFiles associated with the tag. Defaults to the
475 // the empty "" string.
476 Tag *string `android:"arch_variant"`
477}
478
Colin Crossfc754582016-05-17 16:34:16 -0700479type nameProperties struct {
480 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800481 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700482}
483
484type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800485 // emit build rules for this module
Paul Duffin54d9bb72020-02-12 10:20:56 +0000486 //
487 // Disabling a module should only be done for those modules that cannot be built
488 // in the current environment. Modules that can build in the current environment
489 // but are not usually required (e.g. superceded by a prebuilt) should not be
490 // disabled as that will prevent them from being built by the checkbuild target
491 // and so prevent early detection of changes that have broken those modules.
Dan Willemsen0effe062015-11-30 16:06:01 -0800492 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800493
Paul Duffin2e61fa62019-03-28 14:10:57 +0000494 // Controls the visibility of this module to other modules. Allowable values are one or more of
495 // these formats:
496 //
497 // ["//visibility:public"]: Anyone can use this module.
498 // ["//visibility:private"]: Only rules in the module's package (not its subpackages) can use
499 // this module.
Paul Duffin51084ff2020-05-05 19:19:22 +0100500 // ["//visibility:override"]: Discards any rules inherited from defaults or a creating module.
501 // Can only be used at the beginning of a list of visibility rules.
Paul Duffin2e61fa62019-03-28 14:10:57 +0000502 // ["//some/package:__pkg__", "//other/package:__pkg__"]: Only modules in some/package and
503 // other/package (defined in some/package/*.bp and other/package/*.bp) have access to
504 // this module. Note that sub-packages do not have access to the rule; for example,
505 // //some/package/foo:bar or //other/package/testing:bla wouldn't have access. __pkg__
506 // is a special module and must be used verbatim. It represents all of the modules in the
507 // package.
508 // ["//project:__subpackages__", "//other:__subpackages__"]: Only modules in packages project
509 // or other or in one of their sub-packages have access to this module. For example,
510 // //project:rule, //project/library:lib or //other/testing/internal:munge are allowed
511 // to depend on this rule (but not //independent:evil)
512 // ["//project"]: This is shorthand for ["//project:__pkg__"]
513 // [":__subpackages__"]: This is shorthand for ["//project:__subpackages__"] where
514 // //project is the module's package. e.g. using [":__subpackages__"] in
515 // packages/apps/Settings/Android.bp is equivalent to
516 // //packages/apps/Settings:__subpackages__.
517 // ["//visibility:legacy_public"]: The default visibility, behaves as //visibility:public
518 // for now. It is an error if it is used in a module.
Paul Duffine2453c72019-05-31 14:00:04 +0100519 //
520 // If a module does not specify the `visibility` property then it uses the
521 // `default_visibility` property of the `package` module in the module's package.
522 //
523 // If the `default_visibility` property is not set for the module's package then
Paul Duffine484f472019-06-20 16:38:08 +0100524 // it will use the `default_visibility` of its closest ancestor package for which
525 // a `default_visibility` property is specified.
526 //
527 // If no `default_visibility` property can be found then the module uses the
528 // global default of `//visibility:legacy_public`.
Paul Duffine2453c72019-05-31 14:00:04 +0100529 //
Paul Duffin95d53b52019-07-24 13:45:05 +0100530 // The `visibility` property has no effect on a defaults module although it does
531 // apply to any non-defaults module that uses it. To set the visibility of a
532 // defaults module, use the `defaults_visibility` property on the defaults module;
533 // not to be confused with the `default_visibility` property on the package module.
534 //
Paul Duffin2e61fa62019-03-28 14:10:57 +0000535 // See https://android.googlesource.com/platform/build/soong/+/master/README.md#visibility for
536 // more details.
537 Visibility []string
538
Colin Cross7d5136f2015-05-11 13:39:40 -0700539 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800540 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
541 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
542 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700543 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700544
545 Target struct {
546 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700547 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700548 }
549 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700550 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700551 }
552 }
553
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000554 // If set to true then the archMutator will create variants for each arch specific target
555 // (e.g. 32/64) that the module is required to produce. If set to false then it will only
556 // create a variant for the architecture and will list the additional arch specific targets
557 // that the variant needs to produce in the CompileMultiTargets property.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700558 UseTargetVariants bool `blueprint:"mutated"`
559 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800560
Dan Willemsen782a2d12015-12-21 14:55:28 -0800561 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700562 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800563
Colin Cross55708f32017-03-20 13:23:34 -0700564 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700565 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700566
Jiyong Park2db76922017-11-08 16:03:48 +0900567 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
568 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
569 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700570 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700571
Jiyong Park2db76922017-11-08 16:03:48 +0900572 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
573 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
574 Soc_specific *bool
575
576 // whether this module is specific to a device, not only for SoC, but also for off-chip
577 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
578 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
579 // This implies `soc_specific:true`.
580 Device_specific *bool
581
582 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900583 // network operator, etc). When set to true, it is installed into /product (or
584 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900585 Product_specific *bool
586
Justin Yund5f6c822019-06-25 16:47:17 +0900587 // whether this module extends system. When set to true, it is installed into /system_ext
588 // (or /system/system_ext if system_ext partition does not exist).
589 System_ext_specific *bool
590
Jiyong Parkf9332f12018-02-01 00:54:12 +0900591 // Whether this module is installed to recovery partition
592 Recovery *bool
593
Yifan Hong1b3348d2020-01-21 15:53:22 -0800594 // Whether this module is installed to ramdisk
595 Ramdisk *bool
596
dimitry1f33e402019-03-26 12:39:31 +0100597 // Whether this module is built for non-native architecures (also known as native bridge binary)
598 Native_bridge_supported *bool `android:"arch_variant"`
599
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700600 // init.rc files to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800601 Init_rc []string `android:"path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700602
Steven Moreland57a23d22018-04-04 15:42:19 -0700603 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800604 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700605
Chris Wolfe998306e2016-08-15 14:47:23 -0400606 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700607 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400608
Sasha Smundakb6d23052019-04-01 18:37:36 -0700609 // names of other modules to install on host if this module is installed
610 Host_required []string `android:"arch_variant"`
611
612 // names of other modules to install on target if this module is installed
613 Target_required []string `android:"arch_variant"`
614
Colin Cross5aac3622017-08-31 15:07:09 -0700615 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800616 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700617
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000618 // The OsType of artifacts that this module variant is responsible for creating.
619 //
620 // Set by osMutator
621 CompileOS OsType `blueprint:"mutated"`
622
623 // The Target of artifacts that this module variant is responsible for creating.
624 //
625 // Set by archMutator
626 CompileTarget Target `blueprint:"mutated"`
627
628 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
629 // responsible for creating.
630 //
631 // By default this is nil as, where necessary, separate variants are created for the
632 // different multilib types supported and that information is encapsulated in the
633 // CompileTarget so the module variant simply needs to create artifacts for that.
634 //
635 // However, if UseTargetVariants is set to false (e.g. by
636 // InitAndroidMultiTargetsArchModule) then no separate variants are created for the
637 // multilib targets. Instead a single variant is created for the architecture and
638 // this contains the multilib specific targets that this variant should create.
639 //
640 // Set by archMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700641 CompileMultiTargets []Target `blueprint:"mutated"`
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000642
643 // True if the module variant's CompileTarget is the primary target
644 //
645 // Set by archMutator
646 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800647
648 // Set by InitAndroidModule
649 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700650 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700651
Paul Duffin1356d8c2020-02-25 19:26:33 +0000652 // If set to true then a CommonOS variant will be created which will have dependencies
653 // on all its OsType specific variants. Used by sdk/module_exports to create a snapshot
654 // that covers all os and architecture variants.
655 //
656 // The OsType specific variants can be retrieved by calling
657 // GetOsSpecificVariantsOfCommonOSVariant
658 //
659 // Set at module initialization time by calling InitCommonOSAndroidMultiTargetsArchModule
660 CreateCommonOSVariant bool `blueprint:"mutated"`
661
662 // If set to true then this variant is the CommonOS variant that has dependencies on its
663 // OsType specific variants.
664 //
665 // Set by osMutator.
666 CommonOSVariant bool `blueprint:"mutated"`
667
Colin Crossce75d2c2016-10-06 16:12:58 -0700668 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800669
Justin Yun32f053b2020-07-31 23:07:17 +0900670 // Disabled by mutators. If set to true, it overrides Enabled property.
671 ForcedDisabled bool `blueprint:"mutated"`
672
Jeff Gaston088e29e2017-11-29 16:47:17 -0800673 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross6c4f21f2019-06-06 15:41:36 -0700674
675 MissingDeps []string `blueprint:"mutated"`
Colin Cross9a362232019-07-01 15:32:45 -0700676
677 // Name and variant strings stored by mutators to enable Module.String()
678 DebugName string `blueprint:"mutated"`
679 DebugMutators []string `blueprint:"mutated"`
680 DebugVariations []string `blueprint:"mutated"`
Colin Cross7228ecd2019-11-18 16:00:16 -0800681
682 // set by ImageMutator
683 ImageVariation string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800684}
685
Paul Duffined875132020-09-02 13:08:57 +0100686type distProperties struct {
687 // configuration to distribute output files from this module to the distribution
688 // directory (default: $OUT/dist, configurable with $DIST_DIR)
689 Dist Dist `android:"arch_variant"`
690
691 // a list of configurations to distribute output files from this module to the
692 // distribution directory (default: $OUT/dist, configurable with $DIST_DIR)
693 Dists []Dist `android:"arch_variant"`
694}
695
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000696// A map of OutputFile tag keys to Paths, for disting purposes.
697type TaggedDistFiles map[string]Paths
698
699func MakeDefaultDistFiles(paths ...Path) TaggedDistFiles {
Jingwen Chen7b27ca72020-07-24 09:13:49 +0000700 for _, path := range paths {
701 if path == nil {
702 panic("The path to a dist file cannot be nil.")
703 }
704 }
705
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000706 // The default OutputFile tag is the empty "" string.
707 return TaggedDistFiles{"": paths}
708}
709
Colin Cross3f40fa42015-01-30 17:27:36 -0800710type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800711 // If set to true, build a variant of the module for the host. Defaults to false.
712 Host_supported *bool
713
714 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700715 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800716}
717
Colin Crossc472d572015-03-17 15:06:21 -0700718type Multilib string
719
720const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800721 MultilibBoth Multilib = "both"
722 MultilibFirst Multilib = "first"
723 MultilibCommon Multilib = "common"
724 MultilibCommonFirst Multilib = "common_first"
725 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700726)
727
Colin Crossa1ad8d12016-06-01 17:09:44 -0700728type HostOrDeviceSupported int
729
730const (
731 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700732
733 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700734 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700735
736 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700737 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700738
739 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700740 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700741
742 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700743 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700744
745 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700746 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700747
748 // Nothing is supported. This is not exposed to the user, but used to mark a
749 // host only module as unsupported when the module type is not supported on
750 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700751 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700752)
753
Jiyong Park2db76922017-11-08 16:03:48 +0900754type moduleKind int
755
756const (
757 platformModule moduleKind = iota
758 deviceSpecificModule
759 socSpecificModule
760 productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900761 systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900762)
763
764func (k moduleKind) String() string {
765 switch k {
766 case platformModule:
767 return "platform"
768 case deviceSpecificModule:
769 return "device-specific"
770 case socSpecificModule:
771 return "soc-specific"
772 case productSpecificModule:
773 return "product-specific"
Justin Yund5f6c822019-06-25 16:47:17 +0900774 case systemExtSpecificModule:
775 return "systemext-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900776 default:
777 panic(fmt.Errorf("unknown module kind %d", k))
778 }
779}
780
Colin Cross9d34f352019-11-22 16:03:51 -0800781func initAndroidModuleBase(m Module) {
782 m.base().module = m
783}
784
Colin Cross36242852017-06-23 15:06:31 -0700785func InitAndroidModule(m Module) {
Colin Cross9d34f352019-11-22 16:03:51 -0800786 initAndroidModuleBase(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800787 base := m.base()
Colin Cross5049f022015-03-18 13:28:46 -0700788
Colin Cross36242852017-06-23 15:06:31 -0700789 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700790 &base.nameProperties,
Paul Duffined875132020-09-02 13:08:57 +0100791 &base.commonProperties,
792 &base.distProperties)
Colin Cross18c46802019-09-24 22:19:02 -0700793
Colin Crosseabaedd2020-02-06 17:01:55 -0800794 initProductVariableModule(m)
Colin Cross18c46802019-09-24 22:19:02 -0700795
Colin Crossa3a97412019-03-18 12:24:29 -0700796 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700797 base.customizableProperties = m.GetProperties()
Paul Duffin63c6e182019-07-24 14:24:38 +0100798
799 // The default_visibility property needs to be checked and parsed by the visibility module during
Paul Duffin5ec73ec2020-05-01 17:52:01 +0100800 // its checking and parsing phases so make it the primary visibility property.
801 setPrimaryVisibilityProperty(m, "visibility", &base.commonProperties.Visibility)
Colin Cross5049f022015-03-18 13:28:46 -0700802}
803
Colin Cross36242852017-06-23 15:06:31 -0700804func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
805 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700806
807 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800808 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700809 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700810 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700811 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800812
Dan Willemsen218f6562015-07-08 18:13:11 -0700813 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700814 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700815 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800816 }
817
Colin Cross36242852017-06-23 15:06:31 -0700818 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800819}
820
Colin Crossee0bc3b2018-10-02 22:01:37 -0700821func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
822 InitAndroidArchModule(m, hod, defaultMultilib)
823 m.base().commonProperties.UseTargetVariants = false
824}
825
Paul Duffin1356d8c2020-02-25 19:26:33 +0000826// As InitAndroidMultiTargetsArchModule except it creates an additional CommonOS variant that
827// has dependencies on all the OsType specific variants.
828func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
829 InitAndroidArchModule(m, hod, defaultMultilib)
830 m.base().commonProperties.UseTargetVariants = false
831 m.base().commonProperties.CreateCommonOSVariant = true
832}
833
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800834// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800835// modules. It should be included as an anonymous field in every module
836// struct definition. InitAndroidModule should then be called from the module's
837// factory function, and the return values from InitAndroidModule should be
838// returned from the factory function.
839//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800840// The ModuleBase type is responsible for implementing the GenerateBuildActions
841// method to support the blueprint.Module interface. This method will then call
842// the module's GenerateAndroidBuildActions method once for each build variant
Colin Cross25de6c32019-06-06 14:29:25 -0700843// that is to be built. GenerateAndroidBuildActions is passed a ModuleContext
844// rather than the usual blueprint.ModuleContext.
845// ModuleContext exposes extra functionality specific to the Android build
Colin Cross3f40fa42015-01-30 17:27:36 -0800846// system including details about the particular build variant that is to be
847// generated.
848//
849// For example:
850//
851// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800852// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800853// )
854//
855// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800856// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800857// properties struct {
858// MyProperty string
859// }
860// }
861//
Colin Cross36242852017-06-23 15:06:31 -0700862// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800863// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700864// m.AddProperties(&m.properties)
865// android.InitAndroidModule(m)
866// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800867// }
868//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800869// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800870// // Get the CPU architecture for the current build variant.
871// variantArch := ctx.Arch()
872//
873// // ...
874// }
Colin Cross635c3b02016-05-18 15:37:25 -0700875type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800876 // Putting the curiously recurring thing pointing to the thing that contains
877 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700878 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700879 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800880
Colin Crossfc754582016-05-17 16:34:16 -0700881 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800882 commonProperties commonProperties
Paul Duffined875132020-09-02 13:08:57 +0100883 distProperties distProperties
Colin Cross18c46802019-09-24 22:19:02 -0700884 variableProperties interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800885 hostAndDeviceProperties hostAndDeviceProperties
886 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700887 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700888 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800889
Paul Duffin63c6e182019-07-24 14:24:38 +0100890 // Information about all the properties on the module that contains visibility rules that need
891 // checking.
892 visibilityPropertyInfo []visibilityProperty
893
894 // The primary visibility property, may be nil, that controls access to the module.
895 primaryVisibilityProperty visibilityProperty
896
Colin Cross3f40fa42015-01-30 17:27:36 -0800897 noAddressSanitizer bool
Colin Cross897266e2020-02-13 13:22:08 -0800898 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700899 checkbuildFiles Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800900 noticeFiles Paths
Colin Crossc3d87d32020-06-04 13:25:17 -0700901 phonies map[string]Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700902
903 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
904 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800905 installTarget WritablePath
906 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700907 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700908
Colin Cross178a5092016-09-13 13:42:32 -0700909 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700910
911 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700912
913 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700914 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800915 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800916 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700917
Inseob Kim8471cda2019-11-15 09:59:12 +0900918 initRcPaths Paths
919 vintfFragmentsPaths Paths
920
Colin Crossa9d8bee2018-10-02 13:59:46 -0700921 prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
Colin Cross36242852017-06-23 15:06:31 -0700922}
923
Paul Duffin44f1d842020-06-26 20:17:02 +0100924func (m *ModuleBase) ComponentDepsMutator(BottomUpMutatorContext) {}
925
Colin Cross4157e882019-06-06 16:57:04 -0700926func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
Colin Cross5f692ec2019-02-01 16:53:07 -0800927
Colin Cross4157e882019-06-06 16:57:04 -0700928func (m *ModuleBase) AddProperties(props ...interface{}) {
929 m.registerProps = append(m.registerProps, props...)
Colin Cross36242852017-06-23 15:06:31 -0700930}
931
Colin Cross4157e882019-06-06 16:57:04 -0700932func (m *ModuleBase) GetProperties() []interface{} {
933 return m.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800934}
935
Colin Cross4157e882019-06-06 16:57:04 -0700936func (m *ModuleBase) BuildParamsForTests() []BuildParams {
937 return m.buildParams
Colin Crosscec81712017-07-13 14:43:27 -0700938}
939
Colin Cross4157e882019-06-06 16:57:04 -0700940func (m *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
941 return m.ruleParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800942}
943
Colin Cross4157e882019-06-06 16:57:04 -0700944func (m *ModuleBase) VariablesForTests() map[string]string {
945 return m.variables
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800946}
947
Colin Cross4157e882019-06-06 16:57:04 -0700948func (m *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
949 m.prefer32 = prefer32
Colin Crossa9d8bee2018-10-02 13:59:46 -0700950}
951
Colin Crossce75d2c2016-10-06 16:12:58 -0700952// Name returns the name of the module. It may be overridden by individual module types, for
953// example prebuilts will prepend prebuilt_ to the name.
Colin Cross4157e882019-06-06 16:57:04 -0700954func (m *ModuleBase) Name() string {
955 return String(m.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700956}
957
Colin Cross9a362232019-07-01 15:32:45 -0700958// String returns a string that includes the module name and variants for printing during debugging.
959func (m *ModuleBase) String() string {
960 sb := strings.Builder{}
961 sb.WriteString(m.commonProperties.DebugName)
962 sb.WriteString("{")
963 for i := range m.commonProperties.DebugMutators {
964 if i != 0 {
965 sb.WriteString(",")
966 }
967 sb.WriteString(m.commonProperties.DebugMutators[i])
968 sb.WriteString(":")
969 sb.WriteString(m.commonProperties.DebugVariations[i])
970 }
971 sb.WriteString("}")
972 return sb.String()
973}
974
Colin Crossce75d2c2016-10-06 16:12:58 -0700975// BaseModuleName returns the name of the module as specified in the blueprints file.
Colin Cross4157e882019-06-06 16:57:04 -0700976func (m *ModuleBase) BaseModuleName() string {
977 return String(m.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700978}
979
Colin Cross4157e882019-06-06 16:57:04 -0700980func (m *ModuleBase) base() *ModuleBase {
981 return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800982}
983
Paul Duffine2453c72019-05-31 14:00:04 +0100984func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
985 return qualifiedModuleName{pkg: ctx.ModuleDir(), name: ctx.ModuleName()}
986}
987
988func (m *ModuleBase) visibilityProperties() []visibilityProperty {
Paul Duffin63c6e182019-07-24 14:24:38 +0100989 return m.visibilityPropertyInfo
990}
991
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000992func (m *ModuleBase) Dists() []Dist {
Paul Duffined875132020-09-02 13:08:57 +0100993 if len(m.distProperties.Dist.Targets) > 0 {
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000994 // Make a copy of the underlying Dists slice to protect against
995 // backing array modifications with repeated calls to this method.
Paul Duffined875132020-09-02 13:08:57 +0100996 distsCopy := append([]Dist(nil), m.distProperties.Dists...)
997 return append(distsCopy, m.distProperties.Dist)
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000998 } else {
Paul Duffined875132020-09-02 13:08:57 +0100999 return m.distProperties.Dists
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001000 }
1001}
1002
1003func (m *ModuleBase) GenerateTaggedDistFiles(ctx BaseModuleContext) TaggedDistFiles {
1004 distFiles := make(TaggedDistFiles)
1005 for _, dist := range m.Dists() {
1006 var tag string
1007 var distFilesForTag Paths
1008 if dist.Tag == nil {
1009 tag = ""
1010 } else {
1011 tag = *dist.Tag
1012 }
1013 distFilesForTag, err := m.base().module.(OutputFileProducer).OutputFiles(tag)
1014 if err != nil {
1015 ctx.PropertyErrorf("dist.tag", "%s", err.Error())
1016 }
1017 for _, distFile := range distFilesForTag {
1018 if distFile != nil && !distFiles[tag].containsPath(distFile) {
1019 distFiles[tag] = append(distFiles[tag], distFile)
1020 }
1021 }
1022 }
1023
1024 return distFiles
1025}
1026
Colin Cross4157e882019-06-06 16:57:04 -07001027func (m *ModuleBase) Target() Target {
1028 return m.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -08001029}
1030
Colin Cross4157e882019-06-06 16:57:04 -07001031func (m *ModuleBase) TargetPrimary() bool {
1032 return m.commonProperties.CompilePrimary
Colin Cross8b74d172016-09-13 09:59:14 -07001033}
1034
Colin Cross4157e882019-06-06 16:57:04 -07001035func (m *ModuleBase) MultiTargets() []Target {
1036 return m.commonProperties.CompileMultiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07001037}
1038
Colin Cross4157e882019-06-06 16:57:04 -07001039func (m *ModuleBase) Os() OsType {
1040 return m.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001041}
1042
Colin Cross4157e882019-06-06 16:57:04 -07001043func (m *ModuleBase) Host() bool {
1044 return m.Os().Class == Host || m.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -08001045}
1046
Yo Chiangbba545e2020-06-09 16:15:37 +08001047func (m *ModuleBase) Device() bool {
1048 return m.Os().Class == Device
1049}
1050
Colin Cross4157e882019-06-06 16:57:04 -07001051func (m *ModuleBase) Arch() Arch {
1052 return m.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -08001053}
1054
Colin Cross4157e882019-06-06 16:57:04 -07001055func (m *ModuleBase) ArchSpecific() bool {
1056 return m.commonProperties.ArchSpecific
Dan Willemsen0b24c742016-10-04 15:13:37 -07001057}
1058
Paul Duffin1356d8c2020-02-25 19:26:33 +00001059// True if the current variant is a CommonOS variant, false otherwise.
1060func (m *ModuleBase) IsCommonOSVariant() bool {
1061 return m.commonProperties.CommonOSVariant
1062}
1063
Colin Cross4157e882019-06-06 16:57:04 -07001064func (m *ModuleBase) OsClassSupported() []OsClass {
1065 switch m.commonProperties.HostOrDeviceSupported {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001066 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -07001067 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -07001068 case HostSupportedNoCross:
1069 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -07001070 case DeviceSupported:
1071 return []OsClass{Device}
Dan Albert0981b5c2018-08-02 13:46:35 -07001072 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Crossa1ad8d12016-06-01 17:09:44 -07001073 var supported []OsClass
Colin Cross4157e882019-06-06 16:57:04 -07001074 if Bool(m.hostAndDeviceProperties.Host_supported) ||
1075 (m.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
1076 m.hostAndDeviceProperties.Host_supported == nil) {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001077 supported = append(supported, Host, HostCross)
1078 }
Colin Cross4157e882019-06-06 16:57:04 -07001079 if m.hostAndDeviceProperties.Device_supported == nil ||
1080 *m.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001081 supported = append(supported, Device)
1082 }
1083 return supported
1084 default:
1085 return nil
1086 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001087}
1088
Colin Cross4157e882019-06-06 16:57:04 -07001089func (m *ModuleBase) DeviceSupported() bool {
1090 return m.commonProperties.HostOrDeviceSupported == DeviceSupported ||
1091 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
1092 (m.hostAndDeviceProperties.Device_supported == nil ||
1093 *m.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -08001094}
1095
Paul Duffine44358f2019-11-26 18:04:12 +00001096func (m *ModuleBase) HostSupported() bool {
1097 return m.commonProperties.HostOrDeviceSupported == HostSupported ||
1098 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
1099 (m.hostAndDeviceProperties.Host_supported != nil &&
1100 *m.hostAndDeviceProperties.Host_supported)
1101}
1102
Colin Cross4157e882019-06-06 16:57:04 -07001103func (m *ModuleBase) Platform() bool {
Justin Yund5f6c822019-06-25 16:47:17 +09001104 return !m.DeviceSpecific() && !m.SocSpecific() && !m.ProductSpecific() && !m.SystemExtSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +09001105}
1106
Colin Cross4157e882019-06-06 16:57:04 -07001107func (m *ModuleBase) DeviceSpecific() bool {
1108 return Bool(m.commonProperties.Device_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001109}
1110
Colin Cross4157e882019-06-06 16:57:04 -07001111func (m *ModuleBase) SocSpecific() bool {
1112 return Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001113}
1114
Colin Cross4157e882019-06-06 16:57:04 -07001115func (m *ModuleBase) ProductSpecific() bool {
1116 return Bool(m.commonProperties.Product_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001117}
1118
Justin Yund5f6c822019-06-25 16:47:17 +09001119func (m *ModuleBase) SystemExtSpecific() bool {
1120 return Bool(m.commonProperties.System_ext_specific)
Dario Frenifd05a742018-05-29 13:28:54 +01001121}
1122
Colin Crossc2d24052020-05-13 11:05:02 -07001123// RequiresStableAPIs returns true if the module will be installed to a partition that may
1124// be updated separately from the system image.
1125func (m *ModuleBase) RequiresStableAPIs(ctx BaseModuleContext) bool {
1126 return m.SocSpecific() || m.DeviceSpecific() ||
1127 (m.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface())
1128}
1129
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001130func (m *ModuleBase) PartitionTag(config DeviceConfig) string {
1131 partition := "system"
1132 if m.SocSpecific() {
1133 // A SoC-specific module could be on the vendor partition at
1134 // "vendor" or the system partition at "system/vendor".
1135 if config.VendorPath() == "vendor" {
1136 partition = "vendor"
1137 }
1138 } else if m.DeviceSpecific() {
1139 // A device-specific module could be on the odm partition at
1140 // "odm", the vendor partition at "vendor/odm", or the system
1141 // partition at "system/vendor/odm".
1142 if config.OdmPath() == "odm" {
1143 partition = "odm"
Ramy Medhat944839a2020-03-31 22:14:52 -04001144 } else if strings.HasPrefix(config.OdmPath(), "vendor/") {
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001145 partition = "vendor"
1146 }
1147 } else if m.ProductSpecific() {
1148 // A product-specific module could be on the product partition
1149 // at "product" or the system partition at "system/product".
1150 if config.ProductPath() == "product" {
1151 partition = "product"
1152 }
1153 } else if m.SystemExtSpecific() {
1154 // A system_ext-specific module could be on the system_ext
1155 // partition at "system_ext" or the system partition at
1156 // "system/system_ext".
1157 if config.SystemExtPath() == "system_ext" {
1158 partition = "system_ext"
1159 }
1160 }
1161 return partition
1162}
1163
Colin Cross4157e882019-06-06 16:57:04 -07001164func (m *ModuleBase) Enabled() bool {
Justin Yun32f053b2020-07-31 23:07:17 +09001165 if m.commonProperties.ForcedDisabled {
1166 return false
1167 }
Colin Cross4157e882019-06-06 16:57:04 -07001168 if m.commonProperties.Enabled == nil {
1169 return !m.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -08001170 }
Colin Cross4157e882019-06-06 16:57:04 -07001171 return *m.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -08001172}
1173
Inseob Kimeec88e12020-01-22 11:11:29 +09001174func (m *ModuleBase) Disable() {
Justin Yun32f053b2020-07-31 23:07:17 +09001175 m.commonProperties.ForcedDisabled = true
Inseob Kimeec88e12020-01-22 11:11:29 +09001176}
1177
Colin Cross4157e882019-06-06 16:57:04 -07001178func (m *ModuleBase) SkipInstall() {
1179 m.commonProperties.SkipInstall = true
Colin Crossce75d2c2016-10-06 16:12:58 -07001180}
1181
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00001182func (m *ModuleBase) IsSkipInstall() bool {
1183 return m.commonProperties.SkipInstall == true
1184}
1185
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01001186// Similar to SkipInstall, but if the AndroidMk entry would set
1187// LOCAL_UNINSTALLABLE_MODULE then this variant may still output that entry
1188// rather than leaving it out altogether. That happens in cases where it would
1189// have other side effects, in particular when it adds a NOTICE file target,
1190// which other install targets might depend on.
1191func (m *ModuleBase) MakeUninstallable() {
1192 m.SkipInstall()
1193}
1194
Colin Cross4157e882019-06-06 16:57:04 -07001195func (m *ModuleBase) ExportedToMake() bool {
1196 return m.commonProperties.NamespaceExportedToMake
Jiyong Park374510b2018-03-19 18:23:01 +09001197}
1198
Colin Cross897266e2020-02-13 13:22:08 -08001199func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {
Colin Cross3f40fa42015-01-30 17:27:36 -08001200
Colin Cross897266e2020-02-13 13:22:08 -08001201 var result InstallPaths
Colin Cross6b753602018-06-21 13:03:07 -07001202 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross897266e2020-02-13 13:22:08 -08001203 ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
1204 if a, ok := m.(Module); ok {
1205 result = append(result, a.filesToInstall()...)
1206 }
1207 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001208
1209 return result
1210}
1211
Colin Cross897266e2020-02-13 13:22:08 -08001212func (m *ModuleBase) filesToInstall() InstallPaths {
Colin Cross4157e882019-06-06 16:57:04 -07001213 return m.installFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001214}
1215
Colin Cross4157e882019-06-06 16:57:04 -07001216func (m *ModuleBase) NoAddressSanitizer() bool {
1217 return m.noAddressSanitizer
Colin Cross3f40fa42015-01-30 17:27:36 -08001218}
1219
Colin Cross4157e882019-06-06 16:57:04 -07001220func (m *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -08001221 return false
1222}
1223
Jaewoong Jung0949f312019-09-11 10:25:18 -07001224func (m *ModuleBase) InstallInTestcases() bool {
1225 return false
1226}
1227
Colin Cross4157e882019-06-06 16:57:04 -07001228func (m *ModuleBase) InstallInSanitizerDir() bool {
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001229 return false
1230}
1231
Yifan Hong1b3348d2020-01-21 15:53:22 -08001232func (m *ModuleBase) InstallInRamdisk() bool {
1233 return Bool(m.commonProperties.Ramdisk)
1234}
1235
Colin Cross4157e882019-06-06 16:57:04 -07001236func (m *ModuleBase) InstallInRecovery() bool {
1237 return Bool(m.commonProperties.Recovery)
Jiyong Parkf9332f12018-02-01 00:54:12 +09001238}
1239
Colin Cross90ba5f42019-10-02 11:10:58 -07001240func (m *ModuleBase) InstallInRoot() bool {
1241 return false
1242}
1243
Colin Cross607d8582019-07-29 16:44:46 -07001244func (m *ModuleBase) InstallBypassMake() bool {
1245 return false
1246}
1247
Jiyong Park87788b52020-09-01 12:37:45 +09001248func (m *ModuleBase) InstallForceOS() (*OsType, *ArchType) {
1249 return nil, nil
Colin Cross6e359402020-02-10 15:29:54 -08001250}
1251
Colin Cross4157e882019-06-06 16:57:04 -07001252func (m *ModuleBase) Owner() string {
1253 return String(m.commonProperties.Owner)
Sundong Ahn4fd04bb2018-08-31 18:01:37 +09001254}
1255
Bob Badoura75b0572020-02-18 20:21:55 -08001256func (m *ModuleBase) NoticeFiles() Paths {
1257 return m.noticeFiles
Jiyong Park52818fc2019-03-18 12:01:38 +09001258}
1259
Colin Cross7228ecd2019-11-18 16:00:16 -08001260func (m *ModuleBase) setImageVariation(variant string) {
1261 m.commonProperties.ImageVariation = variant
1262}
1263
1264func (m *ModuleBase) ImageVariation() blueprint.Variation {
1265 return blueprint.Variation{
1266 Mutator: "image",
1267 Variation: m.base().commonProperties.ImageVariation,
1268 }
1269}
1270
Paul Duffin9b76c0b2020-03-12 10:24:35 +00001271func (m *ModuleBase) getVariationByMutatorName(mutator string) string {
1272 for i, v := range m.commonProperties.DebugMutators {
1273 if v == mutator {
1274 return m.commonProperties.DebugVariations[i]
1275 }
1276 }
1277
1278 return ""
1279}
1280
Yifan Hong1b3348d2020-01-21 15:53:22 -08001281func (m *ModuleBase) InRamdisk() bool {
1282 return m.base().commonProperties.ImageVariation == RamdiskVariation
1283}
1284
Colin Cross7228ecd2019-11-18 16:00:16 -08001285func (m *ModuleBase) InRecovery() bool {
1286 return m.base().commonProperties.ImageVariation == RecoveryVariation
1287}
1288
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09001289func (m *ModuleBase) RequiredModuleNames() []string {
1290 return m.base().commonProperties.Required
1291}
1292
1293func (m *ModuleBase) HostRequiredModuleNames() []string {
1294 return m.base().commonProperties.Host_required
1295}
1296
1297func (m *ModuleBase) TargetRequiredModuleNames() []string {
1298 return m.base().commonProperties.Target_required
1299}
1300
Inseob Kim8471cda2019-11-15 09:59:12 +09001301func (m *ModuleBase) InitRc() Paths {
1302 return append(Paths{}, m.initRcPaths...)
1303}
1304
1305func (m *ModuleBase) VintfFragments() Paths {
1306 return append(Paths{}, m.vintfFragmentsPaths...)
1307}
1308
Colin Cross4157e882019-06-06 16:57:04 -07001309func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Colin Cross897266e2020-02-13 13:22:08 -08001310 var allInstalledFiles InstallPaths
1311 var allCheckbuildFiles Paths
Colin Cross0875c522017-11-28 17:34:01 -08001312 ctx.VisitAllModuleVariants(func(module Module) {
1313 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -07001314 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
1315 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -08001316 })
1317
Colin Cross0875c522017-11-28 17:34:01 -08001318 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -07001319
Colin Cross133ebef2020-08-14 17:38:45 -07001320 namespacePrefix := ctx.Namespace().id
Jeff Gaston088e29e2017-11-29 16:47:17 -08001321 if namespacePrefix != "" {
1322 namespacePrefix = namespacePrefix + "-"
1323 }
1324
Colin Cross3f40fa42015-01-30 17:27:36 -08001325 if len(allInstalledFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001326 name := namespacePrefix + ctx.ModuleName() + "-install"
1327 ctx.Phony(name, allInstalledFiles.Paths()...)
1328 m.installTarget = PathForPhony(ctx, name)
1329 deps = append(deps, m.installTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001330 }
1331
1332 if len(allCheckbuildFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001333 name := namespacePrefix + ctx.ModuleName() + "-checkbuild"
1334 ctx.Phony(name, allCheckbuildFiles...)
1335 m.checkbuildTarget = PathForPhony(ctx, name)
1336 deps = append(deps, m.checkbuildTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001337 }
1338
1339 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001340 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001341 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001342 suffix = "-soong"
1343 }
1344
Colin Crossc3d87d32020-06-04 13:25:17 -07001345 ctx.Phony(namespacePrefix+ctx.ModuleName()+suffix, deps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001346
Colin Cross4157e882019-06-06 16:57:04 -07001347 m.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -08001348 }
1349}
1350
Colin Crossc34d2322020-01-03 15:23:27 -08001351func determineModuleKind(m *ModuleBase, ctx blueprint.EarlyModuleContext) moduleKind {
Colin Cross4157e882019-06-06 16:57:04 -07001352 var socSpecific = Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
1353 var deviceSpecific = Bool(m.commonProperties.Device_specific)
1354 var productSpecific = Bool(m.commonProperties.Product_specific)
Justin Yund5f6c822019-06-25 16:47:17 +09001355 var systemExtSpecific = Bool(m.commonProperties.System_ext_specific)
Jiyong Park2db76922017-11-08 16:03:48 +09001356
Dario Frenifd05a742018-05-29 13:28:54 +01001357 msg := "conflicting value set here"
1358 if socSpecific && deviceSpecific {
1359 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Colin Cross4157e882019-06-06 16:57:04 -07001360 if Bool(m.commonProperties.Vendor) {
Jiyong Park2db76922017-11-08 16:03:48 +09001361 ctx.PropertyErrorf("vendor", msg)
1362 }
Colin Cross4157e882019-06-06 16:57:04 -07001363 if Bool(m.commonProperties.Proprietary) {
Jiyong Park2db76922017-11-08 16:03:48 +09001364 ctx.PropertyErrorf("proprietary", msg)
1365 }
Colin Cross4157e882019-06-06 16:57:04 -07001366 if Bool(m.commonProperties.Soc_specific) {
Jiyong Park2db76922017-11-08 16:03:48 +09001367 ctx.PropertyErrorf("soc_specific", msg)
1368 }
1369 }
1370
Justin Yund5f6c822019-06-25 16:47:17 +09001371 if productSpecific && systemExtSpecific {
1372 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and system_ext at the same time.")
1373 ctx.PropertyErrorf("system_ext_specific", msg)
Dario Frenifd05a742018-05-29 13:28:54 +01001374 }
1375
Justin Yund5f6c822019-06-25 16:47:17 +09001376 if (socSpecific || deviceSpecific) && (productSpecific || systemExtSpecific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001377 if productSpecific {
1378 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
1379 } else {
Justin Yund5f6c822019-06-25 16:47:17 +09001380 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 +01001381 }
1382 if deviceSpecific {
1383 ctx.PropertyErrorf("device_specific", msg)
1384 } else {
Colin Cross4157e882019-06-06 16:57:04 -07001385 if Bool(m.commonProperties.Vendor) {
Dario Frenifd05a742018-05-29 13:28:54 +01001386 ctx.PropertyErrorf("vendor", msg)
1387 }
Colin Cross4157e882019-06-06 16:57:04 -07001388 if Bool(m.commonProperties.Proprietary) {
Dario Frenifd05a742018-05-29 13:28:54 +01001389 ctx.PropertyErrorf("proprietary", msg)
1390 }
Colin Cross4157e882019-06-06 16:57:04 -07001391 if Bool(m.commonProperties.Soc_specific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001392 ctx.PropertyErrorf("soc_specific", msg)
1393 }
1394 }
1395 }
1396
Jiyong Park2db76922017-11-08 16:03:48 +09001397 if productSpecific {
1398 return productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +09001399 } else if systemExtSpecific {
1400 return systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001401 } else if deviceSpecific {
1402 return deviceSpecificModule
1403 } else if socSpecific {
1404 return socSpecificModule
1405 } else {
1406 return platformModule
1407 }
1408}
1409
Colin Crossc34d2322020-01-03 15:23:27 -08001410func (m *ModuleBase) earlyModuleContextFactory(ctx blueprint.EarlyModuleContext) earlyModuleContext {
Colin Cross1184b642019-12-30 18:43:07 -08001411 return earlyModuleContext{
Colin Crossc34d2322020-01-03 15:23:27 -08001412 EarlyModuleContext: ctx,
1413 kind: determineModuleKind(m, ctx),
1414 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -08001415 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001416}
1417
Colin Cross1184b642019-12-30 18:43:07 -08001418func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
1419 return baseModuleContext{
1420 bp: ctx,
1421 earlyModuleContext: m.earlyModuleContextFactory(ctx),
1422 os: m.commonProperties.CompileOS,
1423 target: m.commonProperties.CompileTarget,
1424 targetPrimary: m.commonProperties.CompilePrimary,
1425 multiTargets: m.commonProperties.CompileMultiTargets,
1426 }
1427}
1428
Colin Cross4157e882019-06-06 16:57:04 -07001429func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
Colin Cross25de6c32019-06-06 14:29:25 -07001430 ctx := &moduleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001431 module: m.module,
Colin Crossdc35e212019-06-06 16:13:11 -07001432 bp: blueprintCtx,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001433 baseModuleContext: m.baseModuleContextFactory(blueprintCtx),
1434 installDeps: m.computeInstallDeps(blueprintCtx),
1435 installFiles: m.installFiles,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001436 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -08001437 }
1438
Colin Cross6c4f21f2019-06-06 15:41:36 -07001439 // Temporarily continue to call blueprintCtx.GetMissingDependencies() to maintain the previous behavior of never
1440 // reporting missing dependency errors in Blueprint when AllowMissingDependencies == true.
1441 // TODO: This will be removed once defaults modules handle missing dependency errors
1442 blueprintCtx.GetMissingDependencies()
1443
Colin Crossdc35e212019-06-06 16:13:11 -07001444 // For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
Paul Duffin1356d8c2020-02-25 19:26:33 +00001445 // are enabled. Unless the module is a CommonOS variant which may have dependencies on disabled variants
1446 // (because the dependencies are added before the modules are disabled). The
1447 // GetOsSpecificVariantsOfCommonOSVariant(...) method will ensure that the disabled variants are
1448 // ignored.
1449 ctx.baseModuleContext.strictVisitDeps = !m.IsCommonOSVariant()
Colin Crossdc35e212019-06-06 16:13:11 -07001450
Colin Cross4c83e5c2019-02-25 14:54:28 -08001451 if ctx.config.captureBuild {
1452 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
1453 }
1454
Colin Cross67a5c132017-05-09 13:45:28 -07001455 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
1456 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -08001457 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
1458 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -07001459 }
Colin Cross0875c522017-11-28 17:34:01 -08001460 if !ctx.PrimaryArch() {
1461 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -07001462 }
Dan Willemsenb13a9482020-02-14 11:25:54 -08001463 if apex, ok := m.module.(ApexModule); ok && !apex.IsForPlatform() {
Colin Crosse07f2312020-08-13 11:24:56 -07001464 suffix = append(suffix, apex.ApexVariationName())
Dan Willemsenb13a9482020-02-14 11:25:54 -08001465 }
Colin Cross67a5c132017-05-09 13:45:28 -07001466
1467 ctx.Variable(pctx, "moduleDesc", desc)
1468
1469 s := ""
1470 if len(suffix) > 0 {
1471 s = " [" + strings.Join(suffix, " ") + "]"
1472 }
1473 ctx.Variable(pctx, "moduleDescSuffix", s)
1474
Dan Willemsen569edc52018-11-19 09:33:29 -08001475 // Some common property checks for properties that will be used later in androidmk.go
Paul Duffined875132020-09-02 13:08:57 +01001476 if m.distProperties.Dist.Dest != nil {
1477 _, err := validateSafePath(*m.distProperties.Dist.Dest)
Dan Willemsen569edc52018-11-19 09:33:29 -08001478 if err != nil {
1479 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
1480 }
1481 }
Paul Duffined875132020-09-02 13:08:57 +01001482 if m.distProperties.Dist.Dir != nil {
1483 _, err := validateSafePath(*m.distProperties.Dist.Dir)
Dan Willemsen569edc52018-11-19 09:33:29 -08001484 if err != nil {
1485 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
1486 }
1487 }
Paul Duffined875132020-09-02 13:08:57 +01001488 if m.distProperties.Dist.Suffix != nil {
1489 if strings.Contains(*m.distProperties.Dist.Suffix, "/") {
Dan Willemsen569edc52018-11-19 09:33:29 -08001490 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
1491 }
1492 }
1493
Colin Cross4157e882019-06-06 16:57:04 -07001494 if m.Enabled() {
Jooyung Hand48f3c32019-08-23 11:18:57 +09001495 // ensure all direct android.Module deps are enabled
1496 ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) {
1497 if _, ok := bm.(Module); ok {
1498 ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps)
1499 }
1500 })
1501
Bob Badoura75b0572020-02-18 20:21:55 -08001502 m.noticeFiles = make([]Path, 0)
1503 optPath := OptionalPath{}
1504 notice := proptools.StringDefault(m.commonProperties.Notice, "")
Colin Cross4157e882019-06-06 16:57:04 -07001505 if module := SrcIsModule(notice); module != "" {
Bob Badoura75b0572020-02-18 20:21:55 -08001506 optPath = ctx.ExpandOptionalSource(&notice, "notice")
1507 } else if notice != "" {
Jiyong Park52818fc2019-03-18 12:01:38 +09001508 noticePath := filepath.Join(ctx.ModuleDir(), notice)
Bob Badoura75b0572020-02-18 20:21:55 -08001509 optPath = ExistentPathForSource(ctx, noticePath)
1510 }
1511 if optPath.Valid() {
1512 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1513 } else {
1514 for _, notice = range []string{"LICENSE", "LICENCE", "NOTICE"} {
1515 noticePath := filepath.Join(ctx.ModuleDir(), notice)
1516 optPath = ExistentPathForSource(ctx, noticePath)
1517 if optPath.Valid() {
1518 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1519 }
1520 }
Jaewoong Jung62707f72018-11-16 13:26:43 -08001521 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001522
1523 m.module.GenerateAndroidBuildActions(ctx)
1524 if ctx.Failed() {
1525 return
1526 }
1527
1528 m.installFiles = append(m.installFiles, ctx.installFiles...)
1529 m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...)
Inseob Kim8471cda2019-11-15 09:59:12 +09001530 m.initRcPaths = PathsForModuleSrc(ctx, m.commonProperties.Init_rc)
1531 m.vintfFragmentsPaths = PathsForModuleSrc(ctx, m.commonProperties.Vintf_fragments)
Colin Crossc3d87d32020-06-04 13:25:17 -07001532 for k, v := range ctx.phonies {
1533 m.phonies[k] = append(m.phonies[k], v...)
1534 }
Colin Crossdc35e212019-06-06 16:13:11 -07001535 } else if ctx.Config().AllowMissingDependencies() {
1536 // If the module is not enabled it will not create any build rules, nothing will call
1537 // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled
1538 // and report them as an error even when AllowMissingDependencies = true. Call
1539 // ctx.GetMissingDependencies() here to tell blueprint not to handle them.
1540 ctx.GetMissingDependencies()
Colin Cross3f40fa42015-01-30 17:27:36 -08001541 }
1542
Colin Cross4157e882019-06-06 16:57:04 -07001543 if m == ctx.FinalModule().(Module).base() {
1544 m.generateModuleTarget(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -07001545 if ctx.Failed() {
1546 return
1547 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001548 }
Colin Crosscec81712017-07-13 14:43:27 -07001549
Colin Cross4157e882019-06-06 16:57:04 -07001550 m.buildParams = ctx.buildParams
1551 m.ruleParams = ctx.ruleParams
1552 m.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -08001553}
1554
Colin Cross1184b642019-12-30 18:43:07 -08001555type earlyModuleContext struct {
Colin Crossc34d2322020-01-03 15:23:27 -08001556 blueprint.EarlyModuleContext
Colin Cross1184b642019-12-30 18:43:07 -08001557
1558 kind moduleKind
1559 config Config
1560}
1561
1562func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths {
1563 ret, err := e.GlobWithDeps(globPattern, excludes)
1564 if err != nil {
1565 e.ModuleErrorf("glob: %s", err.Error())
1566 }
1567 return pathsForModuleSrcFromFullPath(e, ret, true)
1568}
1569
1570func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
1571 ret, err := e.GlobWithDeps(globPattern, excludes)
1572 if err != nil {
1573 e.ModuleErrorf("glob: %s", err.Error())
1574 }
1575 return pathsForModuleSrcFromFullPath(e, ret, false)
1576}
1577
Colin Cross988414c2020-01-11 01:11:46 +00001578func (b *earlyModuleContext) IsSymlink(path Path) bool {
1579 fileInfo, err := b.config.fs.Lstat(path.String())
1580 if err != nil {
1581 b.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
1582 }
1583 return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
1584}
1585
1586func (b *earlyModuleContext) Readlink(path Path) string {
1587 dest, err := b.config.fs.Readlink(path.String())
1588 if err != nil {
1589 b.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
1590 }
1591 return dest
1592}
1593
Colin Cross1184b642019-12-30 18:43:07 -08001594func (e *earlyModuleContext) Module() Module {
Colin Crossc34d2322020-01-03 15:23:27 -08001595 module, _ := e.EarlyModuleContext.Module().(Module)
Colin Cross1184b642019-12-30 18:43:07 -08001596 return module
1597}
1598
1599func (e *earlyModuleContext) Config() Config {
Colin Crossc34d2322020-01-03 15:23:27 -08001600 return e.EarlyModuleContext.Config().(Config)
Colin Cross1184b642019-12-30 18:43:07 -08001601}
1602
1603func (e *earlyModuleContext) AConfig() Config {
1604 return e.config
1605}
1606
1607func (e *earlyModuleContext) DeviceConfig() DeviceConfig {
1608 return DeviceConfig{e.config.deviceConfig}
1609}
1610
1611func (e *earlyModuleContext) Platform() bool {
1612 return e.kind == platformModule
1613}
1614
1615func (e *earlyModuleContext) DeviceSpecific() bool {
1616 return e.kind == deviceSpecificModule
1617}
1618
1619func (e *earlyModuleContext) SocSpecific() bool {
1620 return e.kind == socSpecificModule
1621}
1622
1623func (e *earlyModuleContext) ProductSpecific() bool {
1624 return e.kind == productSpecificModule
1625}
1626
1627func (e *earlyModuleContext) SystemExtSpecific() bool {
1628 return e.kind == systemExtSpecificModule
1629}
1630
Colin Cross133ebef2020-08-14 17:38:45 -07001631func (e *earlyModuleContext) Namespace() *Namespace {
1632 return e.EarlyModuleContext.Namespace().(*Namespace)
1633}
1634
Colin Cross1184b642019-12-30 18:43:07 -08001635type baseModuleContext struct {
1636 bp blueprint.BaseModuleContext
1637 earlyModuleContext
Colin Crossfb0c16e2019-11-20 17:12:35 -08001638 os OsType
Colin Cross8b74d172016-09-13 09:59:14 -07001639 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -07001640 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -07001641 targetPrimary bool
1642 debug bool
Colin Crossdc35e212019-06-06 16:13:11 -07001643
1644 walkPath []Module
Paul Duffinc5192442020-03-31 11:31:36 +01001645 tagPath []blueprint.DependencyTag
Colin Crossdc35e212019-06-06 16:13:11 -07001646
1647 strictVisitDeps bool // If true, enforce that all dependencies are enabled
Colin Crossf6566ed2015-03-24 11:13:38 -07001648}
1649
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001650func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string {
1651 return b.bp.OtherModuleName(m)
1652}
1653func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) }
Colin Cross1184b642019-12-30 18:43:07 -08001654func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) {
Jooyung Hancd87c692020-02-26 02:05:18 +09001655 b.bp.OtherModuleErrorf(m, fmt, args...)
Colin Cross1184b642019-12-30 18:43:07 -08001656}
1657func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag {
1658 return b.bp.OtherModuleDependencyTag(m)
1659}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001660func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +00001661func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
1662 return b.bp.OtherModuleDependencyVariantExists(variations, name)
1663}
1664func (b *baseModuleContext) OtherModuleReverseDependencyVariantExists(name string) bool {
1665 return b.bp.OtherModuleReverseDependencyVariantExists(name)
1666}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001667func (b *baseModuleContext) OtherModuleType(m blueprint.Module) string {
1668 return b.bp.OtherModuleType(m)
1669}
Colin Cross1184b642019-12-30 18:43:07 -08001670
1671func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1672 return b.bp.GetDirectDepWithTag(name, tag)
1673}
1674
Paul Duffinf88d8e02020-05-07 20:21:34 +01001675func (b *baseModuleContext) blueprintBaseModuleContext() blueprint.BaseModuleContext {
1676 return b.bp
1677}
1678
Colin Cross25de6c32019-06-06 14:29:25 -07001679type moduleContext struct {
Colin Crossdc35e212019-06-06 16:13:11 -07001680 bp blueprint.ModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -07001681 baseModuleContext
Colin Cross897266e2020-02-13 13:22:08 -08001682 installDeps InstallPaths
1683 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001684 checkbuildFiles Paths
Colin Cross8d8f8e22016-08-03 11:57:50 -07001685 module Module
Colin Crossc3d87d32020-06-04 13:25:17 -07001686 phonies map[string]Paths
Colin Crosscec81712017-07-13 14:43:27 -07001687
1688 // For tests
Colin Crossae887032017-10-23 17:16:14 -07001689 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -08001690 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001691 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -08001692}
1693
Colin Crossb88b3c52019-06-10 15:15:17 -07001694func (m *moduleContext) ninjaError(params BuildParams, err error) (PackageContext, BuildParams) {
1695 return pctx, BuildParams{
Colin Cross4b69c492019-06-07 13:06:06 -07001696 Rule: ErrorRule,
1697 Description: params.Description,
1698 Output: params.Output,
1699 Outputs: params.Outputs,
1700 ImplicitOutput: params.ImplicitOutput,
1701 ImplicitOutputs: params.ImplicitOutputs,
Colin Cross6ff51382015-12-17 16:39:19 -08001702 Args: map[string]string{
1703 "error": err.Error(),
1704 },
Colin Crossb88b3c52019-06-10 15:15:17 -07001705 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001706}
1707
Colin Cross25de6c32019-06-06 14:29:25 -07001708func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
1709 m.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -08001710}
1711
Colin Cross0875c522017-11-28 17:34:01 -08001712func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001713 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001714 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -08001715 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -08001716 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001717 Outputs: params.Outputs.Strings(),
1718 ImplicitOutputs: params.ImplicitOutputs.Strings(),
1719 Inputs: params.Inputs.Strings(),
1720 Implicits: params.Implicits.Strings(),
1721 OrderOnly: params.OrderOnly.Strings(),
Colin Cross824f1162020-07-16 13:07:51 -07001722 Validations: params.Validations.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001723 Args: params.Args,
1724 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001725 }
1726
Colin Cross33bfb0a2016-11-21 17:23:08 -08001727 if params.Depfile != nil {
1728 bparams.Depfile = params.Depfile.String()
1729 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001730 if params.Output != nil {
1731 bparams.Outputs = append(bparams.Outputs, params.Output.String())
1732 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001733 if params.ImplicitOutput != nil {
1734 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
1735 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001736 if params.Input != nil {
1737 bparams.Inputs = append(bparams.Inputs, params.Input.String())
1738 }
1739 if params.Implicit != nil {
1740 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
1741 }
Colin Cross824f1162020-07-16 13:07:51 -07001742 if params.Validation != nil {
1743 bparams.Validations = append(bparams.Validations, params.Validation.String())
1744 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001745
Colin Cross0b9f31f2019-02-28 11:00:01 -08001746 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
1747 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
1748 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
1749 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
1750 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
Colin Cross824f1162020-07-16 13:07:51 -07001751 bparams.Validations = proptools.NinjaEscapeList(bparams.Validations)
1752 bparams.Depfile = proptools.NinjaEscape(bparams.Depfile)
Colin Crossfe4bc362018-09-12 10:02:13 -07001753
Colin Cross0875c522017-11-28 17:34:01 -08001754 return bparams
1755}
1756
Colin Cross25de6c32019-06-06 14:29:25 -07001757func (m *moduleContext) Variable(pctx PackageContext, name, value string) {
1758 if m.config.captureBuild {
1759 m.variables[name] = value
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001760 }
1761
Colin Crossdc35e212019-06-06 16:13:11 -07001762 m.bp.Variable(pctx.PackageContext, name, value)
Colin Cross0875c522017-11-28 17:34:01 -08001763}
1764
Colin Cross25de6c32019-06-06 14:29:25 -07001765func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
Colin Cross0875c522017-11-28 17:34:01 -08001766 argNames ...string) blueprint.Rule {
1767
Ramy Medhat944839a2020-03-31 22:14:52 -04001768 if m.config.UseRemoteBuild() {
1769 if params.Pool == nil {
1770 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
1771 // jobs to the local parallelism value
1772 params.Pool = localPool
1773 } else if params.Pool == remotePool {
1774 // remotePool is a fake pool used to identify rule that are supported for remoting. If the rule's
1775 // pool is the remotePool, replace with nil so that ninja runs it at NINJA_REMOTE_NUM_JOBS
1776 // parallelism.
1777 params.Pool = nil
1778 }
Colin Cross2e2dbc22019-09-25 13:31:46 -07001779 }
1780
Colin Crossdc35e212019-06-06 16:13:11 -07001781 rule := m.bp.Rule(pctx.PackageContext, name, params, argNames...)
Colin Cross4c83e5c2019-02-25 14:54:28 -08001782
Colin Cross25de6c32019-06-06 14:29:25 -07001783 if m.config.captureBuild {
1784 m.ruleParams[rule] = params
Colin Cross4c83e5c2019-02-25 14:54:28 -08001785 }
1786
1787 return rule
Colin Cross0875c522017-11-28 17:34:01 -08001788}
1789
Colin Cross25de6c32019-06-06 14:29:25 -07001790func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
Colin Crossb88b3c52019-06-10 15:15:17 -07001791 if params.Description != "" {
1792 params.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1793 }
1794
1795 if missingDeps := m.GetMissingDependencies(); len(missingDeps) > 0 {
1796 pctx, params = m.ninjaError(params, fmt.Errorf("module %s missing dependencies: %s\n",
1797 m.ModuleName(), strings.Join(missingDeps, ", ")))
1798 }
1799
Colin Cross25de6c32019-06-06 14:29:25 -07001800 if m.config.captureBuild {
1801 m.buildParams = append(m.buildParams, params)
Colin Cross0875c522017-11-28 17:34:01 -08001802 }
1803
Colin Crossdc35e212019-06-06 16:13:11 -07001804 m.bp.Build(pctx.PackageContext, convertBuildParams(params))
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001805}
Colin Crossc3d87d32020-06-04 13:25:17 -07001806
1807func (m *moduleContext) Phony(name string, deps ...Path) {
1808 addPhony(m.config, name, deps...)
1809}
1810
Colin Cross25de6c32019-06-06 14:29:25 -07001811func (m *moduleContext) GetMissingDependencies() []string {
Colin Cross6c4f21f2019-06-06 15:41:36 -07001812 var missingDeps []string
1813 missingDeps = append(missingDeps, m.Module().base().commonProperties.MissingDeps...)
Colin Crossdc35e212019-06-06 16:13:11 -07001814 missingDeps = append(missingDeps, m.bp.GetMissingDependencies()...)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001815 missingDeps = FirstUniqueStrings(missingDeps)
1816 return missingDeps
Colin Cross6ff51382015-12-17 16:39:19 -08001817}
1818
Colin Crossdc35e212019-06-06 16:13:11 -07001819func (b *baseModuleContext) AddMissingDependencies(deps []string) {
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001820 if deps != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001821 missingDeps := &b.Module().base().commonProperties.MissingDeps
Colin Cross6c4f21f2019-06-06 15:41:36 -07001822 *missingDeps = append(*missingDeps, deps...)
1823 *missingDeps = FirstUniqueStrings(*missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001824 }
1825}
1826
Colin Crossdc35e212019-06-06 16:13:11 -07001827func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, strict bool) Module {
Colin Crossd11fcda2017-10-23 17:59:01 -07001828 aModule, _ := module.(Module)
Colin Crossdc35e212019-06-06 16:13:11 -07001829
1830 if !strict {
1831 return aModule
1832 }
1833
Colin Cross380c69a2019-06-10 17:49:58 +00001834 if aModule == nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001835 b.ModuleErrorf("module %q not an android module", b.OtherModuleName(module))
Colin Cross380c69a2019-06-10 17:49:58 +00001836 return nil
1837 }
1838
1839 if !aModule.Enabled() {
Colin Crossdc35e212019-06-06 16:13:11 -07001840 if b.Config().AllowMissingDependencies() {
1841 b.AddMissingDependencies([]string{b.OtherModuleName(aModule)})
Colin Cross380c69a2019-06-10 17:49:58 +00001842 } else {
Colin Crossdc35e212019-06-06 16:13:11 -07001843 b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule))
Colin Cross380c69a2019-06-10 17:49:58 +00001844 }
1845 return nil
1846 }
Colin Crossd11fcda2017-10-23 17:59:01 -07001847 return aModule
1848}
1849
Colin Crossdc35e212019-06-06 16:13:11 -07001850func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
Jiyong Parkf2976302019-04-17 21:47:37 +09001851 type dep struct {
1852 mod blueprint.Module
1853 tag blueprint.DependencyTag
1854 }
1855 var deps []dep
Colin Crossdc35e212019-06-06 16:13:11 -07001856 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001857 if aModule, _ := module.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
Colin Cross1184b642019-12-30 18:43:07 -08001858 returnedTag := b.bp.OtherModuleDependencyTag(aModule)
Jiyong Parkf2976302019-04-17 21:47:37 +09001859 if tag == nil || returnedTag == tag {
1860 deps = append(deps, dep{aModule, returnedTag})
1861 }
1862 }
1863 })
1864 if len(deps) == 1 {
1865 return deps[0].mod, deps[0].tag
1866 } else if len(deps) >= 2 {
1867 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
Colin Crossdc35e212019-06-06 16:13:11 -07001868 name, b.ModuleName()))
Jiyong Parkf2976302019-04-17 21:47:37 +09001869 } else {
1870 return nil, nil
1871 }
1872}
1873
Colin Crossdc35e212019-06-06 16:13:11 -07001874func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module {
Colin Cross0ef08162019-05-01 15:50:51 -07001875 var deps []Module
Colin Crossdc35e212019-06-06 16:13:11 -07001876 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001877 if aModule, _ := module.(Module); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001878 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Cross0ef08162019-05-01 15:50:51 -07001879 deps = append(deps, aModule)
1880 }
1881 }
1882 })
1883 return deps
1884}
1885
Colin Cross25de6c32019-06-06 14:29:25 -07001886func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1887 module, _ := m.getDirectDepInternal(name, tag)
1888 return module
Jiyong Parkf2976302019-04-17 21:47:37 +09001889}
1890
Colin Crossdc35e212019-06-06 16:13:11 -07001891func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
1892 return b.getDirectDepInternal(name, nil)
Jiyong Parkf2976302019-04-17 21:47:37 +09001893}
1894
Colin Crossdc35e212019-06-06 16:13:11 -07001895func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001896 b.bp.VisitDirectDeps(visit)
Colin Cross35143d02017-11-16 00:11:20 -08001897}
1898
Colin Crossdc35e212019-06-06 16:13:11 -07001899func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001900 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001901 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001902 visit(aModule)
1903 }
1904 })
1905}
1906
Colin Crossdc35e212019-06-06 16:13:11 -07001907func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001908 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001909 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001910 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Crossee6143c2017-12-30 17:54:27 -08001911 visit(aModule)
1912 }
1913 }
1914 })
1915}
1916
Colin Crossdc35e212019-06-06 16:13:11 -07001917func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001918 b.bp.VisitDirectDepsIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07001919 // pred
1920 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001921 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001922 return pred(aModule)
1923 } else {
1924 return false
1925 }
1926 },
1927 // visit
1928 func(module blueprint.Module) {
1929 visit(module.(Module))
1930 })
1931}
1932
Colin Crossdc35e212019-06-06 16:13:11 -07001933func (b *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001934 b.bp.VisitDepsDepthFirst(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001935 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001936 visit(aModule)
1937 }
1938 })
1939}
1940
Colin Crossdc35e212019-06-06 16:13:11 -07001941func (b *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001942 b.bp.VisitDepsDepthFirstIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07001943 // pred
1944 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001945 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001946 return pred(aModule)
1947 } else {
1948 return false
1949 }
1950 },
1951 // visit
1952 func(module blueprint.Module) {
1953 visit(module.(Module))
1954 })
1955}
1956
Colin Crossdc35e212019-06-06 16:13:11 -07001957func (b *baseModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
Colin Cross1184b642019-12-30 18:43:07 -08001958 b.bp.WalkDeps(visit)
Alex Light778127a2019-02-27 14:19:50 -08001959}
1960
Colin Crossdc35e212019-06-06 16:13:11 -07001961func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
1962 b.walkPath = []Module{b.Module()}
Paul Duffinc5192442020-03-31 11:31:36 +01001963 b.tagPath = []blueprint.DependencyTag{}
Colin Cross1184b642019-12-30 18:43:07 -08001964 b.bp.WalkDeps(func(child, parent blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07001965 childAndroidModule, _ := child.(Module)
1966 parentAndroidModule, _ := parent.(Module)
Colin Crossd11fcda2017-10-23 17:59:01 -07001967 if childAndroidModule != nil && parentAndroidModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001968 // record walkPath before visit
1969 for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
1970 b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
Paul Duffinc5192442020-03-31 11:31:36 +01001971 b.tagPath = b.tagPath[0 : len(b.tagPath)-1]
Colin Crossdc35e212019-06-06 16:13:11 -07001972 }
1973 b.walkPath = append(b.walkPath, childAndroidModule)
Paul Duffinc5192442020-03-31 11:31:36 +01001974 b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule))
Colin Crossd11fcda2017-10-23 17:59:01 -07001975 return visit(childAndroidModule, parentAndroidModule)
1976 } else {
1977 return false
1978 }
1979 })
1980}
1981
Colin Crossdc35e212019-06-06 16:13:11 -07001982func (b *baseModuleContext) GetWalkPath() []Module {
1983 return b.walkPath
1984}
1985
Paul Duffinc5192442020-03-31 11:31:36 +01001986func (b *baseModuleContext) GetTagPath() []blueprint.DependencyTag {
1987 return b.tagPath
1988}
1989
Jiyong Park1c7e9622020-05-07 16:12:13 +09001990// A regexp for removing boilerplate from BaseDependencyTag from the string representation of
1991// a dependency tag.
Colin Cross6e511a92020-07-27 21:26:48 -07001992var tagCleaner = regexp.MustCompile(`\QBaseDependencyTag:{}\E(, )?`)
Jiyong Park1c7e9622020-05-07 16:12:13 +09001993
1994// PrettyPrintTag returns string representation of the tag, but prefers
1995// custom String() method if available.
1996func PrettyPrintTag(tag blueprint.DependencyTag) string {
1997 // Use tag's custom String() method if available.
1998 if stringer, ok := tag.(fmt.Stringer); ok {
1999 return stringer.String()
2000 }
2001
2002 // Otherwise, get a default string representation of the tag's struct.
Colin Cross6e511a92020-07-27 21:26:48 -07002003 tagString := fmt.Sprintf("%T: %+v", tag, tag)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002004
2005 // Remove the boilerplate from BaseDependencyTag as it adds no value.
2006 tagString = tagCleaner.ReplaceAllString(tagString, "")
2007 return tagString
2008}
2009
2010func (b *baseModuleContext) GetPathString(skipFirst bool) string {
2011 sb := strings.Builder{}
2012 tagPath := b.GetTagPath()
2013 walkPath := b.GetWalkPath()
2014 if !skipFirst {
2015 sb.WriteString(walkPath[0].String())
2016 }
2017 for i, m := range walkPath[1:] {
2018 sb.WriteString("\n")
2019 sb.WriteString(fmt.Sprintf(" via tag %s\n", PrettyPrintTag(tagPath[i])))
2020 sb.WriteString(fmt.Sprintf(" -> %s", m.String()))
2021 }
2022 return sb.String()
2023}
2024
Colin Cross25de6c32019-06-06 14:29:25 -07002025func (m *moduleContext) VisitAllModuleVariants(visit func(Module)) {
Colin Crossdc35e212019-06-06 16:13:11 -07002026 m.bp.VisitAllModuleVariants(func(module blueprint.Module) {
Colin Cross0875c522017-11-28 17:34:01 -08002027 visit(module.(Module))
2028 })
2029}
2030
Colin Cross25de6c32019-06-06 14:29:25 -07002031func (m *moduleContext) PrimaryModule() Module {
Colin Crossdc35e212019-06-06 16:13:11 -07002032 return m.bp.PrimaryModule().(Module)
Colin Cross0875c522017-11-28 17:34:01 -08002033}
2034
Colin Cross25de6c32019-06-06 14:29:25 -07002035func (m *moduleContext) FinalModule() Module {
Colin Crossdc35e212019-06-06 16:13:11 -07002036 return m.bp.FinalModule().(Module)
2037}
2038
2039func (m *moduleContext) ModuleSubDir() string {
2040 return m.bp.ModuleSubDir()
Colin Cross0875c522017-11-28 17:34:01 -08002041}
2042
Colin Cross0ea8ba82019-06-06 14:33:29 -07002043func (b *baseModuleContext) Target() Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002044 return b.target
Colin Crossa1ad8d12016-06-01 17:09:44 -07002045}
2046
Colin Cross0ea8ba82019-06-06 14:33:29 -07002047func (b *baseModuleContext) TargetPrimary() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002048 return b.targetPrimary
Colin Cross8b74d172016-09-13 09:59:14 -07002049}
2050
Colin Cross0ea8ba82019-06-06 14:33:29 -07002051func (b *baseModuleContext) MultiTargets() []Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002052 return b.multiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07002053}
2054
Colin Cross0ea8ba82019-06-06 14:33:29 -07002055func (b *baseModuleContext) Arch() Arch {
Colin Cross25de6c32019-06-06 14:29:25 -07002056 return b.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08002057}
2058
Colin Cross0ea8ba82019-06-06 14:33:29 -07002059func (b *baseModuleContext) Os() OsType {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002060 return b.os
Dan Willemsen490fd492015-11-24 17:53:15 -08002061}
2062
Colin Cross0ea8ba82019-06-06 14:33:29 -07002063func (b *baseModuleContext) Host() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002064 return b.os.Class == Host || b.os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -07002065}
2066
Colin Cross0ea8ba82019-06-06 14:33:29 -07002067func (b *baseModuleContext) Device() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002068 return b.os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07002069}
2070
Colin Cross0ea8ba82019-06-06 14:33:29 -07002071func (b *baseModuleContext) Darwin() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002072 return b.os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07002073}
2074
Colin Cross0ea8ba82019-06-06 14:33:29 -07002075func (b *baseModuleContext) Fuchsia() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002076 return b.os == Fuchsia
Doug Horn21b94272019-01-16 12:06:11 -08002077}
2078
Colin Cross0ea8ba82019-06-06 14:33:29 -07002079func (b *baseModuleContext) Windows() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002080 return b.os == Windows
Colin Cross3edeee12017-04-04 12:59:48 -07002081}
2082
Colin Cross0ea8ba82019-06-06 14:33:29 -07002083func (b *baseModuleContext) Debug() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002084 return b.debug
Colin Crossf6566ed2015-03-24 11:13:38 -07002085}
2086
Colin Cross0ea8ba82019-06-06 14:33:29 -07002087func (b *baseModuleContext) PrimaryArch() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002088 if len(b.config.Targets[b.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07002089 return true
2090 }
Colin Cross25de6c32019-06-06 14:29:25 -07002091 return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07002092}
2093
Jiyong Park5baac542018-08-28 09:55:37 +09002094// Makes this module a platform module, i.e. not specific to soc, device,
Justin Yund5f6c822019-06-25 16:47:17 +09002095// product, or system_ext.
Colin Cross4157e882019-06-06 16:57:04 -07002096func (m *ModuleBase) MakeAsPlatform() {
2097 m.commonProperties.Vendor = boolPtr(false)
2098 m.commonProperties.Proprietary = boolPtr(false)
2099 m.commonProperties.Soc_specific = boolPtr(false)
2100 m.commonProperties.Product_specific = boolPtr(false)
Justin Yund5f6c822019-06-25 16:47:17 +09002101 m.commonProperties.System_ext_specific = boolPtr(false)
Jiyong Park5baac542018-08-28 09:55:37 +09002102}
2103
Colin Cross4157e882019-06-06 16:57:04 -07002104func (m *ModuleBase) EnableNativeBridgeSupportByDefault() {
2105 m.commonProperties.Native_bridge_supported = boolPtr(true)
dimitry03dc3f62019-05-09 14:07:34 +02002106}
2107
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002108func (m *ModuleBase) MakeAsSystemExt() {
Jooyung Han91df2082019-11-20 01:49:42 +09002109 m.commonProperties.Vendor = boolPtr(false)
2110 m.commonProperties.Proprietary = boolPtr(false)
2111 m.commonProperties.Soc_specific = boolPtr(false)
2112 m.commonProperties.Product_specific = boolPtr(false)
2113 m.commonProperties.System_ext_specific = boolPtr(true)
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002114}
2115
Jooyung Han344d5432019-08-23 11:17:39 +09002116// IsNativeBridgeSupported returns true if "native_bridge_supported" is explicitly set as "true"
2117func (m *ModuleBase) IsNativeBridgeSupported() bool {
2118 return proptools.Bool(m.commonProperties.Native_bridge_supported)
2119}
2120
Colin Cross25de6c32019-06-06 14:29:25 -07002121func (m *moduleContext) InstallInData() bool {
2122 return m.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08002123}
2124
Jaewoong Jung0949f312019-09-11 10:25:18 -07002125func (m *moduleContext) InstallInTestcases() bool {
2126 return m.module.InstallInTestcases()
2127}
2128
Colin Cross25de6c32019-06-06 14:29:25 -07002129func (m *moduleContext) InstallInSanitizerDir() bool {
2130 return m.module.InstallInSanitizerDir()
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002131}
2132
Yifan Hong1b3348d2020-01-21 15:53:22 -08002133func (m *moduleContext) InstallInRamdisk() bool {
2134 return m.module.InstallInRamdisk()
2135}
2136
Colin Cross25de6c32019-06-06 14:29:25 -07002137func (m *moduleContext) InstallInRecovery() bool {
2138 return m.module.InstallInRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002139}
2140
Colin Cross90ba5f42019-10-02 11:10:58 -07002141func (m *moduleContext) InstallInRoot() bool {
2142 return m.module.InstallInRoot()
2143}
2144
Colin Cross607d8582019-07-29 16:44:46 -07002145func (m *moduleContext) InstallBypassMake() bool {
2146 return m.module.InstallBypassMake()
2147}
2148
Jiyong Park87788b52020-09-01 12:37:45 +09002149func (m *moduleContext) InstallForceOS() (*OsType, *ArchType) {
Colin Cross6e359402020-02-10 15:29:54 -08002150 return m.module.InstallForceOS()
2151}
2152
Colin Cross70dda7e2019-10-01 22:05:35 -07002153func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002154 if m.module.base().commonProperties.SkipInstall {
Colin Cross893d8162017-04-26 17:34:03 -07002155 return true
2156 }
2157
Colin Cross3607f212018-05-07 15:28:05 -07002158 // We'll need a solution for choosing which of modules with the same name in different
2159 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
2160 // list of namespaces to install in a Soong-only build.
Colin Cross25de6c32019-06-06 14:29:25 -07002161 if !m.module.base().commonProperties.NamespaceExportedToMake {
Colin Cross3607f212018-05-07 15:28:05 -07002162 return true
2163 }
2164
Colin Cross25de6c32019-06-06 14:29:25 -07002165 if m.Device() {
Colin Cross607d8582019-07-29 16:44:46 -07002166 if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
Colin Cross893d8162017-04-26 17:34:03 -07002167 return true
2168 }
2169
Colin Cross25de6c32019-06-06 14:29:25 -07002170 if m.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07002171 return true
2172 }
2173 }
2174
2175 return false
2176}
2177
Colin Cross70dda7e2019-10-01 22:05:35 -07002178func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
2179 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002180 return m.installFile(installPath, name, srcPath, Cp, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002181}
2182
Colin Cross70dda7e2019-10-01 22:05:35 -07002183func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
2184 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002185 return m.installFile(installPath, name, srcPath, CpExecutable, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002186}
2187
Colin Cross70dda7e2019-10-01 22:05:35 -07002188func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
2189 rule blueprint.Rule, deps []Path) InstallPath {
Colin Cross35cec122015-04-02 14:37:16 -07002190
Colin Cross25de6c32019-06-06 14:29:25 -07002191 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002192 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08002193
Colin Cross25de6c32019-06-06 14:29:25 -07002194 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002195
Colin Cross897266e2020-02-13 13:22:08 -08002196 deps = append(deps, m.installDeps.Paths()...)
Colin Cross35cec122015-04-02 14:37:16 -07002197
Colin Cross89562dc2016-10-03 17:47:19 -07002198 var implicitDeps, orderOnlyDeps Paths
2199
Colin Cross25de6c32019-06-06 14:29:25 -07002200 if m.Host() {
Colin Cross89562dc2016-10-03 17:47:19 -07002201 // Installed host modules might be used during the build, depend directly on their
2202 // dependencies so their timestamp is updated whenever their dependency is updated
2203 implicitDeps = deps
2204 } else {
2205 orderOnlyDeps = deps
2206 }
2207
Colin Cross25de6c32019-06-06 14:29:25 -07002208 m.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07002209 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07002210 Description: "install " + fullInstallPath.Base(),
2211 Output: fullInstallPath,
2212 Input: srcPath,
2213 Implicits: implicitDeps,
2214 OrderOnly: orderOnlyDeps,
Colin Cross25de6c32019-06-06 14:29:25 -07002215 Default: !m.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08002216 })
Colin Cross3f40fa42015-01-30 17:27:36 -08002217
Colin Cross25de6c32019-06-06 14:29:25 -07002218 m.installFiles = append(m.installFiles, fullInstallPath)
Dan Willemsen322acaf2016-01-12 23:07:05 -08002219 }
Colin Cross25de6c32019-06-06 14:29:25 -07002220 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07002221 return fullInstallPath
2222}
2223
Colin Cross70dda7e2019-10-01 22:05:35 -07002224func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002225 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002226 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08002227
Colin Cross25de6c32019-06-06 14:29:25 -07002228 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002229
Alex Lightfb4353d2019-01-17 13:57:45 -08002230 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
2231 if err != nil {
2232 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
2233 }
Colin Cross25de6c32019-06-06 14:29:25 -07002234 m.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07002235 Rule: Symlink,
2236 Description: "install symlink " + fullInstallPath.Base(),
2237 Output: fullInstallPath,
Dan Willemsen40efa1c2020-01-14 15:19:52 -08002238 Input: srcPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002239 Default: !m.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08002240 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08002241 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08002242 },
2243 })
Colin Cross3854a602016-01-11 12:49:11 -08002244
Colin Cross25de6c32019-06-06 14:29:25 -07002245 m.installFiles = append(m.installFiles, fullInstallPath)
2246 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross12fc4972016-01-11 12:49:11 -08002247 }
Colin Cross3854a602016-01-11 12:49:11 -08002248 return fullInstallPath
2249}
2250
Jiyong Parkf1194352019-02-25 11:05:47 +09002251// installPath/name -> absPath where absPath might be a path that is available only at runtime
2252// (e.g. /apex/...)
Colin Cross70dda7e2019-10-01 22:05:35 -07002253func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002254 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002255 m.module.base().hooks.runInstallHooks(m, nil, fullInstallPath, true)
Jiyong Parkf1194352019-02-25 11:05:47 +09002256
Colin Cross25de6c32019-06-06 14:29:25 -07002257 if !m.skipInstall(fullInstallPath) {
2258 m.Build(pctx, BuildParams{
Jiyong Parkf1194352019-02-25 11:05:47 +09002259 Rule: Symlink,
2260 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
2261 Output: fullInstallPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002262 Default: !m.Config().EmbeddedInMake(),
Jiyong Parkf1194352019-02-25 11:05:47 +09002263 Args: map[string]string{
2264 "fromPath": absPath,
2265 },
2266 })
2267
Colin Cross25de6c32019-06-06 14:29:25 -07002268 m.installFiles = append(m.installFiles, fullInstallPath)
Jiyong Parkf1194352019-02-25 11:05:47 +09002269 }
2270 return fullInstallPath
2271}
2272
Colin Cross25de6c32019-06-06 14:29:25 -07002273func (m *moduleContext) CheckbuildFile(srcPath Path) {
2274 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross3f40fa42015-01-30 17:27:36 -08002275}
2276
Colin Cross41955e82019-05-29 14:40:35 -07002277// SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input
2278// was not a module reference.
2279func SrcIsModule(s string) (module string) {
Colin Cross068e0fe2016-12-13 15:23:47 -08002280 if len(s) > 1 && s[0] == ':' {
2281 return s[1:]
2282 }
2283 return ""
2284}
2285
Colin Cross41955e82019-05-29 14:40:35 -07002286// SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the
2287// module name and an empty string for the tag, or empty strings if the input was not a module reference.
2288func SrcIsModuleWithTag(s string) (module, tag string) {
2289 if len(s) > 1 && s[0] == ':' {
2290 module = s[1:]
2291 if tagStart := strings.IndexByte(module, '{'); tagStart > 0 {
2292 if module[len(module)-1] == '}' {
2293 tag = module[tagStart+1 : len(module)-1]
2294 module = module[:tagStart]
2295 return module, tag
2296 }
2297 }
2298 return module, ""
2299 }
2300 return "", ""
Colin Cross068e0fe2016-12-13 15:23:47 -08002301}
2302
Colin Cross41955e82019-05-29 14:40:35 -07002303type sourceOrOutputDependencyTag struct {
2304 blueprint.BaseDependencyTag
2305 tag string
2306}
2307
2308func sourceOrOutputDepTag(tag string) blueprint.DependencyTag {
2309 return sourceOrOutputDependencyTag{tag: tag}
2310}
2311
2312var SourceDepTag = sourceOrOutputDepTag("")
Colin Cross068e0fe2016-12-13 15:23:47 -08002313
Colin Cross366938f2017-12-11 16:29:02 -08002314// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
2315// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002316//
2317// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08002318func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
Nan Zhang2439eb72017-04-10 11:27:50 -07002319 set := make(map[string]bool)
2320
Colin Cross068e0fe2016-12-13 15:23:47 -08002321 for _, s := range srcFiles {
Colin Cross41955e82019-05-29 14:40:35 -07002322 if m, t := SrcIsModuleWithTag(s); m != "" {
2323 if _, found := set[s]; found {
2324 ctx.ModuleErrorf("found source dependency duplicate: %q!", s)
Nan Zhang2439eb72017-04-10 11:27:50 -07002325 } else {
Colin Cross41955e82019-05-29 14:40:35 -07002326 set[s] = true
2327 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Nan Zhang2439eb72017-04-10 11:27:50 -07002328 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002329 }
2330 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002331}
2332
Colin Cross366938f2017-12-11 16:29:02 -08002333// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
2334// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002335//
2336// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08002337func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
2338 if s != nil {
Colin Cross41955e82019-05-29 14:40:35 -07002339 if m, t := SrcIsModuleWithTag(*s); m != "" {
2340 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Colin Cross366938f2017-12-11 16:29:02 -08002341 }
2342 }
2343}
2344
Colin Cross41955e82019-05-29 14:40:35 -07002345// A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"`
2346// 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 -08002347type SourceFileProducer interface {
2348 Srcs() Paths
2349}
2350
Colin Cross41955e82019-05-29 14:40:35 -07002351// A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"`
Roland Levillain97c1f342019-11-22 14:20:54 +00002352// 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 -07002353// listed in the property.
2354type OutputFileProducer interface {
2355 OutputFiles(tag string) (Paths, error)
2356}
2357
Colin Cross5e708052019-08-06 13:59:50 -07002358// OutputFilesForModule returns the paths from an OutputFileProducer with the given tag. On error, including if the
2359// module produced zero paths, it reports errors to the ctx and returns nil.
2360func OutputFilesForModule(ctx PathContext, module blueprint.Module, tag string) Paths {
2361 paths, err := outputFilesForModule(ctx, module, tag)
2362 if err != nil {
2363 reportPathError(ctx, err)
2364 return nil
2365 }
2366 return paths
2367}
2368
2369// OutputFileForModule returns the path from an OutputFileProducer with the given tag. On error, including if the
2370// module produced zero or multiple paths, it reports errors to the ctx and returns nil.
2371func OutputFileForModule(ctx PathContext, module blueprint.Module, tag string) Path {
2372 paths, err := outputFilesForModule(ctx, module, tag)
2373 if err != nil {
2374 reportPathError(ctx, err)
2375 return nil
2376 }
2377 if len(paths) > 1 {
Ulya Trafimovich5ab276a2020-08-25 12:45:15 +01002378 ReportPathErrorf(ctx, "got multiple output files from module %q, expected exactly one",
Colin Cross5e708052019-08-06 13:59:50 -07002379 pathContextName(ctx, module))
2380 return nil
2381 }
2382 return paths[0]
2383}
2384
2385func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
2386 if outputFileProducer, ok := module.(OutputFileProducer); ok {
2387 paths, err := outputFileProducer.OutputFiles(tag)
2388 if err != nil {
2389 return nil, fmt.Errorf("failed to get output file from module %q: %s",
2390 pathContextName(ctx, module), err.Error())
2391 }
2392 if len(paths) == 0 {
2393 return nil, fmt.Errorf("failed to get output files from module %q", pathContextName(ctx, module))
2394 }
2395 return paths, nil
2396 } else {
2397 return nil, fmt.Errorf("module %q is not an OutputFileProducer", pathContextName(ctx, module))
2398 }
2399}
2400
Colin Crossfe17f6f2019-03-28 19:30:56 -07002401type HostToolProvider interface {
2402 HostToolPath() OptionalPath
2403}
2404
Colin Cross27b922f2019-03-04 22:35:41 -08002405// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
2406// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002407//
2408// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002409func (m *moduleContext) ExpandSources(srcFiles, excludes []string) Paths {
2410 return PathsForModuleSrcExcludes(m, srcFiles, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07002411}
2412
Colin Cross2fafa3e2019-03-05 12:39:51 -08002413// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
2414// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002415//
2416// Deprecated: use PathForModuleSrc instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002417func (m *moduleContext) ExpandSource(srcFile, prop string) Path {
2418 return PathForModuleSrc(m, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08002419}
2420
2421// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
2422// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
2423// dependency resolution.
Colin Cross25de6c32019-06-06 14:29:25 -07002424func (m *moduleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
Colin Cross2fafa3e2019-03-05 12:39:51 -08002425 if srcFile != nil {
Colin Cross25de6c32019-06-06 14:29:25 -07002426 return OptionalPathForPath(PathForModuleSrc(m, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08002427 }
2428 return OptionalPath{}
2429}
2430
Colin Cross25de6c32019-06-06 14:29:25 -07002431func (m *moduleContext) RequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002432 return m.module.RequiredModuleNames()
Nan Zhang6d34b302017-02-04 17:47:46 -08002433}
2434
Colin Cross25de6c32019-06-06 14:29:25 -07002435func (m *moduleContext) HostRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002436 return m.module.HostRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002437}
2438
Colin Cross25de6c32019-06-06 14:29:25 -07002439func (m *moduleContext) TargetRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002440 return m.module.TargetRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002441}
2442
Colin Cross463a90e2015-06-17 14:20:06 -07002443func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07002444 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07002445}
2446
Colin Cross0875c522017-11-28 17:34:01 -08002447func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07002448 return &buildTargetSingleton{}
2449}
2450
Colin Cross87d8b562017-04-25 10:01:55 -07002451func parentDir(dir string) string {
2452 dir, _ = filepath.Split(dir)
2453 return filepath.Clean(dir)
2454}
2455
Colin Cross1f8c52b2015-06-16 16:38:17 -07002456type buildTargetSingleton struct{}
2457
Colin Cross0875c522017-11-28 17:34:01 -08002458func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
2459 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07002460
Colin Crossc3d87d32020-06-04 13:25:17 -07002461 mmTarget := func(dir string) string {
2462 return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1)
Colin Cross87d8b562017-04-25 10:01:55 -07002463 }
2464
Colin Cross0875c522017-11-28 17:34:01 -08002465 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002466
Colin Cross0875c522017-11-28 17:34:01 -08002467 ctx.VisitAllModules(func(module Module) {
2468 blueprintDir := module.base().blueprintDir
2469 installTarget := module.base().installTarget
2470 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07002471
Colin Cross0875c522017-11-28 17:34:01 -08002472 if checkbuildTarget != nil {
2473 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
2474 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
2475 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002476
Colin Cross0875c522017-11-28 17:34:01 -08002477 if installTarget != nil {
2478 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002479 }
2480 })
2481
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002482 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08002483 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002484 suffix = "-soong"
2485 }
2486
Colin Cross1f8c52b2015-06-16 16:38:17 -07002487 // Create a top-level checkbuild target that depends on all modules
Colin Crossc3d87d32020-06-04 13:25:17 -07002488 ctx.Phony("checkbuild"+suffix, checkbuildDeps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002489
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002490 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08002491 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002492 return
2493 }
2494
Colin Cross87d8b562017-04-25 10:01:55 -07002495 // Ensure ancestor directories are in modulesInDir
Inseob Kim1a365c62019-06-08 15:47:51 +09002496 dirs := SortedStringKeys(modulesInDir)
Colin Cross87d8b562017-04-25 10:01:55 -07002497 for _, dir := range dirs {
2498 dir := parentDir(dir)
2499 for dir != "." && dir != "/" {
2500 if _, exists := modulesInDir[dir]; exists {
2501 break
2502 }
2503 modulesInDir[dir] = nil
2504 dir = parentDir(dir)
2505 }
2506 }
2507
2508 // Make directories build their direct subdirectories
Colin Cross87d8b562017-04-25 10:01:55 -07002509 for _, dir := range dirs {
2510 p := parentDir(dir)
2511 if p != "." && p != "/" {
Colin Crossc3d87d32020-06-04 13:25:17 -07002512 modulesInDir[p] = append(modulesInDir[p], PathForPhony(ctx, mmTarget(dir)))
Colin Cross87d8b562017-04-25 10:01:55 -07002513 }
2514 }
2515
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002516 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
2517 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
2518 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07002519 for _, dir := range dirs {
Colin Crossc3d87d32020-06-04 13:25:17 -07002520 ctx.Phony(mmTarget(dir), modulesInDir[dir]...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002521 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002522
2523 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
2524 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08002525 ctx.VisitAllModules(func(module Module) {
2526 if module.Enabled() {
2527 os := module.Target().Os
2528 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002529 }
2530 })
2531
Colin Cross0875c522017-11-28 17:34:01 -08002532 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002533 for os, deps := range osDeps {
2534 var className string
2535
2536 switch os.Class {
2537 case Host:
2538 className = "host"
2539 case HostCross:
2540 className = "host-cross"
2541 case Device:
2542 className = "target"
2543 default:
2544 continue
2545 }
2546
Colin Crossc3d87d32020-06-04 13:25:17 -07002547 name := className + "-" + os.Name
2548 osClass[className] = append(osClass[className], PathForPhony(ctx, name))
Dan Willemsen61d88b82017-09-20 17:29:08 -07002549
Colin Crossc3d87d32020-06-04 13:25:17 -07002550 ctx.Phony(name, deps...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002551 }
2552
2553 // Wrap those into host|host-cross|target phony rules
Inseob Kim1a365c62019-06-08 15:47:51 +09002554 for _, class := range SortedStringKeys(osClass) {
Colin Crossc3d87d32020-06-04 13:25:17 -07002555 ctx.Phony(class, osClass[class]...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002556 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002557}
Colin Crossd779da42015-12-17 18:00:23 -08002558
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002559// Collect information for opening IDE project files in java/jdeps.go.
2560type IDEInfo interface {
2561 IDEInfo(ideInfo *IdeInfo)
2562 BaseModuleName() string
2563}
2564
2565// Extract the base module name from the Import name.
2566// Often the Import name has a prefix "prebuilt_".
2567// Remove the prefix explicitly if needed
2568// until we find a better solution to get the Import name.
2569type IDECustomizedModuleName interface {
2570 IDECustomizedModuleName() string
2571}
2572
2573type IdeInfo struct {
2574 Deps []string `json:"dependencies,omitempty"`
2575 Srcs []string `json:"srcs,omitempty"`
2576 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
2577 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
2578 Jars []string `json:"jars,omitempty"`
2579 Classes []string `json:"class,omitempty"`
2580 Installed_paths []string `json:"installed,omitempty"`
patricktu18c82ff2019-05-10 15:48:50 +08002581 SrcJars []string `json:"srcjars,omitempty"`
bralee1fbf4402020-05-21 10:11:59 +08002582 Paths []string `json:"path,omitempty"`
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002583}
Paul Duffinf88d8e02020-05-07 20:21:34 +01002584
2585func CheckBlueprintSyntax(ctx BaseModuleContext, filename string, contents string) []error {
2586 bpctx := ctx.blueprintBaseModuleContext()
2587 return blueprint.CheckBlueprintSyntax(bpctx.ModuleFactories(), filename, contents)
2588}