blob: d677406a6d6fa008731ad7582aa117651f4f7c42 [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
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700351 InstallInVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900352 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700353 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700354 InstallBypassMake() bool
Jiyong Park87788b52020-09-01 12:37:45 +0900355 InstallForceOS() (*OsType, *ArchType)
Nan Zhang6d34b302017-02-04 17:47:46 -0800356
357 RequiredModuleNames() []string
Sasha Smundakb6d23052019-04-01 18:37:36 -0700358 HostRequiredModuleNames() []string
359 TargetRequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700360
Colin Cross3f68a132017-10-23 17:10:29 -0700361 ModuleSubDir() string
362
Colin Cross0875c522017-11-28 17:34:01 -0800363 Variable(pctx PackageContext, name, value string)
364 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700365 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
366 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800367 Build(pctx PackageContext, params BuildParams)
Colin Crossc3d87d32020-06-04 13:25:17 -0700368 // Phony creates a Make-style phony rule, a rule with no commands that can depend on other
369 // phony rules or real files. Phony can be called on the same name multiple times to add
370 // additional dependencies.
371 Phony(phony string, deps ...Path)
Colin Cross3f68a132017-10-23 17:10:29 -0700372
Colin Cross9f35c3d2020-09-16 19:04:41 -0700373 // GetMissingDependencies returns the list of dependencies that were passed to AddDependencies or related methods,
374 // but do not exist.
Colin Cross3f68a132017-10-23 17:10:29 -0700375 GetMissingDependencies() []string
Colin Cross3f40fa42015-01-30 17:27:36 -0800376}
377
Colin Cross635c3b02016-05-18 15:37:25 -0700378type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800379 blueprint.Module
380
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700381 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
382 // but GenerateAndroidBuildActions also has access to Android-specific information.
383 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700384 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700385
Paul Duffin44f1d842020-06-26 20:17:02 +0100386 // Add dependencies to the components of a module, i.e. modules that are created
387 // by the module and which are considered to be part of the creating module.
388 //
389 // This is called before prebuilts are renamed so as to allow a dependency to be
390 // added directly to a prebuilt child module instead of depending on a source module
391 // and relying on prebuilt processing to switch to the prebuilt module if preferred.
392 //
393 // A dependency on a prebuilt must include the "prebuilt_" prefix.
394 ComponentDepsMutator(ctx BottomUpMutatorContext)
395
Colin Cross1e676be2016-10-12 14:38:15 -0700396 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800397
Colin Cross635c3b02016-05-18 15:37:25 -0700398 base() *ModuleBase
Inseob Kimeec88e12020-01-22 11:11:29 +0900399 Disable()
Dan Willemsen0effe062015-11-30 16:06:01 -0800400 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700401 Target() Target
Anton Hansson1ee62c02020-06-30 11:51:53 +0100402 Owner() string
Dan Willemsen782a2d12015-12-21 14:55:28 -0800403 InstallInData() bool
Jaewoong Jung0949f312019-09-11 10:25:18 -0700404 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700405 InstallInSanitizerDir() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800406 InstallInRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700407 InstallInVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900408 InstallInRecovery() bool
Colin Cross90ba5f42019-10-02 11:10:58 -0700409 InstallInRoot() bool
Colin Cross607d8582019-07-29 16:44:46 -0700410 InstallBypassMake() bool
Jiyong Park87788b52020-09-01 12:37:45 +0900411 InstallForceOS() (*OsType, *ArchType)
Colin Crossa2f296f2016-11-29 15:16:18 -0800412 SkipInstall()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +0000413 IsSkipInstall() bool
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100414 MakeUninstallable()
Liz Kammer5ca3a622020-08-05 15:40:41 -0700415 ReplacedByPrebuilt()
416 IsReplacedByPrebuilt() bool
Jiyong Park374510b2018-03-19 18:23:01 +0900417 ExportedToMake() bool
Inseob Kim8471cda2019-11-15 09:59:12 +0900418 InitRc() Paths
419 VintfFragments() Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800420 NoticeFiles() Paths
Colin Cross36242852017-06-23 15:06:31 -0700421
422 AddProperties(props ...interface{})
423 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700424
Colin Crossae887032017-10-23 17:16:14 -0700425 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800426 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800427 VariablesForTests() map[string]string
Paul Duffine2453c72019-05-31 14:00:04 +0100428
Colin Cross9a362232019-07-01 15:32:45 -0700429 // String returns a string that includes the module name and variants for printing during debugging.
430 String() string
431
Paul Duffine2453c72019-05-31 14:00:04 +0100432 // Get the qualified module id for this module.
433 qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName
434
435 // Get information about the properties that can contain visibility rules.
436 visibilityProperties() []visibilityProperty
Paul Duffin63c6e182019-07-24 14:24:38 +0100437
Jiyong Park6a8cf5f2019-12-30 16:31:09 +0900438 RequiredModuleNames() []string
439 HostRequiredModuleNames() []string
440 TargetRequiredModuleNames() []string
Colin Cross897266e2020-02-13 13:22:08 -0800441
Jiyong Park4dc2a1a2020-09-28 17:46:22 +0900442 FilesToInstall() InstallPaths
Paul Duffine2453c72019-05-31 14:00:04 +0100443}
444
445// Qualified id for a module
446type qualifiedModuleName struct {
447 // The package (i.e. directory) in which the module is defined, without trailing /
448 pkg string
449
450 // The name of the module, empty string if package.
451 name string
452}
453
454func (q qualifiedModuleName) String() string {
455 if q.name == "" {
456 return "//" + q.pkg
457 }
458 return "//" + q.pkg + ":" + q.name
459}
460
Paul Duffine484f472019-06-20 16:38:08 +0100461func (q qualifiedModuleName) isRootPackage() bool {
462 return q.pkg == "" && q.name == ""
463}
464
Paul Duffine2453c72019-05-31 14:00:04 +0100465// Get the id for the package containing this module.
466func (q qualifiedModuleName) getContainingPackageId() qualifiedModuleName {
467 pkg := q.pkg
468 if q.name == "" {
Paul Duffine484f472019-06-20 16:38:08 +0100469 if pkg == "" {
470 panic(fmt.Errorf("Cannot get containing package id of root package"))
471 }
472
473 index := strings.LastIndex(pkg, "/")
474 if index == -1 {
475 pkg = ""
476 } else {
477 pkg = pkg[:index]
478 }
Paul Duffine2453c72019-05-31 14:00:04 +0100479 }
480 return newPackageId(pkg)
481}
482
483func newPackageId(pkg string) qualifiedModuleName {
484 // A qualified id for a package module has no name.
485 return qualifiedModuleName{pkg: pkg, name: ""}
Colin Cross3f40fa42015-01-30 17:27:36 -0800486}
487
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000488type Dist struct {
489 // Copy the output of this module to the $DIST_DIR when `dist` is specified on the
490 // command line and any of these targets are also on the command line, or otherwise
491 // built
492 Targets []string `android:"arch_variant"`
493
494 // The name of the output artifact. This defaults to the basename of the output of
495 // the module.
496 Dest *string `android:"arch_variant"`
497
498 // The directory within the dist directory to store the artifact. Defaults to the
499 // top level directory ("").
500 Dir *string `android:"arch_variant"`
501
502 // A suffix to add to the artifact file name (before any extension).
503 Suffix *string `android:"arch_variant"`
504
505 // A string tag to select the OutputFiles associated with the tag. Defaults to the
506 // the empty "" string.
507 Tag *string `android:"arch_variant"`
508}
509
Colin Crossfc754582016-05-17 16:34:16 -0700510type nameProperties struct {
511 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800512 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700513}
514
515type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800516 // emit build rules for this module
Paul Duffin54d9bb72020-02-12 10:20:56 +0000517 //
518 // Disabling a module should only be done for those modules that cannot be built
519 // in the current environment. Modules that can build in the current environment
520 // but are not usually required (e.g. superceded by a prebuilt) should not be
521 // disabled as that will prevent them from being built by the checkbuild target
522 // and so prevent early detection of changes that have broken those modules.
Dan Willemsen0effe062015-11-30 16:06:01 -0800523 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800524
Paul Duffin2e61fa62019-03-28 14:10:57 +0000525 // Controls the visibility of this module to other modules. Allowable values are one or more of
526 // these formats:
527 //
528 // ["//visibility:public"]: Anyone can use this module.
529 // ["//visibility:private"]: Only rules in the module's package (not its subpackages) can use
530 // this module.
Paul Duffin51084ff2020-05-05 19:19:22 +0100531 // ["//visibility:override"]: Discards any rules inherited from defaults or a creating module.
532 // Can only be used at the beginning of a list of visibility rules.
Paul Duffin2e61fa62019-03-28 14:10:57 +0000533 // ["//some/package:__pkg__", "//other/package:__pkg__"]: Only modules in some/package and
534 // other/package (defined in some/package/*.bp and other/package/*.bp) have access to
535 // this module. Note that sub-packages do not have access to the rule; for example,
536 // //some/package/foo:bar or //other/package/testing:bla wouldn't have access. __pkg__
537 // is a special module and must be used verbatim. It represents all of the modules in the
538 // package.
539 // ["//project:__subpackages__", "//other:__subpackages__"]: Only modules in packages project
540 // or other or in one of their sub-packages have access to this module. For example,
541 // //project:rule, //project/library:lib or //other/testing/internal:munge are allowed
542 // to depend on this rule (but not //independent:evil)
543 // ["//project"]: This is shorthand for ["//project:__pkg__"]
544 // [":__subpackages__"]: This is shorthand for ["//project:__subpackages__"] where
545 // //project is the module's package. e.g. using [":__subpackages__"] in
546 // packages/apps/Settings/Android.bp is equivalent to
547 // //packages/apps/Settings:__subpackages__.
548 // ["//visibility:legacy_public"]: The default visibility, behaves as //visibility:public
549 // for now. It is an error if it is used in a module.
Paul Duffine2453c72019-05-31 14:00:04 +0100550 //
551 // If a module does not specify the `visibility` property then it uses the
552 // `default_visibility` property of the `package` module in the module's package.
553 //
554 // If the `default_visibility` property is not set for the module's package then
Paul Duffine484f472019-06-20 16:38:08 +0100555 // it will use the `default_visibility` of its closest ancestor package for which
556 // a `default_visibility` property is specified.
557 //
558 // If no `default_visibility` property can be found then the module uses the
559 // global default of `//visibility:legacy_public`.
Paul Duffine2453c72019-05-31 14:00:04 +0100560 //
Paul Duffin95d53b52019-07-24 13:45:05 +0100561 // The `visibility` property has no effect on a defaults module although it does
562 // apply to any non-defaults module that uses it. To set the visibility of a
563 // defaults module, use the `defaults_visibility` property on the defaults module;
564 // not to be confused with the `default_visibility` property on the package module.
565 //
Paul Duffin2e61fa62019-03-28 14:10:57 +0000566 // See https://android.googlesource.com/platform/build/soong/+/master/README.md#visibility for
567 // more details.
568 Visibility []string
569
Colin Cross7d5136f2015-05-11 13:39:40 -0700570 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800571 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
572 // 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 +0000573 // platform).
Colin Cross7d716ba2017-11-01 10:38:29 -0700574 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700575
576 Target struct {
577 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700578 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700579 }
580 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700581 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700582 }
583 }
584
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000585 // If set to true then the archMutator will create variants for each arch specific target
586 // (e.g. 32/64) that the module is required to produce. If set to false then it will only
587 // create a variant for the architecture and will list the additional arch specific targets
588 // that the variant needs to produce in the CompileMultiTargets property.
Colin Crossee0bc3b2018-10-02 22:01:37 -0700589 UseTargetVariants bool `blueprint:"mutated"`
590 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800591
Dan Willemsen782a2d12015-12-21 14:55:28 -0800592 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700593 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800594
Colin Cross55708f32017-03-20 13:23:34 -0700595 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700596 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700597
Jiyong Park2db76922017-11-08 16:03:48 +0900598 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
599 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
600 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700601 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700602
Jiyong Park2db76922017-11-08 16:03:48 +0900603 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
604 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
605 Soc_specific *bool
606
607 // whether this module is specific to a device, not only for SoC, but also for off-chip
608 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
609 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
610 // This implies `soc_specific:true`.
611 Device_specific *bool
612
613 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900614 // network operator, etc). When set to true, it is installed into /product (or
615 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900616 Product_specific *bool
617
Justin Yund5f6c822019-06-25 16:47:17 +0900618 // whether this module extends system. When set to true, it is installed into /system_ext
619 // (or /system/system_ext if system_ext partition does not exist).
620 System_ext_specific *bool
621
Jiyong Parkf9332f12018-02-01 00:54:12 +0900622 // Whether this module is installed to recovery partition
623 Recovery *bool
624
Yifan Hong1b3348d2020-01-21 15:53:22 -0800625 // Whether this module is installed to ramdisk
626 Ramdisk *bool
627
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700628 // Whether this module is installed to vendor ramdisk
629 Vendor_ramdisk *bool
630
dimitry1f33e402019-03-26 12:39:31 +0100631 // Whether this module is built for non-native architecures (also known as native bridge binary)
632 Native_bridge_supported *bool `android:"arch_variant"`
633
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700634 // init.rc files to be installed if this module is installed
Colin Cross0bab8772020-09-25 14:01:21 -0700635 Init_rc []string `android:"arch_variant,path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700636
Steven Moreland57a23d22018-04-04 15:42:19 -0700637 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800638 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700639
Chris Wolfe998306e2016-08-15 14:47:23 -0400640 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700641 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400642
Sasha Smundakb6d23052019-04-01 18:37:36 -0700643 // names of other modules to install on host if this module is installed
644 Host_required []string `android:"arch_variant"`
645
646 // names of other modules to install on target if this module is installed
647 Target_required []string `android:"arch_variant"`
648
Colin Cross5aac3622017-08-31 15:07:09 -0700649 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800650 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700651
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000652 // The OsType of artifacts that this module variant is responsible for creating.
653 //
654 // Set by osMutator
655 CompileOS OsType `blueprint:"mutated"`
656
657 // The Target of artifacts that this module variant is responsible for creating.
658 //
659 // Set by archMutator
660 CompileTarget Target `blueprint:"mutated"`
661
662 // The additional arch specific targets (e.g. 32/64 bit) that this module variant is
663 // responsible for creating.
664 //
665 // By default this is nil as, where necessary, separate variants are created for the
666 // different multilib types supported and that information is encapsulated in the
667 // CompileTarget so the module variant simply needs to create artifacts for that.
668 //
669 // However, if UseTargetVariants is set to false (e.g. by
670 // InitAndroidMultiTargetsArchModule) then no separate variants are created for the
671 // multilib targets. Instead a single variant is created for the architecture and
672 // this contains the multilib specific targets that this variant should create.
673 //
674 // Set by archMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700675 CompileMultiTargets []Target `blueprint:"mutated"`
Paul Duffinca7f0ef2020-02-25 15:50:49 +0000676
677 // True if the module variant's CompileTarget is the primary target
678 //
679 // Set by archMutator
680 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800681
682 // Set by InitAndroidModule
683 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700684 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700685
Paul Duffin1356d8c2020-02-25 19:26:33 +0000686 // If set to true then a CommonOS variant will be created which will have dependencies
687 // on all its OsType specific variants. Used by sdk/module_exports to create a snapshot
688 // that covers all os and architecture variants.
689 //
690 // The OsType specific variants can be retrieved by calling
691 // GetOsSpecificVariantsOfCommonOSVariant
692 //
693 // Set at module initialization time by calling InitCommonOSAndroidMultiTargetsArchModule
694 CreateCommonOSVariant bool `blueprint:"mutated"`
695
696 // If set to true then this variant is the CommonOS variant that has dependencies on its
697 // OsType specific variants.
698 //
699 // Set by osMutator.
700 CommonOSVariant bool `blueprint:"mutated"`
701
Colin Crossce75d2c2016-10-06 16:12:58 -0700702 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800703
Liz Kammer5ca3a622020-08-05 15:40:41 -0700704 // Whether the module has been replaced by a prebuilt
705 ReplacedByPrebuilt bool `blueprint:"mutated"`
706
Justin Yun32f053b2020-07-31 23:07:17 +0900707 // Disabled by mutators. If set to true, it overrides Enabled property.
708 ForcedDisabled bool `blueprint:"mutated"`
709
Jeff Gaston088e29e2017-11-29 16:47:17 -0800710 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross6c4f21f2019-06-06 15:41:36 -0700711
712 MissingDeps []string `blueprint:"mutated"`
Colin Cross9a362232019-07-01 15:32:45 -0700713
714 // Name and variant strings stored by mutators to enable Module.String()
715 DebugName string `blueprint:"mutated"`
716 DebugMutators []string `blueprint:"mutated"`
717 DebugVariations []string `blueprint:"mutated"`
Colin Cross7228ecd2019-11-18 16:00:16 -0800718
719 // set by ImageMutator
720 ImageVariation string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800721}
722
Paul Duffined875132020-09-02 13:08:57 +0100723type distProperties struct {
724 // configuration to distribute output files from this module to the distribution
725 // directory (default: $OUT/dist, configurable with $DIST_DIR)
726 Dist Dist `android:"arch_variant"`
727
728 // a list of configurations to distribute output files from this module to the
729 // distribution directory (default: $OUT/dist, configurable with $DIST_DIR)
730 Dists []Dist `android:"arch_variant"`
731}
732
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000733// A map of OutputFile tag keys to Paths, for disting purposes.
734type TaggedDistFiles map[string]Paths
735
736func MakeDefaultDistFiles(paths ...Path) TaggedDistFiles {
Jingwen Chen7b27ca72020-07-24 09:13:49 +0000737 for _, path := range paths {
738 if path == nil {
739 panic("The path to a dist file cannot be nil.")
740 }
741 }
742
Jingwen Chen40fd90a2020-06-15 05:24:19 +0000743 // The default OutputFile tag is the empty "" string.
744 return TaggedDistFiles{"": paths}
745}
746
Colin Cross3f40fa42015-01-30 17:27:36 -0800747type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800748 // If set to true, build a variant of the module for the host. Defaults to false.
749 Host_supported *bool
750
751 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700752 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800753}
754
Colin Crossc472d572015-03-17 15:06:21 -0700755type Multilib string
756
757const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800758 MultilibBoth Multilib = "both"
759 MultilibFirst Multilib = "first"
760 MultilibCommon Multilib = "common"
761 MultilibCommonFirst Multilib = "common_first"
762 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700763)
764
Colin Crossa1ad8d12016-06-01 17:09:44 -0700765type HostOrDeviceSupported int
766
767const (
768 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700769
770 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700771 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700772
773 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700774 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700775
776 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700777 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700778
779 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700780 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700781
782 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700783 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700784
785 // Nothing is supported. This is not exposed to the user, but used to mark a
786 // host only module as unsupported when the module type is not supported on
787 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700788 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700789)
790
Jiyong Park2db76922017-11-08 16:03:48 +0900791type moduleKind int
792
793const (
794 platformModule moduleKind = iota
795 deviceSpecificModule
796 socSpecificModule
797 productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900798 systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900799)
800
801func (k moduleKind) String() string {
802 switch k {
803 case platformModule:
804 return "platform"
805 case deviceSpecificModule:
806 return "device-specific"
807 case socSpecificModule:
808 return "soc-specific"
809 case productSpecificModule:
810 return "product-specific"
Justin Yund5f6c822019-06-25 16:47:17 +0900811 case systemExtSpecificModule:
812 return "systemext-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900813 default:
814 panic(fmt.Errorf("unknown module kind %d", k))
815 }
816}
817
Colin Cross9d34f352019-11-22 16:03:51 -0800818func initAndroidModuleBase(m Module) {
819 m.base().module = m
820}
821
Colin Cross36242852017-06-23 15:06:31 -0700822func InitAndroidModule(m Module) {
Colin Cross9d34f352019-11-22 16:03:51 -0800823 initAndroidModuleBase(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800824 base := m.base()
Colin Cross5049f022015-03-18 13:28:46 -0700825
Colin Cross36242852017-06-23 15:06:31 -0700826 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700827 &base.nameProperties,
Paul Duffined875132020-09-02 13:08:57 +0100828 &base.commonProperties,
829 &base.distProperties)
Colin Cross18c46802019-09-24 22:19:02 -0700830
Colin Crosseabaedd2020-02-06 17:01:55 -0800831 initProductVariableModule(m)
Colin Cross18c46802019-09-24 22:19:02 -0700832
Colin Crossa3a97412019-03-18 12:24:29 -0700833 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700834 base.customizableProperties = m.GetProperties()
Paul Duffin63c6e182019-07-24 14:24:38 +0100835
836 // The default_visibility property needs to be checked and parsed by the visibility module during
Paul Duffin5ec73ec2020-05-01 17:52:01 +0100837 // its checking and parsing phases so make it the primary visibility property.
838 setPrimaryVisibilityProperty(m, "visibility", &base.commonProperties.Visibility)
Colin Cross5049f022015-03-18 13:28:46 -0700839}
840
Colin Cross36242852017-06-23 15:06:31 -0700841func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
842 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700843
844 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800845 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700846 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700847 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700848 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800849
Dan Willemsen218f6562015-07-08 18:13:11 -0700850 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700851 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700852 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800853 }
854
Colin Cross36242852017-06-23 15:06:31 -0700855 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800856}
857
Colin Crossee0bc3b2018-10-02 22:01:37 -0700858func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
859 InitAndroidArchModule(m, hod, defaultMultilib)
860 m.base().commonProperties.UseTargetVariants = false
861}
862
Paul Duffin1356d8c2020-02-25 19:26:33 +0000863// As InitAndroidMultiTargetsArchModule except it creates an additional CommonOS variant that
864// has dependencies on all the OsType specific variants.
865func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
866 InitAndroidArchModule(m, hod, defaultMultilib)
867 m.base().commonProperties.UseTargetVariants = false
868 m.base().commonProperties.CreateCommonOSVariant = true
869}
870
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800871// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800872// modules. It should be included as an anonymous field in every module
873// struct definition. InitAndroidModule should then be called from the module's
874// factory function, and the return values from InitAndroidModule should be
875// returned from the factory function.
876//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800877// The ModuleBase type is responsible for implementing the GenerateBuildActions
878// method to support the blueprint.Module interface. This method will then call
879// the module's GenerateAndroidBuildActions method once for each build variant
Colin Cross25de6c32019-06-06 14:29:25 -0700880// that is to be built. GenerateAndroidBuildActions is passed a ModuleContext
881// rather than the usual blueprint.ModuleContext.
882// ModuleContext exposes extra functionality specific to the Android build
Colin Cross3f40fa42015-01-30 17:27:36 -0800883// system including details about the particular build variant that is to be
884// generated.
885//
886// For example:
887//
888// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800889// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800890// )
891//
892// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800893// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800894// properties struct {
895// MyProperty string
896// }
897// }
898//
Colin Cross36242852017-06-23 15:06:31 -0700899// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800900// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700901// m.AddProperties(&m.properties)
902// android.InitAndroidModule(m)
903// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800904// }
905//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800906// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800907// // Get the CPU architecture for the current build variant.
908// variantArch := ctx.Arch()
909//
910// // ...
911// }
Colin Cross635c3b02016-05-18 15:37:25 -0700912type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800913 // Putting the curiously recurring thing pointing to the thing that contains
914 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700915 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700916 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800917
Colin Crossfc754582016-05-17 16:34:16 -0700918 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800919 commonProperties commonProperties
Paul Duffined875132020-09-02 13:08:57 +0100920 distProperties distProperties
Colin Cross18c46802019-09-24 22:19:02 -0700921 variableProperties interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800922 hostAndDeviceProperties hostAndDeviceProperties
923 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700924 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700925 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800926
Paul Duffin63c6e182019-07-24 14:24:38 +0100927 // Information about all the properties on the module that contains visibility rules that need
928 // checking.
929 visibilityPropertyInfo []visibilityProperty
930
931 // The primary visibility property, may be nil, that controls access to the module.
932 primaryVisibilityProperty visibilityProperty
933
Colin Cross3f40fa42015-01-30 17:27:36 -0800934 noAddressSanitizer bool
Colin Cross897266e2020-02-13 13:22:08 -0800935 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700936 checkbuildFiles Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800937 noticeFiles Paths
Colin Crossc3d87d32020-06-04 13:25:17 -0700938 phonies map[string]Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700939
940 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
941 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800942 installTarget WritablePath
943 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700944 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700945
Colin Cross178a5092016-09-13 13:42:32 -0700946 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700947
948 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700949
950 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700951 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800952 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800953 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700954
Inseob Kim8471cda2019-11-15 09:59:12 +0900955 initRcPaths Paths
956 vintfFragmentsPaths Paths
957
Jiyong Park1613e552020-09-14 19:43:17 +0900958 prefer32 func(ctx BaseModuleContext, base *ModuleBase, os OsType) bool
Colin Cross36242852017-06-23 15:06:31 -0700959}
960
Paul Duffin44f1d842020-06-26 20:17:02 +0100961func (m *ModuleBase) ComponentDepsMutator(BottomUpMutatorContext) {}
962
Colin Cross4157e882019-06-06 16:57:04 -0700963func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
Colin Cross5f692ec2019-02-01 16:53:07 -0800964
Colin Cross4157e882019-06-06 16:57:04 -0700965func (m *ModuleBase) AddProperties(props ...interface{}) {
966 m.registerProps = append(m.registerProps, props...)
Colin Cross36242852017-06-23 15:06:31 -0700967}
968
Colin Cross4157e882019-06-06 16:57:04 -0700969func (m *ModuleBase) GetProperties() []interface{} {
970 return m.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800971}
972
Colin Cross4157e882019-06-06 16:57:04 -0700973func (m *ModuleBase) BuildParamsForTests() []BuildParams {
974 return m.buildParams
Colin Crosscec81712017-07-13 14:43:27 -0700975}
976
Colin Cross4157e882019-06-06 16:57:04 -0700977func (m *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
978 return m.ruleParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800979}
980
Colin Cross4157e882019-06-06 16:57:04 -0700981func (m *ModuleBase) VariablesForTests() map[string]string {
982 return m.variables
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800983}
984
Jiyong Park1613e552020-09-14 19:43:17 +0900985func (m *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, os OsType) bool) {
Colin Cross4157e882019-06-06 16:57:04 -0700986 m.prefer32 = prefer32
Colin Crossa9d8bee2018-10-02 13:59:46 -0700987}
988
Colin Crossce75d2c2016-10-06 16:12:58 -0700989// Name returns the name of the module. It may be overridden by individual module types, for
990// example prebuilts will prepend prebuilt_ to the name.
Colin Cross4157e882019-06-06 16:57:04 -0700991func (m *ModuleBase) Name() string {
992 return String(m.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700993}
994
Colin Cross9a362232019-07-01 15:32:45 -0700995// String returns a string that includes the module name and variants for printing during debugging.
996func (m *ModuleBase) String() string {
997 sb := strings.Builder{}
998 sb.WriteString(m.commonProperties.DebugName)
999 sb.WriteString("{")
1000 for i := range m.commonProperties.DebugMutators {
1001 if i != 0 {
1002 sb.WriteString(",")
1003 }
1004 sb.WriteString(m.commonProperties.DebugMutators[i])
1005 sb.WriteString(":")
1006 sb.WriteString(m.commonProperties.DebugVariations[i])
1007 }
1008 sb.WriteString("}")
1009 return sb.String()
1010}
1011
Colin Crossce75d2c2016-10-06 16:12:58 -07001012// BaseModuleName returns the name of the module as specified in the blueprints file.
Colin Cross4157e882019-06-06 16:57:04 -07001013func (m *ModuleBase) BaseModuleName() string {
1014 return String(m.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -07001015}
1016
Colin Cross4157e882019-06-06 16:57:04 -07001017func (m *ModuleBase) base() *ModuleBase {
1018 return m
Colin Cross3f40fa42015-01-30 17:27:36 -08001019}
1020
Paul Duffine2453c72019-05-31 14:00:04 +01001021func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
1022 return qualifiedModuleName{pkg: ctx.ModuleDir(), name: ctx.ModuleName()}
1023}
1024
1025func (m *ModuleBase) visibilityProperties() []visibilityProperty {
Paul Duffin63c6e182019-07-24 14:24:38 +01001026 return m.visibilityPropertyInfo
1027}
1028
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001029func (m *ModuleBase) Dists() []Dist {
Paul Duffined875132020-09-02 13:08:57 +01001030 if len(m.distProperties.Dist.Targets) > 0 {
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001031 // Make a copy of the underlying Dists slice to protect against
1032 // backing array modifications with repeated calls to this method.
Paul Duffined875132020-09-02 13:08:57 +01001033 distsCopy := append([]Dist(nil), m.distProperties.Dists...)
1034 return append(distsCopy, m.distProperties.Dist)
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001035 } else {
Paul Duffined875132020-09-02 13:08:57 +01001036 return m.distProperties.Dists
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001037 }
1038}
1039
1040func (m *ModuleBase) GenerateTaggedDistFiles(ctx BaseModuleContext) TaggedDistFiles {
1041 distFiles := make(TaggedDistFiles)
1042 for _, dist := range m.Dists() {
1043 var tag string
1044 var distFilesForTag Paths
1045 if dist.Tag == nil {
1046 tag = ""
1047 } else {
1048 tag = *dist.Tag
1049 }
1050 distFilesForTag, err := m.base().module.(OutputFileProducer).OutputFiles(tag)
1051 if err != nil {
1052 ctx.PropertyErrorf("dist.tag", "%s", err.Error())
1053 }
1054 for _, distFile := range distFilesForTag {
1055 if distFile != nil && !distFiles[tag].containsPath(distFile) {
1056 distFiles[tag] = append(distFiles[tag], distFile)
1057 }
1058 }
1059 }
1060
1061 return distFiles
1062}
1063
Colin Cross4157e882019-06-06 16:57:04 -07001064func (m *ModuleBase) Target() Target {
1065 return m.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -08001066}
1067
Colin Cross4157e882019-06-06 16:57:04 -07001068func (m *ModuleBase) TargetPrimary() bool {
1069 return m.commonProperties.CompilePrimary
Colin Cross8b74d172016-09-13 09:59:14 -07001070}
1071
Colin Cross4157e882019-06-06 16:57:04 -07001072func (m *ModuleBase) MultiTargets() []Target {
1073 return m.commonProperties.CompileMultiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07001074}
1075
Colin Cross4157e882019-06-06 16:57:04 -07001076func (m *ModuleBase) Os() OsType {
1077 return m.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001078}
1079
Colin Cross4157e882019-06-06 16:57:04 -07001080func (m *ModuleBase) Host() bool {
Jiyong Park1613e552020-09-14 19:43:17 +09001081 return m.Os().Class == Host
Dan Willemsen97750522016-02-09 17:43:51 -08001082}
1083
Yo Chiangbba545e2020-06-09 16:15:37 +08001084func (m *ModuleBase) Device() bool {
1085 return m.Os().Class == Device
1086}
1087
Colin Cross4157e882019-06-06 16:57:04 -07001088func (m *ModuleBase) Arch() Arch {
1089 return m.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -08001090}
1091
Colin Cross4157e882019-06-06 16:57:04 -07001092func (m *ModuleBase) ArchSpecific() bool {
1093 return m.commonProperties.ArchSpecific
Dan Willemsen0b24c742016-10-04 15:13:37 -07001094}
1095
Paul Duffin1356d8c2020-02-25 19:26:33 +00001096// True if the current variant is a CommonOS variant, false otherwise.
1097func (m *ModuleBase) IsCommonOSVariant() bool {
1098 return m.commonProperties.CommonOSVariant
1099}
1100
Jiyong Park1613e552020-09-14 19:43:17 +09001101func (m *ModuleBase) supportsTarget(target Target, config Config) bool {
Colin Cross4157e882019-06-06 16:57:04 -07001102 switch m.commonProperties.HostOrDeviceSupported {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001103 case HostSupported:
Jiyong Park1613e552020-09-14 19:43:17 +09001104 return target.Os.Class == Host
Dan Albertc6345fb2016-10-20 01:36:11 -07001105 case HostSupportedNoCross:
Jiyong Park1613e552020-09-14 19:43:17 +09001106 return target.Os.Class == Host && !target.HostCross
Colin Crossa1ad8d12016-06-01 17:09:44 -07001107 case DeviceSupported:
Jiyong Park1613e552020-09-14 19:43:17 +09001108 return target.Os.Class == Device
Dan Albert0981b5c2018-08-02 13:46:35 -07001109 case HostAndDeviceSupported, HostAndDeviceDefault:
Jiyong Park1613e552020-09-14 19:43:17 +09001110 supported := false
Colin Cross4157e882019-06-06 16:57:04 -07001111 if Bool(m.hostAndDeviceProperties.Host_supported) ||
1112 (m.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
1113 m.hostAndDeviceProperties.Host_supported == nil) {
Jiyong Park1613e552020-09-14 19:43:17 +09001114 supported = supported || target.Os.Class == Host
Colin Crossa1ad8d12016-06-01 17:09:44 -07001115 }
Colin Cross4157e882019-06-06 16:57:04 -07001116 if m.hostAndDeviceProperties.Device_supported == nil ||
1117 *m.hostAndDeviceProperties.Device_supported {
Jiyong Park1613e552020-09-14 19:43:17 +09001118 supported = supported || target.Os.Class == Device
Colin Crossa1ad8d12016-06-01 17:09:44 -07001119 }
1120 return supported
1121 default:
Jiyong Park1613e552020-09-14 19:43:17 +09001122 return false
Colin Crossa1ad8d12016-06-01 17:09:44 -07001123 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001124}
1125
Colin Cross4157e882019-06-06 16:57:04 -07001126func (m *ModuleBase) DeviceSupported() bool {
1127 return m.commonProperties.HostOrDeviceSupported == DeviceSupported ||
1128 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
1129 (m.hostAndDeviceProperties.Device_supported == nil ||
1130 *m.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -08001131}
1132
Paul Duffine44358f2019-11-26 18:04:12 +00001133func (m *ModuleBase) HostSupported() bool {
1134 return m.commonProperties.HostOrDeviceSupported == HostSupported ||
1135 m.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
1136 (m.hostAndDeviceProperties.Host_supported != nil &&
1137 *m.hostAndDeviceProperties.Host_supported)
1138}
1139
Colin Cross4157e882019-06-06 16:57:04 -07001140func (m *ModuleBase) Platform() bool {
Justin Yund5f6c822019-06-25 16:47:17 +09001141 return !m.DeviceSpecific() && !m.SocSpecific() && !m.ProductSpecific() && !m.SystemExtSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +09001142}
1143
Colin Cross4157e882019-06-06 16:57:04 -07001144func (m *ModuleBase) DeviceSpecific() bool {
1145 return Bool(m.commonProperties.Device_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001146}
1147
Colin Cross4157e882019-06-06 16:57:04 -07001148func (m *ModuleBase) SocSpecific() bool {
1149 return Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001150}
1151
Colin Cross4157e882019-06-06 16:57:04 -07001152func (m *ModuleBase) ProductSpecific() bool {
1153 return Bool(m.commonProperties.Product_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001154}
1155
Justin Yund5f6c822019-06-25 16:47:17 +09001156func (m *ModuleBase) SystemExtSpecific() bool {
1157 return Bool(m.commonProperties.System_ext_specific)
Dario Frenifd05a742018-05-29 13:28:54 +01001158}
1159
Colin Crossc2d24052020-05-13 11:05:02 -07001160// RequiresStableAPIs returns true if the module will be installed to a partition that may
1161// be updated separately from the system image.
1162func (m *ModuleBase) RequiresStableAPIs(ctx BaseModuleContext) bool {
1163 return m.SocSpecific() || m.DeviceSpecific() ||
1164 (m.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface())
1165}
1166
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001167func (m *ModuleBase) PartitionTag(config DeviceConfig) string {
1168 partition := "system"
1169 if m.SocSpecific() {
1170 // A SoC-specific module could be on the vendor partition at
1171 // "vendor" or the system partition at "system/vendor".
1172 if config.VendorPath() == "vendor" {
1173 partition = "vendor"
1174 }
1175 } else if m.DeviceSpecific() {
1176 // A device-specific module could be on the odm partition at
1177 // "odm", the vendor partition at "vendor/odm", or the system
1178 // partition at "system/vendor/odm".
1179 if config.OdmPath() == "odm" {
1180 partition = "odm"
Ramy Medhat944839a2020-03-31 22:14:52 -04001181 } else if strings.HasPrefix(config.OdmPath(), "vendor/") {
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001182 partition = "vendor"
1183 }
1184 } else if m.ProductSpecific() {
1185 // A product-specific module could be on the product partition
1186 // at "product" or the system partition at "system/product".
1187 if config.ProductPath() == "product" {
1188 partition = "product"
1189 }
1190 } else if m.SystemExtSpecific() {
1191 // A system_ext-specific module could be on the system_ext
1192 // partition at "system_ext" or the system partition at
1193 // "system/system_ext".
1194 if config.SystemExtPath() == "system_ext" {
1195 partition = "system_ext"
1196 }
1197 }
1198 return partition
1199}
1200
Colin Cross4157e882019-06-06 16:57:04 -07001201func (m *ModuleBase) Enabled() bool {
Justin Yun32f053b2020-07-31 23:07:17 +09001202 if m.commonProperties.ForcedDisabled {
1203 return false
1204 }
Colin Cross4157e882019-06-06 16:57:04 -07001205 if m.commonProperties.Enabled == nil {
1206 return !m.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -08001207 }
Colin Cross4157e882019-06-06 16:57:04 -07001208 return *m.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -08001209}
1210
Inseob Kimeec88e12020-01-22 11:11:29 +09001211func (m *ModuleBase) Disable() {
Justin Yun32f053b2020-07-31 23:07:17 +09001212 m.commonProperties.ForcedDisabled = true
Inseob Kimeec88e12020-01-22 11:11:29 +09001213}
1214
Colin Cross4157e882019-06-06 16:57:04 -07001215func (m *ModuleBase) SkipInstall() {
1216 m.commonProperties.SkipInstall = true
Colin Crossce75d2c2016-10-06 16:12:58 -07001217}
1218
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00001219func (m *ModuleBase) IsSkipInstall() bool {
1220 return m.commonProperties.SkipInstall == true
1221}
1222
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01001223// Similar to SkipInstall, but if the AndroidMk entry would set
1224// LOCAL_UNINSTALLABLE_MODULE then this variant may still output that entry
1225// rather than leaving it out altogether. That happens in cases where it would
1226// have other side effects, in particular when it adds a NOTICE file target,
1227// which other install targets might depend on.
1228func (m *ModuleBase) MakeUninstallable() {
1229 m.SkipInstall()
1230}
1231
Liz Kammer5ca3a622020-08-05 15:40:41 -07001232func (m *ModuleBase) ReplacedByPrebuilt() {
1233 m.commonProperties.ReplacedByPrebuilt = true
1234 m.SkipInstall()
1235}
1236
1237func (m *ModuleBase) IsReplacedByPrebuilt() bool {
1238 return m.commonProperties.ReplacedByPrebuilt
1239}
1240
Colin Cross4157e882019-06-06 16:57:04 -07001241func (m *ModuleBase) ExportedToMake() bool {
1242 return m.commonProperties.NamespaceExportedToMake
Jiyong Park374510b2018-03-19 18:23:01 +09001243}
1244
Colin Cross897266e2020-02-13 13:22:08 -08001245func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {
Colin Crossb5ae1932020-11-17 06:32:06 +00001246
Colin Cross897266e2020-02-13 13:22:08 -08001247 var result InstallPaths
Colin Crossb5ae1932020-11-17 06:32:06 +00001248 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
1249 ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
1250 if a, ok := m.(Module); ok {
1251 result = append(result, a.FilesToInstall()...)
Colin Cross897266e2020-02-13 13:22:08 -08001252 }
1253 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001254
1255 return result
1256}
1257
Jiyong Park4dc2a1a2020-09-28 17:46:22 +09001258func (m *ModuleBase) FilesToInstall() InstallPaths {
Colin Cross4157e882019-06-06 16:57:04 -07001259 return m.installFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001260}
1261
Colin Cross4157e882019-06-06 16:57:04 -07001262func (m *ModuleBase) NoAddressSanitizer() bool {
1263 return m.noAddressSanitizer
Colin Cross3f40fa42015-01-30 17:27:36 -08001264}
1265
Colin Cross4157e882019-06-06 16:57:04 -07001266func (m *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -08001267 return false
1268}
1269
Jaewoong Jung0949f312019-09-11 10:25:18 -07001270func (m *ModuleBase) InstallInTestcases() bool {
1271 return false
1272}
1273
Colin Cross4157e882019-06-06 16:57:04 -07001274func (m *ModuleBase) InstallInSanitizerDir() bool {
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001275 return false
1276}
1277
Yifan Hong1b3348d2020-01-21 15:53:22 -08001278func (m *ModuleBase) InstallInRamdisk() bool {
1279 return Bool(m.commonProperties.Ramdisk)
1280}
1281
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001282func (m *ModuleBase) InstallInVendorRamdisk() bool {
1283 return Bool(m.commonProperties.Vendor_ramdisk)
1284}
1285
Colin Cross4157e882019-06-06 16:57:04 -07001286func (m *ModuleBase) InstallInRecovery() bool {
1287 return Bool(m.commonProperties.Recovery)
Jiyong Parkf9332f12018-02-01 00:54:12 +09001288}
1289
Colin Cross90ba5f42019-10-02 11:10:58 -07001290func (m *ModuleBase) InstallInRoot() bool {
1291 return false
1292}
1293
Colin Cross607d8582019-07-29 16:44:46 -07001294func (m *ModuleBase) InstallBypassMake() bool {
1295 return false
1296}
1297
Jiyong Park87788b52020-09-01 12:37:45 +09001298func (m *ModuleBase) InstallForceOS() (*OsType, *ArchType) {
1299 return nil, nil
Colin Cross6e359402020-02-10 15:29:54 -08001300}
1301
Colin Cross4157e882019-06-06 16:57:04 -07001302func (m *ModuleBase) Owner() string {
1303 return String(m.commonProperties.Owner)
Sundong Ahn4fd04bb2018-08-31 18:01:37 +09001304}
1305
Bob Badoura75b0572020-02-18 20:21:55 -08001306func (m *ModuleBase) NoticeFiles() Paths {
1307 return m.noticeFiles
Jiyong Park52818fc2019-03-18 12:01:38 +09001308}
1309
Colin Cross7228ecd2019-11-18 16:00:16 -08001310func (m *ModuleBase) setImageVariation(variant string) {
1311 m.commonProperties.ImageVariation = variant
1312}
1313
1314func (m *ModuleBase) ImageVariation() blueprint.Variation {
1315 return blueprint.Variation{
1316 Mutator: "image",
1317 Variation: m.base().commonProperties.ImageVariation,
1318 }
1319}
1320
Paul Duffin9b76c0b2020-03-12 10:24:35 +00001321func (m *ModuleBase) getVariationByMutatorName(mutator string) string {
1322 for i, v := range m.commonProperties.DebugMutators {
1323 if v == mutator {
1324 return m.commonProperties.DebugVariations[i]
1325 }
1326 }
1327
1328 return ""
1329}
1330
Yifan Hong1b3348d2020-01-21 15:53:22 -08001331func (m *ModuleBase) InRamdisk() bool {
1332 return m.base().commonProperties.ImageVariation == RamdiskVariation
1333}
1334
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001335func (m *ModuleBase) InVendorRamdisk() bool {
1336 return m.base().commonProperties.ImageVariation == VendorRamdiskVariation
1337}
1338
Colin Cross7228ecd2019-11-18 16:00:16 -08001339func (m *ModuleBase) InRecovery() bool {
1340 return m.base().commonProperties.ImageVariation == RecoveryVariation
1341}
1342
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09001343func (m *ModuleBase) RequiredModuleNames() []string {
1344 return m.base().commonProperties.Required
1345}
1346
1347func (m *ModuleBase) HostRequiredModuleNames() []string {
1348 return m.base().commonProperties.Host_required
1349}
1350
1351func (m *ModuleBase) TargetRequiredModuleNames() []string {
1352 return m.base().commonProperties.Target_required
1353}
1354
Inseob Kim8471cda2019-11-15 09:59:12 +09001355func (m *ModuleBase) InitRc() Paths {
1356 return append(Paths{}, m.initRcPaths...)
1357}
1358
1359func (m *ModuleBase) VintfFragments() Paths {
1360 return append(Paths{}, m.vintfFragmentsPaths...)
1361}
1362
Colin Cross4157e882019-06-06 16:57:04 -07001363func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Colin Cross897266e2020-02-13 13:22:08 -08001364 var allInstalledFiles InstallPaths
1365 var allCheckbuildFiles Paths
Colin Cross0875c522017-11-28 17:34:01 -08001366 ctx.VisitAllModuleVariants(func(module Module) {
1367 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -07001368 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
1369 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -08001370 })
1371
Colin Cross0875c522017-11-28 17:34:01 -08001372 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -07001373
Colin Cross133ebef2020-08-14 17:38:45 -07001374 namespacePrefix := ctx.Namespace().id
Jeff Gaston088e29e2017-11-29 16:47:17 -08001375 if namespacePrefix != "" {
1376 namespacePrefix = namespacePrefix + "-"
1377 }
1378
Colin Cross3f40fa42015-01-30 17:27:36 -08001379 if len(allInstalledFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001380 name := namespacePrefix + ctx.ModuleName() + "-install"
1381 ctx.Phony(name, allInstalledFiles.Paths()...)
1382 m.installTarget = PathForPhony(ctx, name)
1383 deps = append(deps, m.installTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001384 }
1385
1386 if len(allCheckbuildFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001387 name := namespacePrefix + ctx.ModuleName() + "-checkbuild"
1388 ctx.Phony(name, allCheckbuildFiles...)
1389 m.checkbuildTarget = PathForPhony(ctx, name)
1390 deps = append(deps, m.checkbuildTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001391 }
1392
1393 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001394 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001395 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001396 suffix = "-soong"
1397 }
1398
Colin Crossc3d87d32020-06-04 13:25:17 -07001399 ctx.Phony(namespacePrefix+ctx.ModuleName()+suffix, deps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001400
Colin Cross4157e882019-06-06 16:57:04 -07001401 m.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -08001402 }
1403}
1404
Colin Crossc34d2322020-01-03 15:23:27 -08001405func determineModuleKind(m *ModuleBase, ctx blueprint.EarlyModuleContext) moduleKind {
Colin Cross4157e882019-06-06 16:57:04 -07001406 var socSpecific = Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
1407 var deviceSpecific = Bool(m.commonProperties.Device_specific)
1408 var productSpecific = Bool(m.commonProperties.Product_specific)
Justin Yund5f6c822019-06-25 16:47:17 +09001409 var systemExtSpecific = Bool(m.commonProperties.System_ext_specific)
Jiyong Park2db76922017-11-08 16:03:48 +09001410
Dario Frenifd05a742018-05-29 13:28:54 +01001411 msg := "conflicting value set here"
1412 if socSpecific && deviceSpecific {
1413 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Colin Cross4157e882019-06-06 16:57:04 -07001414 if Bool(m.commonProperties.Vendor) {
Jiyong Park2db76922017-11-08 16:03:48 +09001415 ctx.PropertyErrorf("vendor", msg)
1416 }
Colin Cross4157e882019-06-06 16:57:04 -07001417 if Bool(m.commonProperties.Proprietary) {
Jiyong Park2db76922017-11-08 16:03:48 +09001418 ctx.PropertyErrorf("proprietary", msg)
1419 }
Colin Cross4157e882019-06-06 16:57:04 -07001420 if Bool(m.commonProperties.Soc_specific) {
Jiyong Park2db76922017-11-08 16:03:48 +09001421 ctx.PropertyErrorf("soc_specific", msg)
1422 }
1423 }
1424
Justin Yund5f6c822019-06-25 16:47:17 +09001425 if productSpecific && systemExtSpecific {
1426 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and system_ext at the same time.")
1427 ctx.PropertyErrorf("system_ext_specific", msg)
Dario Frenifd05a742018-05-29 13:28:54 +01001428 }
1429
Justin Yund5f6c822019-06-25 16:47:17 +09001430 if (socSpecific || deviceSpecific) && (productSpecific || systemExtSpecific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001431 if productSpecific {
1432 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
1433 } else {
Justin Yund5f6c822019-06-25 16:47:17 +09001434 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 +01001435 }
1436 if deviceSpecific {
1437 ctx.PropertyErrorf("device_specific", msg)
1438 } else {
Colin Cross4157e882019-06-06 16:57:04 -07001439 if Bool(m.commonProperties.Vendor) {
Dario Frenifd05a742018-05-29 13:28:54 +01001440 ctx.PropertyErrorf("vendor", msg)
1441 }
Colin Cross4157e882019-06-06 16:57:04 -07001442 if Bool(m.commonProperties.Proprietary) {
Dario Frenifd05a742018-05-29 13:28:54 +01001443 ctx.PropertyErrorf("proprietary", msg)
1444 }
Colin Cross4157e882019-06-06 16:57:04 -07001445 if Bool(m.commonProperties.Soc_specific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001446 ctx.PropertyErrorf("soc_specific", msg)
1447 }
1448 }
1449 }
1450
Jiyong Park2db76922017-11-08 16:03:48 +09001451 if productSpecific {
1452 return productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +09001453 } else if systemExtSpecific {
1454 return systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001455 } else if deviceSpecific {
1456 return deviceSpecificModule
1457 } else if socSpecific {
1458 return socSpecificModule
1459 } else {
1460 return platformModule
1461 }
1462}
1463
Colin Crossc34d2322020-01-03 15:23:27 -08001464func (m *ModuleBase) earlyModuleContextFactory(ctx blueprint.EarlyModuleContext) earlyModuleContext {
Colin Cross1184b642019-12-30 18:43:07 -08001465 return earlyModuleContext{
Colin Crossc34d2322020-01-03 15:23:27 -08001466 EarlyModuleContext: ctx,
1467 kind: determineModuleKind(m, ctx),
1468 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -08001469 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001470}
1471
Colin Cross1184b642019-12-30 18:43:07 -08001472func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
1473 return baseModuleContext{
1474 bp: ctx,
1475 earlyModuleContext: m.earlyModuleContextFactory(ctx),
1476 os: m.commonProperties.CompileOS,
1477 target: m.commonProperties.CompileTarget,
1478 targetPrimary: m.commonProperties.CompilePrimary,
1479 multiTargets: m.commonProperties.CompileMultiTargets,
1480 }
1481}
1482
Colin Cross4157e882019-06-06 16:57:04 -07001483func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
Colin Cross25de6c32019-06-06 14:29:25 -07001484 ctx := &moduleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001485 module: m.module,
Colin Crossdc35e212019-06-06 16:13:11 -07001486 bp: blueprintCtx,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001487 baseModuleContext: m.baseModuleContextFactory(blueprintCtx),
1488 installDeps: m.computeInstallDeps(blueprintCtx),
1489 installFiles: m.installFiles,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001490 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -08001491 }
1492
Colin Cross6c4f21f2019-06-06 15:41:36 -07001493 // Temporarily continue to call blueprintCtx.GetMissingDependencies() to maintain the previous behavior of never
1494 // reporting missing dependency errors in Blueprint when AllowMissingDependencies == true.
1495 // TODO: This will be removed once defaults modules handle missing dependency errors
1496 blueprintCtx.GetMissingDependencies()
1497
Colin Crossdc35e212019-06-06 16:13:11 -07001498 // For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
Paul Duffin1356d8c2020-02-25 19:26:33 +00001499 // are enabled. Unless the module is a CommonOS variant which may have dependencies on disabled variants
1500 // (because the dependencies are added before the modules are disabled). The
1501 // GetOsSpecificVariantsOfCommonOSVariant(...) method will ensure that the disabled variants are
1502 // ignored.
1503 ctx.baseModuleContext.strictVisitDeps = !m.IsCommonOSVariant()
Colin Crossdc35e212019-06-06 16:13:11 -07001504
Colin Cross4c83e5c2019-02-25 14:54:28 -08001505 if ctx.config.captureBuild {
1506 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
1507 }
1508
Colin Cross67a5c132017-05-09 13:45:28 -07001509 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
1510 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -08001511 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
1512 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -07001513 }
Colin Cross0875c522017-11-28 17:34:01 -08001514 if !ctx.PrimaryArch() {
1515 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -07001516 }
Colin Cross56a83212020-09-15 18:30:11 -07001517 if apexInfo := ctx.Provider(ApexInfoProvider).(ApexInfo); !apexInfo.IsForPlatform() {
1518 suffix = append(suffix, apexInfo.ApexVariationName)
Dan Willemsenb13a9482020-02-14 11:25:54 -08001519 }
Colin Cross67a5c132017-05-09 13:45:28 -07001520
1521 ctx.Variable(pctx, "moduleDesc", desc)
1522
1523 s := ""
1524 if len(suffix) > 0 {
1525 s = " [" + strings.Join(suffix, " ") + "]"
1526 }
1527 ctx.Variable(pctx, "moduleDescSuffix", s)
1528
Dan Willemsen569edc52018-11-19 09:33:29 -08001529 // Some common property checks for properties that will be used later in androidmk.go
Paul Duffined875132020-09-02 13:08:57 +01001530 if m.distProperties.Dist.Dest != nil {
1531 _, err := validateSafePath(*m.distProperties.Dist.Dest)
Dan Willemsen569edc52018-11-19 09:33:29 -08001532 if err != nil {
1533 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
1534 }
1535 }
Paul Duffined875132020-09-02 13:08:57 +01001536 if m.distProperties.Dist.Dir != nil {
1537 _, err := validateSafePath(*m.distProperties.Dist.Dir)
Dan Willemsen569edc52018-11-19 09:33:29 -08001538 if err != nil {
1539 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
1540 }
1541 }
Paul Duffined875132020-09-02 13:08:57 +01001542 if m.distProperties.Dist.Suffix != nil {
1543 if strings.Contains(*m.distProperties.Dist.Suffix, "/") {
Dan Willemsen569edc52018-11-19 09:33:29 -08001544 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
1545 }
1546 }
1547
Colin Cross4157e882019-06-06 16:57:04 -07001548 if m.Enabled() {
Jooyung Hand48f3c32019-08-23 11:18:57 +09001549 // ensure all direct android.Module deps are enabled
1550 ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) {
1551 if _, ok := bm.(Module); ok {
1552 ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps)
1553 }
1554 })
1555
Bob Badoura75b0572020-02-18 20:21:55 -08001556 m.noticeFiles = make([]Path, 0)
1557 optPath := OptionalPath{}
1558 notice := proptools.StringDefault(m.commonProperties.Notice, "")
Colin Cross4157e882019-06-06 16:57:04 -07001559 if module := SrcIsModule(notice); module != "" {
Bob Badoura75b0572020-02-18 20:21:55 -08001560 optPath = ctx.ExpandOptionalSource(&notice, "notice")
1561 } else if notice != "" {
Jiyong Park52818fc2019-03-18 12:01:38 +09001562 noticePath := filepath.Join(ctx.ModuleDir(), notice)
Bob Badoura75b0572020-02-18 20:21:55 -08001563 optPath = ExistentPathForSource(ctx, noticePath)
1564 }
1565 if optPath.Valid() {
1566 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1567 } else {
1568 for _, notice = range []string{"LICENSE", "LICENCE", "NOTICE"} {
1569 noticePath := filepath.Join(ctx.ModuleDir(), notice)
1570 optPath = ExistentPathForSource(ctx, noticePath)
1571 if optPath.Valid() {
1572 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1573 }
1574 }
Jaewoong Jung62707f72018-11-16 13:26:43 -08001575 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001576
1577 m.module.GenerateAndroidBuildActions(ctx)
1578 if ctx.Failed() {
1579 return
1580 }
1581
1582 m.installFiles = append(m.installFiles, ctx.installFiles...)
1583 m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...)
Inseob Kim8471cda2019-11-15 09:59:12 +09001584 m.initRcPaths = PathsForModuleSrc(ctx, m.commonProperties.Init_rc)
1585 m.vintfFragmentsPaths = PathsForModuleSrc(ctx, m.commonProperties.Vintf_fragments)
Colin Crossc3d87d32020-06-04 13:25:17 -07001586 for k, v := range ctx.phonies {
1587 m.phonies[k] = append(m.phonies[k], v...)
1588 }
Colin Crossdc35e212019-06-06 16:13:11 -07001589 } else if ctx.Config().AllowMissingDependencies() {
1590 // If the module is not enabled it will not create any build rules, nothing will call
1591 // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled
1592 // and report them as an error even when AllowMissingDependencies = true. Call
1593 // ctx.GetMissingDependencies() here to tell blueprint not to handle them.
1594 ctx.GetMissingDependencies()
Colin Cross3f40fa42015-01-30 17:27:36 -08001595 }
1596
Colin Cross4157e882019-06-06 16:57:04 -07001597 if m == ctx.FinalModule().(Module).base() {
1598 m.generateModuleTarget(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -07001599 if ctx.Failed() {
1600 return
1601 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001602 }
Colin Crosscec81712017-07-13 14:43:27 -07001603
Colin Cross4157e882019-06-06 16:57:04 -07001604 m.buildParams = ctx.buildParams
1605 m.ruleParams = ctx.ruleParams
1606 m.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -08001607}
1608
Colin Cross1184b642019-12-30 18:43:07 -08001609type earlyModuleContext struct {
Colin Crossc34d2322020-01-03 15:23:27 -08001610 blueprint.EarlyModuleContext
Colin Cross1184b642019-12-30 18:43:07 -08001611
1612 kind moduleKind
1613 config Config
1614}
1615
1616func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths {
1617 ret, err := e.GlobWithDeps(globPattern, excludes)
1618 if err != nil {
1619 e.ModuleErrorf("glob: %s", err.Error())
1620 }
1621 return pathsForModuleSrcFromFullPath(e, ret, true)
1622}
1623
1624func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
1625 ret, err := e.GlobWithDeps(globPattern, excludes)
1626 if err != nil {
1627 e.ModuleErrorf("glob: %s", err.Error())
1628 }
1629 return pathsForModuleSrcFromFullPath(e, ret, false)
1630}
1631
Colin Cross988414c2020-01-11 01:11:46 +00001632func (b *earlyModuleContext) IsSymlink(path Path) bool {
1633 fileInfo, err := b.config.fs.Lstat(path.String())
1634 if err != nil {
1635 b.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
1636 }
1637 return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
1638}
1639
1640func (b *earlyModuleContext) Readlink(path Path) string {
1641 dest, err := b.config.fs.Readlink(path.String())
1642 if err != nil {
1643 b.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
1644 }
1645 return dest
1646}
1647
Colin Cross1184b642019-12-30 18:43:07 -08001648func (e *earlyModuleContext) Module() Module {
Colin Crossc34d2322020-01-03 15:23:27 -08001649 module, _ := e.EarlyModuleContext.Module().(Module)
Colin Cross1184b642019-12-30 18:43:07 -08001650 return module
1651}
1652
1653func (e *earlyModuleContext) Config() Config {
Colin Crossc34d2322020-01-03 15:23:27 -08001654 return e.EarlyModuleContext.Config().(Config)
Colin Cross1184b642019-12-30 18:43:07 -08001655}
1656
1657func (e *earlyModuleContext) AConfig() Config {
1658 return e.config
1659}
1660
1661func (e *earlyModuleContext) DeviceConfig() DeviceConfig {
1662 return DeviceConfig{e.config.deviceConfig}
1663}
1664
1665func (e *earlyModuleContext) Platform() bool {
1666 return e.kind == platformModule
1667}
1668
1669func (e *earlyModuleContext) DeviceSpecific() bool {
1670 return e.kind == deviceSpecificModule
1671}
1672
1673func (e *earlyModuleContext) SocSpecific() bool {
1674 return e.kind == socSpecificModule
1675}
1676
1677func (e *earlyModuleContext) ProductSpecific() bool {
1678 return e.kind == productSpecificModule
1679}
1680
1681func (e *earlyModuleContext) SystemExtSpecific() bool {
1682 return e.kind == systemExtSpecificModule
1683}
1684
Colin Cross133ebef2020-08-14 17:38:45 -07001685func (e *earlyModuleContext) Namespace() *Namespace {
1686 return e.EarlyModuleContext.Namespace().(*Namespace)
1687}
1688
Colin Cross1184b642019-12-30 18:43:07 -08001689type baseModuleContext struct {
1690 bp blueprint.BaseModuleContext
1691 earlyModuleContext
Colin Crossfb0c16e2019-11-20 17:12:35 -08001692 os OsType
Colin Cross8b74d172016-09-13 09:59:14 -07001693 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -07001694 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -07001695 targetPrimary bool
1696 debug bool
Colin Crossdc35e212019-06-06 16:13:11 -07001697
1698 walkPath []Module
Paul Duffinc5192442020-03-31 11:31:36 +01001699 tagPath []blueprint.DependencyTag
Colin Crossdc35e212019-06-06 16:13:11 -07001700
1701 strictVisitDeps bool // If true, enforce that all dependencies are enabled
Colin Crossf6566ed2015-03-24 11:13:38 -07001702}
1703
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001704func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string {
1705 return b.bp.OtherModuleName(m)
1706}
1707func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) }
Colin Cross1184b642019-12-30 18:43:07 -08001708func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) {
Jooyung Hancd87c692020-02-26 02:05:18 +09001709 b.bp.OtherModuleErrorf(m, fmt, args...)
Colin Cross1184b642019-12-30 18:43:07 -08001710}
1711func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag {
1712 return b.bp.OtherModuleDependencyTag(m)
1713}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001714func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +00001715func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
1716 return b.bp.OtherModuleDependencyVariantExists(variations, name)
1717}
1718func (b *baseModuleContext) OtherModuleReverseDependencyVariantExists(name string) bool {
1719 return b.bp.OtherModuleReverseDependencyVariantExists(name)
1720}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001721func (b *baseModuleContext) OtherModuleType(m blueprint.Module) string {
1722 return b.bp.OtherModuleType(m)
1723}
Colin Crossd27e7b82020-07-02 11:38:17 -07001724func (b *baseModuleContext) OtherModuleProvider(m blueprint.Module, provider blueprint.ProviderKey) interface{} {
1725 return b.bp.OtherModuleProvider(m, provider)
1726}
1727func (b *baseModuleContext) OtherModuleHasProvider(m blueprint.Module, provider blueprint.ProviderKey) bool {
1728 return b.bp.OtherModuleHasProvider(m, provider)
1729}
1730func (b *baseModuleContext) Provider(provider blueprint.ProviderKey) interface{} {
1731 return b.bp.Provider(provider)
1732}
1733func (b *baseModuleContext) HasProvider(provider blueprint.ProviderKey) bool {
1734 return b.bp.HasProvider(provider)
1735}
1736func (b *baseModuleContext) SetProvider(provider blueprint.ProviderKey, value interface{}) {
1737 b.bp.SetProvider(provider, value)
1738}
Colin Cross1184b642019-12-30 18:43:07 -08001739
1740func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1741 return b.bp.GetDirectDepWithTag(name, tag)
1742}
1743
Paul Duffinf88d8e02020-05-07 20:21:34 +01001744func (b *baseModuleContext) blueprintBaseModuleContext() blueprint.BaseModuleContext {
1745 return b.bp
1746}
1747
Colin Cross25de6c32019-06-06 14:29:25 -07001748type moduleContext struct {
Colin Crossdc35e212019-06-06 16:13:11 -07001749 bp blueprint.ModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -07001750 baseModuleContext
Colin Cross897266e2020-02-13 13:22:08 -08001751 installDeps InstallPaths
1752 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001753 checkbuildFiles Paths
Colin Cross8d8f8e22016-08-03 11:57:50 -07001754 module Module
Colin Crossc3d87d32020-06-04 13:25:17 -07001755 phonies map[string]Paths
Colin Crosscec81712017-07-13 14:43:27 -07001756
1757 // For tests
Colin Crossae887032017-10-23 17:16:14 -07001758 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -08001759 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001760 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -08001761}
1762
Colin Crossb88b3c52019-06-10 15:15:17 -07001763func (m *moduleContext) ninjaError(params BuildParams, err error) (PackageContext, BuildParams) {
1764 return pctx, BuildParams{
Colin Cross4b69c492019-06-07 13:06:06 -07001765 Rule: ErrorRule,
1766 Description: params.Description,
1767 Output: params.Output,
1768 Outputs: params.Outputs,
1769 ImplicitOutput: params.ImplicitOutput,
1770 ImplicitOutputs: params.ImplicitOutputs,
Colin Cross6ff51382015-12-17 16:39:19 -08001771 Args: map[string]string{
1772 "error": err.Error(),
1773 },
Colin Crossb88b3c52019-06-10 15:15:17 -07001774 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001775}
1776
Colin Cross25de6c32019-06-06 14:29:25 -07001777func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
1778 m.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -08001779}
1780
Jingwen Chence679d22020-09-23 04:30:02 +00001781func validateBuildParams(params blueprint.BuildParams) error {
1782 // Validate that the symlink outputs are declared outputs or implicit outputs
1783 allOutputs := map[string]bool{}
1784 for _, output := range params.Outputs {
1785 allOutputs[output] = true
1786 }
1787 for _, output := range params.ImplicitOutputs {
1788 allOutputs[output] = true
1789 }
1790 for _, symlinkOutput := range params.SymlinkOutputs {
1791 if !allOutputs[symlinkOutput] {
1792 return fmt.Errorf(
1793 "Symlink output %s is not a declared output or implicit output",
1794 symlinkOutput)
1795 }
1796 }
1797 return nil
1798}
1799
1800// Convert build parameters from their concrete Android types into their string representations,
1801// and combine the singular and plural fields of the same type (e.g. Output and Outputs).
Colin Cross0875c522017-11-28 17:34:01 -08001802func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001803 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001804 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -08001805 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -08001806 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001807 Outputs: params.Outputs.Strings(),
1808 ImplicitOutputs: params.ImplicitOutputs.Strings(),
Jingwen Chence679d22020-09-23 04:30:02 +00001809 SymlinkOutputs: params.SymlinkOutputs.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001810 Inputs: params.Inputs.Strings(),
1811 Implicits: params.Implicits.Strings(),
1812 OrderOnly: params.OrderOnly.Strings(),
Colin Cross824f1162020-07-16 13:07:51 -07001813 Validations: params.Validations.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001814 Args: params.Args,
1815 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001816 }
1817
Colin Cross33bfb0a2016-11-21 17:23:08 -08001818 if params.Depfile != nil {
1819 bparams.Depfile = params.Depfile.String()
1820 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001821 if params.Output != nil {
1822 bparams.Outputs = append(bparams.Outputs, params.Output.String())
1823 }
Jingwen Chence679d22020-09-23 04:30:02 +00001824 if params.SymlinkOutput != nil {
1825 bparams.SymlinkOutputs = append(bparams.SymlinkOutputs, params.SymlinkOutput.String())
1826 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001827 if params.ImplicitOutput != nil {
1828 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
1829 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001830 if params.Input != nil {
1831 bparams.Inputs = append(bparams.Inputs, params.Input.String())
1832 }
1833 if params.Implicit != nil {
1834 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
1835 }
Colin Cross824f1162020-07-16 13:07:51 -07001836 if params.Validation != nil {
1837 bparams.Validations = append(bparams.Validations, params.Validation.String())
1838 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001839
Colin Cross0b9f31f2019-02-28 11:00:01 -08001840 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
1841 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
Jingwen Chence679d22020-09-23 04:30:02 +00001842 bparams.SymlinkOutputs = proptools.NinjaEscapeList(bparams.SymlinkOutputs)
Colin Cross0b9f31f2019-02-28 11:00:01 -08001843 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
1844 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
1845 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
Colin Cross824f1162020-07-16 13:07:51 -07001846 bparams.Validations = proptools.NinjaEscapeList(bparams.Validations)
1847 bparams.Depfile = proptools.NinjaEscape(bparams.Depfile)
Colin Crossfe4bc362018-09-12 10:02:13 -07001848
Colin Cross0875c522017-11-28 17:34:01 -08001849 return bparams
1850}
1851
Colin Cross25de6c32019-06-06 14:29:25 -07001852func (m *moduleContext) Variable(pctx PackageContext, name, value string) {
1853 if m.config.captureBuild {
1854 m.variables[name] = value
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001855 }
1856
Colin Crossdc35e212019-06-06 16:13:11 -07001857 m.bp.Variable(pctx.PackageContext, name, value)
Colin Cross0875c522017-11-28 17:34:01 -08001858}
1859
Colin Cross25de6c32019-06-06 14:29:25 -07001860func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
Colin Cross0875c522017-11-28 17:34:01 -08001861 argNames ...string) blueprint.Rule {
1862
Ramy Medhat944839a2020-03-31 22:14:52 -04001863 if m.config.UseRemoteBuild() {
1864 if params.Pool == nil {
1865 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
1866 // jobs to the local parallelism value
1867 params.Pool = localPool
1868 } else if params.Pool == remotePool {
1869 // remotePool is a fake pool used to identify rule that are supported for remoting. If the rule's
1870 // pool is the remotePool, replace with nil so that ninja runs it at NINJA_REMOTE_NUM_JOBS
1871 // parallelism.
1872 params.Pool = nil
1873 }
Colin Cross2e2dbc22019-09-25 13:31:46 -07001874 }
1875
Colin Crossdc35e212019-06-06 16:13:11 -07001876 rule := m.bp.Rule(pctx.PackageContext, name, params, argNames...)
Colin Cross4c83e5c2019-02-25 14:54:28 -08001877
Colin Cross25de6c32019-06-06 14:29:25 -07001878 if m.config.captureBuild {
1879 m.ruleParams[rule] = params
Colin Cross4c83e5c2019-02-25 14:54:28 -08001880 }
1881
1882 return rule
Colin Cross0875c522017-11-28 17:34:01 -08001883}
1884
Colin Cross25de6c32019-06-06 14:29:25 -07001885func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
Colin Crossb88b3c52019-06-10 15:15:17 -07001886 if params.Description != "" {
1887 params.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1888 }
1889
1890 if missingDeps := m.GetMissingDependencies(); len(missingDeps) > 0 {
1891 pctx, params = m.ninjaError(params, fmt.Errorf("module %s missing dependencies: %s\n",
1892 m.ModuleName(), strings.Join(missingDeps, ", ")))
1893 }
1894
Colin Cross25de6c32019-06-06 14:29:25 -07001895 if m.config.captureBuild {
1896 m.buildParams = append(m.buildParams, params)
Colin Cross0875c522017-11-28 17:34:01 -08001897 }
1898
Jingwen Chence679d22020-09-23 04:30:02 +00001899 bparams := convertBuildParams(params)
1900 err := validateBuildParams(bparams)
1901 if err != nil {
1902 m.ModuleErrorf(
1903 "%s: build parameter validation failed: %s",
1904 m.ModuleName(),
1905 err.Error())
1906 }
1907 m.bp.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001908}
Colin Crossc3d87d32020-06-04 13:25:17 -07001909
1910func (m *moduleContext) Phony(name string, deps ...Path) {
1911 addPhony(m.config, name, deps...)
1912}
1913
Colin Cross25de6c32019-06-06 14:29:25 -07001914func (m *moduleContext) GetMissingDependencies() []string {
Colin Cross6c4f21f2019-06-06 15:41:36 -07001915 var missingDeps []string
1916 missingDeps = append(missingDeps, m.Module().base().commonProperties.MissingDeps...)
Colin Crossdc35e212019-06-06 16:13:11 -07001917 missingDeps = append(missingDeps, m.bp.GetMissingDependencies()...)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001918 missingDeps = FirstUniqueStrings(missingDeps)
1919 return missingDeps
Colin Cross6ff51382015-12-17 16:39:19 -08001920}
1921
Colin Crossdc35e212019-06-06 16:13:11 -07001922func (b *baseModuleContext) AddMissingDependencies(deps []string) {
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001923 if deps != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001924 missingDeps := &b.Module().base().commonProperties.MissingDeps
Colin Cross6c4f21f2019-06-06 15:41:36 -07001925 *missingDeps = append(*missingDeps, deps...)
1926 *missingDeps = FirstUniqueStrings(*missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001927 }
1928}
1929
Colin Crossdc35e212019-06-06 16:13:11 -07001930func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, strict bool) Module {
Colin Crossd11fcda2017-10-23 17:59:01 -07001931 aModule, _ := module.(Module)
Colin Crossdc35e212019-06-06 16:13:11 -07001932
1933 if !strict {
1934 return aModule
1935 }
1936
Colin Cross380c69a2019-06-10 17:49:58 +00001937 if aModule == nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001938 b.ModuleErrorf("module %q not an android module", b.OtherModuleName(module))
Colin Cross380c69a2019-06-10 17:49:58 +00001939 return nil
1940 }
1941
1942 if !aModule.Enabled() {
Colin Crossdc35e212019-06-06 16:13:11 -07001943 if b.Config().AllowMissingDependencies() {
1944 b.AddMissingDependencies([]string{b.OtherModuleName(aModule)})
Colin Cross380c69a2019-06-10 17:49:58 +00001945 } else {
Colin Crossdc35e212019-06-06 16:13:11 -07001946 b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule))
Colin Cross380c69a2019-06-10 17:49:58 +00001947 }
1948 return nil
1949 }
Colin Crossd11fcda2017-10-23 17:59:01 -07001950 return aModule
1951}
1952
Colin Crossdc35e212019-06-06 16:13:11 -07001953func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
Jiyong Parkf2976302019-04-17 21:47:37 +09001954 type dep struct {
1955 mod blueprint.Module
1956 tag blueprint.DependencyTag
1957 }
1958 var deps []dep
Colin Crossdc35e212019-06-06 16:13:11 -07001959 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001960 if aModule, _ := module.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
Colin Cross1184b642019-12-30 18:43:07 -08001961 returnedTag := b.bp.OtherModuleDependencyTag(aModule)
Jiyong Parkf2976302019-04-17 21:47:37 +09001962 if tag == nil || returnedTag == tag {
1963 deps = append(deps, dep{aModule, returnedTag})
1964 }
1965 }
1966 })
1967 if len(deps) == 1 {
1968 return deps[0].mod, deps[0].tag
1969 } else if len(deps) >= 2 {
1970 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
Colin Crossdc35e212019-06-06 16:13:11 -07001971 name, b.ModuleName()))
Jiyong Parkf2976302019-04-17 21:47:37 +09001972 } else {
1973 return nil, nil
1974 }
1975}
1976
Colin Crossdc35e212019-06-06 16:13:11 -07001977func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module {
Colin Cross0ef08162019-05-01 15:50:51 -07001978 var deps []Module
Colin Crossdc35e212019-06-06 16:13:11 -07001979 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001980 if aModule, _ := module.(Module); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001981 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Cross0ef08162019-05-01 15:50:51 -07001982 deps = append(deps, aModule)
1983 }
1984 }
1985 })
1986 return deps
1987}
1988
Colin Cross25de6c32019-06-06 14:29:25 -07001989func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1990 module, _ := m.getDirectDepInternal(name, tag)
1991 return module
Jiyong Parkf2976302019-04-17 21:47:37 +09001992}
1993
Colin Crossdc35e212019-06-06 16:13:11 -07001994func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
1995 return b.getDirectDepInternal(name, nil)
Jiyong Parkf2976302019-04-17 21:47:37 +09001996}
1997
Colin Crossdc35e212019-06-06 16:13:11 -07001998func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08001999 b.bp.VisitDirectDeps(visit)
Colin Cross35143d02017-11-16 00:11:20 -08002000}
2001
Colin Crossdc35e212019-06-06 16:13:11 -07002002func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002003 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002004 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002005 visit(aModule)
2006 }
2007 })
2008}
2009
Colin Crossdc35e212019-06-06 16:13:11 -07002010func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002011 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002012 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08002013 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Crossee6143c2017-12-30 17:54:27 -08002014 visit(aModule)
2015 }
2016 }
2017 })
2018}
2019
Colin Crossdc35e212019-06-06 16:13:11 -07002020func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002021 b.bp.VisitDirectDepsIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07002022 // pred
2023 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002024 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002025 return pred(aModule)
2026 } else {
2027 return false
2028 }
2029 },
2030 // visit
2031 func(module blueprint.Module) {
2032 visit(module.(Module))
2033 })
2034}
2035
Colin Crossdc35e212019-06-06 16:13:11 -07002036func (b *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002037 b.bp.VisitDepsDepthFirst(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002038 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002039 visit(aModule)
2040 }
2041 })
2042}
2043
Colin Crossdc35e212019-06-06 16:13:11 -07002044func (b *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002045 b.bp.VisitDepsDepthFirstIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07002046 // pred
2047 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002048 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002049 return pred(aModule)
2050 } else {
2051 return false
2052 }
2053 },
2054 // visit
2055 func(module blueprint.Module) {
2056 visit(module.(Module))
2057 })
2058}
2059
Colin Crossdc35e212019-06-06 16:13:11 -07002060func (b *baseModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
Colin Cross1184b642019-12-30 18:43:07 -08002061 b.bp.WalkDeps(visit)
Alex Light778127a2019-02-27 14:19:50 -08002062}
2063
Colin Crossdc35e212019-06-06 16:13:11 -07002064func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
2065 b.walkPath = []Module{b.Module()}
Paul Duffinc5192442020-03-31 11:31:36 +01002066 b.tagPath = []blueprint.DependencyTag{}
Colin Cross1184b642019-12-30 18:43:07 -08002067 b.bp.WalkDeps(func(child, parent blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002068 childAndroidModule, _ := child.(Module)
2069 parentAndroidModule, _ := parent.(Module)
Colin Crossd11fcda2017-10-23 17:59:01 -07002070 if childAndroidModule != nil && parentAndroidModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07002071 // record walkPath before visit
2072 for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
2073 b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
Paul Duffinc5192442020-03-31 11:31:36 +01002074 b.tagPath = b.tagPath[0 : len(b.tagPath)-1]
Colin Crossdc35e212019-06-06 16:13:11 -07002075 }
2076 b.walkPath = append(b.walkPath, childAndroidModule)
Paul Duffinc5192442020-03-31 11:31:36 +01002077 b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule))
Colin Crossd11fcda2017-10-23 17:59:01 -07002078 return visit(childAndroidModule, parentAndroidModule)
2079 } else {
2080 return false
2081 }
2082 })
2083}
2084
Colin Crossdc35e212019-06-06 16:13:11 -07002085func (b *baseModuleContext) GetWalkPath() []Module {
2086 return b.walkPath
2087}
2088
Paul Duffinc5192442020-03-31 11:31:36 +01002089func (b *baseModuleContext) GetTagPath() []blueprint.DependencyTag {
2090 return b.tagPath
2091}
2092
Colin Cross4dfacf92020-09-16 19:22:27 -07002093func (b *baseModuleContext) VisitAllModuleVariants(visit func(Module)) {
2094 b.bp.VisitAllModuleVariants(func(module blueprint.Module) {
2095 visit(module.(Module))
2096 })
2097}
2098
2099func (b *baseModuleContext) PrimaryModule() Module {
2100 return b.bp.PrimaryModule().(Module)
2101}
2102
2103func (b *baseModuleContext) FinalModule() Module {
2104 return b.bp.FinalModule().(Module)
2105}
2106
Jiyong Park1c7e9622020-05-07 16:12:13 +09002107// A regexp for removing boilerplate from BaseDependencyTag from the string representation of
2108// a dependency tag.
Colin Cross6e511a92020-07-27 21:26:48 -07002109var tagCleaner = regexp.MustCompile(`\QBaseDependencyTag:{}\E(, )?`)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002110
2111// PrettyPrintTag returns string representation of the tag, but prefers
2112// custom String() method if available.
2113func PrettyPrintTag(tag blueprint.DependencyTag) string {
2114 // Use tag's custom String() method if available.
2115 if stringer, ok := tag.(fmt.Stringer); ok {
2116 return stringer.String()
2117 }
2118
2119 // Otherwise, get a default string representation of the tag's struct.
Colin Cross6e511a92020-07-27 21:26:48 -07002120 tagString := fmt.Sprintf("%T: %+v", tag, tag)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002121
2122 // Remove the boilerplate from BaseDependencyTag as it adds no value.
2123 tagString = tagCleaner.ReplaceAllString(tagString, "")
2124 return tagString
2125}
2126
2127func (b *baseModuleContext) GetPathString(skipFirst bool) string {
2128 sb := strings.Builder{}
2129 tagPath := b.GetTagPath()
2130 walkPath := b.GetWalkPath()
2131 if !skipFirst {
2132 sb.WriteString(walkPath[0].String())
2133 }
2134 for i, m := range walkPath[1:] {
2135 sb.WriteString("\n")
2136 sb.WriteString(fmt.Sprintf(" via tag %s\n", PrettyPrintTag(tagPath[i])))
2137 sb.WriteString(fmt.Sprintf(" -> %s", m.String()))
2138 }
2139 return sb.String()
2140}
2141
Colin Crossdc35e212019-06-06 16:13:11 -07002142func (m *moduleContext) ModuleSubDir() string {
2143 return m.bp.ModuleSubDir()
Colin Cross0875c522017-11-28 17:34:01 -08002144}
2145
Colin Cross0ea8ba82019-06-06 14:33:29 -07002146func (b *baseModuleContext) Target() Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002147 return b.target
Colin Crossa1ad8d12016-06-01 17:09:44 -07002148}
2149
Colin Cross0ea8ba82019-06-06 14:33:29 -07002150func (b *baseModuleContext) TargetPrimary() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002151 return b.targetPrimary
Colin Cross8b74d172016-09-13 09:59:14 -07002152}
2153
Colin Cross0ea8ba82019-06-06 14:33:29 -07002154func (b *baseModuleContext) MultiTargets() []Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002155 return b.multiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07002156}
2157
Colin Cross0ea8ba82019-06-06 14:33:29 -07002158func (b *baseModuleContext) Arch() Arch {
Colin Cross25de6c32019-06-06 14:29:25 -07002159 return b.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08002160}
2161
Colin Cross0ea8ba82019-06-06 14:33:29 -07002162func (b *baseModuleContext) Os() OsType {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002163 return b.os
Dan Willemsen490fd492015-11-24 17:53:15 -08002164}
2165
Colin Cross0ea8ba82019-06-06 14:33:29 -07002166func (b *baseModuleContext) Host() bool {
Jiyong Park1613e552020-09-14 19:43:17 +09002167 return b.os.Class == Host
Colin Crossf6566ed2015-03-24 11:13:38 -07002168}
2169
Colin Cross0ea8ba82019-06-06 14:33:29 -07002170func (b *baseModuleContext) Device() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002171 return b.os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07002172}
2173
Colin Cross0ea8ba82019-06-06 14:33:29 -07002174func (b *baseModuleContext) Darwin() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002175 return b.os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07002176}
2177
Colin Cross0ea8ba82019-06-06 14:33:29 -07002178func (b *baseModuleContext) Fuchsia() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002179 return b.os == Fuchsia
Doug Horn21b94272019-01-16 12:06:11 -08002180}
2181
Colin Cross0ea8ba82019-06-06 14:33:29 -07002182func (b *baseModuleContext) Windows() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002183 return b.os == Windows
Colin Cross3edeee12017-04-04 12:59:48 -07002184}
2185
Colin Cross0ea8ba82019-06-06 14:33:29 -07002186func (b *baseModuleContext) Debug() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002187 return b.debug
Colin Crossf6566ed2015-03-24 11:13:38 -07002188}
2189
Colin Cross0ea8ba82019-06-06 14:33:29 -07002190func (b *baseModuleContext) PrimaryArch() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002191 if len(b.config.Targets[b.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07002192 return true
2193 }
Colin Cross25de6c32019-06-06 14:29:25 -07002194 return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07002195}
2196
Jiyong Park5baac542018-08-28 09:55:37 +09002197// Makes this module a platform module, i.e. not specific to soc, device,
Justin Yund5f6c822019-06-25 16:47:17 +09002198// product, or system_ext.
Colin Cross4157e882019-06-06 16:57:04 -07002199func (m *ModuleBase) MakeAsPlatform() {
2200 m.commonProperties.Vendor = boolPtr(false)
2201 m.commonProperties.Proprietary = boolPtr(false)
2202 m.commonProperties.Soc_specific = boolPtr(false)
2203 m.commonProperties.Product_specific = boolPtr(false)
Justin Yund5f6c822019-06-25 16:47:17 +09002204 m.commonProperties.System_ext_specific = boolPtr(false)
Jiyong Park5baac542018-08-28 09:55:37 +09002205}
2206
Colin Cross4157e882019-06-06 16:57:04 -07002207func (m *ModuleBase) EnableNativeBridgeSupportByDefault() {
2208 m.commonProperties.Native_bridge_supported = boolPtr(true)
dimitry03dc3f62019-05-09 14:07:34 +02002209}
2210
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002211func (m *ModuleBase) MakeAsSystemExt() {
Jooyung Han91df2082019-11-20 01:49:42 +09002212 m.commonProperties.Vendor = boolPtr(false)
2213 m.commonProperties.Proprietary = boolPtr(false)
2214 m.commonProperties.Soc_specific = boolPtr(false)
2215 m.commonProperties.Product_specific = boolPtr(false)
2216 m.commonProperties.System_ext_specific = boolPtr(true)
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002217}
2218
Jooyung Han344d5432019-08-23 11:17:39 +09002219// IsNativeBridgeSupported returns true if "native_bridge_supported" is explicitly set as "true"
2220func (m *ModuleBase) IsNativeBridgeSupported() bool {
2221 return proptools.Bool(m.commonProperties.Native_bridge_supported)
2222}
2223
Colin Cross25de6c32019-06-06 14:29:25 -07002224func (m *moduleContext) InstallInData() bool {
2225 return m.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08002226}
2227
Jaewoong Jung0949f312019-09-11 10:25:18 -07002228func (m *moduleContext) InstallInTestcases() bool {
2229 return m.module.InstallInTestcases()
2230}
2231
Colin Cross25de6c32019-06-06 14:29:25 -07002232func (m *moduleContext) InstallInSanitizerDir() bool {
2233 return m.module.InstallInSanitizerDir()
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002234}
2235
Yifan Hong1b3348d2020-01-21 15:53:22 -08002236func (m *moduleContext) InstallInRamdisk() bool {
2237 return m.module.InstallInRamdisk()
2238}
2239
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002240func (m *moduleContext) InstallInVendorRamdisk() bool {
2241 return m.module.InstallInVendorRamdisk()
2242}
2243
Colin Cross25de6c32019-06-06 14:29:25 -07002244func (m *moduleContext) InstallInRecovery() bool {
2245 return m.module.InstallInRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002246}
2247
Colin Cross90ba5f42019-10-02 11:10:58 -07002248func (m *moduleContext) InstallInRoot() bool {
2249 return m.module.InstallInRoot()
2250}
2251
Colin Cross607d8582019-07-29 16:44:46 -07002252func (m *moduleContext) InstallBypassMake() bool {
2253 return m.module.InstallBypassMake()
2254}
2255
Jiyong Park87788b52020-09-01 12:37:45 +09002256func (m *moduleContext) InstallForceOS() (*OsType, *ArchType) {
Colin Cross6e359402020-02-10 15:29:54 -08002257 return m.module.InstallForceOS()
2258}
2259
Colin Cross70dda7e2019-10-01 22:05:35 -07002260func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002261 if m.module.base().commonProperties.SkipInstall {
Colin Cross893d8162017-04-26 17:34:03 -07002262 return true
2263 }
2264
Colin Cross3607f212018-05-07 15:28:05 -07002265 // We'll need a solution for choosing which of modules with the same name in different
2266 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
2267 // list of namespaces to install in a Soong-only build.
Colin Cross25de6c32019-06-06 14:29:25 -07002268 if !m.module.base().commonProperties.NamespaceExportedToMake {
Colin Cross3607f212018-05-07 15:28:05 -07002269 return true
2270 }
2271
Colin Cross25de6c32019-06-06 14:29:25 -07002272 if m.Device() {
Colin Cross607d8582019-07-29 16:44:46 -07002273 if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
Colin Cross893d8162017-04-26 17:34:03 -07002274 return true
2275 }
2276
Colin Cross25de6c32019-06-06 14:29:25 -07002277 if m.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07002278 return true
2279 }
2280 }
2281
2282 return false
2283}
2284
Colin Cross70dda7e2019-10-01 22:05:35 -07002285func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
2286 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002287 return m.installFile(installPath, name, srcPath, Cp, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002288}
2289
Colin Cross70dda7e2019-10-01 22:05:35 -07002290func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
2291 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002292 return m.installFile(installPath, name, srcPath, CpExecutable, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002293}
2294
Colin Cross70dda7e2019-10-01 22:05:35 -07002295func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
2296 rule blueprint.Rule, deps []Path) InstallPath {
Colin Cross35cec122015-04-02 14:37:16 -07002297
Colin Cross25de6c32019-06-06 14:29:25 -07002298 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002299 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08002300
Colin Cross25de6c32019-06-06 14:29:25 -07002301 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002302
Colin Cross897266e2020-02-13 13:22:08 -08002303 deps = append(deps, m.installDeps.Paths()...)
Colin Cross35cec122015-04-02 14:37:16 -07002304
Colin Cross89562dc2016-10-03 17:47:19 -07002305 var implicitDeps, orderOnlyDeps Paths
2306
Colin Cross25de6c32019-06-06 14:29:25 -07002307 if m.Host() {
Colin Cross89562dc2016-10-03 17:47:19 -07002308 // Installed host modules might be used during the build, depend directly on their
2309 // dependencies so their timestamp is updated whenever their dependency is updated
2310 implicitDeps = deps
2311 } else {
2312 orderOnlyDeps = deps
2313 }
2314
Colin Cross25de6c32019-06-06 14:29:25 -07002315 m.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07002316 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07002317 Description: "install " + fullInstallPath.Base(),
2318 Output: fullInstallPath,
2319 Input: srcPath,
2320 Implicits: implicitDeps,
2321 OrderOnly: orderOnlyDeps,
Colin Cross25de6c32019-06-06 14:29:25 -07002322 Default: !m.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08002323 })
Colin Cross3f40fa42015-01-30 17:27:36 -08002324
Colin Cross25de6c32019-06-06 14:29:25 -07002325 m.installFiles = append(m.installFiles, fullInstallPath)
Dan Willemsen322acaf2016-01-12 23:07:05 -08002326 }
Colin Cross25de6c32019-06-06 14:29:25 -07002327 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07002328 return fullInstallPath
2329}
2330
Colin Cross70dda7e2019-10-01 22:05:35 -07002331func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002332 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002333 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08002334
Colin Cross25de6c32019-06-06 14:29:25 -07002335 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002336
Alex Lightfb4353d2019-01-17 13:57:45 -08002337 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
2338 if err != nil {
2339 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
2340 }
Colin Cross25de6c32019-06-06 14:29:25 -07002341 m.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07002342 Rule: Symlink,
2343 Description: "install symlink " + fullInstallPath.Base(),
2344 Output: fullInstallPath,
Dan Willemsen40efa1c2020-01-14 15:19:52 -08002345 Input: srcPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002346 Default: !m.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08002347 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08002348 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08002349 },
2350 })
Colin Cross3854a602016-01-11 12:49:11 -08002351
Colin Cross25de6c32019-06-06 14:29:25 -07002352 m.installFiles = append(m.installFiles, fullInstallPath)
2353 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross12fc4972016-01-11 12:49:11 -08002354 }
Colin Cross3854a602016-01-11 12:49:11 -08002355 return fullInstallPath
2356}
2357
Jiyong Parkf1194352019-02-25 11:05:47 +09002358// installPath/name -> absPath where absPath might be a path that is available only at runtime
2359// (e.g. /apex/...)
Colin Cross70dda7e2019-10-01 22:05:35 -07002360func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002361 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002362 m.module.base().hooks.runInstallHooks(m, nil, fullInstallPath, true)
Jiyong Parkf1194352019-02-25 11:05:47 +09002363
Colin Cross25de6c32019-06-06 14:29:25 -07002364 if !m.skipInstall(fullInstallPath) {
2365 m.Build(pctx, BuildParams{
Jiyong Parkf1194352019-02-25 11:05:47 +09002366 Rule: Symlink,
2367 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
2368 Output: fullInstallPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002369 Default: !m.Config().EmbeddedInMake(),
Jiyong Parkf1194352019-02-25 11:05:47 +09002370 Args: map[string]string{
2371 "fromPath": absPath,
2372 },
2373 })
2374
Colin Cross25de6c32019-06-06 14:29:25 -07002375 m.installFiles = append(m.installFiles, fullInstallPath)
Jiyong Parkf1194352019-02-25 11:05:47 +09002376 }
2377 return fullInstallPath
2378}
2379
Colin Cross25de6c32019-06-06 14:29:25 -07002380func (m *moduleContext) CheckbuildFile(srcPath Path) {
2381 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross3f40fa42015-01-30 17:27:36 -08002382}
2383
Colin Cross41955e82019-05-29 14:40:35 -07002384// SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input
2385// was not a module reference.
2386func SrcIsModule(s string) (module string) {
Colin Cross068e0fe2016-12-13 15:23:47 -08002387 if len(s) > 1 && s[0] == ':' {
2388 return s[1:]
2389 }
2390 return ""
2391}
2392
Colin Cross41955e82019-05-29 14:40:35 -07002393// SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the
2394// module name and an empty string for the tag, or empty strings if the input was not a module reference.
2395func SrcIsModuleWithTag(s string) (module, tag string) {
2396 if len(s) > 1 && s[0] == ':' {
2397 module = s[1:]
2398 if tagStart := strings.IndexByte(module, '{'); tagStart > 0 {
2399 if module[len(module)-1] == '}' {
2400 tag = module[tagStart+1 : len(module)-1]
2401 module = module[:tagStart]
2402 return module, tag
2403 }
2404 }
2405 return module, ""
2406 }
2407 return "", ""
Colin Cross068e0fe2016-12-13 15:23:47 -08002408}
2409
Colin Cross41955e82019-05-29 14:40:35 -07002410type sourceOrOutputDependencyTag struct {
2411 blueprint.BaseDependencyTag
2412 tag string
2413}
2414
2415func sourceOrOutputDepTag(tag string) blueprint.DependencyTag {
2416 return sourceOrOutputDependencyTag{tag: tag}
2417}
2418
2419var SourceDepTag = sourceOrOutputDepTag("")
Colin Cross068e0fe2016-12-13 15:23:47 -08002420
Colin Cross366938f2017-12-11 16:29:02 -08002421// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
2422// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002423//
2424// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08002425func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
Nan Zhang2439eb72017-04-10 11:27:50 -07002426 set := make(map[string]bool)
2427
Colin Cross068e0fe2016-12-13 15:23:47 -08002428 for _, s := range srcFiles {
Colin Cross41955e82019-05-29 14:40:35 -07002429 if m, t := SrcIsModuleWithTag(s); m != "" {
2430 if _, found := set[s]; found {
2431 ctx.ModuleErrorf("found source dependency duplicate: %q!", s)
Nan Zhang2439eb72017-04-10 11:27:50 -07002432 } else {
Colin Cross41955e82019-05-29 14:40:35 -07002433 set[s] = true
2434 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Nan Zhang2439eb72017-04-10 11:27:50 -07002435 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002436 }
2437 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002438}
2439
Colin Cross366938f2017-12-11 16:29:02 -08002440// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
2441// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002442//
2443// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08002444func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
2445 if s != nil {
Colin Cross41955e82019-05-29 14:40:35 -07002446 if m, t := SrcIsModuleWithTag(*s); m != "" {
2447 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Colin Cross366938f2017-12-11 16:29:02 -08002448 }
2449 }
2450}
2451
Colin Cross41955e82019-05-29 14:40:35 -07002452// A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"`
2453// 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 -08002454type SourceFileProducer interface {
2455 Srcs() Paths
2456}
2457
Colin Cross41955e82019-05-29 14:40:35 -07002458// A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"`
Roland Levillain97c1f342019-11-22 14:20:54 +00002459// 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 -07002460// listed in the property.
2461type OutputFileProducer interface {
2462 OutputFiles(tag string) (Paths, error)
2463}
2464
Colin Cross5e708052019-08-06 13:59:50 -07002465// OutputFilesForModule returns the paths from an OutputFileProducer with the given tag. On error, including if the
2466// module produced zero paths, it reports errors to the ctx and returns nil.
2467func OutputFilesForModule(ctx PathContext, module blueprint.Module, tag string) Paths {
2468 paths, err := outputFilesForModule(ctx, module, tag)
2469 if err != nil {
2470 reportPathError(ctx, err)
2471 return nil
2472 }
2473 return paths
2474}
2475
2476// OutputFileForModule returns the path from an OutputFileProducer with the given tag. On error, including if the
2477// module produced zero or multiple paths, it reports errors to the ctx and returns nil.
2478func OutputFileForModule(ctx PathContext, module blueprint.Module, tag string) Path {
2479 paths, err := outputFilesForModule(ctx, module, tag)
2480 if err != nil {
2481 reportPathError(ctx, err)
2482 return nil
2483 }
2484 if len(paths) > 1 {
Ulya Trafimovich5ab276a2020-08-25 12:45:15 +01002485 ReportPathErrorf(ctx, "got multiple output files from module %q, expected exactly one",
Colin Cross5e708052019-08-06 13:59:50 -07002486 pathContextName(ctx, module))
2487 return nil
2488 }
2489 return paths[0]
2490}
2491
2492func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
2493 if outputFileProducer, ok := module.(OutputFileProducer); ok {
2494 paths, err := outputFileProducer.OutputFiles(tag)
2495 if err != nil {
2496 return nil, fmt.Errorf("failed to get output file from module %q: %s",
2497 pathContextName(ctx, module), err.Error())
2498 }
2499 if len(paths) == 0 {
2500 return nil, fmt.Errorf("failed to get output files from module %q", pathContextName(ctx, module))
2501 }
2502 return paths, nil
2503 } else {
2504 return nil, fmt.Errorf("module %q is not an OutputFileProducer", pathContextName(ctx, module))
2505 }
2506}
2507
Colin Crossfe17f6f2019-03-28 19:30:56 -07002508type HostToolProvider interface {
2509 HostToolPath() OptionalPath
2510}
2511
Colin Cross27b922f2019-03-04 22:35:41 -08002512// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
2513// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002514//
2515// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002516func (m *moduleContext) ExpandSources(srcFiles, excludes []string) Paths {
2517 return PathsForModuleSrcExcludes(m, srcFiles, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07002518}
2519
Colin Cross2fafa3e2019-03-05 12:39:51 -08002520// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
2521// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002522//
2523// Deprecated: use PathForModuleSrc instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002524func (m *moduleContext) ExpandSource(srcFile, prop string) Path {
2525 return PathForModuleSrc(m, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08002526}
2527
2528// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
2529// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
2530// dependency resolution.
Colin Cross25de6c32019-06-06 14:29:25 -07002531func (m *moduleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
Colin Cross2fafa3e2019-03-05 12:39:51 -08002532 if srcFile != nil {
Colin Cross25de6c32019-06-06 14:29:25 -07002533 return OptionalPathForPath(PathForModuleSrc(m, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08002534 }
2535 return OptionalPath{}
2536}
2537
Colin Cross25de6c32019-06-06 14:29:25 -07002538func (m *moduleContext) RequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002539 return m.module.RequiredModuleNames()
Nan Zhang6d34b302017-02-04 17:47:46 -08002540}
2541
Colin Cross25de6c32019-06-06 14:29:25 -07002542func (m *moduleContext) HostRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002543 return m.module.HostRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002544}
2545
Colin Cross25de6c32019-06-06 14:29:25 -07002546func (m *moduleContext) TargetRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002547 return m.module.TargetRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002548}
2549
Colin Cross463a90e2015-06-17 14:20:06 -07002550func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07002551 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07002552}
2553
Colin Cross0875c522017-11-28 17:34:01 -08002554func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07002555 return &buildTargetSingleton{}
2556}
2557
Colin Cross87d8b562017-04-25 10:01:55 -07002558func parentDir(dir string) string {
2559 dir, _ = filepath.Split(dir)
2560 return filepath.Clean(dir)
2561}
2562
Colin Cross1f8c52b2015-06-16 16:38:17 -07002563type buildTargetSingleton struct{}
2564
Colin Cross0875c522017-11-28 17:34:01 -08002565func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
2566 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07002567
Colin Crossc3d87d32020-06-04 13:25:17 -07002568 mmTarget := func(dir string) string {
2569 return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1)
Colin Cross87d8b562017-04-25 10:01:55 -07002570 }
2571
Colin Cross0875c522017-11-28 17:34:01 -08002572 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002573
Colin Cross0875c522017-11-28 17:34:01 -08002574 ctx.VisitAllModules(func(module Module) {
2575 blueprintDir := module.base().blueprintDir
2576 installTarget := module.base().installTarget
2577 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07002578
Colin Cross0875c522017-11-28 17:34:01 -08002579 if checkbuildTarget != nil {
2580 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
2581 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
2582 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002583
Colin Cross0875c522017-11-28 17:34:01 -08002584 if installTarget != nil {
2585 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002586 }
2587 })
2588
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002589 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08002590 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002591 suffix = "-soong"
2592 }
2593
Colin Cross1f8c52b2015-06-16 16:38:17 -07002594 // Create a top-level checkbuild target that depends on all modules
Colin Crossc3d87d32020-06-04 13:25:17 -07002595 ctx.Phony("checkbuild"+suffix, checkbuildDeps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002596
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002597 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08002598 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002599 return
2600 }
2601
Colin Cross87d8b562017-04-25 10:01:55 -07002602 // Ensure ancestor directories are in modulesInDir
Inseob Kim1a365c62019-06-08 15:47:51 +09002603 dirs := SortedStringKeys(modulesInDir)
Colin Cross87d8b562017-04-25 10:01:55 -07002604 for _, dir := range dirs {
2605 dir := parentDir(dir)
2606 for dir != "." && dir != "/" {
2607 if _, exists := modulesInDir[dir]; exists {
2608 break
2609 }
2610 modulesInDir[dir] = nil
2611 dir = parentDir(dir)
2612 }
2613 }
2614
2615 // Make directories build their direct subdirectories
Colin Cross87d8b562017-04-25 10:01:55 -07002616 for _, dir := range dirs {
2617 p := parentDir(dir)
2618 if p != "." && p != "/" {
Colin Crossc3d87d32020-06-04 13:25:17 -07002619 modulesInDir[p] = append(modulesInDir[p], PathForPhony(ctx, mmTarget(dir)))
Colin Cross87d8b562017-04-25 10:01:55 -07002620 }
2621 }
2622
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002623 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
2624 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
2625 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07002626 for _, dir := range dirs {
Colin Crossc3d87d32020-06-04 13:25:17 -07002627 ctx.Phony(mmTarget(dir), modulesInDir[dir]...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002628 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002629
2630 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
Jiyong Park1613e552020-09-14 19:43:17 +09002631 type osAndCross struct {
2632 os OsType
2633 hostCross bool
2634 }
2635 osDeps := map[osAndCross]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08002636 ctx.VisitAllModules(func(module Module) {
2637 if module.Enabled() {
Jiyong Park1613e552020-09-14 19:43:17 +09002638 key := osAndCross{os: module.Target().Os, hostCross: module.Target().HostCross}
2639 osDeps[key] = append(osDeps[key], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002640 }
2641 })
2642
Colin Cross0875c522017-11-28 17:34:01 -08002643 osClass := make(map[string]Paths)
Jiyong Park1613e552020-09-14 19:43:17 +09002644 for key, deps := range osDeps {
Dan Willemsen61d88b82017-09-20 17:29:08 -07002645 var className string
2646
Jiyong Park1613e552020-09-14 19:43:17 +09002647 switch key.os.Class {
Dan Willemsen61d88b82017-09-20 17:29:08 -07002648 case Host:
Jiyong Park1613e552020-09-14 19:43:17 +09002649 if key.hostCross {
2650 className = "host-cross"
2651 } else {
2652 className = "host"
2653 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002654 case Device:
2655 className = "target"
2656 default:
2657 continue
2658 }
2659
Jiyong Park1613e552020-09-14 19:43:17 +09002660 name := className + "-" + key.os.Name
Colin Crossc3d87d32020-06-04 13:25:17 -07002661 osClass[className] = append(osClass[className], PathForPhony(ctx, name))
Dan Willemsen61d88b82017-09-20 17:29:08 -07002662
Colin Crossc3d87d32020-06-04 13:25:17 -07002663 ctx.Phony(name, deps...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002664 }
2665
2666 // Wrap those into host|host-cross|target phony rules
Inseob Kim1a365c62019-06-08 15:47:51 +09002667 for _, class := range SortedStringKeys(osClass) {
Colin Crossc3d87d32020-06-04 13:25:17 -07002668 ctx.Phony(class, osClass[class]...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002669 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002670}
Colin Crossd779da42015-12-17 18:00:23 -08002671
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002672// Collect information for opening IDE project files in java/jdeps.go.
2673type IDEInfo interface {
2674 IDEInfo(ideInfo *IdeInfo)
2675 BaseModuleName() string
2676}
2677
2678// Extract the base module name from the Import name.
2679// Often the Import name has a prefix "prebuilt_".
2680// Remove the prefix explicitly if needed
2681// until we find a better solution to get the Import name.
2682type IDECustomizedModuleName interface {
2683 IDECustomizedModuleName() string
2684}
2685
2686type IdeInfo struct {
2687 Deps []string `json:"dependencies,omitempty"`
2688 Srcs []string `json:"srcs,omitempty"`
2689 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
2690 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
2691 Jars []string `json:"jars,omitempty"`
2692 Classes []string `json:"class,omitempty"`
2693 Installed_paths []string `json:"installed,omitempty"`
patricktu18c82ff2019-05-10 15:48:50 +08002694 SrcJars []string `json:"srcjars,omitempty"`
bralee1fbf4402020-05-21 10:11:59 +08002695 Paths []string `json:"path,omitempty"`
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002696}
Paul Duffinf88d8e02020-05-07 20:21:34 +01002697
2698func CheckBlueprintSyntax(ctx BaseModuleContext, filename string, contents string) []error {
2699 bpctx := ctx.blueprintBaseModuleContext()
2700 return blueprint.CheckBlueprintSyntax(bpctx.ModuleFactories(), filename, contents)
2701}