blob: 70a343e47018668f82dca3c6c96cb96d2f52290e [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
Jingwen Chence679d22020-09-23 04:30:02 +000046 SymlinkOutput WritablePath
47 SymlinkOutputs WritablePaths
Dan Willemsen9f3c5742016-11-03 14:28:31 -070048 ImplicitOutput WritablePath
49 ImplicitOutputs WritablePaths
50 Input Path
51 Inputs Paths
52 Implicit Path
53 Implicits Paths
54 OrderOnly Paths
Colin Cross824f1162020-07-16 13:07:51 -070055 Validation Path
56 Validations Paths
Dan Willemsen9f3c5742016-11-03 14:28:31 -070057 Default bool
58 Args map[string]string
Dan Willemsen34cc69e2015-09-23 15:26:20 -070059}
60
Colin Crossae887032017-10-23 17:16:14 -070061type ModuleBuildParams BuildParams
62
Colin Cross1184b642019-12-30 18:43:07 -080063// EarlyModuleContext provides methods that can be called early, as soon as the properties have
64// been parsed into the module and before any mutators have run.
65type EarlyModuleContext interface {
Colin Cross9f35c3d2020-09-16 19:04:41 -070066 // Module returns the current module as a Module. It should rarely be necessary, as the module already has a
67 // reference to itself.
Colin Cross1184b642019-12-30 18:43:07 -080068 Module() Module
Colin Cross9f35c3d2020-09-16 19:04:41 -070069
70 // ModuleName returns the name of the module. This is generally the value that was returned by Module.Name() when
71 // the module was created, but may have been modified by calls to BaseMutatorContext.Rename.
Colin Cross1184b642019-12-30 18:43:07 -080072 ModuleName() string
Colin Cross9f35c3d2020-09-16 19:04:41 -070073
74 // ModuleDir returns the path to the directory that contains the definition of the module.
Colin Cross1184b642019-12-30 18:43:07 -080075 ModuleDir() string
Colin Cross9f35c3d2020-09-16 19:04:41 -070076
77 // ModuleType returns the name of the module type that was used to create the module, as specified in
78 // RegisterModuleType.
Colin Cross1184b642019-12-30 18:43:07 -080079 ModuleType() string
Colin Cross9f35c3d2020-09-16 19:04:41 -070080
81 // BlueprintFile returns the name of the blueprint file that contains the definition of this
82 // module.
Colin Cross9d34f352019-11-22 16:03:51 -080083 BlueprintsFile() string
Colin Cross1184b642019-12-30 18:43:07 -080084
Colin Cross9f35c3d2020-09-16 19:04:41 -070085 // ContainsProperty returns true if the specified property name was set in the module definition.
Colin Cross1184b642019-12-30 18:43:07 -080086 ContainsProperty(name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -070087
88 // Errorf reports an error at the specified position of the module definition file.
Colin Cross1184b642019-12-30 18:43:07 -080089 Errorf(pos scanner.Position, fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -070090
91 // ModuleErrorf reports an error at the line number of the module type in the module definition.
Colin Cross1184b642019-12-30 18:43:07 -080092 ModuleErrorf(fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -070093
94 // PropertyErrorf reports an error at the line number of a property in the module definition.
Colin Cross1184b642019-12-30 18:43:07 -080095 PropertyErrorf(property, fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -070096
97 // Failed returns true if any errors have been reported. In most cases the module can continue with generating
98 // build rules after an error, allowing it to report additional errors in a single run, but in cases where the error
99 // has prevented the module from creating necessary data it can return early when Failed returns true.
Colin Cross1184b642019-12-30 18:43:07 -0800100 Failed() bool
101
Colin Cross9f35c3d2020-09-16 19:04:41 -0700102 // AddNinjaFileDeps adds dependencies on the specified files to the rule that creates the ninja manifest. The
103 // primary builder will be rerun whenever the specified files are modified.
Colin Cross1184b642019-12-30 18:43:07 -0800104 AddNinjaFileDeps(deps ...string)
105
106 DeviceSpecific() bool
107 SocSpecific() bool
108 ProductSpecific() bool
109 SystemExtSpecific() bool
110 Platform() bool
111
112 Config() Config
113 DeviceConfig() DeviceConfig
114
115 // Deprecated: use Config()
116 AConfig() Config
117
118 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
119 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
120 // builder whenever a file matching the pattern as added or removed, without rerunning if a
121 // file that does not match the pattern is added to a searched directory.
122 GlobWithDeps(pattern string, excludes []string) ([]string, error)
123
124 Glob(globPattern string, excludes []string) Paths
125 GlobFiles(globPattern string, excludes []string) Paths
Colin Cross988414c2020-01-11 01:11:46 +0000126 IsSymlink(path Path) bool
127 Readlink(path Path) string
Colin Cross133ebef2020-08-14 17:38:45 -0700128
Colin Cross9f35c3d2020-09-16 19:04:41 -0700129 // Namespace returns the Namespace object provided by the NameInterface set by Context.SetNameInterface, or the
130 // default SimpleNameInterface if Context.SetNameInterface was not called.
Colin Cross133ebef2020-08-14 17:38:45 -0700131 Namespace() *Namespace
Colin Cross1184b642019-12-30 18:43:07 -0800132}
133
Colin Cross0ea8ba82019-06-06 14:33:29 -0700134// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
Colin Crossdc35e212019-06-06 16:13:11 -0700135// a Config instead of an interface{}, and some methods have been wrapped to use an android.Module
136// instead of a blueprint.Module, plus some extra methods that return Android-specific information
Colin Cross0ea8ba82019-06-06 14:33:29 -0700137// about the current module.
138type BaseModuleContext interface {
Colin Cross1184b642019-12-30 18:43:07 -0800139 EarlyModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -0700140
Paul Duffinf88d8e02020-05-07 20:21:34 +0100141 blueprintBaseModuleContext() blueprint.BaseModuleContext
142
Colin Cross9f35c3d2020-09-16 19:04:41 -0700143 // OtherModuleName returns the name of another Module. See BaseModuleContext.ModuleName for more information.
144 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Colin Crossdc35e212019-06-06 16:13:11 -0700145 OtherModuleName(m blueprint.Module) string
Colin Cross9f35c3d2020-09-16 19:04:41 -0700146
147 // OtherModuleDir returns the directory of another Module. See BaseModuleContext.ModuleDir for more information.
148 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Colin Crossdc35e212019-06-06 16:13:11 -0700149 OtherModuleDir(m blueprint.Module) string
Colin Cross9f35c3d2020-09-16 19:04:41 -0700150
151 // OtherModuleErrorf reports an error on another Module. See BaseModuleContext.ModuleErrorf for more information.
152 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Colin Crossdc35e212019-06-06 16:13:11 -0700153 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
Colin Cross9f35c3d2020-09-16 19:04:41 -0700154
155 // OtherModuleDependencyTag returns the dependency tag used to depend on a module, or nil if there is no dependency
156 // on the module. When called inside a Visit* method with current module being visited, and there are multiple
157 // dependencies on the module being visited, it returns the dependency tag used for the current dependency.
Colin Crossdc35e212019-06-06 16:13:11 -0700158 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
Colin Cross9f35c3d2020-09-16 19:04:41 -0700159
160 // OtherModuleExists returns true if a module with the specified name exists, as determined by the NameInterface
161 // passed to Context.SetNameInterface, or SimpleNameInterface if it was not called.
Colin Crossdc35e212019-06-06 16:13:11 -0700162 OtherModuleExists(name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -0700163
164 // OtherModuleDependencyVariantExists returns true if a module with the
165 // specified name and variant exists. The variant must match the given
166 // variations. It must also match all the non-local variations of the current
167 // module. In other words, it checks for the module AddVariationDependencies
168 // would add a dependency on with the same arguments.
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000169 OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -0700170
171 // OtherModuleReverseDependencyVariantExists returns true if a module with the
172 // specified name exists with the same variations as the current module. In
173 // other words, it checks for the module AddReverseDependency would add a
174 // dependency on with the same argument.
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000175 OtherModuleReverseDependencyVariantExists(name string) bool
Colin Cross9f35c3d2020-09-16 19:04:41 -0700176
177 // OtherModuleType returns the type of another Module. See BaseModuleContext.ModuleType for more information.
178 // It is intended for use inside the visit functions of Visit* and WalkDeps.
Jiyong Park9e6c2422019-08-09 20:39:45 +0900179 OtherModuleType(m blueprint.Module) string
Colin Crossdc35e212019-06-06 16:13:11 -0700180
Colin Crossd27e7b82020-07-02 11:38:17 -0700181 // OtherModuleProvider returns the value for a provider for the given module. If the value is
182 // not set it returns the zero value of the type of the provider, so the return value can always
183 // be type asserted to the type of the provider. The value returned may be a deep copy of the
184 // value originally passed to SetProvider.
185 OtherModuleProvider(m blueprint.Module, provider blueprint.ProviderKey) interface{}
186
187 // OtherModuleHasProvider returns true if the provider for the given module has been set.
188 OtherModuleHasProvider(m blueprint.Module, provider blueprint.ProviderKey) bool
189
190 // Provider returns the value for a provider for the current module. If the value is
191 // not set it returns the zero value of the type of the provider, so the return value can always
192 // be type asserted to the type of the provider. It panics if called before the appropriate
193 // mutator or GenerateBuildActions pass for the provider. The value returned may be a deep
194 // copy of the value originally passed to SetProvider.
195 Provider(provider blueprint.ProviderKey) interface{}
196
197 // HasProvider returns true if the provider for the current module has been set.
198 HasProvider(provider blueprint.ProviderKey) bool
199
200 // SetProvider sets the value for a provider for the current module. It panics if not called
201 // during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
202 // is not of the appropriate type, or if the value has already been set. The value should not
203 // be modified after being passed to SetProvider.
204 SetProvider(provider blueprint.ProviderKey, value interface{})
205
Colin Crossdc35e212019-06-06 16:13:11 -0700206 GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module
Colin Cross9f35c3d2020-09-16 19:04:41 -0700207
208 // GetDirectDepWithTag returns the Module the direct dependency with the specified name, or nil if
209 // none exists. It panics if the dependency does not have the specified tag. It skips any
210 // dependencies that are not an android.Module.
Colin Crossdc35e212019-06-06 16:13:11 -0700211 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
Colin Cross9f35c3d2020-09-16 19:04:41 -0700212
213 // GetDirectDep returns the Module and DependencyTag for the direct dependency with the specified
214 // name, or nil if none exists. If there are multiple dependencies on the same module it returns
215 // the first DependencyTag. It skips any dependencies that are not an android.Module.
Colin Crossdc35e212019-06-06 16:13:11 -0700216 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
217
Colin Cross9f35c3d2020-09-16 19:04:41 -0700218 // VisitDirectDepsBlueprint calls visit for each direct dependency. If there are multiple
219 // direct dependencies on the same module visit will be called multiple times on that module
220 // and OtherModuleDependencyTag will return a different tag for each.
221 //
222 // The Module passed to the visit function should not be retained outside of the visit
223 // function, it may be invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700224 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700225
226 // VisitDirectDeps calls visit for each direct dependency. If there are multiple
227 // direct dependencies on the same module visit will be called multiple times on that module
228 // and OtherModuleDependencyTag will return a different tag for each. It skips any
229 // dependencies that are not an android.Module.
230 //
231 // The Module passed to the visit function should not be retained outside of the visit
232 // function, it may be invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700233 VisitDirectDeps(visit func(Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700234
Colin Crossdc35e212019-06-06 16:13:11 -0700235 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700236
237 // VisitDirectDepsIf calls pred for each direct dependency, and if pred returns true calls visit. If there are
238 // multiple direct dependencies on the same module pred and visit will be called multiple times on that module and
239 // OtherModuleDependencyTag will return a different tag for each. It skips any
240 // dependencies that are not an android.Module.
241 //
242 // The Module passed to the visit function should not be retained outside of the visit function, it may be
243 // invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700244 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
245 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
246 VisitDepsDepthFirst(visit func(Module))
247 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
248 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
Colin Cross9f35c3d2020-09-16 19:04:41 -0700249
250 // WalkDeps calls visit for each transitive dependency, traversing the dependency tree in top down order. visit may
251 // be called multiple times for the same (child, parent) pair if there are multiple direct dependencies between the
252 // child and parent with different tags. OtherModuleDependencyTag will return the tag for the currently visited
253 // (child, parent) pair. If visit returns false WalkDeps will not continue recursing down to child. It skips
254 // any dependencies that are not an android.Module.
255 //
256 // The Modules passed to the visit function should not be retained outside of the visit function, they may be
257 // invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700258 WalkDeps(visit func(Module, Module) bool)
Colin Cross9f35c3d2020-09-16 19:04:41 -0700259
260 // WalkDepsBlueprint calls visit for each transitive dependency, traversing the dependency
261 // tree in top down order. visit may be called multiple times for the same (child, parent)
262 // pair if there are multiple direct dependencies between the child and parent with different
263 // tags. OtherModuleDependencyTag will return the tag for the currently visited
264 // (child, parent) pair. If visit returns false WalkDeps will not continue recursing down
265 // to child.
266 //
267 // The Modules passed to the visit function should not be retained outside of the visit function, they may be
268 // invalidated by future mutators.
Colin Crossdc35e212019-06-06 16:13:11 -0700269 WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool)
Colin Cross9f35c3d2020-09-16 19:04:41 -0700270
Colin Crossdc35e212019-06-06 16:13:11 -0700271 // GetWalkPath is supposed to be called in visit function passed in WalkDeps()
272 // and returns a top-down dependency path from a start module to current child module.
273 GetWalkPath() []Module
274
Colin Cross4dfacf92020-09-16 19:22:27 -0700275 // PrimaryModule returns the first variant of the current module. Variants of a module are always visited in
276 // order by mutators and GenerateBuildActions, so the data created by the current mutator can be read from the
277 // Module returned by PrimaryModule without data races. This can be used to perform singleton actions that are
278 // only done once for all variants of a module.
279 PrimaryModule() Module
280
281 // FinalModule returns the last variant of the current module. Variants of a module are always visited in
282 // order by mutators and GenerateBuildActions, so the data created by the current mutator can be read from all
283 // variants using VisitAllModuleVariants if the current module == FinalModule(). This can be used to perform
284 // singleton actions that are only done once for all variants of a module.
285 FinalModule() Module
286
287 // VisitAllModuleVariants calls visit for each variant of the current module. Variants of a module are always
288 // visited in order by mutators and GenerateBuildActions, so the data created by the current mutator can be read
289 // from all variants if the current module == FinalModule(). Otherwise, care must be taken to not access any
290 // data modified by the current mutator.
291 VisitAllModuleVariants(visit func(Module))
292
Paul Duffinc5192442020-03-31 11:31:36 +0100293 // GetTagPath is supposed to be called in visit function passed in WalkDeps()
294 // and returns a top-down dependency tags path from a start module to current child module.
295 // It has one less entry than GetWalkPath() as it contains the dependency tags that
296 // exist between each adjacent pair of modules in the GetWalkPath().
297 // GetTagPath()[i] is the tag between GetWalkPath()[i] and GetWalkPath()[i+1]
298 GetTagPath() []blueprint.DependencyTag
299
Jiyong Park1c7e9622020-05-07 16:12:13 +0900300 // GetPathString is supposed to be called in visit function passed in WalkDeps()
301 // and returns a multi-line string showing the modules and dependency tags
302 // among them along the top-down dependency path from a start module to current child module.
303 // skipFirst when set to true, the output doesn't include the start module,
304 // which is already printed when this function is used along with ModuleErrorf().
305 GetPathString(skipFirst bool) string
306
Colin Crossdc35e212019-06-06 16:13:11 -0700307 AddMissingDependencies(missingDeps []string)
308
Colin Crossa1ad8d12016-06-01 17:09:44 -0700309 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -0700310 TargetPrimary() bool
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000311
312 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
313 // responsible for creating.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700314 MultiTargets() []Target
Colin Crossf6566ed2015-03-24 11:13:38 -0700315 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -0700316 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -0700317 Host() bool
318 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -0700319 Darwin() bool
Doug Horn21b94272019-01-16 12:06:11 -0800320 Fuchsia() bool
Colin Cross3edeee12017-04-04 12:59:48 -0700321 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700322 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -0700323 PrimaryArch() bool
Colin Crossf6566ed2015-03-24 11:13:38 -0700324}
325
Colin Cross1184b642019-12-30 18:43:07 -0800326// Deprecated: use EarlyModuleContext instead
Colin Cross635c3b02016-05-18 15:37:25 -0700327type BaseContext interface {
Colin Cross1184b642019-12-30 18:43:07 -0800328 EarlyModuleContext
Colin Crossaabf6792017-11-29 00:27:14 -0800329}
330
Colin Cross635c3b02016-05-18 15:37:25 -0700331type ModuleContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -0800332 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800333
Colin Crossae887032017-10-23 17:16:14 -0700334 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800335 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700336
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700337 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800338 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800339 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700340
Colin Cross70dda7e2019-10-01 22:05:35 -0700341 InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
342 InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
343 InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath
344 InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700345 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800346
Colin Cross8d8f8e22016-08-03 11:57:50 -0700347 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700348 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700349 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800350 InstallInRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900351 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700352 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700353 InstallBypassMake() bool
Jiyong Park87788b52020-09-01 12:37:45 +0900354 InstallForceOS() (*OsType, *ArchType)
Nan Zhang6d34b302017-02-04 17:47:46 -0800355
356 RequiredModuleNames() []string
Sasha Smundakb6d23052019-04-01 18:37:36 -0700357 HostRequiredModuleNames() []string
358 TargetRequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700359
Colin Cross3f68a132017-10-23 17:10:29 -0700360 ModuleSubDir() string
361
Colin Cross0875c522017-11-28 17:34:01 -0800362 Variable(pctx PackageContext, name, value string)
363 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700364 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
365 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800366 Build(pctx PackageContext, params BuildParams)
Colin Crossc3d87d32020-06-04 13:25:17 -0700367 // Phony creates a Make-style phony rule, a rule with no commands that can depend on other
368 // phony rules or real files. Phony can be called on the same name multiple times to add
369 // additional dependencies.
370 Phony(phony string, deps ...Path)
Colin Cross3f68a132017-10-23 17:10:29 -0700371
Colin Cross9f35c3d2020-09-16 19:04:41 -0700372 // GetMissingDependencies returns the list of dependencies that were passed to AddDependencies or related methods,
373 // but do not exist.
Colin Cross3f68a132017-10-23 17:10:29 -0700374 GetMissingDependencies() []string
Colin Cross3f40fa42015-01-30 17:27:36 -0800375}
376
Colin Cross635c3b02016-05-18 15:37:25 -0700377type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 blueprint.Module
379
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700380 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
381 // but GenerateAndroidBuildActions also has access to Android-specific information.
382 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700383 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700384
Paul Duffin44f1d842020-06-26 20:17:02 +0100385 // Add dependencies to the components of a module, i.e. modules that are created
386 // by the module and which are considered to be part of the creating module.
387 //
388 // This is called before prebuilts are renamed so as to allow a dependency to be
389 // added directly to a prebuilt child module instead of depending on a source module
390 // and relying on prebuilt processing to switch to the prebuilt module if preferred.
391 //
392 // A dependency on a prebuilt must include the "prebuilt_" prefix.
393 ComponentDepsMutator(ctx BottomUpMutatorContext)
394
Colin Cross1e676be2016-10-12 14:38:15 -0700395 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800396
Colin Cross635c3b02016-05-18 15:37:25 -0700397 base() *ModuleBase
Inseob Kimeec88e12020-01-22 11:11:29 +0900398 Disable()
Dan Willemsen0effe062015-11-30 16:06:01 -0800399 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700400 Target() Target
Anton Hansson1ee62c02020-06-30 11:51:53 +0100401 Owner() string
Dan Willemsen782a2d12015-12-21 14:55:28 -0800402 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700403 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700404 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800405 InstallInRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900406 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700407 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700408 InstallBypassMake() bool
Jiyong Park87788b52020-09-01 12:37:45 +0900409 InstallForceOS() (*OsType, *ArchType)
Colin Crossa2f296f2016-11-29 15:16:18 -0800410 SkipInstall()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +0000411 IsSkipInstall() bool
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100412 MakeUninstallable()
Liz Kammer5ca3a622020-08-05 15:40:41 -0700413 ReplacedByPrebuilt()
414 IsReplacedByPrebuilt() bool
Jiyong Park374510b2018-03-19 18:23:01 +0900415 ExportedToMake() bool
Inseob Kim8471cda2019-11-15 09:59:12 +0900416 InitRc() Paths
417 VintfFragments() Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800418 NoticeFiles() Paths
Colin Cross36242852017-06-23 15:06:31 -0700419
420 AddProperties(props ...interface{})
421 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700422
Colin Crossae887032017-10-23 17:16:14 -0700423 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800424 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800425 VariablesForTests() map[string]string
Paul Duffine2453c72019-05-31 14:00:04 +0100426
Colin Cross9a362232019-07-01 15:32:45 -0700427 // String returns a string that includes the module name and variants for printing during debugging.
428 String() string
429
Paul Duffine2453c72019-05-31 14:00:04 +0100430 // Get the qualified module id for this module.
431 qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName
432
433 // Get information about the properties that can contain visibility rules.
434 visibilityProperties() []visibilityProperty
Paul Duffin63c6e182019-07-24 14:24:38 +0100435
Jiyong Park6a8cf5f2019-12-30 16:31:09 +0900436 RequiredModuleNames() []string
437 HostRequiredModuleNames() []string
438 TargetRequiredModuleNames() []string
Colin Cross897266e2020-02-13 13:22:08 -0800439
Jiyong Park4dc2a1a2020-09-28 17:46:22 +0900440 FilesToInstall() InstallPaths
Paul Duffine2453c72019-05-31 14:00:04 +0100441}
442
443// Qualified id for a module
444type qualifiedModuleName struct {
445 // The package (i.e. directory) in which the module is defined, without trailing /
446 pkg string
447
448 // The name of the module, empty string if package.
449 name string
450}
451
452func (q qualifiedModuleName) String() string {
453 if q.name == "" {
454 return "//" + q.pkg
455 }
456 return "//" + q.pkg + ":" + q.name
457}
458
Paul Duffine484f472019-06-20 16:38:08 +0100459func (q qualifiedModuleName) isRootPackage() bool {
460 return q.pkg == "" && q.name == ""
461}
462
Paul Duffine2453c72019-05-31 14:00:04 +0100463// Get the id for the package containing this module.
464func (q qualifiedModuleName) getContainingPackageId() qualifiedModuleName {
465 pkg := q.pkg
466 if q.name == "" {
Paul Duffine484f472019-06-20 16:38:08 +0100467 if pkg == "" {
468 panic(fmt.Errorf("Cannot get containing package id of root package"))
469 }
470
471 index := strings.LastIndex(pkg, "/")
472 if index == -1 {
473 pkg = ""
474 } else {
475 pkg = pkg[:index]
476 }
Paul Duffine2453c72019-05-31 14:00:04 +0100477 }
478 return newPackageId(pkg)
479}
480
481func newPackageId(pkg string) qualifiedModuleName {
482 // A qualified id for a package module has no name.
483 return qualifiedModuleName{pkg: pkg, name: ""}
Colin Cross3f40fa42015-01-30 17:27:36 -0800484}
485
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000486type Dist struct {
487 // Copy the output of this module to the $DIST_DIR when `dist` is specified on the
488 // command line and any of these targets are also on the command line, or otherwise
489 // built
490 Targets []string `android:"arch_variant"`
491
492 // The name of the output artifact. This defaults to the basename of the output of
493 // the module.
494 Dest *string `android:"arch_variant"`
495
496 // The directory within the dist directory to store the artifact. Defaults to the
497 // top level directory ("").
498 Dir *string `android:"arch_variant"`
499
500 // A suffix to add to the artifact file name (before any extension).
501 Suffix *string `android:"arch_variant"`
502
503 // A string tag to select the OutputFiles associated with the tag. Defaults to the
504 // the empty "" string.
505 Tag *string `android:"arch_variant"`
506}
507
Colin Crossfc754582016-05-17 16:34:16 -0700508type nameProperties struct {
509 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800510 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700511}
512
513type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800514 // emit build rules for this module
Paul Duffin54d9bb72020-02-12 10:20:56 +0000515 //
516 // Disabling a module should only be done for those modules that cannot be built
517 // in the current environment. Modules that can build in the current environment
518 // but are not usually required (e.g. superceded by a prebuilt) should not be
519 // disabled as that will prevent them from being built by the checkbuild target
520 // and so prevent early detection of changes that have broken those modules.
Dan Willemsen0effe062015-11-30 16:06:01 -0800521 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800522
Paul Duffin2e61fa62019-03-28 14:10:57 +0000523 // Controls the visibility of this module to other modules. Allowable values are one or more of
524 // these formats:
525 //
526 // ["//visibility:public"]: Anyone can use this module.
527 // ["//visibility:private"]: Only rules in the module's package (not its subpackages) can use
528 // this module.
Paul Duffin51084ff2020-05-05 19:19:22 +0100529 // ["//visibility:override"]: Discards any rules inherited from defaults or a creating module.
530 // Can only be used at the beginning of a list of visibility rules.
Paul Duffin2e61fa62019-03-28 14:10:57 +0000531 // ["//some/package:__pkg__", "//other/package:__pkg__"]: Only modules in some/package and
532 // other/package (defined in some/package/*.bp and other/package/*.bp) have access to
533 // this module. Note that sub-packages do not have access to the rule; for example,
534 // //some/package/foo:bar or //other/package/testing:bla wouldn't have access. __pkg__
535 // is a special module and must be used verbatim. It represents all of the modules in the
536 // package.
537 // ["//project:__subpackages__", "//other:__subpackages__"]: Only modules in packages project
538 // or other or in one of their sub-packages have access to this module. For example,
539 // //project:rule, //project/library:lib or //other/testing/internal:munge are allowed
540 // to depend on this rule (but not //independent:evil)
541 // ["//project"]: This is shorthand for ["//project:__pkg__"]
542 // [":__subpackages__"]: This is shorthand for ["//project:__subpackages__"] where
543 // //project is the module's package. e.g. using [":__subpackages__"] in
544 // packages/apps/Settings/Android.bp is equivalent to
545 // //packages/apps/Settings:__subpackages__.
546 // ["//visibility:legacy_public"]: The default visibility, behaves as //visibility:public
547 // for now. It is an error if it is used in a module.
Paul Duffine2453c72019-05-31 14:00:04 +0100548 //
549 // If a module does not specify the `visibility` property then it uses the
550 // `default_visibility` property of the `package` module in the module's package.
551 //
552 // If the `default_visibility` property is not set for the module's package then
Paul Duffine484f472019-06-20 16:38:08 +0100553 // it will use the `default_visibility` of its closest ancestor package for which
554 // a `default_visibility` property is specified.
555 //
556 // If no `default_visibility` property can be found then the module uses the
557 // global default of `//visibility:legacy_public`.
Paul Duffine2453c72019-05-31 14:00:04 +0100558 //
Paul Duffin95d53b52019-07-24 13:45:05 +0100559 // The `visibility` property has no effect on a defaults module although it does
560 // apply to any non-defaults module that uses it. To set the visibility of a
561 // defaults module, use the `defaults_visibility` property on the defaults module;
562 // not to be confused with the `default_visibility` property on the package module.
563 //
Paul Duffin2e61fa62019-03-28 14:10:57 +0000564 // See https://android.googlesource.com/platform/build/soong/+/master/README.md#visibility for
565 // more details.
566 Visibility []string
567
Colin Cross7d5136f2015-05-11 13:39:40 -0700568 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800569 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
570 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
Roland Levillain24bb2e62020-09-22 11:18:38 +0000571 // platform).
Colin Cross7d716ba2017-11-01 10:38:29 -0700572 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700573
574 Target struct {
575 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700576 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700577 }
578 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700579 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700580 }
581 }
582
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000583 // If set to true then the archMutator will create variants for each arch specific target
584 // (e.g. 32/64) that the module is required to produce. If set to false then it will only
585 // create a variant for the architecture and will list the additional arch specific targets
586 // that the variant needs to produce in the CompileMultiTargets property.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700587 UseTargetVariants bool `blueprint:"mutated"`
588 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800589
Dan Willemsen782a2d12015-12-21 14:55:28 -0800590 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700591 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800592
Colin Cross55708f32017-03-20 13:23:34 -0700593 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700594 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700595
Jiyong Park2db76922017-11-08 16:03:48 +0900596 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
597 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
598 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700599 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700600
Jiyong Park2db76922017-11-08 16:03:48 +0900601 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
602 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
603 Soc_specific *bool
604
605 // whether this module is specific to a device, not only for SoC, but also for off-chip
606 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
607 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
608 // This implies `soc_specific:true`.
609 Device_specific *bool
610
611 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900612 // network operator, etc). When set to true, it is installed into /product (or
613 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900614 Product_specific *bool
615
Justin Yund5f6c822019-06-25 16:47:17 +0900616 // whether this module extends system. When set to true, it is installed into /system_ext
617 // (or /system/system_ext if system_ext partition does not exist).
618 System_ext_specific *bool
619
Jiyong Parkf9332f12018-02-01 00:54:12 +0900620 // Whether this module is installed to recovery partition
621 Recovery *bool
622
Yifan Hong1b3348d2020-01-21 15:53:22 -0800623 // Whether this module is installed to ramdisk
624 Ramdisk *bool
625
dimitry1f33e402019-03-26 12:39:31 +0100626 // Whether this module is built for non-native architecures (also known as native bridge binary)
627 Native_bridge_supported *bool `android:"arch_variant"`
628
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700629 // init.rc files to be installed if this module is installed
Colin Cross0bab8772020-09-25 14:01:21 -0700630 Init_rc []string `android:"arch_variant,path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700631
Steven Moreland57a23d22018-04-04 15:42:19 -0700632 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800633 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700634
Chris Wolfe998306e2016-08-15 14:47:23 -0400635 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700636 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400637
Sasha Smundakb6d23052019-04-01 18:37:36 -0700638 // names of other modules to install on host if this module is installed
639 Host_required []string `android:"arch_variant"`
640
641 // names of other modules to install on target if this module is installed
642 Target_required []string `android:"arch_variant"`
643
Colin Cross5aac3622017-08-31 15:07:09 -0700644 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800645 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700646
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000647 // The OsType of artifacts that this module variant is responsible for creating.
648 //
649 // Set by osMutator
650 CompileOS OsType `blueprint:"mutated"`
651
652 // The Target of artifacts that this module variant is responsible for creating.
653 //
654 // Set by archMutator
655 CompileTarget Target `blueprint:"mutated"`
656
657 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
658 // responsible for creating.
659 //
660 // By default this is nil as, where necessary, separate variants are created for the
661 // different multilib types supported and that information is encapsulated in the
662 // CompileTarget so the module variant simply needs to create artifacts for that.
663 //
664 // However, if UseTargetVariants is set to false (e.g. by
665 // InitAndroidMultiTargetsArchModule) then no separate variants are created for the
666 // multilib targets. Instead a single variant is created for the architecture and
667 // this contains the multilib specific targets that this variant should create.
668 //
669 // Set by archMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700670 CompileMultiTargets []Target `blueprint:"mutated"`
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000671
672 // True if the module variant's CompileTarget is the primary target
673 //
674 // Set by archMutator
675 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800676
677 // Set by InitAndroidModule
678 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700679 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700680
Paul Duffin1356d8c2020-02-25 19:26:33 +0000681 // If set to true then a CommonOS variant will be created which will have dependencies
682 // on all its OsType specific variants. Used by sdk/module_exports to create a snapshot
683 // that covers all os and architecture variants.
684 //
685 // The OsType specific variants can be retrieved by calling
686 // GetOsSpecificVariantsOfCommonOSVariant
687 //
688 // Set at module initialization time by calling InitCommonOSAndroidMultiTargetsArchModule
689 CreateCommonOSVariant bool `blueprint:"mutated"`
690
691 // If set to true then this variant is the CommonOS variant that has dependencies on its
692 // OsType specific variants.
693 //
694 // Set by osMutator.
695 CommonOSVariant bool `blueprint:"mutated"`
696
Colin Crossce75d2c2016-10-06 16:12:58 -0700697 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800698
Liz Kammer5ca3a622020-08-05 15:40:41 -0700699 // Whether the module has been replaced by a prebuilt
700 ReplacedByPrebuilt bool `blueprint:"mutated"`
701
Justin Yun32f053b2020-07-31 23:07:17 +0900702 // Disabled by mutators. If set to true, it overrides Enabled property.
703 ForcedDisabled bool `blueprint:"mutated"`
704
Jeff Gaston088e29e2017-11-29 16:47:17 -0800705 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross6c4f21f2019-06-06 15:41:36 -0700706
707 MissingDeps []string `blueprint:"mutated"`
Colin Cross9a362232019-07-01 15:32:45 -0700708
709 // Name and variant strings stored by mutators to enable Module.String()
710 DebugName string `blueprint:"mutated"`
711 DebugMutators []string `blueprint:"mutated"`
712 DebugVariations []string `blueprint:"mutated"`
Colin Cross7228ecd2019-11-18 16:00:16 -0800713
714 // set by ImageMutator
715 ImageVariation string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800716}
717
Paul Duffined875132020-09-02 13:08:57 +0100718type distProperties struct {
719 // configuration to distribute output files from this module to the distribution
720 // directory (default: $OUT/dist, configurable with $DIST_DIR)
721 Dist Dist `android:"arch_variant"`
722
723 // a list of configurations to distribute output files from this module to the
724 // distribution directory (default: $OUT/dist, configurable with $DIST_DIR)
725 Dists []Dist `android:"arch_variant"`
726}
727
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000728// A map of OutputFile tag keys to Paths, for disting purposes.
729type TaggedDistFiles map[string]Paths
730
731func MakeDefaultDistFiles(paths ...Path) TaggedDistFiles {
Jingwen Chen7b27ca72020-07-24 09:13:49 +0000732 for _, path := range paths {
733 if path == nil {
734 panic("The path to a dist file cannot be nil.")
735 }
736 }
737
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000738 // The default OutputFile tag is the empty "" string.
739 return TaggedDistFiles{"": paths}
740}
741
Colin Cross3f40fa42015-01-30 17:27:36 -0800742type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800743 // If set to true, build a variant of the module for the host. Defaults to false.
744 Host_supported *bool
745
746 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700747 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800748}
749
Colin Crossc472d572015-03-17 15:06:21 -0700750type Multilib string
751
752const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800753 MultilibBoth Multilib = "both"
754 MultilibFirst Multilib = "first"
755 MultilibCommon Multilib = "common"
756 MultilibCommonFirst Multilib = "common_first"
757 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700758)
759
Colin Crossa1ad8d12016-06-01 17:09:44 -0700760type HostOrDeviceSupported int
761
762const (
763 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700764
765 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700766 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700767
768 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700769 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700770
771 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700772 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700773
774 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700775 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700776
777 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700778 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700779
780 // Nothing is supported. This is not exposed to the user, but used to mark a
781 // host only module as unsupported when the module type is not supported on
782 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700783 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700784)
785
Jiyong Park2db76922017-11-08 16:03:48 +0900786type moduleKind int
787
788const (
789 platformModule moduleKind = iota
790 deviceSpecificModule
791 socSpecificModule
792 productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900793 systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900794)
795
796func (k moduleKind) String() string {
797 switch k {
798 case platformModule:
799 return "platform"
800 case deviceSpecificModule:
801 return "device-specific"
802 case socSpecificModule:
803 return "soc-specific"
804 case productSpecificModule:
805 return "product-specific"
Justin Yund5f6c822019-06-25 16:47:17 +0900806 case systemExtSpecificModule:
807 return "systemext-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900808 default:
809 panic(fmt.Errorf("unknown module kind %d", k))
810 }
811}
812
Colin Cross9d34f352019-11-22 16:03:51 -0800813func initAndroidModuleBase(m Module) {
814 m.base().module = m
815}
816
Colin Cross36242852017-06-23 15:06:31 -0700817func InitAndroidModule(m Module) {
Colin Cross9d34f352019-11-22 16:03:51 -0800818 initAndroidModuleBase(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800819 base := m.base()
Colin Cross5049f022015-03-18 13:28:46 -0700820
Colin Cross36242852017-06-23 15:06:31 -0700821 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700822 &base.nameProperties,
Paul Duffined875132020-09-02 13:08:57 +0100823 &base.commonProperties,
824 &base.distProperties)
Colin Cross18c46802019-09-24 22:19:02 -0700825
Colin Crosseabaedd2020-02-06 17:01:55 -0800826 initProductVariableModule(m)
Colin Cross18c46802019-09-24 22:19:02 -0700827
Colin Crossa3a97412019-03-18 12:24:29 -0700828 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700829 base.customizableProperties = m.GetProperties()
Paul Duffin63c6e182019-07-24 14:24:38 +0100830
831 // The default_visibility property needs to be checked and parsed by the visibility module during
Paul Duffin5ec73ec2020-05-01 17:52:01 +0100832 // its checking and parsing phases so make it the primary visibility property.
833 setPrimaryVisibilityProperty(m, "visibility", &base.commonProperties.Visibility)
Colin Cross5049f022015-03-18 13:28:46 -0700834}
835
Colin Cross36242852017-06-23 15:06:31 -0700836func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
837 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700838
839 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800840 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700841 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700842 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700843 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800844
Dan Willemsen218f6562015-07-08 18:13:11 -0700845 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700846 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700847 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800848 }
849
Colin Cross36242852017-06-23 15:06:31 -0700850 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800851}
852
Colin Crossee0bc3b2018-10-02 22:01:37 -0700853func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
854 InitAndroidArchModule(m, hod, defaultMultilib)
855 m.base().commonProperties.UseTargetVariants = false
856}
857
Paul Duffin1356d8c2020-02-25 19:26:33 +0000858// As InitAndroidMultiTargetsArchModule except it creates an additional CommonOS variant that
859// has dependencies on all the OsType specific variants.
860func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
861 InitAndroidArchModule(m, hod, defaultMultilib)
862 m.base().commonProperties.UseTargetVariants = false
863 m.base().commonProperties.CreateCommonOSVariant = true
864}
865
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800866// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800867// modules. It should be included as an anonymous field in every module
868// struct definition. InitAndroidModule should then be called from the module's
869// factory function, and the return values from InitAndroidModule should be
870// returned from the factory function.
871//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800872// The ModuleBase type is responsible for implementing the GenerateBuildActions
873// method to support the blueprint.Module interface. This method will then call
874// the module's GenerateAndroidBuildActions method once for each build variant
Colin Cross25de6c32019-06-06 14:29:25 -0700875// that is to be built. GenerateAndroidBuildActions is passed a ModuleContext
876// rather than the usual blueprint.ModuleContext.
877// ModuleContext exposes extra functionality specific to the Android build
Colin Cross3f40fa42015-01-30 17:27:36 -0800878// system including details about the particular build variant that is to be
879// generated.
880//
881// For example:
882//
883// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800884// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800885// )
886//
887// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800888// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800889// properties struct {
890// MyProperty string
891// }
892// }
893//
Colin Cross36242852017-06-23 15:06:31 -0700894// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800895// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700896// m.AddProperties(&m.properties)
897// android.InitAndroidModule(m)
898// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800899// }
900//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800901// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800902// // Get the CPU architecture for the current build variant.
903// variantArch := ctx.Arch()
904//
905// // ...
906// }
Colin Cross635c3b02016-05-18 15:37:25 -0700907type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800908 // Putting the curiously recurring thing pointing to the thing that contains
909 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700910 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700911 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800912
Colin Crossfc754582016-05-17 16:34:16 -0700913 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800914 commonProperties commonProperties
Paul Duffined875132020-09-02 13:08:57 +0100915 distProperties distProperties
Colin Cross18c46802019-09-24 22:19:02 -0700916 variableProperties interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800917 hostAndDeviceProperties hostAndDeviceProperties
918 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700919 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700920 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800921
Paul Duffin63c6e182019-07-24 14:24:38 +0100922 // Information about all the properties on the module that contains visibility rules that need
923 // checking.
924 visibilityPropertyInfo []visibilityProperty
925
926 // The primary visibility property, may be nil, that controls access to the module.
927 primaryVisibilityProperty visibilityProperty
928
Colin Cross3f40fa42015-01-30 17:27:36 -0800929 noAddressSanitizer bool
Colin Cross897266e2020-02-13 13:22:08 -0800930 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700931 checkbuildFiles Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800932 noticeFiles Paths
Colin Crossc3d87d32020-06-04 13:25:17 -0700933 phonies map[string]Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700934
935 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
936 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800937 installTarget WritablePath
938 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700939 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700940
Colin Cross178a5092016-09-13 13:42:32 -0700941 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700942
943 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700944
945 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700946 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800947 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800948 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700949
Inseob Kim8471cda2019-11-15 09:59:12 +0900950 initRcPaths Paths
951 vintfFragmentsPaths Paths
952
Jiyong Park1613e552020-09-14 19:43:17 +0900953 prefer32 func(ctx BaseModuleContext, base *ModuleBase, os OsType) bool
Colin Cross36242852017-06-23 15:06:31 -0700954}
955
Paul Duffin44f1d842020-06-26 20:17:02 +0100956func (m *ModuleBase) ComponentDepsMutator(BottomUpMutatorContext) {}
957
Colin Cross4157e882019-06-06 16:57:04 -0700958func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
Colin Cross5f692ec2019-02-01 16:53:07 -0800959
Colin Cross4157e882019-06-06 16:57:04 -0700960func (m *ModuleBase) AddProperties(props ...interface{}) {
961 m.registerProps = append(m.registerProps, props...)
Colin Cross36242852017-06-23 15:06:31 -0700962}
963
Colin Cross4157e882019-06-06 16:57:04 -0700964func (m *ModuleBase) GetProperties() []interface{} {
965 return m.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800966}
967
Colin Cross4157e882019-06-06 16:57:04 -0700968func (m *ModuleBase) BuildParamsForTests() []BuildParams {
969 return m.buildParams
Colin Crosscec81712017-07-13 14:43:27 -0700970}
971
Colin Cross4157e882019-06-06 16:57:04 -0700972func (m *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
973 return m.ruleParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800974}
975
Colin Cross4157e882019-06-06 16:57:04 -0700976func (m *ModuleBase) VariablesForTests() map[string]string {
977 return m.variables
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800978}
979
Jiyong Park1613e552020-09-14 19:43:17 +0900980func (m *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, os OsType) bool) {
Colin Cross4157e882019-06-06 16:57:04 -0700981 m.prefer32 = prefer32
Colin Crossa9d8bee2018-10-02 13:59:46 -0700982}
983
Colin Crossce75d2c2016-10-06 16:12:58 -0700984// Name returns the name of the module. It may be overridden by individual module types, for
985// example prebuilts will prepend prebuilt_ to the name.
Colin Cross4157e882019-06-06 16:57:04 -0700986func (m *ModuleBase) Name() string {
987 return String(m.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700988}
989
Colin Cross9a362232019-07-01 15:32:45 -0700990// String returns a string that includes the module name and variants for printing during debugging.
991func (m *ModuleBase) String() string {
992 sb := strings.Builder{}
993 sb.WriteString(m.commonProperties.DebugName)
994 sb.WriteString("{")
995 for i := range m.commonProperties.DebugMutators {
996 if i != 0 {
997 sb.WriteString(",")
998 }
999 sb.WriteString(m.commonProperties.DebugMutators[i])
1000 sb.WriteString(":")
1001 sb.WriteString(m.commonProperties.DebugVariations[i])
1002 }
1003 sb.WriteString("}")
1004 return sb.String()
1005}
1006
Colin Crossce75d2c2016-10-06 16:12:58 -07001007// BaseModuleName returns the name of the module as specified in the blueprints file.
Colin Cross4157e882019-06-06 16:57:04 -07001008func (m *ModuleBase) BaseModuleName() string {
1009 return String(m.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -07001010}
1011
Colin Cross4157e882019-06-06 16:57:04 -07001012func (m *ModuleBase) base() *ModuleBase {
1013 return m
Colin Cross3f40fa42015-01-30 17:27:36 -08001014}
1015
Paul Duffine2453c72019-05-31 14:00:04 +01001016func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
1017 return qualifiedModuleName{pkg: ctx.ModuleDir(), name: ctx.ModuleName()}
1018}
1019
1020func (m *ModuleBase) visibilityProperties() []visibilityProperty {
Paul Duffin63c6e182019-07-24 14:24:38 +01001021 return m.visibilityPropertyInfo
1022}
1023
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001024func (m *ModuleBase) Dists() []Dist {
Paul Duffined875132020-09-02 13:08:57 +01001025 if len(m.distProperties.Dist.Targets) > 0 {
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001026 // Make a copy of the underlying Dists slice to protect against
1027 // backing array modifications with repeated calls to this method.
Paul Duffined875132020-09-02 13:08:57 +01001028 distsCopy := append([]Dist(nil), m.distProperties.Dists...)
1029 return append(distsCopy, m.distProperties.Dist)
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001030 } else {
Paul Duffined875132020-09-02 13:08:57 +01001031 return m.distProperties.Dists
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001032 }
1033}
1034
1035func (m *ModuleBase) GenerateTaggedDistFiles(ctx BaseModuleContext) TaggedDistFiles {
1036 distFiles := make(TaggedDistFiles)
1037 for _, dist := range m.Dists() {
1038 var tag string
1039 var distFilesForTag Paths
1040 if dist.Tag == nil {
1041 tag = ""
1042 } else {
1043 tag = *dist.Tag
1044 }
1045 distFilesForTag, err := m.base().module.(OutputFileProducer).OutputFiles(tag)
1046 if err != nil {
1047 ctx.PropertyErrorf("dist.tag", "%s", err.Error())
1048 }
1049 for _, distFile := range distFilesForTag {
1050 if distFile != nil && !distFiles[tag].containsPath(distFile) {
1051 distFiles[tag] = append(distFiles[tag], distFile)
1052 }
1053 }
1054 }
1055
1056 return distFiles
1057}
1058
Colin Cross4157e882019-06-06 16:57:04 -07001059func (m *ModuleBase) Target() Target {
1060 return m.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -08001061}
1062
Colin Cross4157e882019-06-06 16:57:04 -07001063func (m *ModuleBase) TargetPrimary() bool {
1064 return m.commonProperties.CompilePrimary
Colin Cross8b74d172016-09-13 09:59:14 -07001065}
1066
Colin Cross4157e882019-06-06 16:57:04 -07001067func (m *ModuleBase) MultiTargets() []Target {
1068 return m.commonProperties.CompileMultiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07001069}
1070
Colin Cross4157e882019-06-06 16:57:04 -07001071func (m *ModuleBase) Os() OsType {
1072 return m.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001073}
1074
Colin Cross4157e882019-06-06 16:57:04 -07001075func (m *ModuleBase) Host() bool {
Jiyong Park1613e552020-09-14 19:43:17 +09001076 return m.Os().Class == Host
Dan Willemsen97750522016-02-09 17:43:51 -08001077}
1078
Yo Chiangbba545e2020-06-09 16:15:37 +08001079func (m *ModuleBase) Device() bool {
1080 return m.Os().Class == Device
1081}
1082
Colin Cross4157e882019-06-06 16:57:04 -07001083func (m *ModuleBase) Arch() Arch {
1084 return m.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -08001085}
1086
Colin Cross4157e882019-06-06 16:57:04 -07001087func (m *ModuleBase) ArchSpecific() bool {
1088 return m.commonProperties.ArchSpecific
Dan Willemsen0b24c742016-10-04 15:13:37 -07001089}
1090
Paul Duffin1356d8c2020-02-25 19:26:33 +00001091// True if the current variant is a CommonOS variant, false otherwise.
1092func (m *ModuleBase) IsCommonOSVariant() bool {
1093 return m.commonProperties.CommonOSVariant
1094}
1095
Jiyong Park1613e552020-09-14 19:43:17 +09001096func (m *ModuleBase) supportsTarget(target Target, config Config) bool {
Colin Cross4157e882019-06-06 16:57:04 -07001097 switch m.commonProperties.HostOrDeviceSupported {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001098 case HostSupported:
Jiyong Park1613e552020-09-14 19:43:17 +09001099 return target.Os.Class == Host
Dan Albertc6345fb2016-10-20 01:36:11 -07001100 case HostSupportedNoCross:
Jiyong Park1613e552020-09-14 19:43:17 +09001101 return target.Os.Class == Host && !target.HostCross
Colin Crossa1ad8d12016-06-01 17:09:44 -07001102 case DeviceSupported:
Jiyong Park1613e552020-09-14 19:43:17 +09001103 return target.Os.Class == Device
Dan Albert0981b5c2018-08-02 13:46:35 -07001104 case HostAndDeviceSupported, HostAndDeviceDefault:
Jiyong Park1613e552020-09-14 19:43:17 +09001105 supported := false
Colin Cross4157e882019-06-06 16:57:04 -07001106 if Bool(m.hostAndDeviceProperties.Host_supported) ||
1107 (m.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
1108 m.hostAndDeviceProperties.Host_supported == nil) {
Jiyong Park1613e552020-09-14 19:43:17 +09001109 supported = supported || target.Os.Class == Host
Colin Crossa1ad8d12016-06-01 17:09:44 -07001110 }
Colin Cross4157e882019-06-06 16:57:04 -07001111 if m.hostAndDeviceProperties.Device_supported == nil ||
1112 *m.hostAndDeviceProperties.Device_supported {
Jiyong Park1613e552020-09-14 19:43:17 +09001113 supported = supported || target.Os.Class == Device
Colin Crossa1ad8d12016-06-01 17:09:44 -07001114 }
1115 return supported
1116 default:
Jiyong Park1613e552020-09-14 19:43:17 +09001117 return false
Colin Crossa1ad8d12016-06-01 17:09:44 -07001118 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001119}
1120
Colin Cross4157e882019-06-06 16:57:04 -07001121func (m *ModuleBase) DeviceSupported() bool {
1122 return m.commonProperties.HostOrDeviceSupported == DeviceSupported ||
1123 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
1124 (m.hostAndDeviceProperties.Device_supported == nil ||
1125 *m.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -08001126}
1127
Paul Duffine44358f2019-11-26 18:04:12 +00001128func (m *ModuleBase) HostSupported() bool {
1129 return m.commonProperties.HostOrDeviceSupported == HostSupported ||
1130 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
1131 (m.hostAndDeviceProperties.Host_supported != nil &&
1132 *m.hostAndDeviceProperties.Host_supported)
1133}
1134
Colin Cross4157e882019-06-06 16:57:04 -07001135func (m *ModuleBase) Platform() bool {
Justin Yund5f6c822019-06-25 16:47:17 +09001136 return !m.DeviceSpecific() && !m.SocSpecific() && !m.ProductSpecific() && !m.SystemExtSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +09001137}
1138
Colin Cross4157e882019-06-06 16:57:04 -07001139func (m *ModuleBase) DeviceSpecific() bool {
1140 return Bool(m.commonProperties.Device_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001141}
1142
Colin Cross4157e882019-06-06 16:57:04 -07001143func (m *ModuleBase) SocSpecific() bool {
1144 return Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001145}
1146
Colin Cross4157e882019-06-06 16:57:04 -07001147func (m *ModuleBase) ProductSpecific() bool {
1148 return Bool(m.commonProperties.Product_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001149}
1150
Justin Yund5f6c822019-06-25 16:47:17 +09001151func (m *ModuleBase) SystemExtSpecific() bool {
1152 return Bool(m.commonProperties.System_ext_specific)
Dario Frenifd05a742018-05-29 13:28:54 +01001153}
1154
Colin Crossc2d24052020-05-13 11:05:02 -07001155// RequiresStableAPIs returns true if the module will be installed to a partition that may
1156// be updated separately from the system image.
1157func (m *ModuleBase) RequiresStableAPIs(ctx BaseModuleContext) bool {
1158 return m.SocSpecific() || m.DeviceSpecific() ||
1159 (m.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface())
1160}
1161
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001162func (m *ModuleBase) PartitionTag(config DeviceConfig) string {
1163 partition := "system"
1164 if m.SocSpecific() {
1165 // A SoC-specific module could be on the vendor partition at
1166 // "vendor" or the system partition at "system/vendor".
1167 if config.VendorPath() == "vendor" {
1168 partition = "vendor"
1169 }
1170 } else if m.DeviceSpecific() {
1171 // A device-specific module could be on the odm partition at
1172 // "odm", the vendor partition at "vendor/odm", or the system
1173 // partition at "system/vendor/odm".
1174 if config.OdmPath() == "odm" {
1175 partition = "odm"
Ramy Medhat944839a2020-03-31 22:14:52 -04001176 } else if strings.HasPrefix(config.OdmPath(), "vendor/") {
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001177 partition = "vendor"
1178 }
1179 } else if m.ProductSpecific() {
1180 // A product-specific module could be on the product partition
1181 // at "product" or the system partition at "system/product".
1182 if config.ProductPath() == "product" {
1183 partition = "product"
1184 }
1185 } else if m.SystemExtSpecific() {
1186 // A system_ext-specific module could be on the system_ext
1187 // partition at "system_ext" or the system partition at
1188 // "system/system_ext".
1189 if config.SystemExtPath() == "system_ext" {
1190 partition = "system_ext"
1191 }
1192 }
1193 return partition
1194}
1195
Colin Cross4157e882019-06-06 16:57:04 -07001196func (m *ModuleBase) Enabled() bool {
Justin Yun32f053b2020-07-31 23:07:17 +09001197 if m.commonProperties.ForcedDisabled {
1198 return false
1199 }
Colin Cross4157e882019-06-06 16:57:04 -07001200 if m.commonProperties.Enabled == nil {
1201 return !m.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -08001202 }
Colin Cross4157e882019-06-06 16:57:04 -07001203 return *m.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -08001204}
1205
Inseob Kimeec88e12020-01-22 11:11:29 +09001206func (m *ModuleBase) Disable() {
Justin Yun32f053b2020-07-31 23:07:17 +09001207 m.commonProperties.ForcedDisabled = true
Inseob Kimeec88e12020-01-22 11:11:29 +09001208}
1209
Colin Cross4157e882019-06-06 16:57:04 -07001210func (m *ModuleBase) SkipInstall() {
1211 m.commonProperties.SkipInstall = true
Colin Crossce75d2c2016-10-06 16:12:58 -07001212}
1213
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00001214func (m *ModuleBase) IsSkipInstall() bool {
1215 return m.commonProperties.SkipInstall == true
1216}
1217
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01001218// Similar to SkipInstall, but if the AndroidMk entry would set
1219// LOCAL_UNINSTALLABLE_MODULE then this variant may still output that entry
1220// rather than leaving it out altogether. That happens in cases where it would
1221// have other side effects, in particular when it adds a NOTICE file target,
1222// which other install targets might depend on.
1223func (m *ModuleBase) MakeUninstallable() {
1224 m.SkipInstall()
1225}
1226
Liz Kammer5ca3a622020-08-05 15:40:41 -07001227func (m *ModuleBase) ReplacedByPrebuilt() {
1228 m.commonProperties.ReplacedByPrebuilt = true
1229 m.SkipInstall()
1230}
1231
1232func (m *ModuleBase) IsReplacedByPrebuilt() bool {
1233 return m.commonProperties.ReplacedByPrebuilt
1234}
1235
Colin Cross4157e882019-06-06 16:57:04 -07001236func (m *ModuleBase) ExportedToMake() bool {
1237 return m.commonProperties.NamespaceExportedToMake
Jiyong Park374510b2018-03-19 18:23:01 +09001238}
1239
Colin Cross897266e2020-02-13 13:22:08 -08001240func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {
Colin Cross3f40fa42015-01-30 17:27:36 -08001241
Colin Cross897266e2020-02-13 13:22:08 -08001242 var result InstallPaths
Colin Cross6b753602018-06-21 13:03:07 -07001243 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross897266e2020-02-13 13:22:08 -08001244 ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
1245 if a, ok := m.(Module); ok {
Jiyong Park4dc2a1a2020-09-28 17:46:22 +09001246 result = append(result, a.FilesToInstall()...)
Colin Cross897266e2020-02-13 13:22:08 -08001247 }
1248 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001249
1250 return result
1251}
1252
Jiyong Park4dc2a1a2020-09-28 17:46:22 +09001253func (m *ModuleBase) FilesToInstall() InstallPaths {
Colin Cross4157e882019-06-06 16:57:04 -07001254 return m.installFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001255}
1256
Colin Cross4157e882019-06-06 16:57:04 -07001257func (m *ModuleBase) NoAddressSanitizer() bool {
1258 return m.noAddressSanitizer
Colin Cross3f40fa42015-01-30 17:27:36 -08001259}
1260
Colin Cross4157e882019-06-06 16:57:04 -07001261func (m *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -08001262 return false
1263}
1264
Jaewoong Jung0949f312019-09-11 10:25:18 -07001265func (m *ModuleBase) InstallInTestcases() bool {
1266 return false
1267}
1268
Colin Cross4157e882019-06-06 16:57:04 -07001269func (m *ModuleBase) InstallInSanitizerDir() bool {
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001270 return false
1271}
1272
Yifan Hong1b3348d2020-01-21 15:53:22 -08001273func (m *ModuleBase) InstallInRamdisk() bool {
1274 return Bool(m.commonProperties.Ramdisk)
1275}
1276
Colin Cross4157e882019-06-06 16:57:04 -07001277func (m *ModuleBase) InstallInRecovery() bool {
1278 return Bool(m.commonProperties.Recovery)
Jiyong Parkf9332f12018-02-01 00:54:12 +09001279}
1280
Colin Cross90ba5f42019-10-02 11:10:58 -07001281func (m *ModuleBase) InstallInRoot() bool {
1282 return false
1283}
1284
Colin Cross607d8582019-07-29 16:44:46 -07001285func (m *ModuleBase) InstallBypassMake() bool {
1286 return false
1287}
1288
Jiyong Park87788b52020-09-01 12:37:45 +09001289func (m *ModuleBase) InstallForceOS() (*OsType, *ArchType) {
1290 return nil, nil
Colin Cross6e359402020-02-10 15:29:54 -08001291}
1292
Colin Cross4157e882019-06-06 16:57:04 -07001293func (m *ModuleBase) Owner() string {
1294 return String(m.commonProperties.Owner)
Sundong Ahn4fd04bb2018-08-31 18:01:37 +09001295}
1296
Bob Badoura75b0572020-02-18 20:21:55 -08001297func (m *ModuleBase) NoticeFiles() Paths {
1298 return m.noticeFiles
Jiyong Park52818fc2019-03-18 12:01:38 +09001299}
1300
Colin Cross7228ecd2019-11-18 16:00:16 -08001301func (m *ModuleBase) setImageVariation(variant string) {
1302 m.commonProperties.ImageVariation = variant
1303}
1304
1305func (m *ModuleBase) ImageVariation() blueprint.Variation {
1306 return blueprint.Variation{
1307 Mutator: "image",
1308 Variation: m.base().commonProperties.ImageVariation,
1309 }
1310}
1311
Paul Duffin9b76c0b2020-03-12 10:24:35 +00001312func (m *ModuleBase) getVariationByMutatorName(mutator string) string {
1313 for i, v := range m.commonProperties.DebugMutators {
1314 if v == mutator {
1315 return m.commonProperties.DebugVariations[i]
1316 }
1317 }
1318
1319 return ""
1320}
1321
Yifan Hong1b3348d2020-01-21 15:53:22 -08001322func (m *ModuleBase) InRamdisk() bool {
1323 return m.base().commonProperties.ImageVariation == RamdiskVariation
1324}
1325
Colin Cross7228ecd2019-11-18 16:00:16 -08001326func (m *ModuleBase) InRecovery() bool {
1327 return m.base().commonProperties.ImageVariation == RecoveryVariation
1328}
1329
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09001330func (m *ModuleBase) RequiredModuleNames() []string {
1331 return m.base().commonProperties.Required
1332}
1333
1334func (m *ModuleBase) HostRequiredModuleNames() []string {
1335 return m.base().commonProperties.Host_required
1336}
1337
1338func (m *ModuleBase) TargetRequiredModuleNames() []string {
1339 return m.base().commonProperties.Target_required
1340}
1341
Inseob Kim8471cda2019-11-15 09:59:12 +09001342func (m *ModuleBase) InitRc() Paths {
1343 return append(Paths{}, m.initRcPaths...)
1344}
1345
1346func (m *ModuleBase) VintfFragments() Paths {
1347 return append(Paths{}, m.vintfFragmentsPaths...)
1348}
1349
Colin Cross4157e882019-06-06 16:57:04 -07001350func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Colin Cross897266e2020-02-13 13:22:08 -08001351 var allInstalledFiles InstallPaths
1352 var allCheckbuildFiles Paths
Colin Cross0875c522017-11-28 17:34:01 -08001353 ctx.VisitAllModuleVariants(func(module Module) {
1354 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -07001355 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
1356 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -08001357 })
1358
Colin Cross0875c522017-11-28 17:34:01 -08001359 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -07001360
Colin Cross133ebef2020-08-14 17:38:45 -07001361 namespacePrefix := ctx.Namespace().id
Jeff Gaston088e29e2017-11-29 16:47:17 -08001362 if namespacePrefix != "" {
1363 namespacePrefix = namespacePrefix + "-"
1364 }
1365
Colin Cross3f40fa42015-01-30 17:27:36 -08001366 if len(allInstalledFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001367 name := namespacePrefix + ctx.ModuleName() + "-install"
1368 ctx.Phony(name, allInstalledFiles.Paths()...)
1369 m.installTarget = PathForPhony(ctx, name)
1370 deps = append(deps, m.installTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001371 }
1372
1373 if len(allCheckbuildFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001374 name := namespacePrefix + ctx.ModuleName() + "-checkbuild"
1375 ctx.Phony(name, allCheckbuildFiles...)
1376 m.checkbuildTarget = PathForPhony(ctx, name)
1377 deps = append(deps, m.checkbuildTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001378 }
1379
1380 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001381 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001382 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001383 suffix = "-soong"
1384 }
1385
Colin Crossc3d87d32020-06-04 13:25:17 -07001386 ctx.Phony(namespacePrefix+ctx.ModuleName()+suffix, deps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001387
Colin Cross4157e882019-06-06 16:57:04 -07001388 m.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -08001389 }
1390}
1391
Colin Crossc34d2322020-01-03 15:23:27 -08001392func determineModuleKind(m *ModuleBase, ctx blueprint.EarlyModuleContext) moduleKind {
Colin Cross4157e882019-06-06 16:57:04 -07001393 var socSpecific = Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
1394 var deviceSpecific = Bool(m.commonProperties.Device_specific)
1395 var productSpecific = Bool(m.commonProperties.Product_specific)
Justin Yund5f6c822019-06-25 16:47:17 +09001396 var systemExtSpecific = Bool(m.commonProperties.System_ext_specific)
Jiyong Park2db76922017-11-08 16:03:48 +09001397
Dario Frenifd05a742018-05-29 13:28:54 +01001398 msg := "conflicting value set here"
1399 if socSpecific && deviceSpecific {
1400 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Colin Cross4157e882019-06-06 16:57:04 -07001401 if Bool(m.commonProperties.Vendor) {
Jiyong Park2db76922017-11-08 16:03:48 +09001402 ctx.PropertyErrorf("vendor", msg)
1403 }
Colin Cross4157e882019-06-06 16:57:04 -07001404 if Bool(m.commonProperties.Proprietary) {
Jiyong Park2db76922017-11-08 16:03:48 +09001405 ctx.PropertyErrorf("proprietary", msg)
1406 }
Colin Cross4157e882019-06-06 16:57:04 -07001407 if Bool(m.commonProperties.Soc_specific) {
Jiyong Park2db76922017-11-08 16:03:48 +09001408 ctx.PropertyErrorf("soc_specific", msg)
1409 }
1410 }
1411
Justin Yund5f6c822019-06-25 16:47:17 +09001412 if productSpecific && systemExtSpecific {
1413 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and system_ext at the same time.")
1414 ctx.PropertyErrorf("system_ext_specific", msg)
Dario Frenifd05a742018-05-29 13:28:54 +01001415 }
1416
Justin Yund5f6c822019-06-25 16:47:17 +09001417 if (socSpecific || deviceSpecific) && (productSpecific || systemExtSpecific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001418 if productSpecific {
1419 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
1420 } else {
Justin Yund5f6c822019-06-25 16:47:17 +09001421 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 +01001422 }
1423 if deviceSpecific {
1424 ctx.PropertyErrorf("device_specific", msg)
1425 } else {
Colin Cross4157e882019-06-06 16:57:04 -07001426 if Bool(m.commonProperties.Vendor) {
Dario Frenifd05a742018-05-29 13:28:54 +01001427 ctx.PropertyErrorf("vendor", msg)
1428 }
Colin Cross4157e882019-06-06 16:57:04 -07001429 if Bool(m.commonProperties.Proprietary) {
Dario Frenifd05a742018-05-29 13:28:54 +01001430 ctx.PropertyErrorf("proprietary", msg)
1431 }
Colin Cross4157e882019-06-06 16:57:04 -07001432 if Bool(m.commonProperties.Soc_specific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001433 ctx.PropertyErrorf("soc_specific", msg)
1434 }
1435 }
1436 }
1437
Jiyong Park2db76922017-11-08 16:03:48 +09001438 if productSpecific {
1439 return productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +09001440 } else if systemExtSpecific {
1441 return systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001442 } else if deviceSpecific {
1443 return deviceSpecificModule
1444 } else if socSpecific {
1445 return socSpecificModule
1446 } else {
1447 return platformModule
1448 }
1449}
1450
Colin Crossc34d2322020-01-03 15:23:27 -08001451func (m *ModuleBase) earlyModuleContextFactory(ctx blueprint.EarlyModuleContext) earlyModuleContext {
Colin Cross1184b642019-12-30 18:43:07 -08001452 return earlyModuleContext{
Colin Crossc34d2322020-01-03 15:23:27 -08001453 EarlyModuleContext: ctx,
1454 kind: determineModuleKind(m, ctx),
1455 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -08001456 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001457}
1458
Colin Cross1184b642019-12-30 18:43:07 -08001459func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
1460 return baseModuleContext{
1461 bp: ctx,
1462 earlyModuleContext: m.earlyModuleContextFactory(ctx),
1463 os: m.commonProperties.CompileOS,
1464 target: m.commonProperties.CompileTarget,
1465 targetPrimary: m.commonProperties.CompilePrimary,
1466 multiTargets: m.commonProperties.CompileMultiTargets,
1467 }
1468}
1469
Colin Cross4157e882019-06-06 16:57:04 -07001470func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
Colin Cross25de6c32019-06-06 14:29:25 -07001471 ctx := &moduleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001472 module: m.module,
Colin Crossdc35e212019-06-06 16:13:11 -07001473 bp: blueprintCtx,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001474 baseModuleContext: m.baseModuleContextFactory(blueprintCtx),
1475 installDeps: m.computeInstallDeps(blueprintCtx),
1476 installFiles: m.installFiles,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001477 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -08001478 }
1479
Colin Cross6c4f21f2019-06-06 15:41:36 -07001480 // Temporarily continue to call blueprintCtx.GetMissingDependencies() to maintain the previous behavior of never
1481 // reporting missing dependency errors in Blueprint when AllowMissingDependencies == true.
1482 // TODO: This will be removed once defaults modules handle missing dependency errors
1483 blueprintCtx.GetMissingDependencies()
1484
Colin Crossdc35e212019-06-06 16:13:11 -07001485 // For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
Paul Duffin1356d8c2020-02-25 19:26:33 +00001486 // are enabled. Unless the module is a CommonOS variant which may have dependencies on disabled variants
1487 // (because the dependencies are added before the modules are disabled). The
1488 // GetOsSpecificVariantsOfCommonOSVariant(...) method will ensure that the disabled variants are
1489 // ignored.
1490 ctx.baseModuleContext.strictVisitDeps = !m.IsCommonOSVariant()
Colin Crossdc35e212019-06-06 16:13:11 -07001491
Colin Cross4c83e5c2019-02-25 14:54:28 -08001492 if ctx.config.captureBuild {
1493 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
1494 }
1495
Colin Cross67a5c132017-05-09 13:45:28 -07001496 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
1497 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -08001498 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
1499 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -07001500 }
Colin Cross0875c522017-11-28 17:34:01 -08001501 if !ctx.PrimaryArch() {
1502 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -07001503 }
Colin Cross56a83212020-09-15 18:30:11 -07001504 if apexInfo := ctx.Provider(ApexInfoProvider).(ApexInfo); !apexInfo.IsForPlatform() {
1505 suffix = append(suffix, apexInfo.ApexVariationName)
Dan Willemsenb13a9482020-02-14 11:25:54 -08001506 }
Colin Cross67a5c132017-05-09 13:45:28 -07001507
1508 ctx.Variable(pctx, "moduleDesc", desc)
1509
1510 s := ""
1511 if len(suffix) > 0 {
1512 s = " [" + strings.Join(suffix, " ") + "]"
1513 }
1514 ctx.Variable(pctx, "moduleDescSuffix", s)
1515
Dan Willemsen569edc52018-11-19 09:33:29 -08001516 // Some common property checks for properties that will be used later in androidmk.go
Paul Duffined875132020-09-02 13:08:57 +01001517 if m.distProperties.Dist.Dest != nil {
1518 _, err := validateSafePath(*m.distProperties.Dist.Dest)
Dan Willemsen569edc52018-11-19 09:33:29 -08001519 if err != nil {
1520 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
1521 }
1522 }
Paul Duffined875132020-09-02 13:08:57 +01001523 if m.distProperties.Dist.Dir != nil {
1524 _, err := validateSafePath(*m.distProperties.Dist.Dir)
Dan Willemsen569edc52018-11-19 09:33:29 -08001525 if err != nil {
1526 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
1527 }
1528 }
Paul Duffined875132020-09-02 13:08:57 +01001529 if m.distProperties.Dist.Suffix != nil {
1530 if strings.Contains(*m.distProperties.Dist.Suffix, "/") {
Dan Willemsen569edc52018-11-19 09:33:29 -08001531 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
1532 }
1533 }
1534
Colin Cross4157e882019-06-06 16:57:04 -07001535 if m.Enabled() {
Jooyung Hand48f3c32019-08-23 11:18:57 +09001536 // ensure all direct android.Module deps are enabled
1537 ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) {
1538 if _, ok := bm.(Module); ok {
1539 ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps)
1540 }
1541 })
1542
Bob Badoura75b0572020-02-18 20:21:55 -08001543 m.noticeFiles = make([]Path, 0)
1544 optPath := OptionalPath{}
1545 notice := proptools.StringDefault(m.commonProperties.Notice, "")
Colin Cross4157e882019-06-06 16:57:04 -07001546 if module := SrcIsModule(notice); module != "" {
Bob Badoura75b0572020-02-18 20:21:55 -08001547 optPath = ctx.ExpandOptionalSource(&notice, "notice")
1548 } else if notice != "" {
Jiyong Park52818fc2019-03-18 12:01:38 +09001549 noticePath := filepath.Join(ctx.ModuleDir(), notice)
Bob Badoura75b0572020-02-18 20:21:55 -08001550 optPath = ExistentPathForSource(ctx, noticePath)
1551 }
1552 if optPath.Valid() {
1553 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1554 } else {
1555 for _, notice = range []string{"LICENSE", "LICENCE", "NOTICE"} {
1556 noticePath := filepath.Join(ctx.ModuleDir(), notice)
1557 optPath = ExistentPathForSource(ctx, noticePath)
1558 if optPath.Valid() {
1559 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1560 }
1561 }
Jaewoong Jung62707f72018-11-16 13:26:43 -08001562 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001563
1564 m.module.GenerateAndroidBuildActions(ctx)
1565 if ctx.Failed() {
1566 return
1567 }
1568
1569 m.installFiles = append(m.installFiles, ctx.installFiles...)
1570 m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...)
Inseob Kim8471cda2019-11-15 09:59:12 +09001571 m.initRcPaths = PathsForModuleSrc(ctx, m.commonProperties.Init_rc)
1572 m.vintfFragmentsPaths = PathsForModuleSrc(ctx, m.commonProperties.Vintf_fragments)
Colin Crossc3d87d32020-06-04 13:25:17 -07001573 for k, v := range ctx.phonies {
1574 m.phonies[k] = append(m.phonies[k], v...)
1575 }
Colin Crossdc35e212019-06-06 16:13:11 -07001576 } else if ctx.Config().AllowMissingDependencies() {
1577 // If the module is not enabled it will not create any build rules, nothing will call
1578 // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled
1579 // and report them as an error even when AllowMissingDependencies = true. Call
1580 // ctx.GetMissingDependencies() here to tell blueprint not to handle them.
1581 ctx.GetMissingDependencies()
Colin Cross3f40fa42015-01-30 17:27:36 -08001582 }
1583
Colin Cross4157e882019-06-06 16:57:04 -07001584 if m == ctx.FinalModule().(Module).base() {
1585 m.generateModuleTarget(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -07001586 if ctx.Failed() {
1587 return
1588 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001589 }
Colin Crosscec81712017-07-13 14:43:27 -07001590
Colin Cross4157e882019-06-06 16:57:04 -07001591 m.buildParams = ctx.buildParams
1592 m.ruleParams = ctx.ruleParams
1593 m.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -08001594}
1595
Colin Cross1184b642019-12-30 18:43:07 -08001596type earlyModuleContext struct {
Colin Crossc34d2322020-01-03 15:23:27 -08001597 blueprint.EarlyModuleContext
Colin Cross1184b642019-12-30 18:43:07 -08001598
1599 kind moduleKind
1600 config Config
1601}
1602
1603func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths {
1604 ret, err := e.GlobWithDeps(globPattern, excludes)
1605 if err != nil {
1606 e.ModuleErrorf("glob: %s", err.Error())
1607 }
1608 return pathsForModuleSrcFromFullPath(e, ret, true)
1609}
1610
1611func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
1612 ret, err := e.GlobWithDeps(globPattern, excludes)
1613 if err != nil {
1614 e.ModuleErrorf("glob: %s", err.Error())
1615 }
1616 return pathsForModuleSrcFromFullPath(e, ret, false)
1617}
1618
Colin Cross988414c2020-01-11 01:11:46 +00001619func (b *earlyModuleContext) IsSymlink(path Path) bool {
1620 fileInfo, err := b.config.fs.Lstat(path.String())
1621 if err != nil {
1622 b.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
1623 }
1624 return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
1625}
1626
1627func (b *earlyModuleContext) Readlink(path Path) string {
1628 dest, err := b.config.fs.Readlink(path.String())
1629 if err != nil {
1630 b.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
1631 }
1632 return dest
1633}
1634
Colin Cross1184b642019-12-30 18:43:07 -08001635func (e *earlyModuleContext) Module() Module {
Colin Crossc34d2322020-01-03 15:23:27 -08001636 module, _ := e.EarlyModuleContext.Module().(Module)
Colin Cross1184b642019-12-30 18:43:07 -08001637 return module
1638}
1639
1640func (e *earlyModuleContext) Config() Config {
Colin Crossc34d2322020-01-03 15:23:27 -08001641 return e.EarlyModuleContext.Config().(Config)
Colin Cross1184b642019-12-30 18:43:07 -08001642}
1643
1644func (e *earlyModuleContext) AConfig() Config {
1645 return e.config
1646}
1647
1648func (e *earlyModuleContext) DeviceConfig() DeviceConfig {
1649 return DeviceConfig{e.config.deviceConfig}
1650}
1651
1652func (e *earlyModuleContext) Platform() bool {
1653 return e.kind == platformModule
1654}
1655
1656func (e *earlyModuleContext) DeviceSpecific() bool {
1657 return e.kind == deviceSpecificModule
1658}
1659
1660func (e *earlyModuleContext) SocSpecific() bool {
1661 return e.kind == socSpecificModule
1662}
1663
1664func (e *earlyModuleContext) ProductSpecific() bool {
1665 return e.kind == productSpecificModule
1666}
1667
1668func (e *earlyModuleContext) SystemExtSpecific() bool {
1669 return e.kind == systemExtSpecificModule
1670}
1671
Colin Cross133ebef2020-08-14 17:38:45 -07001672func (e *earlyModuleContext) Namespace() *Namespace {
1673 return e.EarlyModuleContext.Namespace().(*Namespace)
1674}
1675
Colin Cross1184b642019-12-30 18:43:07 -08001676type baseModuleContext struct {
1677 bp blueprint.BaseModuleContext
1678 earlyModuleContext
Colin Crossfb0c16e2019-11-20 17:12:35 -08001679 os OsType
Colin Cross8b74d172016-09-13 09:59:14 -07001680 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -07001681 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -07001682 targetPrimary bool
1683 debug bool
Colin Crossdc35e212019-06-06 16:13:11 -07001684
1685 walkPath []Module
Paul Duffinc5192442020-03-31 11:31:36 +01001686 tagPath []blueprint.DependencyTag
Colin Crossdc35e212019-06-06 16:13:11 -07001687
1688 strictVisitDeps bool // If true, enforce that all dependencies are enabled
Colin Crossf6566ed2015-03-24 11:13:38 -07001689}
1690
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001691func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string {
1692 return b.bp.OtherModuleName(m)
1693}
1694func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) }
Colin Cross1184b642019-12-30 18:43:07 -08001695func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) {
Jooyung Hancd87c692020-02-26 02:05:18 +09001696 b.bp.OtherModuleErrorf(m, fmt, args...)
Colin Cross1184b642019-12-30 18:43:07 -08001697}
1698func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag {
1699 return b.bp.OtherModuleDependencyTag(m)
1700}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001701func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +00001702func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
1703 return b.bp.OtherModuleDependencyVariantExists(variations, name)
1704}
1705func (b *baseModuleContext) OtherModuleReverseDependencyVariantExists(name string) bool {
1706 return b.bp.OtherModuleReverseDependencyVariantExists(name)
1707}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001708func (b *baseModuleContext) OtherModuleType(m blueprint.Module) string {
1709 return b.bp.OtherModuleType(m)
1710}
Colin Crossd27e7b82020-07-02 11:38:17 -07001711func (b *baseModuleContext) OtherModuleProvider(m blueprint.Module, provider blueprint.ProviderKey) interface{} {
1712 return b.bp.OtherModuleProvider(m, provider)
1713}
1714func (b *baseModuleContext) OtherModuleHasProvider(m blueprint.Module, provider blueprint.ProviderKey) bool {
1715 return b.bp.OtherModuleHasProvider(m, provider)
1716}
1717func (b *baseModuleContext) Provider(provider blueprint.ProviderKey) interface{} {
1718 return b.bp.Provider(provider)
1719}
1720func (b *baseModuleContext) HasProvider(provider blueprint.ProviderKey) bool {
1721 return b.bp.HasProvider(provider)
1722}
1723func (b *baseModuleContext) SetProvider(provider blueprint.ProviderKey, value interface{}) {
1724 b.bp.SetProvider(provider, value)
1725}
Colin Cross1184b642019-12-30 18:43:07 -08001726
1727func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1728 return b.bp.GetDirectDepWithTag(name, tag)
1729}
1730
Paul Duffinf88d8e02020-05-07 20:21:34 +01001731func (b *baseModuleContext) blueprintBaseModuleContext() blueprint.BaseModuleContext {
1732 return b.bp
1733}
1734
Colin Cross25de6c32019-06-06 14:29:25 -07001735type moduleContext struct {
Colin Crossdc35e212019-06-06 16:13:11 -07001736 bp blueprint.ModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -07001737 baseModuleContext
Colin Cross897266e2020-02-13 13:22:08 -08001738 installDeps InstallPaths
1739 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001740 checkbuildFiles Paths
Colin Cross8d8f8e22016-08-03 11:57:50 -07001741 module Module
Colin Crossc3d87d32020-06-04 13:25:17 -07001742 phonies map[string]Paths
Colin Crosscec81712017-07-13 14:43:27 -07001743
1744 // For tests
Colin Crossae887032017-10-23 17:16:14 -07001745 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -08001746 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001747 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -08001748}
1749
Colin Crossb88b3c52019-06-10 15:15:17 -07001750func (m *moduleContext) ninjaError(params BuildParams, err error) (PackageContext, BuildParams) {
1751 return pctx, BuildParams{
Colin Cross4b69c492019-06-07 13:06:06 -07001752 Rule: ErrorRule,
1753 Description: params.Description,
1754 Output: params.Output,
1755 Outputs: params.Outputs,
1756 ImplicitOutput: params.ImplicitOutput,
1757 ImplicitOutputs: params.ImplicitOutputs,
Colin Cross6ff51382015-12-17 16:39:19 -08001758 Args: map[string]string{
1759 "error": err.Error(),
1760 },
Colin Crossb88b3c52019-06-10 15:15:17 -07001761 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001762}
1763
Colin Cross25de6c32019-06-06 14:29:25 -07001764func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
1765 m.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -08001766}
1767
Jingwen Chence679d22020-09-23 04:30:02 +00001768func validateBuildParams(params blueprint.BuildParams) error {
1769 // Validate that the symlink outputs are declared outputs or implicit outputs
1770 allOutputs := map[string]bool{}
1771 for _, output := range params.Outputs {
1772 allOutputs[output] = true
1773 }
1774 for _, output := range params.ImplicitOutputs {
1775 allOutputs[output] = true
1776 }
1777 for _, symlinkOutput := range params.SymlinkOutputs {
1778 if !allOutputs[symlinkOutput] {
1779 return fmt.Errorf(
1780 "Symlink output %s is not a declared output or implicit output",
1781 symlinkOutput)
1782 }
1783 }
1784 return nil
1785}
1786
1787// Convert build parameters from their concrete Android types into their string representations,
1788// and combine the singular and plural fields of the same type (e.g. Output and Outputs).
Colin Cross0875c522017-11-28 17:34:01 -08001789func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001790 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001791 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -08001792 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -08001793 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001794 Outputs: params.Outputs.Strings(),
1795 ImplicitOutputs: params.ImplicitOutputs.Strings(),
Jingwen Chence679d22020-09-23 04:30:02 +00001796 SymlinkOutputs: params.SymlinkOutputs.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001797 Inputs: params.Inputs.Strings(),
1798 Implicits: params.Implicits.Strings(),
1799 OrderOnly: params.OrderOnly.Strings(),
Colin Cross824f1162020-07-16 13:07:51 -07001800 Validations: params.Validations.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001801 Args: params.Args,
1802 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001803 }
1804
Colin Cross33bfb0a2016-11-21 17:23:08 -08001805 if params.Depfile != nil {
1806 bparams.Depfile = params.Depfile.String()
1807 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001808 if params.Output != nil {
1809 bparams.Outputs = append(bparams.Outputs, params.Output.String())
1810 }
Jingwen Chence679d22020-09-23 04:30:02 +00001811 if params.SymlinkOutput != nil {
1812 bparams.SymlinkOutputs = append(bparams.SymlinkOutputs, params.SymlinkOutput.String())
1813 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001814 if params.ImplicitOutput != nil {
1815 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
1816 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001817 if params.Input != nil {
1818 bparams.Inputs = append(bparams.Inputs, params.Input.String())
1819 }
1820 if params.Implicit != nil {
1821 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
1822 }
Colin Cross824f1162020-07-16 13:07:51 -07001823 if params.Validation != nil {
1824 bparams.Validations = append(bparams.Validations, params.Validation.String())
1825 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001826
Colin Cross0b9f31f2019-02-28 11:00:01 -08001827 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
1828 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
Jingwen Chence679d22020-09-23 04:30:02 +00001829 bparams.SymlinkOutputs = proptools.NinjaEscapeList(bparams.SymlinkOutputs)
Colin Cross0b9f31f2019-02-28 11:00:01 -08001830 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
1831 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
1832 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
Colin Cross824f1162020-07-16 13:07:51 -07001833 bparams.Validations = proptools.NinjaEscapeList(bparams.Validations)
1834 bparams.Depfile = proptools.NinjaEscape(bparams.Depfile)
Colin Crossfe4bc362018-09-12 10:02:13 -07001835
Colin Cross0875c522017-11-28 17:34:01 -08001836 return bparams
1837}
1838
Colin Cross25de6c32019-06-06 14:29:25 -07001839func (m *moduleContext) Variable(pctx PackageContext, name, value string) {
1840 if m.config.captureBuild {
1841 m.variables[name] = value
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001842 }
1843
Colin Crossdc35e212019-06-06 16:13:11 -07001844 m.bp.Variable(pctx.PackageContext, name, value)
Colin Cross0875c522017-11-28 17:34:01 -08001845}
1846
Colin Cross25de6c32019-06-06 14:29:25 -07001847func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
Colin Cross0875c522017-11-28 17:34:01 -08001848 argNames ...string) blueprint.Rule {
1849
Ramy Medhat944839a2020-03-31 22:14:52 -04001850 if m.config.UseRemoteBuild() {
1851 if params.Pool == nil {
1852 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
1853 // jobs to the local parallelism value
1854 params.Pool = localPool
1855 } else if params.Pool == remotePool {
1856 // remotePool is a fake pool used to identify rule that are supported for remoting. If the rule's
1857 // pool is the remotePool, replace with nil so that ninja runs it at NINJA_REMOTE_NUM_JOBS
1858 // parallelism.
1859 params.Pool = nil
1860 }
Colin Cross2e2dbc22019-09-25 13:31:46 -07001861 }
1862
Colin Crossdc35e212019-06-06 16:13:11 -07001863 rule := m.bp.Rule(pctx.PackageContext, name, params, argNames...)
Colin Cross4c83e5c2019-02-25 14:54:28 -08001864
Colin Cross25de6c32019-06-06 14:29:25 -07001865 if m.config.captureBuild {
1866 m.ruleParams[rule] = params
Colin Cross4c83e5c2019-02-25 14:54:28 -08001867 }
1868
1869 return rule
Colin Cross0875c522017-11-28 17:34:01 -08001870}
1871
Colin Cross25de6c32019-06-06 14:29:25 -07001872func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
Colin Crossb88b3c52019-06-10 15:15:17 -07001873 if params.Description != "" {
1874 params.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1875 }
1876
1877 if missingDeps := m.GetMissingDependencies(); len(missingDeps) > 0 {
1878 pctx, params = m.ninjaError(params, fmt.Errorf("module %s missing dependencies: %s\n",
1879 m.ModuleName(), strings.Join(missingDeps, ", ")))
1880 }
1881
Colin Cross25de6c32019-06-06 14:29:25 -07001882 if m.config.captureBuild {
1883 m.buildParams = append(m.buildParams, params)
Colin Cross0875c522017-11-28 17:34:01 -08001884 }
1885
Jingwen Chence679d22020-09-23 04:30:02 +00001886 bparams := convertBuildParams(params)
1887 err := validateBuildParams(bparams)
1888 if err != nil {
1889 m.ModuleErrorf(
1890 "%s: build parameter validation failed: %s",
1891 m.ModuleName(),
1892 err.Error())
1893 }
1894 m.bp.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001895}
Colin Crossc3d87d32020-06-04 13:25:17 -07001896
1897func (m *moduleContext) Phony(name string, deps ...Path) {
1898 addPhony(m.config, name, deps...)
1899}
1900
Colin Cross25de6c32019-06-06 14:29:25 -07001901func (m *moduleContext) GetMissingDependencies() []string {
Colin Cross6c4f21f2019-06-06 15:41:36 -07001902 var missingDeps []string
1903 missingDeps = append(missingDeps, m.Module().base().commonProperties.MissingDeps...)
Colin Crossdc35e212019-06-06 16:13:11 -07001904 missingDeps = append(missingDeps, m.bp.GetMissingDependencies()...)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001905 missingDeps = FirstUniqueStrings(missingDeps)
1906 return missingDeps
Colin Cross6ff51382015-12-17 16:39:19 -08001907}
1908
Colin Crossdc35e212019-06-06 16:13:11 -07001909func (b *baseModuleContext) AddMissingDependencies(deps []string) {
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001910 if deps != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001911 missingDeps := &b.Module().base().commonProperties.MissingDeps
Colin Cross6c4f21f2019-06-06 15:41:36 -07001912 *missingDeps = append(*missingDeps, deps...)
1913 *missingDeps = FirstUniqueStrings(*missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001914 }
1915}
1916
Colin Crossdc35e212019-06-06 16:13:11 -07001917func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, strict bool) Module {
Colin Crossd11fcda2017-10-23 17:59:01 -07001918 aModule, _ := module.(Module)
Colin Crossdc35e212019-06-06 16:13:11 -07001919
1920 if !strict {
1921 return aModule
1922 }
1923
Colin Cross380c69a2019-06-10 17:49:58 +00001924 if aModule == nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001925 b.ModuleErrorf("module %q not an android module", b.OtherModuleName(module))
Colin Cross380c69a2019-06-10 17:49:58 +00001926 return nil
1927 }
1928
1929 if !aModule.Enabled() {
Colin Crossdc35e212019-06-06 16:13:11 -07001930 if b.Config().AllowMissingDependencies() {
1931 b.AddMissingDependencies([]string{b.OtherModuleName(aModule)})
Colin Cross380c69a2019-06-10 17:49:58 +00001932 } else {
Colin Crossdc35e212019-06-06 16:13:11 -07001933 b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule))
Colin Cross380c69a2019-06-10 17:49:58 +00001934 }
1935 return nil
1936 }
Colin Crossd11fcda2017-10-23 17:59:01 -07001937 return aModule
1938}
1939
Colin Crossdc35e212019-06-06 16:13:11 -07001940func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
Jiyong Parkf2976302019-04-17 21:47:37 +09001941 type dep struct {
1942 mod blueprint.Module
1943 tag blueprint.DependencyTag
1944 }
1945 var deps []dep
Colin Crossdc35e212019-06-06 16:13:11 -07001946 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001947 if aModule, _ := module.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
Colin Cross1184b642019-12-30 18:43:07 -08001948 returnedTag := b.bp.OtherModuleDependencyTag(aModule)
Jiyong Parkf2976302019-04-17 21:47:37 +09001949 if tag == nil || returnedTag == tag {
1950 deps = append(deps, dep{aModule, returnedTag})
1951 }
1952 }
1953 })
1954 if len(deps) == 1 {
1955 return deps[0].mod, deps[0].tag
1956 } else if len(deps) >= 2 {
1957 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
Colin Crossdc35e212019-06-06 16:13:11 -07001958 name, b.ModuleName()))
Jiyong Parkf2976302019-04-17 21:47:37 +09001959 } else {
1960 return nil, nil
1961 }
1962}
1963
Colin Crossdc35e212019-06-06 16:13:11 -07001964func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module {
Colin Cross0ef08162019-05-01 15:50:51 -07001965 var deps []Module
Colin Crossdc35e212019-06-06 16:13:11 -07001966 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001967 if aModule, _ := module.(Module); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001968 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Cross0ef08162019-05-01 15:50:51 -07001969 deps = append(deps, aModule)
1970 }
1971 }
1972 })
1973 return deps
1974}
1975
Colin Cross25de6c32019-06-06 14:29:25 -07001976func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1977 module, _ := m.getDirectDepInternal(name, tag)
1978 return module
Jiyong Parkf2976302019-04-17 21:47:37 +09001979}
1980
Colin Crossdc35e212019-06-06 16:13:11 -07001981func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
1982 return b.getDirectDepInternal(name, nil)
Jiyong Parkf2976302019-04-17 21:47:37 +09001983}
1984
Colin Crossdc35e212019-06-06 16:13:11 -07001985func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001986 b.bp.VisitDirectDeps(visit)
Colin Cross35143d02017-11-16 00:11:20 -08001987}
1988
Colin Crossdc35e212019-06-06 16:13:11 -07001989func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001990 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001991 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07001992 visit(aModule)
1993 }
1994 })
1995}
1996
Colin Crossdc35e212019-06-06 16:13:11 -07001997func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001998 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07001999 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08002000 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Crossee6143c2017-12-30 17:54:27 -08002001 visit(aModule)
2002 }
2003 }
2004 })
2005}
2006
Colin Crossdc35e212019-06-06 16:13:11 -07002007func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002008 b.bp.VisitDirectDepsIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07002009 // pred
2010 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002011 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002012 return pred(aModule)
2013 } else {
2014 return false
2015 }
2016 },
2017 // visit
2018 func(module blueprint.Module) {
2019 visit(module.(Module))
2020 })
2021}
2022
Colin Crossdc35e212019-06-06 16:13:11 -07002023func (b *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002024 b.bp.VisitDepsDepthFirst(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002025 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002026 visit(aModule)
2027 }
2028 })
2029}
2030
Colin Crossdc35e212019-06-06 16:13:11 -07002031func (b *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002032 b.bp.VisitDepsDepthFirstIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07002033 // pred
2034 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002035 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002036 return pred(aModule)
2037 } else {
2038 return false
2039 }
2040 },
2041 // visit
2042 func(module blueprint.Module) {
2043 visit(module.(Module))
2044 })
2045}
2046
Colin Crossdc35e212019-06-06 16:13:11 -07002047func (b *baseModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
Colin Cross1184b642019-12-30 18:43:07 -08002048 b.bp.WalkDeps(visit)
Alex Light778127a2019-02-27 14:19:50 -08002049}
2050
Colin Crossdc35e212019-06-06 16:13:11 -07002051func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
2052 b.walkPath = []Module{b.Module()}
Paul Duffinc5192442020-03-31 11:31:36 +01002053 b.tagPath = []blueprint.DependencyTag{}
Colin Cross1184b642019-12-30 18:43:07 -08002054 b.bp.WalkDeps(func(child, parent blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002055 childAndroidModule, _ := child.(Module)
2056 parentAndroidModule, _ := parent.(Module)
Colin Crossd11fcda2017-10-23 17:59:01 -07002057 if childAndroidModule != nil && parentAndroidModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07002058 // record walkPath before visit
2059 for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
2060 b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
Paul Duffinc5192442020-03-31 11:31:36 +01002061 b.tagPath = b.tagPath[0 : len(b.tagPath)-1]
Colin Crossdc35e212019-06-06 16:13:11 -07002062 }
2063 b.walkPath = append(b.walkPath, childAndroidModule)
Paul Duffinc5192442020-03-31 11:31:36 +01002064 b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule))
Colin Crossd11fcda2017-10-23 17:59:01 -07002065 return visit(childAndroidModule, parentAndroidModule)
2066 } else {
2067 return false
2068 }
2069 })
2070}
2071
Colin Crossdc35e212019-06-06 16:13:11 -07002072func (b *baseModuleContext) GetWalkPath() []Module {
2073 return b.walkPath
2074}
2075
Paul Duffinc5192442020-03-31 11:31:36 +01002076func (b *baseModuleContext) GetTagPath() []blueprint.DependencyTag {
2077 return b.tagPath
2078}
2079
Colin Cross4dfacf92020-09-16 19:22:27 -07002080func (b *baseModuleContext) VisitAllModuleVariants(visit func(Module)) {
2081 b.bp.VisitAllModuleVariants(func(module blueprint.Module) {
2082 visit(module.(Module))
2083 })
2084}
2085
2086func (b *baseModuleContext) PrimaryModule() Module {
2087 return b.bp.PrimaryModule().(Module)
2088}
2089
2090func (b *baseModuleContext) FinalModule() Module {
2091 return b.bp.FinalModule().(Module)
2092}
2093
Jiyong Park1c7e9622020-05-07 16:12:13 +09002094// A regexp for removing boilerplate from BaseDependencyTag from the string representation of
2095// a dependency tag.
Colin Cross6e511a92020-07-27 21:26:48 -07002096var tagCleaner = regexp.MustCompile(`\QBaseDependencyTag:{}\E(, )?`)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002097
2098// PrettyPrintTag returns string representation of the tag, but prefers
2099// custom String() method if available.
2100func PrettyPrintTag(tag blueprint.DependencyTag) string {
2101 // Use tag's custom String() method if available.
2102 if stringer, ok := tag.(fmt.Stringer); ok {
2103 return stringer.String()
2104 }
2105
2106 // Otherwise, get a default string representation of the tag's struct.
Colin Cross6e511a92020-07-27 21:26:48 -07002107 tagString := fmt.Sprintf("%T: %+v", tag, tag)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002108
2109 // Remove the boilerplate from BaseDependencyTag as it adds no value.
2110 tagString = tagCleaner.ReplaceAllString(tagString, "")
2111 return tagString
2112}
2113
2114func (b *baseModuleContext) GetPathString(skipFirst bool) string {
2115 sb := strings.Builder{}
2116 tagPath := b.GetTagPath()
2117 walkPath := b.GetWalkPath()
2118 if !skipFirst {
2119 sb.WriteString(walkPath[0].String())
2120 }
2121 for i, m := range walkPath[1:] {
2122 sb.WriteString("\n")
2123 sb.WriteString(fmt.Sprintf(" via tag %s\n", PrettyPrintTag(tagPath[i])))
2124 sb.WriteString(fmt.Sprintf(" -> %s", m.String()))
2125 }
2126 return sb.String()
2127}
2128
Colin Crossdc35e212019-06-06 16:13:11 -07002129func (m *moduleContext) ModuleSubDir() string {
2130 return m.bp.ModuleSubDir()
Colin Cross0875c522017-11-28 17:34:01 -08002131}
2132
Colin Cross0ea8ba82019-06-06 14:33:29 -07002133func (b *baseModuleContext) Target() Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002134 return b.target
Colin Crossa1ad8d12016-06-01 17:09:44 -07002135}
2136
Colin Cross0ea8ba82019-06-06 14:33:29 -07002137func (b *baseModuleContext) TargetPrimary() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002138 return b.targetPrimary
Colin Cross8b74d172016-09-13 09:59:14 -07002139}
2140
Colin Cross0ea8ba82019-06-06 14:33:29 -07002141func (b *baseModuleContext) MultiTargets() []Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002142 return b.multiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07002143}
2144
Colin Cross0ea8ba82019-06-06 14:33:29 -07002145func (b *baseModuleContext) Arch() Arch {
Colin Cross25de6c32019-06-06 14:29:25 -07002146 return b.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08002147}
2148
Colin Cross0ea8ba82019-06-06 14:33:29 -07002149func (b *baseModuleContext) Os() OsType {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002150 return b.os
Dan Willemsen490fd492015-11-24 17:53:15 -08002151}
2152
Colin Cross0ea8ba82019-06-06 14:33:29 -07002153func (b *baseModuleContext) Host() bool {
Jiyong Park1613e552020-09-14 19:43:17 +09002154 return b.os.Class == Host
Colin Crossf6566ed2015-03-24 11:13:38 -07002155}
2156
Colin Cross0ea8ba82019-06-06 14:33:29 -07002157func (b *baseModuleContext) Device() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002158 return b.os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07002159}
2160
Colin Cross0ea8ba82019-06-06 14:33:29 -07002161func (b *baseModuleContext) Darwin() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002162 return b.os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07002163}
2164
Colin Cross0ea8ba82019-06-06 14:33:29 -07002165func (b *baseModuleContext) Fuchsia() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002166 return b.os == Fuchsia
Doug Horn21b94272019-01-16 12:06:11 -08002167}
2168
Colin Cross0ea8ba82019-06-06 14:33:29 -07002169func (b *baseModuleContext) Windows() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002170 return b.os == Windows
Colin Cross3edeee12017-04-04 12:59:48 -07002171}
2172
Colin Cross0ea8ba82019-06-06 14:33:29 -07002173func (b *baseModuleContext) Debug() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002174 return b.debug
Colin Crossf6566ed2015-03-24 11:13:38 -07002175}
2176
Colin Cross0ea8ba82019-06-06 14:33:29 -07002177func (b *baseModuleContext) PrimaryArch() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002178 if len(b.config.Targets[b.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07002179 return true
2180 }
Colin Cross25de6c32019-06-06 14:29:25 -07002181 return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07002182}
2183
Jiyong Park5baac542018-08-28 09:55:37 +09002184// Makes this module a platform module, i.e. not specific to soc, device,
Justin Yund5f6c822019-06-25 16:47:17 +09002185// product, or system_ext.
Colin Cross4157e882019-06-06 16:57:04 -07002186func (m *ModuleBase) MakeAsPlatform() {
2187 m.commonProperties.Vendor = boolPtr(false)
2188 m.commonProperties.Proprietary = boolPtr(false)
2189 m.commonProperties.Soc_specific = boolPtr(false)
2190 m.commonProperties.Product_specific = boolPtr(false)
Justin Yund5f6c822019-06-25 16:47:17 +09002191 m.commonProperties.System_ext_specific = boolPtr(false)
Jiyong Park5baac542018-08-28 09:55:37 +09002192}
2193
Colin Cross4157e882019-06-06 16:57:04 -07002194func (m *ModuleBase) EnableNativeBridgeSupportByDefault() {
2195 m.commonProperties.Native_bridge_supported = boolPtr(true)
dimitry03dc3f62019-05-09 14:07:34 +02002196}
2197
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002198func (m *ModuleBase) MakeAsSystemExt() {
Jooyung Han91df2082019-11-20 01:49:42 +09002199 m.commonProperties.Vendor = boolPtr(false)
2200 m.commonProperties.Proprietary = boolPtr(false)
2201 m.commonProperties.Soc_specific = boolPtr(false)
2202 m.commonProperties.Product_specific = boolPtr(false)
2203 m.commonProperties.System_ext_specific = boolPtr(true)
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002204}
2205
Jooyung Han344d5432019-08-23 11:17:39 +09002206// IsNativeBridgeSupported returns true if "native_bridge_supported" is explicitly set as "true"
2207func (m *ModuleBase) IsNativeBridgeSupported() bool {
2208 return proptools.Bool(m.commonProperties.Native_bridge_supported)
2209}
2210
Colin Cross25de6c32019-06-06 14:29:25 -07002211func (m *moduleContext) InstallInData() bool {
2212 return m.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08002213}
2214
Jaewoong Jung0949f312019-09-11 10:25:18 -07002215func (m *moduleContext) InstallInTestcases() bool {
2216 return m.module.InstallInTestcases()
2217}
2218
Colin Cross25de6c32019-06-06 14:29:25 -07002219func (m *moduleContext) InstallInSanitizerDir() bool {
2220 return m.module.InstallInSanitizerDir()
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002221}
2222
Yifan Hong1b3348d2020-01-21 15:53:22 -08002223func (m *moduleContext) InstallInRamdisk() bool {
2224 return m.module.InstallInRamdisk()
2225}
2226
Colin Cross25de6c32019-06-06 14:29:25 -07002227func (m *moduleContext) InstallInRecovery() bool {
2228 return m.module.InstallInRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002229}
2230
Colin Cross90ba5f42019-10-02 11:10:58 -07002231func (m *moduleContext) InstallInRoot() bool {
2232 return m.module.InstallInRoot()
2233}
2234
Colin Cross607d8582019-07-29 16:44:46 -07002235func (m *moduleContext) InstallBypassMake() bool {
2236 return m.module.InstallBypassMake()
2237}
2238
Jiyong Park87788b52020-09-01 12:37:45 +09002239func (m *moduleContext) InstallForceOS() (*OsType, *ArchType) {
Colin Cross6e359402020-02-10 15:29:54 -08002240 return m.module.InstallForceOS()
2241}
2242
Colin Cross70dda7e2019-10-01 22:05:35 -07002243func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002244 if m.module.base().commonProperties.SkipInstall {
Colin Cross893d8162017-04-26 17:34:03 -07002245 return true
2246 }
2247
Colin Cross3607f212018-05-07 15:28:05 -07002248 // We'll need a solution for choosing which of modules with the same name in different
2249 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
2250 // list of namespaces to install in a Soong-only build.
Colin Cross25de6c32019-06-06 14:29:25 -07002251 if !m.module.base().commonProperties.NamespaceExportedToMake {
Colin Cross3607f212018-05-07 15:28:05 -07002252 return true
2253 }
2254
Colin Cross25de6c32019-06-06 14:29:25 -07002255 if m.Device() {
Colin Cross607d8582019-07-29 16:44:46 -07002256 if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
Colin Cross893d8162017-04-26 17:34:03 -07002257 return true
2258 }
2259
Colin Cross25de6c32019-06-06 14:29:25 -07002260 if m.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07002261 return true
2262 }
2263 }
2264
2265 return false
2266}
2267
Colin Cross70dda7e2019-10-01 22:05:35 -07002268func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
2269 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002270 return m.installFile(installPath, name, srcPath, Cp, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002271}
2272
Colin Cross70dda7e2019-10-01 22:05:35 -07002273func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
2274 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002275 return m.installFile(installPath, name, srcPath, CpExecutable, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002276}
2277
Colin Cross70dda7e2019-10-01 22:05:35 -07002278func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
2279 rule blueprint.Rule, deps []Path) InstallPath {
Colin Cross35cec122015-04-02 14:37:16 -07002280
Colin Cross25de6c32019-06-06 14:29:25 -07002281 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002282 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08002283
Colin Cross25de6c32019-06-06 14:29:25 -07002284 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002285
Colin Cross897266e2020-02-13 13:22:08 -08002286 deps = append(deps, m.installDeps.Paths()...)
Colin Cross35cec122015-04-02 14:37:16 -07002287
Colin Cross89562dc2016-10-03 17:47:19 -07002288 var implicitDeps, orderOnlyDeps Paths
2289
Colin Cross25de6c32019-06-06 14:29:25 -07002290 if m.Host() {
Colin Cross89562dc2016-10-03 17:47:19 -07002291 // Installed host modules might be used during the build, depend directly on their
2292 // dependencies so their timestamp is updated whenever their dependency is updated
2293 implicitDeps = deps
2294 } else {
2295 orderOnlyDeps = deps
2296 }
2297
Colin Cross25de6c32019-06-06 14:29:25 -07002298 m.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07002299 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07002300 Description: "install " + fullInstallPath.Base(),
2301 Output: fullInstallPath,
2302 Input: srcPath,
2303 Implicits: implicitDeps,
2304 OrderOnly: orderOnlyDeps,
Colin Cross25de6c32019-06-06 14:29:25 -07002305 Default: !m.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08002306 })
Colin Cross3f40fa42015-01-30 17:27:36 -08002307
Colin Cross25de6c32019-06-06 14:29:25 -07002308 m.installFiles = append(m.installFiles, fullInstallPath)
Dan Willemsen322acaf2016-01-12 23:07:05 -08002309 }
Colin Cross25de6c32019-06-06 14:29:25 -07002310 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07002311 return fullInstallPath
2312}
2313
Colin Cross70dda7e2019-10-01 22:05:35 -07002314func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002315 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002316 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08002317
Colin Cross25de6c32019-06-06 14:29:25 -07002318 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002319
Alex Lightfb4353d2019-01-17 13:57:45 -08002320 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
2321 if err != nil {
2322 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
2323 }
Colin Cross25de6c32019-06-06 14:29:25 -07002324 m.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07002325 Rule: Symlink,
2326 Description: "install symlink " + fullInstallPath.Base(),
2327 Output: fullInstallPath,
Dan Willemsen40efa1c2020-01-14 15:19:52 -08002328 Input: srcPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002329 Default: !m.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08002330 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08002331 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08002332 },
2333 })
Colin Cross3854a602016-01-11 12:49:11 -08002334
Colin Cross25de6c32019-06-06 14:29:25 -07002335 m.installFiles = append(m.installFiles, fullInstallPath)
2336 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross12fc4972016-01-11 12:49:11 -08002337 }
Colin Cross3854a602016-01-11 12:49:11 -08002338 return fullInstallPath
2339}
2340
Jiyong Parkf1194352019-02-25 11:05:47 +09002341// installPath/name -> absPath where absPath might be a path that is available only at runtime
2342// (e.g. /apex/...)
Colin Cross70dda7e2019-10-01 22:05:35 -07002343func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002344 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002345 m.module.base().hooks.runInstallHooks(m, nil, fullInstallPath, true)
Jiyong Parkf1194352019-02-25 11:05:47 +09002346
Colin Cross25de6c32019-06-06 14:29:25 -07002347 if !m.skipInstall(fullInstallPath) {
2348 m.Build(pctx, BuildParams{
Jiyong Parkf1194352019-02-25 11:05:47 +09002349 Rule: Symlink,
2350 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
2351 Output: fullInstallPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002352 Default: !m.Config().EmbeddedInMake(),
Jiyong Parkf1194352019-02-25 11:05:47 +09002353 Args: map[string]string{
2354 "fromPath": absPath,
2355 },
2356 })
2357
Colin Cross25de6c32019-06-06 14:29:25 -07002358 m.installFiles = append(m.installFiles, fullInstallPath)
Jiyong Parkf1194352019-02-25 11:05:47 +09002359 }
2360 return fullInstallPath
2361}
2362
Colin Cross25de6c32019-06-06 14:29:25 -07002363func (m *moduleContext) CheckbuildFile(srcPath Path) {
2364 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross3f40fa42015-01-30 17:27:36 -08002365}
2366
Colin Cross41955e82019-05-29 14:40:35 -07002367// SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input
2368// was not a module reference.
2369func SrcIsModule(s string) (module string) {
Colin Cross068e0fe2016-12-13 15:23:47 -08002370 if len(s) > 1 && s[0] == ':' {
2371 return s[1:]
2372 }
2373 return ""
2374}
2375
Colin Cross41955e82019-05-29 14:40:35 -07002376// SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the
2377// module name and an empty string for the tag, or empty strings if the input was not a module reference.
2378func SrcIsModuleWithTag(s string) (module, tag string) {
2379 if len(s) > 1 && s[0] == ':' {
2380 module = s[1:]
2381 if tagStart := strings.IndexByte(module, '{'); tagStart > 0 {
2382 if module[len(module)-1] == '}' {
2383 tag = module[tagStart+1 : len(module)-1]
2384 module = module[:tagStart]
2385 return module, tag
2386 }
2387 }
2388 return module, ""
2389 }
2390 return "", ""
Colin Cross068e0fe2016-12-13 15:23:47 -08002391}
2392
Colin Cross41955e82019-05-29 14:40:35 -07002393type sourceOrOutputDependencyTag struct {
2394 blueprint.BaseDependencyTag
2395 tag string
2396}
2397
2398func sourceOrOutputDepTag(tag string) blueprint.DependencyTag {
2399 return sourceOrOutputDependencyTag{tag: tag}
2400}
2401
2402var SourceDepTag = sourceOrOutputDepTag("")
Colin Cross068e0fe2016-12-13 15:23:47 -08002403
Colin Cross366938f2017-12-11 16:29:02 -08002404// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
2405// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002406//
2407// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08002408func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
Nan Zhang2439eb72017-04-10 11:27:50 -07002409 set := make(map[string]bool)
2410
Colin Cross068e0fe2016-12-13 15:23:47 -08002411 for _, s := range srcFiles {
Colin Cross41955e82019-05-29 14:40:35 -07002412 if m, t := SrcIsModuleWithTag(s); m != "" {
2413 if _, found := set[s]; found {
2414 ctx.ModuleErrorf("found source dependency duplicate: %q!", s)
Nan Zhang2439eb72017-04-10 11:27:50 -07002415 } else {
Colin Cross41955e82019-05-29 14:40:35 -07002416 set[s] = true
2417 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Nan Zhang2439eb72017-04-10 11:27:50 -07002418 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002419 }
2420 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002421}
2422
Colin Cross366938f2017-12-11 16:29:02 -08002423// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
2424// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002425//
2426// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08002427func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
2428 if s != nil {
Colin Cross41955e82019-05-29 14:40:35 -07002429 if m, t := SrcIsModuleWithTag(*s); m != "" {
2430 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Colin Cross366938f2017-12-11 16:29:02 -08002431 }
2432 }
2433}
2434
Colin Cross41955e82019-05-29 14:40:35 -07002435// A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"`
2436// 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 -08002437type SourceFileProducer interface {
2438 Srcs() Paths
2439}
2440
Colin Cross41955e82019-05-29 14:40:35 -07002441// A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"`
Roland Levillain97c1f342019-11-22 14:20:54 +00002442// 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 -07002443// listed in the property.
2444type OutputFileProducer interface {
2445 OutputFiles(tag string) (Paths, error)
2446}
2447
Colin Cross5e708052019-08-06 13:59:50 -07002448// OutputFilesForModule returns the paths from an OutputFileProducer with the given tag. On error, including if the
2449// module produced zero paths, it reports errors to the ctx and returns nil.
2450func OutputFilesForModule(ctx PathContext, module blueprint.Module, tag string) Paths {
2451 paths, err := outputFilesForModule(ctx, module, tag)
2452 if err != nil {
2453 reportPathError(ctx, err)
2454 return nil
2455 }
2456 return paths
2457}
2458
2459// OutputFileForModule returns the path from an OutputFileProducer with the given tag. On error, including if the
2460// module produced zero or multiple paths, it reports errors to the ctx and returns nil.
2461func OutputFileForModule(ctx PathContext, module blueprint.Module, tag string) Path {
2462 paths, err := outputFilesForModule(ctx, module, tag)
2463 if err != nil {
2464 reportPathError(ctx, err)
2465 return nil
2466 }
2467 if len(paths) > 1 {
Ulya Trafimovich5ab276a2020-08-25 12:45:15 +01002468 ReportPathErrorf(ctx, "got multiple output files from module %q, expected exactly one",
Colin Cross5e708052019-08-06 13:59:50 -07002469 pathContextName(ctx, module))
2470 return nil
2471 }
2472 return paths[0]
2473}
2474
2475func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
2476 if outputFileProducer, ok := module.(OutputFileProducer); ok {
2477 paths, err := outputFileProducer.OutputFiles(tag)
2478 if err != nil {
2479 return nil, fmt.Errorf("failed to get output file from module %q: %s",
2480 pathContextName(ctx, module), err.Error())
2481 }
2482 if len(paths) == 0 {
2483 return nil, fmt.Errorf("failed to get output files from module %q", pathContextName(ctx, module))
2484 }
2485 return paths, nil
2486 } else {
2487 return nil, fmt.Errorf("module %q is not an OutputFileProducer", pathContextName(ctx, module))
2488 }
2489}
2490
Colin Crossfe17f6f2019-03-28 19:30:56 -07002491type HostToolProvider interface {
2492 HostToolPath() OptionalPath
2493}
2494
Colin Cross27b922f2019-03-04 22:35:41 -08002495// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
2496// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002497//
2498// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002499func (m *moduleContext) ExpandSources(srcFiles, excludes []string) Paths {
2500 return PathsForModuleSrcExcludes(m, srcFiles, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07002501}
2502
Colin Cross2fafa3e2019-03-05 12:39:51 -08002503// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
2504// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002505//
2506// Deprecated: use PathForModuleSrc instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002507func (m *moduleContext) ExpandSource(srcFile, prop string) Path {
2508 return PathForModuleSrc(m, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08002509}
2510
2511// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
2512// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
2513// dependency resolution.
Colin Cross25de6c32019-06-06 14:29:25 -07002514func (m *moduleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
Colin Cross2fafa3e2019-03-05 12:39:51 -08002515 if srcFile != nil {
Colin Cross25de6c32019-06-06 14:29:25 -07002516 return OptionalPathForPath(PathForModuleSrc(m, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08002517 }
2518 return OptionalPath{}
2519}
2520
Colin Cross25de6c32019-06-06 14:29:25 -07002521func (m *moduleContext) RequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002522 return m.module.RequiredModuleNames()
Nan Zhang6d34b302017-02-04 17:47:46 -08002523}
2524
Colin Cross25de6c32019-06-06 14:29:25 -07002525func (m *moduleContext) HostRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002526 return m.module.HostRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002527}
2528
Colin Cross25de6c32019-06-06 14:29:25 -07002529func (m *moduleContext) TargetRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002530 return m.module.TargetRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002531}
2532
Colin Cross463a90e2015-06-17 14:20:06 -07002533func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07002534 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07002535}
2536
Colin Cross0875c522017-11-28 17:34:01 -08002537func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07002538 return &buildTargetSingleton{}
2539}
2540
Colin Cross87d8b562017-04-25 10:01:55 -07002541func parentDir(dir string) string {
2542 dir, _ = filepath.Split(dir)
2543 return filepath.Clean(dir)
2544}
2545
Colin Cross1f8c52b2015-06-16 16:38:17 -07002546type buildTargetSingleton struct{}
2547
Colin Cross0875c522017-11-28 17:34:01 -08002548func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
2549 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07002550
Colin Crossc3d87d32020-06-04 13:25:17 -07002551 mmTarget := func(dir string) string {
2552 return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1)
Colin Cross87d8b562017-04-25 10:01:55 -07002553 }
2554
Colin Cross0875c522017-11-28 17:34:01 -08002555 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002556
Colin Cross0875c522017-11-28 17:34:01 -08002557 ctx.VisitAllModules(func(module Module) {
2558 blueprintDir := module.base().blueprintDir
2559 installTarget := module.base().installTarget
2560 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07002561
Colin Cross0875c522017-11-28 17:34:01 -08002562 if checkbuildTarget != nil {
2563 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
2564 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
2565 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002566
Colin Cross0875c522017-11-28 17:34:01 -08002567 if installTarget != nil {
2568 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002569 }
2570 })
2571
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002572 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08002573 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002574 suffix = "-soong"
2575 }
2576
Colin Cross1f8c52b2015-06-16 16:38:17 -07002577 // Create a top-level checkbuild target that depends on all modules
Colin Crossc3d87d32020-06-04 13:25:17 -07002578 ctx.Phony("checkbuild"+suffix, checkbuildDeps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002579
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002580 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08002581 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002582 return
2583 }
2584
Colin Cross87d8b562017-04-25 10:01:55 -07002585 // Ensure ancestor directories are in modulesInDir
Inseob Kim1a365c62019-06-08 15:47:51 +09002586 dirs := SortedStringKeys(modulesInDir)
Colin Cross87d8b562017-04-25 10:01:55 -07002587 for _, dir := range dirs {
2588 dir := parentDir(dir)
2589 for dir != "." && dir != "/" {
2590 if _, exists := modulesInDir[dir]; exists {
2591 break
2592 }
2593 modulesInDir[dir] = nil
2594 dir = parentDir(dir)
2595 }
2596 }
2597
2598 // Make directories build their direct subdirectories
Colin Cross87d8b562017-04-25 10:01:55 -07002599 for _, dir := range dirs {
2600 p := parentDir(dir)
2601 if p != "." && p != "/" {
Colin Crossc3d87d32020-06-04 13:25:17 -07002602 modulesInDir[p] = append(modulesInDir[p], PathForPhony(ctx, mmTarget(dir)))
Colin Cross87d8b562017-04-25 10:01:55 -07002603 }
2604 }
2605
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002606 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
2607 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
2608 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07002609 for _, dir := range dirs {
Colin Crossc3d87d32020-06-04 13:25:17 -07002610 ctx.Phony(mmTarget(dir), modulesInDir[dir]...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002611 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002612
2613 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
Jiyong Park1613e552020-09-14 19:43:17 +09002614 type osAndCross struct {
2615 os OsType
2616 hostCross bool
2617 }
2618 osDeps := map[osAndCross]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08002619 ctx.VisitAllModules(func(module Module) {
2620 if module.Enabled() {
Jiyong Park1613e552020-09-14 19:43:17 +09002621 key := osAndCross{os: module.Target().Os, hostCross: module.Target().HostCross}
2622 osDeps[key] = append(osDeps[key], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002623 }
2624 })
2625
Colin Cross0875c522017-11-28 17:34:01 -08002626 osClass := make(map[string]Paths)
Jiyong Park1613e552020-09-14 19:43:17 +09002627 for key, deps := range osDeps {
Dan Willemsen61d88b82017-09-20 17:29:08 -07002628 var className string
2629
Jiyong Park1613e552020-09-14 19:43:17 +09002630 switch key.os.Class {
Dan Willemsen61d88b82017-09-20 17:29:08 -07002631 case Host:
Jiyong Park1613e552020-09-14 19:43:17 +09002632 if key.hostCross {
2633 className = "host-cross"
2634 } else {
2635 className = "host"
2636 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002637 case Device:
2638 className = "target"
2639 default:
2640 continue
2641 }
2642
Jiyong Park1613e552020-09-14 19:43:17 +09002643 name := className + "-" + key.os.Name
Colin Crossc3d87d32020-06-04 13:25:17 -07002644 osClass[className] = append(osClass[className], PathForPhony(ctx, name))
Dan Willemsen61d88b82017-09-20 17:29:08 -07002645
Colin Crossc3d87d32020-06-04 13:25:17 -07002646 ctx.Phony(name, deps...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002647 }
2648
2649 // Wrap those into host|host-cross|target phony rules
Inseob Kim1a365c62019-06-08 15:47:51 +09002650 for _, class := range SortedStringKeys(osClass) {
Colin Crossc3d87d32020-06-04 13:25:17 -07002651 ctx.Phony(class, osClass[class]...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002652 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002653}
Colin Crossd779da42015-12-17 18:00:23 -08002654
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002655// Collect information for opening IDE project files in java/jdeps.go.
2656type IDEInfo interface {
2657 IDEInfo(ideInfo *IdeInfo)
2658 BaseModuleName() string
2659}
2660
2661// Extract the base module name from the Import name.
2662// Often the Import name has a prefix "prebuilt_".
2663// Remove the prefix explicitly if needed
2664// until we find a better solution to get the Import name.
2665type IDECustomizedModuleName interface {
2666 IDECustomizedModuleName() string
2667}
2668
2669type IdeInfo struct {
2670 Deps []string `json:"dependencies,omitempty"`
2671 Srcs []string `json:"srcs,omitempty"`
2672 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
2673 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
2674 Jars []string `json:"jars,omitempty"`
2675 Classes []string `json:"class,omitempty"`
2676 Installed_paths []string `json:"installed,omitempty"`
patricktu18c82ff2019-05-10 15:48:50 +08002677 SrcJars []string `json:"srcjars,omitempty"`
bralee1fbf4402020-05-21 10:11:59 +08002678 Paths []string `json:"path,omitempty"`
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002679}
Paul Duffinf88d8e02020-05-07 20:21:34 +01002680
2681func CheckBlueprintSyntax(ctx BaseModuleContext, filename string, contents string) []error {
2682 bpctx := ctx.blueprintBaseModuleContext()
2683 return blueprint.CheckBlueprintSyntax(bpctx.ModuleFactories(), filename, contents)
2684}