blob: 9bcb22f04756f2508de799165dcea560bea3c43e [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
Colin Cross08d6f8f2020-11-19 02:33:19 +0000515type 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 (
Colin Cross34037c62020-11-17 13:19:17 -0800768 hostSupported = 1 << iota
769 hostCrossSupported
770 deviceSupported
771 hostDefault
772 deviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700773
774 // Host and HostCross are built by default. Device is not supported.
Colin Cross34037c62020-11-17 13:19:17 -0800775 HostSupported = hostSupported | hostCrossSupported | hostDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700776
777 // Host is built by default. HostCross and Device are not supported.
Colin Cross34037c62020-11-17 13:19:17 -0800778 HostSupportedNoCross = hostSupported | hostDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700779
780 // Device is built by default. Host and HostCross are not supported.
Colin Cross34037c62020-11-17 13:19:17 -0800781 DeviceSupported = deviceSupported | deviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700782
783 // Device is built by default. Host and HostCross are supported.
Colin Cross34037c62020-11-17 13:19:17 -0800784 HostAndDeviceSupported = hostSupported | hostCrossSupported | deviceSupported | deviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700785
786 // Host, HostCross, and Device are built by default.
Colin Cross34037c62020-11-17 13:19:17 -0800787 HostAndDeviceDefault = hostSupported | hostCrossSupported | hostDefault |
788 deviceSupported | deviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700789
790 // Nothing is supported. This is not exposed to the user, but used to mark a
791 // host only module as unsupported when the module type is not supported on
792 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Colin Cross34037c62020-11-17 13:19:17 -0800793 NeitherHostNorDeviceSupported = 0
Colin Crossa1ad8d12016-06-01 17:09:44 -0700794)
795
Jiyong Park2db76922017-11-08 16:03:48 +0900796type moduleKind int
797
798const (
799 platformModule moduleKind = iota
800 deviceSpecificModule
801 socSpecificModule
802 productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +0900803 systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900804)
805
806func (k moduleKind) String() string {
807 switch k {
808 case platformModule:
809 return "platform"
810 case deviceSpecificModule:
811 return "device-specific"
812 case socSpecificModule:
813 return "soc-specific"
814 case productSpecificModule:
815 return "product-specific"
Justin Yund5f6c822019-06-25 16:47:17 +0900816 case systemExtSpecificModule:
817 return "systemext-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900818 default:
819 panic(fmt.Errorf("unknown module kind %d", k))
820 }
821}
822
Colin Cross9d34f352019-11-22 16:03:51 -0800823func initAndroidModuleBase(m Module) {
824 m.base().module = m
825}
826
Colin Cross36242852017-06-23 15:06:31 -0700827func InitAndroidModule(m Module) {
Colin Cross9d34f352019-11-22 16:03:51 -0800828 initAndroidModuleBase(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800829 base := m.base()
Colin Cross5049f022015-03-18 13:28:46 -0700830
Colin Cross36242852017-06-23 15:06:31 -0700831 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700832 &base.nameProperties,
Paul Duffined875132020-09-02 13:08:57 +0100833 &base.commonProperties,
834 &base.distProperties)
Colin Cross18c46802019-09-24 22:19:02 -0700835
Colin Crosseabaedd2020-02-06 17:01:55 -0800836 initProductVariableModule(m)
Colin Cross18c46802019-09-24 22:19:02 -0700837
Colin Crossa3a97412019-03-18 12:24:29 -0700838 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700839 base.customizableProperties = m.GetProperties()
Paul Duffin63c6e182019-07-24 14:24:38 +0100840
841 // The default_visibility property needs to be checked and parsed by the visibility module during
Paul Duffin5ec73ec2020-05-01 17:52:01 +0100842 // its checking and parsing phases so make it the primary visibility property.
843 setPrimaryVisibilityProperty(m, "visibility", &base.commonProperties.Visibility)
Colin Cross5049f022015-03-18 13:28:46 -0700844}
845
Colin Cross36242852017-06-23 15:06:31 -0700846func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
847 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700848
849 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800850 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700851 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700852 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700853 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800854
Colin Cross34037c62020-11-17 13:19:17 -0800855 if hod&hostSupported != 0 && hod&deviceSupported != 0 {
Colin Cross36242852017-06-23 15:06:31 -0700856 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800857 }
858
Colin Cross36242852017-06-23 15:06:31 -0700859 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800860}
861
Colin Crossee0bc3b2018-10-02 22:01:37 -0700862func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
863 InitAndroidArchModule(m, hod, defaultMultilib)
864 m.base().commonProperties.UseTargetVariants = false
865}
866
Paul Duffin1356d8c2020-02-25 19:26:33 +0000867// As InitAndroidMultiTargetsArchModule except it creates an additional CommonOS variant that
868// has dependencies on all the OsType specific variants.
869func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
870 InitAndroidArchModule(m, hod, defaultMultilib)
871 m.base().commonProperties.UseTargetVariants = false
872 m.base().commonProperties.CreateCommonOSVariant = true
873}
874
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800875// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800876// modules. It should be included as an anonymous field in every module
877// struct definition. InitAndroidModule should then be called from the module's
878// factory function, and the return values from InitAndroidModule should be
879// returned from the factory function.
880//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800881// The ModuleBase type is responsible for implementing the GenerateBuildActions
882// method to support the blueprint.Module interface. This method will then call
883// the module's GenerateAndroidBuildActions method once for each build variant
Colin Cross25de6c32019-06-06 14:29:25 -0700884// that is to be built. GenerateAndroidBuildActions is passed a ModuleContext
885// rather than the usual blueprint.ModuleContext.
886// ModuleContext exposes extra functionality specific to the Android build
Colin Cross3f40fa42015-01-30 17:27:36 -0800887// system including details about the particular build variant that is to be
888// generated.
889//
890// For example:
891//
892// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800893// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800894// )
895//
896// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800897// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800898// properties struct {
899// MyProperty string
900// }
901// }
902//
Colin Cross36242852017-06-23 15:06:31 -0700903// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800904// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700905// m.AddProperties(&m.properties)
906// android.InitAndroidModule(m)
907// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800908// }
909//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800910// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800911// // Get the CPU architecture for the current build variant.
912// variantArch := ctx.Arch()
913//
914// // ...
915// }
Colin Cross635c3b02016-05-18 15:37:25 -0700916type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800917 // Putting the curiously recurring thing pointing to the thing that contains
918 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700919 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700920 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800921
Colin Crossfc754582016-05-17 16:34:16 -0700922 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800923 commonProperties commonProperties
Paul Duffined875132020-09-02 13:08:57 +0100924 distProperties distProperties
Colin Cross18c46802019-09-24 22:19:02 -0700925 variableProperties interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800926 hostAndDeviceProperties hostAndDeviceProperties
927 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700928 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700929 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800930
Paul Duffin63c6e182019-07-24 14:24:38 +0100931 // Information about all the properties on the module that contains visibility rules that need
932 // checking.
933 visibilityPropertyInfo []visibilityProperty
934
935 // The primary visibility property, may be nil, that controls access to the module.
936 primaryVisibilityProperty visibilityProperty
937
Colin Cross3f40fa42015-01-30 17:27:36 -0800938 noAddressSanitizer bool
Colin Cross897266e2020-02-13 13:22:08 -0800939 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700940 checkbuildFiles Paths
Bob Badoura75b0572020-02-18 20:21:55 -0800941 noticeFiles Paths
Colin Crossc3d87d32020-06-04 13:25:17 -0700942 phonies map[string]Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -0700943
944 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
945 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800946 installTarget WritablePath
947 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700948 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700949
Colin Cross178a5092016-09-13 13:42:32 -0700950 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700951
952 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700953
954 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700955 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800956 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800957 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700958
Inseob Kim8471cda2019-11-15 09:59:12 +0900959 initRcPaths Paths
960 vintfFragmentsPaths Paths
961
Jiyong Park1613e552020-09-14 19:43:17 +0900962 prefer32 func(ctx BaseModuleContext, base *ModuleBase, os OsType) bool
Colin Cross36242852017-06-23 15:06:31 -0700963}
964
Paul Duffin44f1d842020-06-26 20:17:02 +0100965func (m *ModuleBase) ComponentDepsMutator(BottomUpMutatorContext) {}
966
Colin Cross4157e882019-06-06 16:57:04 -0700967func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
Colin Cross5f692ec2019-02-01 16:53:07 -0800968
Colin Cross4157e882019-06-06 16:57:04 -0700969func (m *ModuleBase) AddProperties(props ...interface{}) {
970 m.registerProps = append(m.registerProps, props...)
Colin Cross36242852017-06-23 15:06:31 -0700971}
972
Colin Cross4157e882019-06-06 16:57:04 -0700973func (m *ModuleBase) GetProperties() []interface{} {
974 return m.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800975}
976
Colin Cross4157e882019-06-06 16:57:04 -0700977func (m *ModuleBase) BuildParamsForTests() []BuildParams {
978 return m.buildParams
Colin Crosscec81712017-07-13 14:43:27 -0700979}
980
Colin Cross4157e882019-06-06 16:57:04 -0700981func (m *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
982 return m.ruleParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800983}
984
Colin Cross4157e882019-06-06 16:57:04 -0700985func (m *ModuleBase) VariablesForTests() map[string]string {
986 return m.variables
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800987}
988
Jiyong Park1613e552020-09-14 19:43:17 +0900989func (m *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, os OsType) bool) {
Colin Cross4157e882019-06-06 16:57:04 -0700990 m.prefer32 = prefer32
Colin Crossa9d8bee2018-10-02 13:59:46 -0700991}
992
Colin Crossce75d2c2016-10-06 16:12:58 -0700993// Name returns the name of the module. It may be overridden by individual module types, for
994// example prebuilts will prepend prebuilt_ to the name.
Colin Cross4157e882019-06-06 16:57:04 -0700995func (m *ModuleBase) Name() string {
996 return String(m.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700997}
998
Colin Cross9a362232019-07-01 15:32:45 -0700999// String returns a string that includes the module name and variants for printing during debugging.
1000func (m *ModuleBase) String() string {
1001 sb := strings.Builder{}
1002 sb.WriteString(m.commonProperties.DebugName)
1003 sb.WriteString("{")
1004 for i := range m.commonProperties.DebugMutators {
1005 if i != 0 {
1006 sb.WriteString(",")
1007 }
1008 sb.WriteString(m.commonProperties.DebugMutators[i])
1009 sb.WriteString(":")
1010 sb.WriteString(m.commonProperties.DebugVariations[i])
1011 }
1012 sb.WriteString("}")
1013 return sb.String()
1014}
1015
Colin Crossce75d2c2016-10-06 16:12:58 -07001016// BaseModuleName returns the name of the module as specified in the blueprints file.
Colin Cross4157e882019-06-06 16:57:04 -07001017func (m *ModuleBase) BaseModuleName() string {
1018 return String(m.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -07001019}
1020
Colin Cross4157e882019-06-06 16:57:04 -07001021func (m *ModuleBase) base() *ModuleBase {
1022 return m
Colin Cross3f40fa42015-01-30 17:27:36 -08001023}
1024
Paul Duffine2453c72019-05-31 14:00:04 +01001025func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
1026 return qualifiedModuleName{pkg: ctx.ModuleDir(), name: ctx.ModuleName()}
1027}
1028
1029func (m *ModuleBase) visibilityProperties() []visibilityProperty {
Paul Duffin63c6e182019-07-24 14:24:38 +01001030 return m.visibilityPropertyInfo
1031}
1032
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001033func (m *ModuleBase) Dists() []Dist {
Paul Duffined875132020-09-02 13:08:57 +01001034 if len(m.distProperties.Dist.Targets) > 0 {
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001035 // Make a copy of the underlying Dists slice to protect against
1036 // backing array modifications with repeated calls to this method.
Paul Duffined875132020-09-02 13:08:57 +01001037 distsCopy := append([]Dist(nil), m.distProperties.Dists...)
1038 return append(distsCopy, m.distProperties.Dist)
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001039 } else {
Paul Duffined875132020-09-02 13:08:57 +01001040 return m.distProperties.Dists
Jingwen Chen40fd90a2020-06-15 05:24:19 +00001041 }
1042}
1043
1044func (m *ModuleBase) GenerateTaggedDistFiles(ctx BaseModuleContext) TaggedDistFiles {
1045 distFiles := make(TaggedDistFiles)
1046 for _, dist := range m.Dists() {
1047 var tag string
1048 var distFilesForTag Paths
1049 if dist.Tag == nil {
1050 tag = ""
1051 } else {
1052 tag = *dist.Tag
1053 }
1054 distFilesForTag, err := m.base().module.(OutputFileProducer).OutputFiles(tag)
1055 if err != nil {
1056 ctx.PropertyErrorf("dist.tag", "%s", err.Error())
1057 }
1058 for _, distFile := range distFilesForTag {
1059 if distFile != nil && !distFiles[tag].containsPath(distFile) {
1060 distFiles[tag] = append(distFiles[tag], distFile)
1061 }
1062 }
1063 }
1064
1065 return distFiles
1066}
1067
Colin Cross4157e882019-06-06 16:57:04 -07001068func (m *ModuleBase) Target() Target {
1069 return m.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -08001070}
1071
Colin Cross4157e882019-06-06 16:57:04 -07001072func (m *ModuleBase) TargetPrimary() bool {
1073 return m.commonProperties.CompilePrimary
Colin Cross8b74d172016-09-13 09:59:14 -07001074}
1075
Colin Cross4157e882019-06-06 16:57:04 -07001076func (m *ModuleBase) MultiTargets() []Target {
1077 return m.commonProperties.CompileMultiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07001078}
1079
Colin Cross4157e882019-06-06 16:57:04 -07001080func (m *ModuleBase) Os() OsType {
1081 return m.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001082}
1083
Colin Cross4157e882019-06-06 16:57:04 -07001084func (m *ModuleBase) Host() bool {
Jiyong Park1613e552020-09-14 19:43:17 +09001085 return m.Os().Class == Host
Dan Willemsen97750522016-02-09 17:43:51 -08001086}
1087
Yo Chiangbba545e2020-06-09 16:15:37 +08001088func (m *ModuleBase) Device() bool {
1089 return m.Os().Class == Device
1090}
1091
Colin Cross4157e882019-06-06 16:57:04 -07001092func (m *ModuleBase) Arch() Arch {
1093 return m.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -08001094}
1095
Colin Cross4157e882019-06-06 16:57:04 -07001096func (m *ModuleBase) ArchSpecific() bool {
1097 return m.commonProperties.ArchSpecific
Dan Willemsen0b24c742016-10-04 15:13:37 -07001098}
1099
Paul Duffin1356d8c2020-02-25 19:26:33 +00001100// True if the current variant is a CommonOS variant, false otherwise.
1101func (m *ModuleBase) IsCommonOSVariant() bool {
1102 return m.commonProperties.CommonOSVariant
1103}
1104
Colin Cross34037c62020-11-17 13:19:17 -08001105// supportsTarget returns true if the given Target is supported by the current module.
1106func (m *ModuleBase) supportsTarget(target Target) bool {
1107 switch target.Os.Class {
1108 case Host:
1109 if target.HostCross {
1110 return m.HostCrossSupported()
1111 } else {
1112 return m.HostSupported()
Colin Crossa1ad8d12016-06-01 17:09:44 -07001113 }
Colin Cross34037c62020-11-17 13:19:17 -08001114 case Device:
1115 return m.DeviceSupported()
Colin Crossa1ad8d12016-06-01 17:09:44 -07001116 default:
Jiyong Park1613e552020-09-14 19:43:17 +09001117 return false
Colin Crossa1ad8d12016-06-01 17:09:44 -07001118 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001119}
1120
Colin Cross34037c62020-11-17 13:19:17 -08001121// DeviceSupported returns true if the current module is supported and enabled for device targets,
1122// i.e. the factory method set the HostOrDeviceSupported value to include device support and
1123// the device support is enabled by default or enabled by the device_supported property.
Colin Cross4157e882019-06-06 16:57:04 -07001124func (m *ModuleBase) DeviceSupported() bool {
Colin Cross34037c62020-11-17 13:19:17 -08001125 hod := m.commonProperties.HostOrDeviceSupported
1126 // deviceEnabled is true if the device_supported property is true or the HostOrDeviceSupported
1127 // value has the deviceDefault bit set.
1128 deviceEnabled := proptools.BoolDefault(m.hostAndDeviceProperties.Device_supported, hod&deviceDefault != 0)
1129 return hod&deviceSupported != 0 && deviceEnabled
Colin Cross3f40fa42015-01-30 17:27:36 -08001130}
1131
Colin Cross34037c62020-11-17 13:19:17 -08001132// HostSupported returns true if the current module is supported and enabled for host targets,
1133// i.e. the factory method set the HostOrDeviceSupported value to include host support and
1134// the host support is enabled by default or enabled by the host_supported property.
Paul Duffine44358f2019-11-26 18:04:12 +00001135func (m *ModuleBase) HostSupported() bool {
Colin Cross34037c62020-11-17 13:19:17 -08001136 hod := m.commonProperties.HostOrDeviceSupported
1137 // hostEnabled is true if the host_supported property is true or the HostOrDeviceSupported
1138 // value has the hostDefault bit set.
1139 hostEnabled := proptools.BoolDefault(m.hostAndDeviceProperties.Host_supported, hod&hostDefault != 0)
1140 return hod&hostSupported != 0 && hostEnabled
1141}
1142
1143// HostCrossSupported returns true if the current module is supported and enabled for host cross
1144// targets, i.e. the factory method set the HostOrDeviceSupported value to include host cross
1145// support and the host cross support is enabled by default or enabled by the
1146// host_supported property.
1147func (m *ModuleBase) HostCrossSupported() bool {
1148 hod := m.commonProperties.HostOrDeviceSupported
1149 // hostEnabled is true if the host_supported property is true or the HostOrDeviceSupported
1150 // value has the hostDefault bit set.
1151 hostEnabled := proptools.BoolDefault(m.hostAndDeviceProperties.Host_supported, hod&hostDefault != 0)
1152 return hod&hostCrossSupported != 0 && hostEnabled
Paul Duffine44358f2019-11-26 18:04:12 +00001153}
1154
Colin Cross4157e882019-06-06 16:57:04 -07001155func (m *ModuleBase) Platform() bool {
Justin Yund5f6c822019-06-25 16:47:17 +09001156 return !m.DeviceSpecific() && !m.SocSpecific() && !m.ProductSpecific() && !m.SystemExtSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +09001157}
1158
Colin Cross4157e882019-06-06 16:57:04 -07001159func (m *ModuleBase) DeviceSpecific() bool {
1160 return Bool(m.commonProperties.Device_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001161}
1162
Colin Cross4157e882019-06-06 16:57:04 -07001163func (m *ModuleBase) SocSpecific() bool {
1164 return Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001165}
1166
Colin Cross4157e882019-06-06 16:57:04 -07001167func (m *ModuleBase) ProductSpecific() bool {
1168 return Bool(m.commonProperties.Product_specific)
Jiyong Parkc678ad32018-04-10 13:07:10 +09001169}
1170
Justin Yund5f6c822019-06-25 16:47:17 +09001171func (m *ModuleBase) SystemExtSpecific() bool {
1172 return Bool(m.commonProperties.System_ext_specific)
Dario Frenifd05a742018-05-29 13:28:54 +01001173}
1174
Colin Crossc2d24052020-05-13 11:05:02 -07001175// RequiresStableAPIs returns true if the module will be installed to a partition that may
1176// be updated separately from the system image.
1177func (m *ModuleBase) RequiresStableAPIs(ctx BaseModuleContext) bool {
1178 return m.SocSpecific() || m.DeviceSpecific() ||
1179 (m.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface())
1180}
1181
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001182func (m *ModuleBase) PartitionTag(config DeviceConfig) string {
1183 partition := "system"
1184 if m.SocSpecific() {
1185 // A SoC-specific module could be on the vendor partition at
1186 // "vendor" or the system partition at "system/vendor".
1187 if config.VendorPath() == "vendor" {
1188 partition = "vendor"
1189 }
1190 } else if m.DeviceSpecific() {
1191 // A device-specific module could be on the odm partition at
1192 // "odm", the vendor partition at "vendor/odm", or the system
1193 // partition at "system/vendor/odm".
1194 if config.OdmPath() == "odm" {
1195 partition = "odm"
Ramy Medhat944839a2020-03-31 22:14:52 -04001196 } else if strings.HasPrefix(config.OdmPath(), "vendor/") {
Bill Peckhamfff3f8a2020-03-20 18:33:20 -07001197 partition = "vendor"
1198 }
1199 } else if m.ProductSpecific() {
1200 // A product-specific module could be on the product partition
1201 // at "product" or the system partition at "system/product".
1202 if config.ProductPath() == "product" {
1203 partition = "product"
1204 }
1205 } else if m.SystemExtSpecific() {
1206 // A system_ext-specific module could be on the system_ext
1207 // partition at "system_ext" or the system partition at
1208 // "system/system_ext".
1209 if config.SystemExtPath() == "system_ext" {
1210 partition = "system_ext"
1211 }
1212 }
1213 return partition
1214}
1215
Colin Cross4157e882019-06-06 16:57:04 -07001216func (m *ModuleBase) Enabled() bool {
Justin Yun32f053b2020-07-31 23:07:17 +09001217 if m.commonProperties.ForcedDisabled {
1218 return false
1219 }
Colin Cross08d6f8f2020-11-19 02:33:19 +00001220 if m.commonProperties.Enabled == nil {
1221 return !m.Os().DefaultDisabled
1222 }
1223 return *m.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -08001224}
1225
Inseob Kimeec88e12020-01-22 11:11:29 +09001226func (m *ModuleBase) Disable() {
Justin Yun32f053b2020-07-31 23:07:17 +09001227 m.commonProperties.ForcedDisabled = true
Inseob Kimeec88e12020-01-22 11:11:29 +09001228}
1229
Colin Cross4157e882019-06-06 16:57:04 -07001230func (m *ModuleBase) SkipInstall() {
1231 m.commonProperties.SkipInstall = true
Colin Crossce75d2c2016-10-06 16:12:58 -07001232}
1233
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00001234func (m *ModuleBase) IsSkipInstall() bool {
1235 return m.commonProperties.SkipInstall == true
1236}
1237
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01001238// Similar to SkipInstall, but if the AndroidMk entry would set
1239// LOCAL_UNINSTALLABLE_MODULE then this variant may still output that entry
1240// rather than leaving it out altogether. That happens in cases where it would
1241// have other side effects, in particular when it adds a NOTICE file target,
1242// which other install targets might depend on.
1243func (m *ModuleBase) MakeUninstallable() {
1244 m.SkipInstall()
1245}
1246
Liz Kammer5ca3a622020-08-05 15:40:41 -07001247func (m *ModuleBase) ReplacedByPrebuilt() {
1248 m.commonProperties.ReplacedByPrebuilt = true
1249 m.SkipInstall()
1250}
1251
1252func (m *ModuleBase) IsReplacedByPrebuilt() bool {
1253 return m.commonProperties.ReplacedByPrebuilt
1254}
1255
Colin Cross4157e882019-06-06 16:57:04 -07001256func (m *ModuleBase) ExportedToMake() bool {
1257 return m.commonProperties.NamespaceExportedToMake
Jiyong Park374510b2018-03-19 18:23:01 +09001258}
1259
Colin Cross897266e2020-02-13 13:22:08 -08001260func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {
Colin Crossb5ae1932020-11-17 06:32:06 +00001261
Colin Cross897266e2020-02-13 13:22:08 -08001262 var result InstallPaths
Colin Crossb5ae1932020-11-17 06:32:06 +00001263 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
1264 ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
1265 if a, ok := m.(Module); ok {
1266 result = append(result, a.FilesToInstall()...)
Colin Cross897266e2020-02-13 13:22:08 -08001267 }
1268 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001269
1270 return result
1271}
1272
Jiyong Park4dc2a1a2020-09-28 17:46:22 +09001273func (m *ModuleBase) FilesToInstall() InstallPaths {
Colin Cross4157e882019-06-06 16:57:04 -07001274 return m.installFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001275}
1276
Colin Cross4157e882019-06-06 16:57:04 -07001277func (m *ModuleBase) NoAddressSanitizer() bool {
1278 return m.noAddressSanitizer
Colin Cross3f40fa42015-01-30 17:27:36 -08001279}
1280
Colin Cross4157e882019-06-06 16:57:04 -07001281func (m *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -08001282 return false
1283}
1284
Jaewoong Jung0949f312019-09-11 10:25:18 -07001285func (m *ModuleBase) InstallInTestcases() bool {
1286 return false
1287}
1288
Colin Cross4157e882019-06-06 16:57:04 -07001289func (m *ModuleBase) InstallInSanitizerDir() bool {
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001290 return false
1291}
1292
Yifan Hong1b3348d2020-01-21 15:53:22 -08001293func (m *ModuleBase) InstallInRamdisk() bool {
1294 return Bool(m.commonProperties.Ramdisk)
1295}
1296
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001297func (m *ModuleBase) InstallInVendorRamdisk() bool {
1298 return Bool(m.commonProperties.Vendor_ramdisk)
1299}
1300
Colin Cross4157e882019-06-06 16:57:04 -07001301func (m *ModuleBase) InstallInRecovery() bool {
1302 return Bool(m.commonProperties.Recovery)
Jiyong Parkf9332f12018-02-01 00:54:12 +09001303}
1304
Colin Cross90ba5f42019-10-02 11:10:58 -07001305func (m *ModuleBase) InstallInRoot() bool {
1306 return false
1307}
1308
Colin Cross607d8582019-07-29 16:44:46 -07001309func (m *ModuleBase) InstallBypassMake() bool {
1310 return false
1311}
1312
Jiyong Park87788b52020-09-01 12:37:45 +09001313func (m *ModuleBase) InstallForceOS() (*OsType, *ArchType) {
1314 return nil, nil
Colin Cross6e359402020-02-10 15:29:54 -08001315}
1316
Colin Cross4157e882019-06-06 16:57:04 -07001317func (m *ModuleBase) Owner() string {
1318 return String(m.commonProperties.Owner)
Sundong Ahn4fd04bb2018-08-31 18:01:37 +09001319}
1320
Bob Badoura75b0572020-02-18 20:21:55 -08001321func (m *ModuleBase) NoticeFiles() Paths {
1322 return m.noticeFiles
Jiyong Park52818fc2019-03-18 12:01:38 +09001323}
1324
Colin Cross7228ecd2019-11-18 16:00:16 -08001325func (m *ModuleBase) setImageVariation(variant string) {
1326 m.commonProperties.ImageVariation = variant
1327}
1328
1329func (m *ModuleBase) ImageVariation() blueprint.Variation {
1330 return blueprint.Variation{
1331 Mutator: "image",
1332 Variation: m.base().commonProperties.ImageVariation,
1333 }
1334}
1335
Paul Duffin9b76c0b2020-03-12 10:24:35 +00001336func (m *ModuleBase) getVariationByMutatorName(mutator string) string {
1337 for i, v := range m.commonProperties.DebugMutators {
1338 if v == mutator {
1339 return m.commonProperties.DebugVariations[i]
1340 }
1341 }
1342
1343 return ""
1344}
1345
Yifan Hong1b3348d2020-01-21 15:53:22 -08001346func (m *ModuleBase) InRamdisk() bool {
1347 return m.base().commonProperties.ImageVariation == RamdiskVariation
1348}
1349
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001350func (m *ModuleBase) InVendorRamdisk() bool {
1351 return m.base().commonProperties.ImageVariation == VendorRamdiskVariation
1352}
1353
Colin Cross7228ecd2019-11-18 16:00:16 -08001354func (m *ModuleBase) InRecovery() bool {
1355 return m.base().commonProperties.ImageVariation == RecoveryVariation
1356}
1357
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09001358func (m *ModuleBase) RequiredModuleNames() []string {
1359 return m.base().commonProperties.Required
1360}
1361
1362func (m *ModuleBase) HostRequiredModuleNames() []string {
1363 return m.base().commonProperties.Host_required
1364}
1365
1366func (m *ModuleBase) TargetRequiredModuleNames() []string {
1367 return m.base().commonProperties.Target_required
1368}
1369
Inseob Kim8471cda2019-11-15 09:59:12 +09001370func (m *ModuleBase) InitRc() Paths {
1371 return append(Paths{}, m.initRcPaths...)
1372}
1373
1374func (m *ModuleBase) VintfFragments() Paths {
1375 return append(Paths{}, m.vintfFragmentsPaths...)
1376}
1377
Colin Cross4157e882019-06-06 16:57:04 -07001378func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Colin Cross897266e2020-02-13 13:22:08 -08001379 var allInstalledFiles InstallPaths
1380 var allCheckbuildFiles Paths
Colin Cross0875c522017-11-28 17:34:01 -08001381 ctx.VisitAllModuleVariants(func(module Module) {
1382 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -07001383 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
1384 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -08001385 })
1386
Colin Cross0875c522017-11-28 17:34:01 -08001387 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -07001388
Colin Cross133ebef2020-08-14 17:38:45 -07001389 namespacePrefix := ctx.Namespace().id
Jeff Gaston088e29e2017-11-29 16:47:17 -08001390 if namespacePrefix != "" {
1391 namespacePrefix = namespacePrefix + "-"
1392 }
1393
Colin Cross3f40fa42015-01-30 17:27:36 -08001394 if len(allInstalledFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001395 name := namespacePrefix + ctx.ModuleName() + "-install"
1396 ctx.Phony(name, allInstalledFiles.Paths()...)
1397 m.installTarget = PathForPhony(ctx, name)
1398 deps = append(deps, m.installTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001399 }
1400
1401 if len(allCheckbuildFiles) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07001402 name := namespacePrefix + ctx.ModuleName() + "-checkbuild"
1403 ctx.Phony(name, allCheckbuildFiles...)
1404 m.checkbuildTarget = PathForPhony(ctx, name)
1405 deps = append(deps, m.checkbuildTarget)
Colin Cross9454bfa2015-03-17 13:24:18 -07001406 }
1407
1408 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001409 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001410 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001411 suffix = "-soong"
1412 }
1413
Colin Crossc3d87d32020-06-04 13:25:17 -07001414 ctx.Phony(namespacePrefix+ctx.ModuleName()+suffix, deps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001415
Colin Cross4157e882019-06-06 16:57:04 -07001416 m.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -08001417 }
1418}
1419
Colin Crossc34d2322020-01-03 15:23:27 -08001420func determineModuleKind(m *ModuleBase, ctx blueprint.EarlyModuleContext) moduleKind {
Colin Cross4157e882019-06-06 16:57:04 -07001421 var socSpecific = Bool(m.commonProperties.Vendor) || Bool(m.commonProperties.Proprietary) || Bool(m.commonProperties.Soc_specific)
1422 var deviceSpecific = Bool(m.commonProperties.Device_specific)
1423 var productSpecific = Bool(m.commonProperties.Product_specific)
Justin Yund5f6c822019-06-25 16:47:17 +09001424 var systemExtSpecific = Bool(m.commonProperties.System_ext_specific)
Jiyong Park2db76922017-11-08 16:03:48 +09001425
Dario Frenifd05a742018-05-29 13:28:54 +01001426 msg := "conflicting value set here"
1427 if socSpecific && deviceSpecific {
1428 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Colin Cross4157e882019-06-06 16:57:04 -07001429 if Bool(m.commonProperties.Vendor) {
Jiyong Park2db76922017-11-08 16:03:48 +09001430 ctx.PropertyErrorf("vendor", msg)
1431 }
Colin Cross4157e882019-06-06 16:57:04 -07001432 if Bool(m.commonProperties.Proprietary) {
Jiyong Park2db76922017-11-08 16:03:48 +09001433 ctx.PropertyErrorf("proprietary", msg)
1434 }
Colin Cross4157e882019-06-06 16:57:04 -07001435 if Bool(m.commonProperties.Soc_specific) {
Jiyong Park2db76922017-11-08 16:03:48 +09001436 ctx.PropertyErrorf("soc_specific", msg)
1437 }
1438 }
1439
Justin Yund5f6c822019-06-25 16:47:17 +09001440 if productSpecific && systemExtSpecific {
1441 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and system_ext at the same time.")
1442 ctx.PropertyErrorf("system_ext_specific", msg)
Dario Frenifd05a742018-05-29 13:28:54 +01001443 }
1444
Justin Yund5f6c822019-06-25 16:47:17 +09001445 if (socSpecific || deviceSpecific) && (productSpecific || systemExtSpecific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001446 if productSpecific {
1447 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
1448 } else {
Justin Yund5f6c822019-06-25 16:47:17 +09001449 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 +01001450 }
1451 if deviceSpecific {
1452 ctx.PropertyErrorf("device_specific", msg)
1453 } else {
Colin Cross4157e882019-06-06 16:57:04 -07001454 if Bool(m.commonProperties.Vendor) {
Dario Frenifd05a742018-05-29 13:28:54 +01001455 ctx.PropertyErrorf("vendor", msg)
1456 }
Colin Cross4157e882019-06-06 16:57:04 -07001457 if Bool(m.commonProperties.Proprietary) {
Dario Frenifd05a742018-05-29 13:28:54 +01001458 ctx.PropertyErrorf("proprietary", msg)
1459 }
Colin Cross4157e882019-06-06 16:57:04 -07001460 if Bool(m.commonProperties.Soc_specific) {
Dario Frenifd05a742018-05-29 13:28:54 +01001461 ctx.PropertyErrorf("soc_specific", msg)
1462 }
1463 }
1464 }
1465
Jiyong Park2db76922017-11-08 16:03:48 +09001466 if productSpecific {
1467 return productSpecificModule
Justin Yund5f6c822019-06-25 16:47:17 +09001468 } else if systemExtSpecific {
1469 return systemExtSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +09001470 } else if deviceSpecific {
1471 return deviceSpecificModule
1472 } else if socSpecific {
1473 return socSpecificModule
1474 } else {
1475 return platformModule
1476 }
1477}
1478
Colin Crossc34d2322020-01-03 15:23:27 -08001479func (m *ModuleBase) earlyModuleContextFactory(ctx blueprint.EarlyModuleContext) earlyModuleContext {
Colin Cross1184b642019-12-30 18:43:07 -08001480 return earlyModuleContext{
Colin Crossc34d2322020-01-03 15:23:27 -08001481 EarlyModuleContext: ctx,
1482 kind: determineModuleKind(m, ctx),
1483 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -08001484 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001485}
1486
Colin Cross1184b642019-12-30 18:43:07 -08001487func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext {
1488 return baseModuleContext{
1489 bp: ctx,
1490 earlyModuleContext: m.earlyModuleContextFactory(ctx),
1491 os: m.commonProperties.CompileOS,
1492 target: m.commonProperties.CompileTarget,
1493 targetPrimary: m.commonProperties.CompilePrimary,
1494 multiTargets: m.commonProperties.CompileMultiTargets,
1495 }
1496}
1497
Colin Cross4157e882019-06-06 16:57:04 -07001498func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
Colin Cross25de6c32019-06-06 14:29:25 -07001499 ctx := &moduleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001500 module: m.module,
Colin Crossdc35e212019-06-06 16:13:11 -07001501 bp: blueprintCtx,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001502 baseModuleContext: m.baseModuleContextFactory(blueprintCtx),
1503 installDeps: m.computeInstallDeps(blueprintCtx),
1504 installFiles: m.installFiles,
Colin Cross0ea8ba82019-06-06 14:33:29 -07001505 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -08001506 }
1507
Colin Cross6c4f21f2019-06-06 15:41:36 -07001508 // Temporarily continue to call blueprintCtx.GetMissingDependencies() to maintain the previous behavior of never
1509 // reporting missing dependency errors in Blueprint when AllowMissingDependencies == true.
1510 // TODO: This will be removed once defaults modules handle missing dependency errors
1511 blueprintCtx.GetMissingDependencies()
1512
Colin Crossdc35e212019-06-06 16:13:11 -07001513 // For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
Paul Duffin1356d8c2020-02-25 19:26:33 +00001514 // are enabled. Unless the module is a CommonOS variant which may have dependencies on disabled variants
1515 // (because the dependencies are added before the modules are disabled). The
1516 // GetOsSpecificVariantsOfCommonOSVariant(...) method will ensure that the disabled variants are
1517 // ignored.
1518 ctx.baseModuleContext.strictVisitDeps = !m.IsCommonOSVariant()
Colin Crossdc35e212019-06-06 16:13:11 -07001519
Colin Cross4c83e5c2019-02-25 14:54:28 -08001520 if ctx.config.captureBuild {
1521 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
1522 }
1523
Colin Cross67a5c132017-05-09 13:45:28 -07001524 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
1525 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -08001526 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
1527 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -07001528 }
Colin Cross0875c522017-11-28 17:34:01 -08001529 if !ctx.PrimaryArch() {
1530 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -07001531 }
Colin Cross56a83212020-09-15 18:30:11 -07001532 if apexInfo := ctx.Provider(ApexInfoProvider).(ApexInfo); !apexInfo.IsForPlatform() {
1533 suffix = append(suffix, apexInfo.ApexVariationName)
Dan Willemsenb13a9482020-02-14 11:25:54 -08001534 }
Colin Cross67a5c132017-05-09 13:45:28 -07001535
1536 ctx.Variable(pctx, "moduleDesc", desc)
1537
1538 s := ""
1539 if len(suffix) > 0 {
1540 s = " [" + strings.Join(suffix, " ") + "]"
1541 }
1542 ctx.Variable(pctx, "moduleDescSuffix", s)
1543
Dan Willemsen569edc52018-11-19 09:33:29 -08001544 // Some common property checks for properties that will be used later in androidmk.go
Paul Duffined875132020-09-02 13:08:57 +01001545 if m.distProperties.Dist.Dest != nil {
1546 _, err := validateSafePath(*m.distProperties.Dist.Dest)
Dan Willemsen569edc52018-11-19 09:33:29 -08001547 if err != nil {
1548 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
1549 }
1550 }
Paul Duffined875132020-09-02 13:08:57 +01001551 if m.distProperties.Dist.Dir != nil {
1552 _, err := validateSafePath(*m.distProperties.Dist.Dir)
Dan Willemsen569edc52018-11-19 09:33:29 -08001553 if err != nil {
1554 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
1555 }
1556 }
Paul Duffined875132020-09-02 13:08:57 +01001557 if m.distProperties.Dist.Suffix != nil {
1558 if strings.Contains(*m.distProperties.Dist.Suffix, "/") {
Dan Willemsen569edc52018-11-19 09:33:29 -08001559 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
1560 }
1561 }
1562
Colin Cross4157e882019-06-06 16:57:04 -07001563 if m.Enabled() {
Jooyung Hand48f3c32019-08-23 11:18:57 +09001564 // ensure all direct android.Module deps are enabled
1565 ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) {
1566 if _, ok := bm.(Module); ok {
1567 ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps)
1568 }
1569 })
1570
Bob Badoura75b0572020-02-18 20:21:55 -08001571 m.noticeFiles = make([]Path, 0)
1572 optPath := OptionalPath{}
1573 notice := proptools.StringDefault(m.commonProperties.Notice, "")
Colin Cross4157e882019-06-06 16:57:04 -07001574 if module := SrcIsModule(notice); module != "" {
Bob Badoura75b0572020-02-18 20:21:55 -08001575 optPath = ctx.ExpandOptionalSource(&notice, "notice")
1576 } else if notice != "" {
Jiyong Park52818fc2019-03-18 12:01:38 +09001577 noticePath := filepath.Join(ctx.ModuleDir(), notice)
Bob Badoura75b0572020-02-18 20:21:55 -08001578 optPath = ExistentPathForSource(ctx, noticePath)
1579 }
1580 if optPath.Valid() {
1581 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1582 } else {
1583 for _, notice = range []string{"LICENSE", "LICENCE", "NOTICE"} {
1584 noticePath := filepath.Join(ctx.ModuleDir(), notice)
1585 optPath = ExistentPathForSource(ctx, noticePath)
1586 if optPath.Valid() {
1587 m.noticeFiles = append(m.noticeFiles, optPath.Path())
1588 }
1589 }
Jaewoong Jung62707f72018-11-16 13:26:43 -08001590 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -07001591
1592 m.module.GenerateAndroidBuildActions(ctx)
1593 if ctx.Failed() {
1594 return
1595 }
1596
1597 m.installFiles = append(m.installFiles, ctx.installFiles...)
1598 m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...)
Inseob Kim8471cda2019-11-15 09:59:12 +09001599 m.initRcPaths = PathsForModuleSrc(ctx, m.commonProperties.Init_rc)
1600 m.vintfFragmentsPaths = PathsForModuleSrc(ctx, m.commonProperties.Vintf_fragments)
Colin Crossc3d87d32020-06-04 13:25:17 -07001601 for k, v := range ctx.phonies {
1602 m.phonies[k] = append(m.phonies[k], v...)
1603 }
Colin Crossdc35e212019-06-06 16:13:11 -07001604 } else if ctx.Config().AllowMissingDependencies() {
1605 // If the module is not enabled it will not create any build rules, nothing will call
1606 // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled
1607 // and report them as an error even when AllowMissingDependencies = true. Call
1608 // ctx.GetMissingDependencies() here to tell blueprint not to handle them.
1609 ctx.GetMissingDependencies()
Colin Cross3f40fa42015-01-30 17:27:36 -08001610 }
1611
Colin Cross4157e882019-06-06 16:57:04 -07001612 if m == ctx.FinalModule().(Module).base() {
1613 m.generateModuleTarget(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -07001614 if ctx.Failed() {
1615 return
1616 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001617 }
Colin Crosscec81712017-07-13 14:43:27 -07001618
Colin Cross4157e882019-06-06 16:57:04 -07001619 m.buildParams = ctx.buildParams
1620 m.ruleParams = ctx.ruleParams
1621 m.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -08001622}
1623
Colin Cross1184b642019-12-30 18:43:07 -08001624type earlyModuleContext struct {
Colin Crossc34d2322020-01-03 15:23:27 -08001625 blueprint.EarlyModuleContext
Colin Cross1184b642019-12-30 18:43:07 -08001626
1627 kind moduleKind
1628 config Config
1629}
1630
1631func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths {
1632 ret, err := e.GlobWithDeps(globPattern, excludes)
1633 if err != nil {
1634 e.ModuleErrorf("glob: %s", err.Error())
1635 }
1636 return pathsForModuleSrcFromFullPath(e, ret, true)
1637}
1638
1639func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
1640 ret, err := e.GlobWithDeps(globPattern, excludes)
1641 if err != nil {
1642 e.ModuleErrorf("glob: %s", err.Error())
1643 }
1644 return pathsForModuleSrcFromFullPath(e, ret, false)
1645}
1646
Colin Cross988414c2020-01-11 01:11:46 +00001647func (b *earlyModuleContext) IsSymlink(path Path) bool {
1648 fileInfo, err := b.config.fs.Lstat(path.String())
1649 if err != nil {
1650 b.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
1651 }
1652 return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
1653}
1654
1655func (b *earlyModuleContext) Readlink(path Path) string {
1656 dest, err := b.config.fs.Readlink(path.String())
1657 if err != nil {
1658 b.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
1659 }
1660 return dest
1661}
1662
Colin Cross1184b642019-12-30 18:43:07 -08001663func (e *earlyModuleContext) Module() Module {
Colin Crossc34d2322020-01-03 15:23:27 -08001664 module, _ := e.EarlyModuleContext.Module().(Module)
Colin Cross1184b642019-12-30 18:43:07 -08001665 return module
1666}
1667
1668func (e *earlyModuleContext) Config() Config {
Colin Crossc34d2322020-01-03 15:23:27 -08001669 return e.EarlyModuleContext.Config().(Config)
Colin Cross1184b642019-12-30 18:43:07 -08001670}
1671
1672func (e *earlyModuleContext) AConfig() Config {
1673 return e.config
1674}
1675
1676func (e *earlyModuleContext) DeviceConfig() DeviceConfig {
1677 return DeviceConfig{e.config.deviceConfig}
1678}
1679
1680func (e *earlyModuleContext) Platform() bool {
1681 return e.kind == platformModule
1682}
1683
1684func (e *earlyModuleContext) DeviceSpecific() bool {
1685 return e.kind == deviceSpecificModule
1686}
1687
1688func (e *earlyModuleContext) SocSpecific() bool {
1689 return e.kind == socSpecificModule
1690}
1691
1692func (e *earlyModuleContext) ProductSpecific() bool {
1693 return e.kind == productSpecificModule
1694}
1695
1696func (e *earlyModuleContext) SystemExtSpecific() bool {
1697 return e.kind == systemExtSpecificModule
1698}
1699
Colin Cross133ebef2020-08-14 17:38:45 -07001700func (e *earlyModuleContext) Namespace() *Namespace {
1701 return e.EarlyModuleContext.Namespace().(*Namespace)
1702}
1703
Colin Cross1184b642019-12-30 18:43:07 -08001704type baseModuleContext struct {
1705 bp blueprint.BaseModuleContext
1706 earlyModuleContext
Colin Crossfb0c16e2019-11-20 17:12:35 -08001707 os OsType
Colin Cross8b74d172016-09-13 09:59:14 -07001708 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -07001709 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -07001710 targetPrimary bool
1711 debug bool
Colin Crossdc35e212019-06-06 16:13:11 -07001712
1713 walkPath []Module
Paul Duffinc5192442020-03-31 11:31:36 +01001714 tagPath []blueprint.DependencyTag
Colin Crossdc35e212019-06-06 16:13:11 -07001715
1716 strictVisitDeps bool // If true, enforce that all dependencies are enabled
Colin Crossf6566ed2015-03-24 11:13:38 -07001717}
1718
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001719func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string {
1720 return b.bp.OtherModuleName(m)
1721}
1722func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) }
Colin Cross1184b642019-12-30 18:43:07 -08001723func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) {
Jooyung Hancd87c692020-02-26 02:05:18 +09001724 b.bp.OtherModuleErrorf(m, fmt, args...)
Colin Cross1184b642019-12-30 18:43:07 -08001725}
1726func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag {
1727 return b.bp.OtherModuleDependencyTag(m)
1728}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001729func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +00001730func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
1731 return b.bp.OtherModuleDependencyVariantExists(variations, name)
1732}
1733func (b *baseModuleContext) OtherModuleReverseDependencyVariantExists(name string) bool {
1734 return b.bp.OtherModuleReverseDependencyVariantExists(name)
1735}
Paul Duffinca7f0ef2020-02-25 15:50:49 +00001736func (b *baseModuleContext) OtherModuleType(m blueprint.Module) string {
1737 return b.bp.OtherModuleType(m)
1738}
Colin Crossd27e7b82020-07-02 11:38:17 -07001739func (b *baseModuleContext) OtherModuleProvider(m blueprint.Module, provider blueprint.ProviderKey) interface{} {
1740 return b.bp.OtherModuleProvider(m, provider)
1741}
1742func (b *baseModuleContext) OtherModuleHasProvider(m blueprint.Module, provider blueprint.ProviderKey) bool {
1743 return b.bp.OtherModuleHasProvider(m, provider)
1744}
1745func (b *baseModuleContext) Provider(provider blueprint.ProviderKey) interface{} {
1746 return b.bp.Provider(provider)
1747}
1748func (b *baseModuleContext) HasProvider(provider blueprint.ProviderKey) bool {
1749 return b.bp.HasProvider(provider)
1750}
1751func (b *baseModuleContext) SetProvider(provider blueprint.ProviderKey, value interface{}) {
1752 b.bp.SetProvider(provider, value)
1753}
Colin Cross1184b642019-12-30 18:43:07 -08001754
1755func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1756 return b.bp.GetDirectDepWithTag(name, tag)
1757}
1758
Paul Duffinf88d8e02020-05-07 20:21:34 +01001759func (b *baseModuleContext) blueprintBaseModuleContext() blueprint.BaseModuleContext {
1760 return b.bp
1761}
1762
Colin Cross25de6c32019-06-06 14:29:25 -07001763type moduleContext struct {
Colin Crossdc35e212019-06-06 16:13:11 -07001764 bp blueprint.ModuleContext
Colin Cross0ea8ba82019-06-06 14:33:29 -07001765 baseModuleContext
Colin Cross897266e2020-02-13 13:22:08 -08001766 installDeps InstallPaths
1767 installFiles InstallPaths
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001768 checkbuildFiles Paths
Colin Cross8d8f8e22016-08-03 11:57:50 -07001769 module Module
Colin Crossc3d87d32020-06-04 13:25:17 -07001770 phonies map[string]Paths
Colin Crosscec81712017-07-13 14:43:27 -07001771
1772 // For tests
Colin Crossae887032017-10-23 17:16:14 -07001773 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -08001774 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001775 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -08001776}
1777
Colin Crossb88b3c52019-06-10 15:15:17 -07001778func (m *moduleContext) ninjaError(params BuildParams, err error) (PackageContext, BuildParams) {
1779 return pctx, BuildParams{
Colin Cross4b69c492019-06-07 13:06:06 -07001780 Rule: ErrorRule,
1781 Description: params.Description,
1782 Output: params.Output,
1783 Outputs: params.Outputs,
1784 ImplicitOutput: params.ImplicitOutput,
1785 ImplicitOutputs: params.ImplicitOutputs,
Colin Cross6ff51382015-12-17 16:39:19 -08001786 Args: map[string]string{
1787 "error": err.Error(),
1788 },
Colin Crossb88b3c52019-06-10 15:15:17 -07001789 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001790}
1791
Colin Cross25de6c32019-06-06 14:29:25 -07001792func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
1793 m.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -08001794}
1795
Jingwen Chence679d22020-09-23 04:30:02 +00001796func validateBuildParams(params blueprint.BuildParams) error {
1797 // Validate that the symlink outputs are declared outputs or implicit outputs
1798 allOutputs := map[string]bool{}
1799 for _, output := range params.Outputs {
1800 allOutputs[output] = true
1801 }
1802 for _, output := range params.ImplicitOutputs {
1803 allOutputs[output] = true
1804 }
1805 for _, symlinkOutput := range params.SymlinkOutputs {
1806 if !allOutputs[symlinkOutput] {
1807 return fmt.Errorf(
1808 "Symlink output %s is not a declared output or implicit output",
1809 symlinkOutput)
1810 }
1811 }
1812 return nil
1813}
1814
1815// Convert build parameters from their concrete Android types into their string representations,
1816// and combine the singular and plural fields of the same type (e.g. Output and Outputs).
Colin Cross0875c522017-11-28 17:34:01 -08001817func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001818 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001819 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -08001820 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -08001821 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001822 Outputs: params.Outputs.Strings(),
1823 ImplicitOutputs: params.ImplicitOutputs.Strings(),
Jingwen Chence679d22020-09-23 04:30:02 +00001824 SymlinkOutputs: params.SymlinkOutputs.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001825 Inputs: params.Inputs.Strings(),
1826 Implicits: params.Implicits.Strings(),
1827 OrderOnly: params.OrderOnly.Strings(),
Colin Cross824f1162020-07-16 13:07:51 -07001828 Validations: params.Validations.Strings(),
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001829 Args: params.Args,
1830 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001831 }
1832
Colin Cross33bfb0a2016-11-21 17:23:08 -08001833 if params.Depfile != nil {
1834 bparams.Depfile = params.Depfile.String()
1835 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001836 if params.Output != nil {
1837 bparams.Outputs = append(bparams.Outputs, params.Output.String())
1838 }
Jingwen Chence679d22020-09-23 04:30:02 +00001839 if params.SymlinkOutput != nil {
1840 bparams.SymlinkOutputs = append(bparams.SymlinkOutputs, params.SymlinkOutput.String())
1841 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -07001842 if params.ImplicitOutput != nil {
1843 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
1844 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001845 if params.Input != nil {
1846 bparams.Inputs = append(bparams.Inputs, params.Input.String())
1847 }
1848 if params.Implicit != nil {
1849 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
1850 }
Colin Cross824f1162020-07-16 13:07:51 -07001851 if params.Validation != nil {
1852 bparams.Validations = append(bparams.Validations, params.Validation.String())
1853 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001854
Colin Cross0b9f31f2019-02-28 11:00:01 -08001855 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
1856 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
Jingwen Chence679d22020-09-23 04:30:02 +00001857 bparams.SymlinkOutputs = proptools.NinjaEscapeList(bparams.SymlinkOutputs)
Colin Cross0b9f31f2019-02-28 11:00:01 -08001858 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
1859 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
1860 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
Colin Cross824f1162020-07-16 13:07:51 -07001861 bparams.Validations = proptools.NinjaEscapeList(bparams.Validations)
1862 bparams.Depfile = proptools.NinjaEscape(bparams.Depfile)
Colin Crossfe4bc362018-09-12 10:02:13 -07001863
Colin Cross0875c522017-11-28 17:34:01 -08001864 return bparams
1865}
1866
Colin Cross25de6c32019-06-06 14:29:25 -07001867func (m *moduleContext) Variable(pctx PackageContext, name, value string) {
1868 if m.config.captureBuild {
1869 m.variables[name] = value
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001870 }
1871
Colin Crossdc35e212019-06-06 16:13:11 -07001872 m.bp.Variable(pctx.PackageContext, name, value)
Colin Cross0875c522017-11-28 17:34:01 -08001873}
1874
Colin Cross25de6c32019-06-06 14:29:25 -07001875func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
Colin Cross0875c522017-11-28 17:34:01 -08001876 argNames ...string) blueprint.Rule {
1877
Ramy Medhat944839a2020-03-31 22:14:52 -04001878 if m.config.UseRemoteBuild() {
1879 if params.Pool == nil {
1880 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
1881 // jobs to the local parallelism value
1882 params.Pool = localPool
1883 } else if params.Pool == remotePool {
1884 // remotePool is a fake pool used to identify rule that are supported for remoting. If the rule's
1885 // pool is the remotePool, replace with nil so that ninja runs it at NINJA_REMOTE_NUM_JOBS
1886 // parallelism.
1887 params.Pool = nil
1888 }
Colin Cross2e2dbc22019-09-25 13:31:46 -07001889 }
1890
Colin Crossdc35e212019-06-06 16:13:11 -07001891 rule := m.bp.Rule(pctx.PackageContext, name, params, argNames...)
Colin Cross4c83e5c2019-02-25 14:54:28 -08001892
Colin Cross25de6c32019-06-06 14:29:25 -07001893 if m.config.captureBuild {
1894 m.ruleParams[rule] = params
Colin Cross4c83e5c2019-02-25 14:54:28 -08001895 }
1896
1897 return rule
Colin Cross0875c522017-11-28 17:34:01 -08001898}
1899
Colin Cross25de6c32019-06-06 14:29:25 -07001900func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
Colin Crossb88b3c52019-06-10 15:15:17 -07001901 if params.Description != "" {
1902 params.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1903 }
1904
1905 if missingDeps := m.GetMissingDependencies(); len(missingDeps) > 0 {
1906 pctx, params = m.ninjaError(params, fmt.Errorf("module %s missing dependencies: %s\n",
1907 m.ModuleName(), strings.Join(missingDeps, ", ")))
1908 }
1909
Colin Cross25de6c32019-06-06 14:29:25 -07001910 if m.config.captureBuild {
1911 m.buildParams = append(m.buildParams, params)
Colin Cross0875c522017-11-28 17:34:01 -08001912 }
1913
Jingwen Chence679d22020-09-23 04:30:02 +00001914 bparams := convertBuildParams(params)
1915 err := validateBuildParams(bparams)
1916 if err != nil {
1917 m.ModuleErrorf(
1918 "%s: build parameter validation failed: %s",
1919 m.ModuleName(),
1920 err.Error())
1921 }
1922 m.bp.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001923}
Colin Crossc3d87d32020-06-04 13:25:17 -07001924
1925func (m *moduleContext) Phony(name string, deps ...Path) {
1926 addPhony(m.config, name, deps...)
1927}
1928
Colin Cross25de6c32019-06-06 14:29:25 -07001929func (m *moduleContext) GetMissingDependencies() []string {
Colin Cross6c4f21f2019-06-06 15:41:36 -07001930 var missingDeps []string
1931 missingDeps = append(missingDeps, m.Module().base().commonProperties.MissingDeps...)
Colin Crossdc35e212019-06-06 16:13:11 -07001932 missingDeps = append(missingDeps, m.bp.GetMissingDependencies()...)
Colin Cross6c4f21f2019-06-06 15:41:36 -07001933 missingDeps = FirstUniqueStrings(missingDeps)
1934 return missingDeps
Colin Cross6ff51382015-12-17 16:39:19 -08001935}
1936
Colin Crossdc35e212019-06-06 16:13:11 -07001937func (b *baseModuleContext) AddMissingDependencies(deps []string) {
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001938 if deps != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001939 missingDeps := &b.Module().base().commonProperties.MissingDeps
Colin Cross6c4f21f2019-06-06 15:41:36 -07001940 *missingDeps = append(*missingDeps, deps...)
1941 *missingDeps = FirstUniqueStrings(*missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001942 }
1943}
1944
Colin Crossdc35e212019-06-06 16:13:11 -07001945func (b *baseModuleContext) validateAndroidModule(module blueprint.Module, strict bool) Module {
Colin Crossd11fcda2017-10-23 17:59:01 -07001946 aModule, _ := module.(Module)
Colin Crossdc35e212019-06-06 16:13:11 -07001947
1948 if !strict {
1949 return aModule
1950 }
1951
Colin Cross380c69a2019-06-10 17:49:58 +00001952 if aModule == nil {
Colin Crossdc35e212019-06-06 16:13:11 -07001953 b.ModuleErrorf("module %q not an android module", b.OtherModuleName(module))
Colin Cross380c69a2019-06-10 17:49:58 +00001954 return nil
1955 }
1956
1957 if !aModule.Enabled() {
Colin Crossdc35e212019-06-06 16:13:11 -07001958 if b.Config().AllowMissingDependencies() {
1959 b.AddMissingDependencies([]string{b.OtherModuleName(aModule)})
Colin Cross380c69a2019-06-10 17:49:58 +00001960 } else {
Colin Crossdc35e212019-06-06 16:13:11 -07001961 b.ModuleErrorf("depends on disabled module %q", b.OtherModuleName(aModule))
Colin Cross380c69a2019-06-10 17:49:58 +00001962 }
1963 return nil
1964 }
Colin Crossd11fcda2017-10-23 17:59:01 -07001965 return aModule
1966}
1967
Colin Crossdc35e212019-06-06 16:13:11 -07001968func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
Jiyong Parkf2976302019-04-17 21:47:37 +09001969 type dep struct {
1970 mod blueprint.Module
1971 tag blueprint.DependencyTag
1972 }
1973 var deps []dep
Colin Crossdc35e212019-06-06 16:13:11 -07001974 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001975 if aModule, _ := module.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
Colin Cross1184b642019-12-30 18:43:07 -08001976 returnedTag := b.bp.OtherModuleDependencyTag(aModule)
Jiyong Parkf2976302019-04-17 21:47:37 +09001977 if tag == nil || returnedTag == tag {
1978 deps = append(deps, dep{aModule, returnedTag})
1979 }
1980 }
1981 })
1982 if len(deps) == 1 {
1983 return deps[0].mod, deps[0].tag
1984 } else if len(deps) >= 2 {
1985 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
Colin Crossdc35e212019-06-06 16:13:11 -07001986 name, b.ModuleName()))
Jiyong Parkf2976302019-04-17 21:47:37 +09001987 } else {
1988 return nil, nil
1989 }
1990}
1991
Colin Crossdc35e212019-06-06 16:13:11 -07001992func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module {
Colin Cross0ef08162019-05-01 15:50:51 -07001993 var deps []Module
Colin Crossdc35e212019-06-06 16:13:11 -07001994 b.VisitDirectDepsBlueprint(func(module blueprint.Module) {
Colin Cross25de6c32019-06-06 14:29:25 -07001995 if aModule, _ := module.(Module); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08001996 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Cross0ef08162019-05-01 15:50:51 -07001997 deps = append(deps, aModule)
1998 }
1999 }
2000 })
2001 return deps
2002}
2003
Colin Cross25de6c32019-06-06 14:29:25 -07002004func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
2005 module, _ := m.getDirectDepInternal(name, tag)
2006 return module
Jiyong Parkf2976302019-04-17 21:47:37 +09002007}
2008
Colin Crossdc35e212019-06-06 16:13:11 -07002009func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
2010 return b.getDirectDepInternal(name, nil)
Jiyong Parkf2976302019-04-17 21:47:37 +09002011}
2012
Colin Crossdc35e212019-06-06 16:13:11 -07002013func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002014 b.bp.VisitDirectDeps(visit)
Colin Cross35143d02017-11-16 00:11:20 -08002015}
2016
Colin Crossdc35e212019-06-06 16:13:11 -07002017func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002018 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002019 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002020 visit(aModule)
2021 }
2022 })
2023}
2024
Colin Crossdc35e212019-06-06 16:13:11 -07002025func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002026 b.bp.VisitDirectDeps(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002027 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Cross1184b642019-12-30 18:43:07 -08002028 if b.bp.OtherModuleDependencyTag(aModule) == tag {
Colin Crossee6143c2017-12-30 17:54:27 -08002029 visit(aModule)
2030 }
2031 }
2032 })
2033}
2034
Colin Crossdc35e212019-06-06 16:13:11 -07002035func (b *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002036 b.bp.VisitDirectDepsIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07002037 // pred
2038 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002039 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002040 return pred(aModule)
2041 } else {
2042 return false
2043 }
2044 },
2045 // visit
2046 func(module blueprint.Module) {
2047 visit(module.(Module))
2048 })
2049}
2050
Colin Crossdc35e212019-06-06 16:13:11 -07002051func (b *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002052 b.bp.VisitDepsDepthFirst(func(module blueprint.Module) {
Colin Crossdc35e212019-06-06 16:13:11 -07002053 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002054 visit(aModule)
2055 }
2056 })
2057}
2058
Colin Crossdc35e212019-06-06 16:13:11 -07002059func (b *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
Colin Cross1184b642019-12-30 18:43:07 -08002060 b.bp.VisitDepsDepthFirstIf(
Colin Crossd11fcda2017-10-23 17:59:01 -07002061 // pred
2062 func(module blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002063 if aModule := b.validateAndroidModule(module, b.strictVisitDeps); aModule != nil {
Colin Crossd11fcda2017-10-23 17:59:01 -07002064 return pred(aModule)
2065 } else {
2066 return false
2067 }
2068 },
2069 // visit
2070 func(module blueprint.Module) {
2071 visit(module.(Module))
2072 })
2073}
2074
Colin Crossdc35e212019-06-06 16:13:11 -07002075func (b *baseModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
Colin Cross1184b642019-12-30 18:43:07 -08002076 b.bp.WalkDeps(visit)
Alex Light778127a2019-02-27 14:19:50 -08002077}
2078
Colin Crossdc35e212019-06-06 16:13:11 -07002079func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
2080 b.walkPath = []Module{b.Module()}
Paul Duffinc5192442020-03-31 11:31:36 +01002081 b.tagPath = []blueprint.DependencyTag{}
Colin Cross1184b642019-12-30 18:43:07 -08002082 b.bp.WalkDeps(func(child, parent blueprint.Module) bool {
Colin Crossdc35e212019-06-06 16:13:11 -07002083 childAndroidModule, _ := child.(Module)
2084 parentAndroidModule, _ := parent.(Module)
Colin Crossd11fcda2017-10-23 17:59:01 -07002085 if childAndroidModule != nil && parentAndroidModule != nil {
Colin Crossdc35e212019-06-06 16:13:11 -07002086 // record walkPath before visit
2087 for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
2088 b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
Paul Duffinc5192442020-03-31 11:31:36 +01002089 b.tagPath = b.tagPath[0 : len(b.tagPath)-1]
Colin Crossdc35e212019-06-06 16:13:11 -07002090 }
2091 b.walkPath = append(b.walkPath, childAndroidModule)
Paul Duffinc5192442020-03-31 11:31:36 +01002092 b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule))
Colin Crossd11fcda2017-10-23 17:59:01 -07002093 return visit(childAndroidModule, parentAndroidModule)
2094 } else {
2095 return false
2096 }
2097 })
2098}
2099
Colin Crossdc35e212019-06-06 16:13:11 -07002100func (b *baseModuleContext) GetWalkPath() []Module {
2101 return b.walkPath
2102}
2103
Paul Duffinc5192442020-03-31 11:31:36 +01002104func (b *baseModuleContext) GetTagPath() []blueprint.DependencyTag {
2105 return b.tagPath
2106}
2107
Colin Cross4dfacf92020-09-16 19:22:27 -07002108func (b *baseModuleContext) VisitAllModuleVariants(visit func(Module)) {
2109 b.bp.VisitAllModuleVariants(func(module blueprint.Module) {
2110 visit(module.(Module))
2111 })
2112}
2113
2114func (b *baseModuleContext) PrimaryModule() Module {
2115 return b.bp.PrimaryModule().(Module)
2116}
2117
2118func (b *baseModuleContext) FinalModule() Module {
2119 return b.bp.FinalModule().(Module)
2120}
2121
Jiyong Park1c7e9622020-05-07 16:12:13 +09002122// A regexp for removing boilerplate from BaseDependencyTag from the string representation of
2123// a dependency tag.
Colin Cross6e511a92020-07-27 21:26:48 -07002124var tagCleaner = regexp.MustCompile(`\QBaseDependencyTag:{}\E(, )?`)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002125
2126// PrettyPrintTag returns string representation of the tag, but prefers
2127// custom String() method if available.
2128func PrettyPrintTag(tag blueprint.DependencyTag) string {
2129 // Use tag's custom String() method if available.
2130 if stringer, ok := tag.(fmt.Stringer); ok {
2131 return stringer.String()
2132 }
2133
2134 // Otherwise, get a default string representation of the tag's struct.
Colin Cross6e511a92020-07-27 21:26:48 -07002135 tagString := fmt.Sprintf("%T: %+v", tag, tag)
Jiyong Park1c7e9622020-05-07 16:12:13 +09002136
2137 // Remove the boilerplate from BaseDependencyTag as it adds no value.
2138 tagString = tagCleaner.ReplaceAllString(tagString, "")
2139 return tagString
2140}
2141
2142func (b *baseModuleContext) GetPathString(skipFirst bool) string {
2143 sb := strings.Builder{}
2144 tagPath := b.GetTagPath()
2145 walkPath := b.GetWalkPath()
2146 if !skipFirst {
2147 sb.WriteString(walkPath[0].String())
2148 }
2149 for i, m := range walkPath[1:] {
2150 sb.WriteString("\n")
2151 sb.WriteString(fmt.Sprintf(" via tag %s\n", PrettyPrintTag(tagPath[i])))
2152 sb.WriteString(fmt.Sprintf(" -> %s", m.String()))
2153 }
2154 return sb.String()
2155}
2156
Colin Crossdc35e212019-06-06 16:13:11 -07002157func (m *moduleContext) ModuleSubDir() string {
2158 return m.bp.ModuleSubDir()
Colin Cross0875c522017-11-28 17:34:01 -08002159}
2160
Colin Cross0ea8ba82019-06-06 14:33:29 -07002161func (b *baseModuleContext) Target() Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002162 return b.target
Colin Crossa1ad8d12016-06-01 17:09:44 -07002163}
2164
Colin Cross0ea8ba82019-06-06 14:33:29 -07002165func (b *baseModuleContext) TargetPrimary() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002166 return b.targetPrimary
Colin Cross8b74d172016-09-13 09:59:14 -07002167}
2168
Colin Cross0ea8ba82019-06-06 14:33:29 -07002169func (b *baseModuleContext) MultiTargets() []Target {
Colin Cross25de6c32019-06-06 14:29:25 -07002170 return b.multiTargets
Colin Crossee0bc3b2018-10-02 22:01:37 -07002171}
2172
Colin Cross0ea8ba82019-06-06 14:33:29 -07002173func (b *baseModuleContext) Arch() Arch {
Colin Cross25de6c32019-06-06 14:29:25 -07002174 return b.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08002175}
2176
Colin Cross0ea8ba82019-06-06 14:33:29 -07002177func (b *baseModuleContext) Os() OsType {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002178 return b.os
Dan Willemsen490fd492015-11-24 17:53:15 -08002179}
2180
Colin Cross0ea8ba82019-06-06 14:33:29 -07002181func (b *baseModuleContext) Host() bool {
Jiyong Park1613e552020-09-14 19:43:17 +09002182 return b.os.Class == Host
Colin Crossf6566ed2015-03-24 11:13:38 -07002183}
2184
Colin Cross0ea8ba82019-06-06 14:33:29 -07002185func (b *baseModuleContext) Device() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002186 return b.os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07002187}
2188
Colin Cross0ea8ba82019-06-06 14:33:29 -07002189func (b *baseModuleContext) Darwin() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002190 return b.os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07002191}
2192
Colin Cross0ea8ba82019-06-06 14:33:29 -07002193func (b *baseModuleContext) Fuchsia() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002194 return b.os == Fuchsia
Doug Horn21b94272019-01-16 12:06:11 -08002195}
2196
Colin Cross0ea8ba82019-06-06 14:33:29 -07002197func (b *baseModuleContext) Windows() bool {
Colin Crossfb0c16e2019-11-20 17:12:35 -08002198 return b.os == Windows
Colin Cross3edeee12017-04-04 12:59:48 -07002199}
2200
Colin Cross0ea8ba82019-06-06 14:33:29 -07002201func (b *baseModuleContext) Debug() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002202 return b.debug
Colin Crossf6566ed2015-03-24 11:13:38 -07002203}
2204
Colin Cross0ea8ba82019-06-06 14:33:29 -07002205func (b *baseModuleContext) PrimaryArch() bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002206 if len(b.config.Targets[b.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07002207 return true
2208 }
Colin Cross25de6c32019-06-06 14:29:25 -07002209 return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07002210}
2211
Jiyong Park5baac542018-08-28 09:55:37 +09002212// Makes this module a platform module, i.e. not specific to soc, device,
Justin Yund5f6c822019-06-25 16:47:17 +09002213// product, or system_ext.
Colin Cross4157e882019-06-06 16:57:04 -07002214func (m *ModuleBase) MakeAsPlatform() {
2215 m.commonProperties.Vendor = boolPtr(false)
2216 m.commonProperties.Proprietary = boolPtr(false)
2217 m.commonProperties.Soc_specific = boolPtr(false)
2218 m.commonProperties.Product_specific = boolPtr(false)
Justin Yund5f6c822019-06-25 16:47:17 +09002219 m.commonProperties.System_ext_specific = boolPtr(false)
Jiyong Park5baac542018-08-28 09:55:37 +09002220}
2221
Colin Cross4157e882019-06-06 16:57:04 -07002222func (m *ModuleBase) EnableNativeBridgeSupportByDefault() {
2223 m.commonProperties.Native_bridge_supported = boolPtr(true)
dimitry03dc3f62019-05-09 14:07:34 +02002224}
2225
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002226func (m *ModuleBase) MakeAsSystemExt() {
Jooyung Han91df2082019-11-20 01:49:42 +09002227 m.commonProperties.Vendor = boolPtr(false)
2228 m.commonProperties.Proprietary = boolPtr(false)
2229 m.commonProperties.Soc_specific = boolPtr(false)
2230 m.commonProperties.Product_specific = boolPtr(false)
2231 m.commonProperties.System_ext_specific = boolPtr(true)
Sundong Ahnd95aa2d2019-10-08 19:34:03 +09002232}
2233
Jooyung Han344d5432019-08-23 11:17:39 +09002234// IsNativeBridgeSupported returns true if "native_bridge_supported" is explicitly set as "true"
2235func (m *ModuleBase) IsNativeBridgeSupported() bool {
2236 return proptools.Bool(m.commonProperties.Native_bridge_supported)
2237}
2238
Colin Cross25de6c32019-06-06 14:29:25 -07002239func (m *moduleContext) InstallInData() bool {
2240 return m.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08002241}
2242
Jaewoong Jung0949f312019-09-11 10:25:18 -07002243func (m *moduleContext) InstallInTestcases() bool {
2244 return m.module.InstallInTestcases()
2245}
2246
Colin Cross25de6c32019-06-06 14:29:25 -07002247func (m *moduleContext) InstallInSanitizerDir() bool {
2248 return m.module.InstallInSanitizerDir()
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002249}
2250
Yifan Hong1b3348d2020-01-21 15:53:22 -08002251func (m *moduleContext) InstallInRamdisk() bool {
2252 return m.module.InstallInRamdisk()
2253}
2254
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002255func (m *moduleContext) InstallInVendorRamdisk() bool {
2256 return m.module.InstallInVendorRamdisk()
2257}
2258
Colin Cross25de6c32019-06-06 14:29:25 -07002259func (m *moduleContext) InstallInRecovery() bool {
2260 return m.module.InstallInRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002261}
2262
Colin Cross90ba5f42019-10-02 11:10:58 -07002263func (m *moduleContext) InstallInRoot() bool {
2264 return m.module.InstallInRoot()
2265}
2266
Colin Cross607d8582019-07-29 16:44:46 -07002267func (m *moduleContext) InstallBypassMake() bool {
2268 return m.module.InstallBypassMake()
2269}
2270
Jiyong Park87788b52020-09-01 12:37:45 +09002271func (m *moduleContext) InstallForceOS() (*OsType, *ArchType) {
Colin Cross6e359402020-02-10 15:29:54 -08002272 return m.module.InstallForceOS()
2273}
2274
Colin Cross70dda7e2019-10-01 22:05:35 -07002275func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
Colin Cross25de6c32019-06-06 14:29:25 -07002276 if m.module.base().commonProperties.SkipInstall {
Colin Cross893d8162017-04-26 17:34:03 -07002277 return true
2278 }
2279
Colin Cross3607f212018-05-07 15:28:05 -07002280 // We'll need a solution for choosing which of modules with the same name in different
2281 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
2282 // list of namespaces to install in a Soong-only build.
Colin Cross25de6c32019-06-06 14:29:25 -07002283 if !m.module.base().commonProperties.NamespaceExportedToMake {
Colin Cross3607f212018-05-07 15:28:05 -07002284 return true
2285 }
2286
Colin Cross25de6c32019-06-06 14:29:25 -07002287 if m.Device() {
Colin Cross607d8582019-07-29 16:44:46 -07002288 if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
Colin Cross893d8162017-04-26 17:34:03 -07002289 return true
2290 }
2291
Colin Cross25de6c32019-06-06 14:29:25 -07002292 if m.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07002293 return true
2294 }
2295 }
2296
2297 return false
2298}
2299
Colin Cross70dda7e2019-10-01 22:05:35 -07002300func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
2301 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002302 return m.installFile(installPath, name, srcPath, Cp, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002303}
2304
Colin Cross70dda7e2019-10-01 22:05:35 -07002305func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
2306 deps ...Path) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002307 return m.installFile(installPath, name, srcPath, CpExecutable, deps)
Colin Cross5c517922017-08-31 12:29:17 -07002308}
2309
Colin Cross70dda7e2019-10-01 22:05:35 -07002310func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
2311 rule blueprint.Rule, deps []Path) InstallPath {
Colin Cross35cec122015-04-02 14:37:16 -07002312
Colin Cross25de6c32019-06-06 14:29:25 -07002313 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002314 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08002315
Colin Cross25de6c32019-06-06 14:29:25 -07002316 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002317
Colin Cross897266e2020-02-13 13:22:08 -08002318 deps = append(deps, m.installDeps.Paths()...)
Colin Cross35cec122015-04-02 14:37:16 -07002319
Colin Cross89562dc2016-10-03 17:47:19 -07002320 var implicitDeps, orderOnlyDeps Paths
2321
Colin Cross25de6c32019-06-06 14:29:25 -07002322 if m.Host() {
Colin Cross89562dc2016-10-03 17:47:19 -07002323 // Installed host modules might be used during the build, depend directly on their
2324 // dependencies so their timestamp is updated whenever their dependency is updated
2325 implicitDeps = deps
2326 } else {
2327 orderOnlyDeps = deps
2328 }
2329
Colin Cross25de6c32019-06-06 14:29:25 -07002330 m.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07002331 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07002332 Description: "install " + fullInstallPath.Base(),
2333 Output: fullInstallPath,
2334 Input: srcPath,
2335 Implicits: implicitDeps,
2336 OrderOnly: orderOnlyDeps,
Colin Cross25de6c32019-06-06 14:29:25 -07002337 Default: !m.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08002338 })
Colin Cross3f40fa42015-01-30 17:27:36 -08002339
Colin Cross25de6c32019-06-06 14:29:25 -07002340 m.installFiles = append(m.installFiles, fullInstallPath)
Dan Willemsen322acaf2016-01-12 23:07:05 -08002341 }
Colin Cross25de6c32019-06-06 14:29:25 -07002342 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07002343 return fullInstallPath
2344}
2345
Colin Cross70dda7e2019-10-01 22:05:35 -07002346func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002347 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002348 m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08002349
Colin Cross25de6c32019-06-06 14:29:25 -07002350 if !m.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07002351
Alex Lightfb4353d2019-01-17 13:57:45 -08002352 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
2353 if err != nil {
2354 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
2355 }
Colin Cross25de6c32019-06-06 14:29:25 -07002356 m.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07002357 Rule: Symlink,
2358 Description: "install symlink " + fullInstallPath.Base(),
2359 Output: fullInstallPath,
Dan Willemsen40efa1c2020-01-14 15:19:52 -08002360 Input: srcPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002361 Default: !m.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08002362 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08002363 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08002364 },
2365 })
Colin Cross3854a602016-01-11 12:49:11 -08002366
Colin Cross25de6c32019-06-06 14:29:25 -07002367 m.installFiles = append(m.installFiles, fullInstallPath)
2368 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross12fc4972016-01-11 12:49:11 -08002369 }
Colin Cross3854a602016-01-11 12:49:11 -08002370 return fullInstallPath
2371}
2372
Jiyong Parkf1194352019-02-25 11:05:47 +09002373// installPath/name -> absPath where absPath might be a path that is available only at runtime
2374// (e.g. /apex/...)
Colin Cross70dda7e2019-10-01 22:05:35 -07002375func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
Colin Cross25de6c32019-06-06 14:29:25 -07002376 fullInstallPath := installPath.Join(m, name)
David Srbecky07656412020-06-04 01:26:16 +01002377 m.module.base().hooks.runInstallHooks(m, nil, fullInstallPath, true)
Jiyong Parkf1194352019-02-25 11:05:47 +09002378
Colin Cross25de6c32019-06-06 14:29:25 -07002379 if !m.skipInstall(fullInstallPath) {
2380 m.Build(pctx, BuildParams{
Jiyong Parkf1194352019-02-25 11:05:47 +09002381 Rule: Symlink,
2382 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
2383 Output: fullInstallPath,
Colin Cross25de6c32019-06-06 14:29:25 -07002384 Default: !m.Config().EmbeddedInMake(),
Jiyong Parkf1194352019-02-25 11:05:47 +09002385 Args: map[string]string{
2386 "fromPath": absPath,
2387 },
2388 })
2389
Colin Cross25de6c32019-06-06 14:29:25 -07002390 m.installFiles = append(m.installFiles, fullInstallPath)
Jiyong Parkf1194352019-02-25 11:05:47 +09002391 }
2392 return fullInstallPath
2393}
2394
Colin Cross25de6c32019-06-06 14:29:25 -07002395func (m *moduleContext) CheckbuildFile(srcPath Path) {
2396 m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
Colin Cross3f40fa42015-01-30 17:27:36 -08002397}
2398
Colin Cross41955e82019-05-29 14:40:35 -07002399// SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input
2400// was not a module reference.
2401func SrcIsModule(s string) (module string) {
Colin Cross068e0fe2016-12-13 15:23:47 -08002402 if len(s) > 1 && s[0] == ':' {
2403 return s[1:]
2404 }
2405 return ""
2406}
2407
Colin Cross41955e82019-05-29 14:40:35 -07002408// SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the
2409// module name and an empty string for the tag, or empty strings if the input was not a module reference.
2410func SrcIsModuleWithTag(s string) (module, tag string) {
2411 if len(s) > 1 && s[0] == ':' {
2412 module = s[1:]
2413 if tagStart := strings.IndexByte(module, '{'); tagStart > 0 {
2414 if module[len(module)-1] == '}' {
2415 tag = module[tagStart+1 : len(module)-1]
2416 module = module[:tagStart]
2417 return module, tag
2418 }
2419 }
2420 return module, ""
2421 }
2422 return "", ""
Colin Cross068e0fe2016-12-13 15:23:47 -08002423}
2424
Colin Cross41955e82019-05-29 14:40:35 -07002425type sourceOrOutputDependencyTag struct {
2426 blueprint.BaseDependencyTag
2427 tag string
2428}
2429
2430func sourceOrOutputDepTag(tag string) blueprint.DependencyTag {
2431 return sourceOrOutputDependencyTag{tag: tag}
2432}
2433
2434var SourceDepTag = sourceOrOutputDepTag("")
Colin Cross068e0fe2016-12-13 15:23:47 -08002435
Colin Cross366938f2017-12-11 16:29:02 -08002436// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
2437// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002438//
2439// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08002440func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
Nan Zhang2439eb72017-04-10 11:27:50 -07002441 set := make(map[string]bool)
2442
Colin Cross068e0fe2016-12-13 15:23:47 -08002443 for _, s := range srcFiles {
Colin Cross41955e82019-05-29 14:40:35 -07002444 if m, t := SrcIsModuleWithTag(s); m != "" {
2445 if _, found := set[s]; found {
2446 ctx.ModuleErrorf("found source dependency duplicate: %q!", s)
Nan Zhang2439eb72017-04-10 11:27:50 -07002447 } else {
Colin Cross41955e82019-05-29 14:40:35 -07002448 set[s] = true
2449 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Nan Zhang2439eb72017-04-10 11:27:50 -07002450 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002451 }
2452 }
Colin Cross068e0fe2016-12-13 15:23:47 -08002453}
2454
Colin Cross366938f2017-12-11 16:29:02 -08002455// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
2456// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08002457//
2458// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08002459func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
2460 if s != nil {
Colin Cross41955e82019-05-29 14:40:35 -07002461 if m, t := SrcIsModuleWithTag(*s); m != "" {
2462 ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m)
Colin Cross366938f2017-12-11 16:29:02 -08002463 }
2464 }
2465}
2466
Colin Cross41955e82019-05-29 14:40:35 -07002467// A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"`
2468// 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 -08002469type SourceFileProducer interface {
2470 Srcs() Paths
2471}
2472
Colin Cross41955e82019-05-29 14:40:35 -07002473// A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"`
Roland Levillain97c1f342019-11-22 14:20:54 +00002474// 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 -07002475// listed in the property.
2476type OutputFileProducer interface {
2477 OutputFiles(tag string) (Paths, error)
2478}
2479
Colin Cross5e708052019-08-06 13:59:50 -07002480// OutputFilesForModule returns the paths from an OutputFileProducer with the given tag. On error, including if the
2481// module produced zero paths, it reports errors to the ctx and returns nil.
2482func OutputFilesForModule(ctx PathContext, module blueprint.Module, tag string) Paths {
2483 paths, err := outputFilesForModule(ctx, module, tag)
2484 if err != nil {
2485 reportPathError(ctx, err)
2486 return nil
2487 }
2488 return paths
2489}
2490
2491// OutputFileForModule returns the path from an OutputFileProducer with the given tag. On error, including if the
2492// module produced zero or multiple paths, it reports errors to the ctx and returns nil.
2493func OutputFileForModule(ctx PathContext, module blueprint.Module, tag string) Path {
2494 paths, err := outputFilesForModule(ctx, module, tag)
2495 if err != nil {
2496 reportPathError(ctx, err)
2497 return nil
2498 }
2499 if len(paths) > 1 {
Ulya Trafimovich5ab276a2020-08-25 12:45:15 +01002500 ReportPathErrorf(ctx, "got multiple output files from module %q, expected exactly one",
Colin Cross5e708052019-08-06 13:59:50 -07002501 pathContextName(ctx, module))
2502 return nil
2503 }
2504 return paths[0]
2505}
2506
2507func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
2508 if outputFileProducer, ok := module.(OutputFileProducer); ok {
2509 paths, err := outputFileProducer.OutputFiles(tag)
2510 if err != nil {
2511 return nil, fmt.Errorf("failed to get output file from module %q: %s",
2512 pathContextName(ctx, module), err.Error())
2513 }
2514 if len(paths) == 0 {
2515 return nil, fmt.Errorf("failed to get output files from module %q", pathContextName(ctx, module))
2516 }
2517 return paths, nil
2518 } else {
2519 return nil, fmt.Errorf("module %q is not an OutputFileProducer", pathContextName(ctx, module))
2520 }
2521}
2522
Colin Crossfe17f6f2019-03-28 19:30:56 -07002523type HostToolProvider interface {
2524 HostToolPath() OptionalPath
2525}
2526
Colin Cross27b922f2019-03-04 22:35:41 -08002527// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
2528// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002529//
2530// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002531func (m *moduleContext) ExpandSources(srcFiles, excludes []string) Paths {
2532 return PathsForModuleSrcExcludes(m, srcFiles, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07002533}
2534
Colin Cross2fafa3e2019-03-05 12:39:51 -08002535// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
2536// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08002537//
2538// Deprecated: use PathForModuleSrc instead.
Colin Cross25de6c32019-06-06 14:29:25 -07002539func (m *moduleContext) ExpandSource(srcFile, prop string) Path {
2540 return PathForModuleSrc(m, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08002541}
2542
2543// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
2544// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
2545// dependency resolution.
Colin Cross25de6c32019-06-06 14:29:25 -07002546func (m *moduleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
Colin Cross2fafa3e2019-03-05 12:39:51 -08002547 if srcFile != nil {
Colin Cross25de6c32019-06-06 14:29:25 -07002548 return OptionalPathForPath(PathForModuleSrc(m, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08002549 }
2550 return OptionalPath{}
2551}
2552
Colin Cross25de6c32019-06-06 14:29:25 -07002553func (m *moduleContext) RequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002554 return m.module.RequiredModuleNames()
Nan Zhang6d34b302017-02-04 17:47:46 -08002555}
2556
Colin Cross25de6c32019-06-06 14:29:25 -07002557func (m *moduleContext) HostRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002558 return m.module.HostRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002559}
2560
Colin Cross25de6c32019-06-06 14:29:25 -07002561func (m *moduleContext) TargetRequiredModuleNames() []string {
Jiyong Park6a8cf5f2019-12-30 16:31:09 +09002562 return m.module.TargetRequiredModuleNames()
Sasha Smundakb6d23052019-04-01 18:37:36 -07002563}
2564
Colin Cross463a90e2015-06-17 14:20:06 -07002565func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07002566 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07002567}
2568
Colin Cross0875c522017-11-28 17:34:01 -08002569func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07002570 return &buildTargetSingleton{}
2571}
2572
Colin Cross87d8b562017-04-25 10:01:55 -07002573func parentDir(dir string) string {
2574 dir, _ = filepath.Split(dir)
2575 return filepath.Clean(dir)
2576}
2577
Colin Cross1f8c52b2015-06-16 16:38:17 -07002578type buildTargetSingleton struct{}
2579
Colin Cross0875c522017-11-28 17:34:01 -08002580func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
2581 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07002582
Colin Crossc3d87d32020-06-04 13:25:17 -07002583 mmTarget := func(dir string) string {
2584 return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1)
Colin Cross87d8b562017-04-25 10:01:55 -07002585 }
2586
Colin Cross0875c522017-11-28 17:34:01 -08002587 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002588
Colin Cross0875c522017-11-28 17:34:01 -08002589 ctx.VisitAllModules(func(module Module) {
2590 blueprintDir := module.base().blueprintDir
2591 installTarget := module.base().installTarget
2592 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07002593
Colin Cross0875c522017-11-28 17:34:01 -08002594 if checkbuildTarget != nil {
2595 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
2596 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
2597 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002598
Colin Cross0875c522017-11-28 17:34:01 -08002599 if installTarget != nil {
2600 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002601 }
2602 })
2603
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002604 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08002605 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08002606 suffix = "-soong"
2607 }
2608
Colin Cross1f8c52b2015-06-16 16:38:17 -07002609 // Create a top-level checkbuild target that depends on all modules
Colin Crossc3d87d32020-06-04 13:25:17 -07002610 ctx.Phony("checkbuild"+suffix, checkbuildDeps...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002611
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002612 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08002613 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002614 return
2615 }
2616
Colin Cross87d8b562017-04-25 10:01:55 -07002617 // Ensure ancestor directories are in modulesInDir
Inseob Kim1a365c62019-06-08 15:47:51 +09002618 dirs := SortedStringKeys(modulesInDir)
Colin Cross87d8b562017-04-25 10:01:55 -07002619 for _, dir := range dirs {
2620 dir := parentDir(dir)
2621 for dir != "." && dir != "/" {
2622 if _, exists := modulesInDir[dir]; exists {
2623 break
2624 }
2625 modulesInDir[dir] = nil
2626 dir = parentDir(dir)
2627 }
2628 }
2629
2630 // Make directories build their direct subdirectories
Colin Cross87d8b562017-04-25 10:01:55 -07002631 for _, dir := range dirs {
2632 p := parentDir(dir)
2633 if p != "." && p != "/" {
Colin Crossc3d87d32020-06-04 13:25:17 -07002634 modulesInDir[p] = append(modulesInDir[p], PathForPhony(ctx, mmTarget(dir)))
Colin Cross87d8b562017-04-25 10:01:55 -07002635 }
2636 }
2637
Dan Willemsend2e95fb2017-09-20 14:30:50 -07002638 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
2639 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
2640 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07002641 for _, dir := range dirs {
Colin Crossc3d87d32020-06-04 13:25:17 -07002642 ctx.Phony(mmTarget(dir), modulesInDir[dir]...)
Colin Cross1f8c52b2015-06-16 16:38:17 -07002643 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002644
2645 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
Jiyong Park1613e552020-09-14 19:43:17 +09002646 type osAndCross struct {
2647 os OsType
2648 hostCross bool
2649 }
2650 osDeps := map[osAndCross]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08002651 ctx.VisitAllModules(func(module Module) {
2652 if module.Enabled() {
Jiyong Park1613e552020-09-14 19:43:17 +09002653 key := osAndCross{os: module.Target().Os, hostCross: module.Target().HostCross}
2654 osDeps[key] = append(osDeps[key], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002655 }
2656 })
2657
Colin Cross0875c522017-11-28 17:34:01 -08002658 osClass := make(map[string]Paths)
Jiyong Park1613e552020-09-14 19:43:17 +09002659 for key, deps := range osDeps {
Dan Willemsen61d88b82017-09-20 17:29:08 -07002660 var className string
2661
Jiyong Park1613e552020-09-14 19:43:17 +09002662 switch key.os.Class {
Dan Willemsen61d88b82017-09-20 17:29:08 -07002663 case Host:
Jiyong Park1613e552020-09-14 19:43:17 +09002664 if key.hostCross {
2665 className = "host-cross"
2666 } else {
2667 className = "host"
2668 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07002669 case Device:
2670 className = "target"
2671 default:
2672 continue
2673 }
2674
Jiyong Park1613e552020-09-14 19:43:17 +09002675 name := className + "-" + key.os.Name
Colin Crossc3d87d32020-06-04 13:25:17 -07002676 osClass[className] = append(osClass[className], PathForPhony(ctx, name))
Dan Willemsen61d88b82017-09-20 17:29:08 -07002677
Colin Crossc3d87d32020-06-04 13:25:17 -07002678 ctx.Phony(name, deps...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002679 }
2680
2681 // Wrap those into host|host-cross|target phony rules
Inseob Kim1a365c62019-06-08 15:47:51 +09002682 for _, class := range SortedStringKeys(osClass) {
Colin Crossc3d87d32020-06-04 13:25:17 -07002683 ctx.Phony(class, osClass[class]...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07002684 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07002685}
Colin Crossd779da42015-12-17 18:00:23 -08002686
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002687// Collect information for opening IDE project files in java/jdeps.go.
2688type IDEInfo interface {
2689 IDEInfo(ideInfo *IdeInfo)
2690 BaseModuleName() string
2691}
2692
2693// Extract the base module name from the Import name.
2694// Often the Import name has a prefix "prebuilt_".
2695// Remove the prefix explicitly if needed
2696// until we find a better solution to get the Import name.
2697type IDECustomizedModuleName interface {
2698 IDECustomizedModuleName() string
2699}
2700
2701type IdeInfo struct {
2702 Deps []string `json:"dependencies,omitempty"`
2703 Srcs []string `json:"srcs,omitempty"`
2704 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
2705 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
2706 Jars []string `json:"jars,omitempty"`
2707 Classes []string `json:"class,omitempty"`
2708 Installed_paths []string `json:"installed,omitempty"`
patricktu18c82ff2019-05-10 15:48:50 +08002709 SrcJars []string `json:"srcjars,omitempty"`
bralee1fbf4402020-05-21 10:11:59 +08002710 Paths []string `json:"path,omitempty"`
Brandon Lee5d45c6f2018-08-15 15:35:38 -07002711}
Paul Duffinf88d8e02020-05-07 20:21:34 +01002712
2713func CheckBlueprintSyntax(ctx BaseModuleContext, filename string, contents string) []error {
2714 bpctx := ctx.blueprintBaseModuleContext()
2715 return blueprint.CheckBlueprintSyntax(bpctx.ModuleFactories(), filename, contents)
2716}