blob: dfeb45d1416c02f8a70503e55cfde5dcc8d7554c [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"
Alex Lightfb4353d2019-01-17 13:57:45 -080019 "path"
Colin Cross3f40fa42015-01-30 17:27:36 -080020 "path/filepath"
Colin Cross0875c522017-11-28 17:34:01 -080021 "sort"
Colin Cross6ff51382015-12-17 16:39:19 -080022 "strings"
Colin Crossaabf6792017-11-29 00:27:14 -080023 "text/scanner"
Colin Crossf6566ed2015-03-24 11:13:38 -070024
25 "github.com/google/blueprint"
Colin Cross7f19f372016-11-01 11:10:25 -070026 "github.com/google/blueprint/pathtools"
Colin Crossfe4bc362018-09-12 10:02:13 -070027 "github.com/google/blueprint/proptools"
Colin Cross3f40fa42015-01-30 17:27:36 -080028)
29
30var (
31 DeviceSharedLibrary = "shared_library"
32 DeviceStaticLibrary = "static_library"
33 DeviceExecutable = "executable"
34 HostSharedLibrary = "host_shared_library"
35 HostStaticLibrary = "host_static_library"
36 HostExecutable = "host_executable"
37)
38
Colin Crossae887032017-10-23 17:16:14 -070039type BuildParams struct {
Dan Willemsen9f3c5742016-11-03 14:28:31 -070040 Rule blueprint.Rule
Colin Cross33bfb0a2016-11-21 17:23:08 -080041 Deps blueprint.Deps
42 Depfile WritablePath
Colin Cross67a5c132017-05-09 13:45:28 -070043 Description string
Dan Willemsen9f3c5742016-11-03 14:28:31 -070044 Output WritablePath
45 Outputs WritablePaths
46 ImplicitOutput WritablePath
47 ImplicitOutputs WritablePaths
48 Input Path
49 Inputs Paths
50 Implicit Path
51 Implicits Paths
52 OrderOnly Paths
53 Default bool
54 Args map[string]string
Dan Willemsen34cc69e2015-09-23 15:26:20 -070055}
56
Colin Crossae887032017-10-23 17:16:14 -070057type ModuleBuildParams BuildParams
58
Colin Crossf6566ed2015-03-24 11:13:38 -070059type androidBaseContext interface {
Colin Crossa1ad8d12016-06-01 17:09:44 -070060 Target() Target
Colin Cross8b74d172016-09-13 09:59:14 -070061 TargetPrimary() bool
Colin Crossee0bc3b2018-10-02 22:01:37 -070062 MultiTargets() []Target
Colin Crossf6566ed2015-03-24 11:13:38 -070063 Arch() Arch
Colin Crossa1ad8d12016-06-01 17:09:44 -070064 Os() OsType
Colin Crossf6566ed2015-03-24 11:13:38 -070065 Host() bool
66 Device() bool
Colin Cross0af4b842015-04-30 16:36:18 -070067 Darwin() bool
Doug Horn21b94272019-01-16 12:06:11 -080068 Fuchsia() bool
Colin Cross3edeee12017-04-04 12:59:48 -070069 Windows() bool
Colin Crossf6566ed2015-03-24 11:13:38 -070070 Debug() bool
Colin Cross1e7d3702016-08-24 15:25:47 -070071 PrimaryArch() bool
Jiyong Park2db76922017-11-08 16:03:48 +090072 Platform() bool
73 DeviceSpecific() bool
74 SocSpecific() bool
75 ProductSpecific() bool
Dario Frenifd05a742018-05-29 13:28:54 +010076 ProductServicesSpecific() bool
Colin Cross1332b002015-04-07 17:11:30 -070077 AConfig() Config
Colin Cross9272ade2016-08-17 15:24:12 -070078 DeviceConfig() DeviceConfig
Colin Crossf6566ed2015-03-24 11:13:38 -070079}
80
Colin Cross635c3b02016-05-18 15:37:25 -070081type BaseContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -080082 BaseModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -070083 androidBaseContext
84}
85
Colin Crossaabf6792017-11-29 00:27:14 -080086// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
87// a Config instead of an interface{}.
88type BaseModuleContext interface {
89 ModuleName() string
90 ModuleDir() string
Colin Cross3d7c9822019-03-01 13:46:24 -080091 ModuleType() string
Colin Crossaabf6792017-11-29 00:27:14 -080092 Config() Config
93
94 ContainsProperty(name string) bool
95 Errorf(pos scanner.Position, fmt string, args ...interface{})
96 ModuleErrorf(fmt string, args ...interface{})
97 PropertyErrorf(property, fmt string, args ...interface{})
98 Failed() bool
99
100 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
101 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
102 // builder whenever a file matching the pattern as added or removed, without rerunning if a
103 // file that does not match the pattern is added to a searched directory.
104 GlobWithDeps(pattern string, excludes []string) ([]string, error)
105
106 Fs() pathtools.FileSystem
107 AddNinjaFileDeps(deps ...string)
108}
109
Colin Cross635c3b02016-05-18 15:37:25 -0700110type ModuleContext interface {
Colin Crossf6566ed2015-03-24 11:13:38 -0700111 androidBaseContext
Colin Crossaabf6792017-11-29 00:27:14 -0800112 BaseModuleContext
Colin Cross3f40fa42015-01-30 17:27:36 -0800113
Colin Crossae887032017-10-23 17:16:14 -0700114 // Deprecated: use ModuleContext.Build instead.
Colin Cross0875c522017-11-28 17:34:01 -0800115 ModuleBuild(pctx PackageContext, params ModuleBuildParams)
Colin Cross8f101b42015-06-17 15:09:06 -0700116
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700117 ExpandSources(srcFiles, excludes []string) Paths
Colin Cross366938f2017-12-11 16:29:02 -0800118 ExpandSource(srcFile, prop string) Path
Colin Cross2383f3b2018-02-06 14:40:13 -0800119 ExpandOptionalSource(srcFile *string, prop string) OptionalPath
Colin Cross7f19f372016-11-01 11:10:25 -0700120 Glob(globPattern string, excludes []string) Paths
Nan Zhang581fd212018-01-10 16:06:12 -0800121 GlobFiles(globPattern string, excludes []string) Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700122
Colin Cross5c517922017-08-31 12:29:17 -0700123 InstallExecutable(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
124 InstallFile(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
Colin Cross3854a602016-01-11 12:49:11 -0800125 InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath
Jiyong Parkf1194352019-02-25 11:05:47 +0900126 InstallAbsoluteSymlink(installPath OutputPath, name string, absPath string) OutputPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700127 CheckbuildFile(srcPath Path)
Dan Willemsen6553f5e2016-03-10 18:14:25 -0800128
129 AddMissingDependencies(deps []string)
Colin Cross8d8f8e22016-08-03 11:57:50 -0700130
Colin Cross8d8f8e22016-08-03 11:57:50 -0700131 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700132 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900133 InstallInRecovery() bool
Nan Zhang6d34b302017-02-04 17:47:46 -0800134
135 RequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700136
137 // android.ModuleContext methods
138 // These are duplicated instead of embedded so that can eventually be wrapped to take an
139 // android.Module instead of a blueprint.Module
140 OtherModuleName(m blueprint.Module) string
141 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
142 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
143
144 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
145 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
146
147 ModuleSubDir() string
148
Colin Cross35143d02017-11-16 00:11:20 -0800149 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700150 VisitDirectDeps(visit func(Module))
Colin Crossee6143c2017-12-30 17:54:27 -0800151 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700152 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -0700153 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Crossd11fcda2017-10-23 17:59:01 -0700154 VisitDepsDepthFirst(visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -0700155 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Crossd11fcda2017-10-23 17:59:01 -0700156 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
157 WalkDeps(visit func(Module, Module) bool)
Alex Light778127a2019-02-27 14:19:50 -0800158 WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool)
Colin Cross3f68a132017-10-23 17:10:29 -0700159
Colin Cross0875c522017-11-28 17:34:01 -0800160 Variable(pctx PackageContext, name, value string)
161 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700162 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
163 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800164 Build(pctx PackageContext, params BuildParams)
Colin Cross3f68a132017-10-23 17:10:29 -0700165
Colin Cross0875c522017-11-28 17:34:01 -0800166 PrimaryModule() Module
167 FinalModule() Module
168 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700169
170 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800171 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800172}
173
Colin Cross635c3b02016-05-18 15:37:25 -0700174type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800175 blueprint.Module
176
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700177 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
178 // but GenerateAndroidBuildActions also has access to Android-specific information.
179 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700180 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700181
Colin Cross1e676be2016-10-12 14:38:15 -0700182 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800183
Colin Cross635c3b02016-05-18 15:37:25 -0700184 base() *ModuleBase
Dan Willemsen0effe062015-11-30 16:06:01 -0800185 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700186 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800187 InstallInData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700188 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900189 InstallInRecovery() bool
Colin Crossa2f296f2016-11-29 15:16:18 -0800190 SkipInstall()
Jiyong Park374510b2018-03-19 18:23:01 +0900191 ExportedToMake() bool
Colin Cross36242852017-06-23 15:06:31 -0700192
193 AddProperties(props ...interface{})
194 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700195
Colin Crossae887032017-10-23 17:16:14 -0700196 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800197 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800198 VariablesForTests() map[string]string
Colin Cross3f40fa42015-01-30 17:27:36 -0800199}
200
Colin Crossfc754582016-05-17 16:34:16 -0700201type nameProperties struct {
202 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800203 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700204}
205
206type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800207 // emit build rules for this module
208 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800209
Colin Cross7d5136f2015-05-11 13:39:40 -0700210 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800211 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
212 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
213 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700214 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700215
216 Target struct {
217 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700218 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700219 }
220 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700221 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700222 }
223 }
224
Colin Crossee0bc3b2018-10-02 22:01:37 -0700225 UseTargetVariants bool `blueprint:"mutated"`
226 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800227
Dan Willemsen782a2d12015-12-21 14:55:28 -0800228 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700229 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800230
Colin Cross55708f32017-03-20 13:23:34 -0700231 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700232 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700233
Jiyong Park2db76922017-11-08 16:03:48 +0900234 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
235 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
236 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700237 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700238
Jiyong Park2db76922017-11-08 16:03:48 +0900239 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
240 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
241 Soc_specific *bool
242
243 // whether this module is specific to a device, not only for SoC, but also for off-chip
244 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
245 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
246 // This implies `soc_specific:true`.
247 Device_specific *bool
248
249 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900250 // network operator, etc). When set to true, it is installed into /product (or
251 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900252 Product_specific *bool
253
Dario Frenifd05a742018-05-29 13:28:54 +0100254 // whether this module provides services owned by the OS provider to the core platform. When set
Dario Freni95cf7672018-08-17 00:57:57 +0100255 // to true, it is installed into /product_services (or /system/product_services if
256 // product_services partition does not exist).
257 Product_services_specific *bool
Dario Frenifd05a742018-05-29 13:28:54 +0100258
Jiyong Parkf9332f12018-02-01 00:54:12 +0900259 // Whether this module is installed to recovery partition
260 Recovery *bool
261
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700262 // init.rc files to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800263 Init_rc []string `android:"path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700264
Steven Moreland57a23d22018-04-04 15:42:19 -0700265 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800266 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700267
Chris Wolfe998306e2016-08-15 14:47:23 -0400268 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700269 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400270
Colin Cross5aac3622017-08-31 15:07:09 -0700271 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800272 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700273
Dan Willemsen569edc52018-11-19 09:33:29 -0800274 Dist struct {
275 // copy the output of this module to the $DIST_DIR when `dist` is specified on the
276 // command line and any of these targets are also on the command line, or otherwise
277 // built
278 Targets []string `android:"arch_variant"`
279
280 // The name of the output artifact. This defaults to the basename of the output of
281 // the module.
282 Dest *string `android:"arch_variant"`
283
284 // The directory within the dist directory to store the artifact. Defaults to the
285 // top level directory ("").
286 Dir *string `android:"arch_variant"`
287
288 // A suffix to add to the artifact file name (before any extension).
289 Suffix *string `android:"arch_variant"`
290 } `android:"arch_variant"`
291
Colin Crossa1ad8d12016-06-01 17:09:44 -0700292 // Set by TargetMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700293 CompileTarget Target `blueprint:"mutated"`
294 CompileMultiTargets []Target `blueprint:"mutated"`
295 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800296
297 // Set by InitAndroidModule
298 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700299 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700300
301 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800302
303 NamespaceExportedToMake bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800304}
305
306type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800307 // If set to true, build a variant of the module for the host. Defaults to false.
308 Host_supported *bool
309
310 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700311 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800312}
313
Colin Crossc472d572015-03-17 15:06:21 -0700314type Multilib string
315
316const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800317 MultilibBoth Multilib = "both"
318 MultilibFirst Multilib = "first"
319 MultilibCommon Multilib = "common"
320 MultilibCommonFirst Multilib = "common_first"
321 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700322)
323
Colin Crossa1ad8d12016-06-01 17:09:44 -0700324type HostOrDeviceSupported int
325
326const (
327 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700328
329 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700330 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700331
332 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700333 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700334
335 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700336 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700337
338 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700339 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700340
341 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700342 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700343
344 // Nothing is supported. This is not exposed to the user, but used to mark a
345 // host only module as unsupported when the module type is not supported on
346 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700347 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700348)
349
Jiyong Park2db76922017-11-08 16:03:48 +0900350type moduleKind int
351
352const (
353 platformModule moduleKind = iota
354 deviceSpecificModule
355 socSpecificModule
356 productSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +0100357 productServicesSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900358)
359
360func (k moduleKind) String() string {
361 switch k {
362 case platformModule:
363 return "platform"
364 case deviceSpecificModule:
365 return "device-specific"
366 case socSpecificModule:
367 return "soc-specific"
368 case productSpecificModule:
369 return "product-specific"
Dario Frenifd05a742018-05-29 13:28:54 +0100370 case productServicesSpecificModule:
371 return "productservices-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900372 default:
373 panic(fmt.Errorf("unknown module kind %d", k))
374 }
375}
376
Colin Cross36242852017-06-23 15:06:31 -0700377func InitAndroidModule(m Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 base := m.base()
379 base.module = m
Colin Cross5049f022015-03-18 13:28:46 -0700380
Colin Cross36242852017-06-23 15:06:31 -0700381 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700382 &base.nameProperties,
383 &base.commonProperties,
384 &base.variableProperties)
Colin Crossa3a97412019-03-18 12:24:29 -0700385 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700386 base.customizableProperties = m.GetProperties()
Colin Cross5049f022015-03-18 13:28:46 -0700387}
388
Colin Cross36242852017-06-23 15:06:31 -0700389func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
390 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700391
392 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800393 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700394 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700395 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700396 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800397
Dan Willemsen218f6562015-07-08 18:13:11 -0700398 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700399 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700400 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800401 }
402
Colin Cross36242852017-06-23 15:06:31 -0700403 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800404}
405
Colin Crossee0bc3b2018-10-02 22:01:37 -0700406func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
407 InitAndroidArchModule(m, hod, defaultMultilib)
408 m.base().commonProperties.UseTargetVariants = false
409}
410
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800411// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800412// modules. It should be included as an anonymous field in every module
413// struct definition. InitAndroidModule should then be called from the module's
414// factory function, and the return values from InitAndroidModule should be
415// returned from the factory function.
416//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800417// The ModuleBase type is responsible for implementing the GenerateBuildActions
418// method to support the blueprint.Module interface. This method will then call
419// the module's GenerateAndroidBuildActions method once for each build variant
420// that is to be built. GenerateAndroidBuildActions is passed a
421// AndroidModuleContext rather than the usual blueprint.ModuleContext.
Colin Cross3f40fa42015-01-30 17:27:36 -0800422// AndroidModuleContext exposes extra functionality specific to the Android build
423// system including details about the particular build variant that is to be
424// generated.
425//
426// For example:
427//
428// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800429// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800430// )
431//
432// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800433// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800434// properties struct {
435// MyProperty string
436// }
437// }
438//
Colin Cross36242852017-06-23 15:06:31 -0700439// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800440// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700441// m.AddProperties(&m.properties)
442// android.InitAndroidModule(m)
443// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800444// }
445//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800446// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800447// // Get the CPU architecture for the current build variant.
448// variantArch := ctx.Arch()
449//
450// // ...
451// }
Colin Cross635c3b02016-05-18 15:37:25 -0700452type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800453 // Putting the curiously recurring thing pointing to the thing that contains
454 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700455 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700456 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800457
Colin Crossfc754582016-05-17 16:34:16 -0700458 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800459 commonProperties commonProperties
Colin Cross7f64b6d2015-07-09 13:57:48 -0700460 variableProperties variableProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800461 hostAndDeviceProperties hostAndDeviceProperties
462 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700463 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700464 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800465
466 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700467 installFiles Paths
468 checkbuildFiles Paths
Jaewoong Jung62707f72018-11-16 13:26:43 -0800469 noticeFile Path
Colin Cross1f8c52b2015-06-16 16:38:17 -0700470
471 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
472 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800473 installTarget WritablePath
474 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700475 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700476
Colin Cross178a5092016-09-13 13:42:32 -0700477 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700478
479 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700480
481 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700482 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800483 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800484 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700485
486 prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
Colin Cross36242852017-06-23 15:06:31 -0700487}
488
Colin Cross5f692ec2019-02-01 16:53:07 -0800489func (a *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
490
Colin Cross36242852017-06-23 15:06:31 -0700491func (a *ModuleBase) AddProperties(props ...interface{}) {
492 a.registerProps = append(a.registerProps, props...)
493}
494
495func (a *ModuleBase) GetProperties() []interface{} {
496 return a.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800497}
498
Colin Crossae887032017-10-23 17:16:14 -0700499func (a *ModuleBase) BuildParamsForTests() []BuildParams {
Colin Crosscec81712017-07-13 14:43:27 -0700500 return a.buildParams
501}
502
Colin Cross4c83e5c2019-02-25 14:54:28 -0800503func (a *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
504 return a.ruleParams
505}
506
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800507func (a *ModuleBase) VariablesForTests() map[string]string {
508 return a.variables
509}
510
Colin Crossa9d8bee2018-10-02 13:59:46 -0700511func (a *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
512 a.prefer32 = prefer32
513}
514
Colin Crossce75d2c2016-10-06 16:12:58 -0700515// Name returns the name of the module. It may be overridden by individual module types, for
516// example prebuilts will prepend prebuilt_ to the name.
Colin Crossfc754582016-05-17 16:34:16 -0700517func (a *ModuleBase) Name() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800518 return String(a.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700519}
520
Colin Crossce75d2c2016-10-06 16:12:58 -0700521// BaseModuleName returns the name of the module as specified in the blueprints file.
522func (a *ModuleBase) BaseModuleName() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800523 return String(a.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700524}
525
Colin Cross635c3b02016-05-18 15:37:25 -0700526func (a *ModuleBase) base() *ModuleBase {
Colin Cross3f40fa42015-01-30 17:27:36 -0800527 return a
528}
529
Colin Crossee0bc3b2018-10-02 22:01:37 -0700530func (a *ModuleBase) SetTarget(target Target, multiTargets []Target, primary bool) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700531 a.commonProperties.CompileTarget = target
Colin Crossee0bc3b2018-10-02 22:01:37 -0700532 a.commonProperties.CompileMultiTargets = multiTargets
Colin Cross8b74d172016-09-13 09:59:14 -0700533 a.commonProperties.CompilePrimary = primary
Colin Crossd3ba0392015-05-07 14:11:29 -0700534}
535
Colin Crossa1ad8d12016-06-01 17:09:44 -0700536func (a *ModuleBase) Target() Target {
537 return a.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800538}
539
Colin Cross8b74d172016-09-13 09:59:14 -0700540func (a *ModuleBase) TargetPrimary() bool {
541 return a.commonProperties.CompilePrimary
542}
543
Colin Crossee0bc3b2018-10-02 22:01:37 -0700544func (a *ModuleBase) MultiTargets() []Target {
545 return a.commonProperties.CompileMultiTargets
546}
547
Colin Crossa1ad8d12016-06-01 17:09:44 -0700548func (a *ModuleBase) Os() OsType {
549 return a.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800550}
551
Colin Cross635c3b02016-05-18 15:37:25 -0700552func (a *ModuleBase) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700553 return a.Os().Class == Host || a.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800554}
555
Colin Cross635c3b02016-05-18 15:37:25 -0700556func (a *ModuleBase) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700557 return a.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800558}
559
Dan Willemsen0b24c742016-10-04 15:13:37 -0700560func (a *ModuleBase) ArchSpecific() bool {
561 return a.commonProperties.ArchSpecific
562}
563
Colin Crossa1ad8d12016-06-01 17:09:44 -0700564func (a *ModuleBase) OsClassSupported() []OsClass {
565 switch a.commonProperties.HostOrDeviceSupported {
566 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700567 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700568 case HostSupportedNoCross:
569 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700570 case DeviceSupported:
571 return []OsClass{Device}
Dan Albert0981b5c2018-08-02 13:46:35 -0700572 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700573 var supported []OsClass
Dan Albert0981b5c2018-08-02 13:46:35 -0700574 if Bool(a.hostAndDeviceProperties.Host_supported) ||
575 (a.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
576 a.hostAndDeviceProperties.Host_supported == nil) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700577 supported = append(supported, Host, HostCross)
578 }
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700579 if a.hostAndDeviceProperties.Device_supported == nil ||
580 *a.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700581 supported = append(supported, Device)
582 }
583 return supported
584 default:
585 return nil
586 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800587}
588
Colin Cross635c3b02016-05-18 15:37:25 -0700589func (a *ModuleBase) DeviceSupported() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800590 return a.commonProperties.HostOrDeviceSupported == DeviceSupported ||
591 a.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700592 (a.hostAndDeviceProperties.Device_supported == nil ||
593 *a.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800594}
595
Jiyong Parkc678ad32018-04-10 13:07:10 +0900596func (a *ModuleBase) Platform() bool {
Dario Frenifd05a742018-05-29 13:28:54 +0100597 return !a.DeviceSpecific() && !a.SocSpecific() && !a.ProductSpecific() && !a.ProductServicesSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900598}
599
600func (a *ModuleBase) DeviceSpecific() bool {
601 return Bool(a.commonProperties.Device_specific)
602}
603
604func (a *ModuleBase) SocSpecific() bool {
605 return Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
606}
607
608func (a *ModuleBase) ProductSpecific() bool {
609 return Bool(a.commonProperties.Product_specific)
610}
611
Dario Frenifd05a742018-05-29 13:28:54 +0100612func (a *ModuleBase) ProductServicesSpecific() bool {
Dario Freni95cf7672018-08-17 00:57:57 +0100613 return Bool(a.commonProperties.Product_services_specific)
Dario Frenifd05a742018-05-29 13:28:54 +0100614}
615
Colin Cross635c3b02016-05-18 15:37:25 -0700616func (a *ModuleBase) Enabled() bool {
Dan Willemsen0effe062015-11-30 16:06:01 -0800617 if a.commonProperties.Enabled == nil {
Dan Willemsen0a37a2a2016-11-13 10:16:05 -0800618 return !a.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800619 }
Dan Willemsen0effe062015-11-30 16:06:01 -0800620 return *a.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800621}
622
Colin Crossce75d2c2016-10-06 16:12:58 -0700623func (a *ModuleBase) SkipInstall() {
624 a.commonProperties.SkipInstall = true
625}
626
Jiyong Park374510b2018-03-19 18:23:01 +0900627func (a *ModuleBase) ExportedToMake() bool {
628 return a.commonProperties.NamespaceExportedToMake
629}
630
Colin Cross635c3b02016-05-18 15:37:25 -0700631func (a *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700632 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800633
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700634 result := Paths{}
Colin Cross6b753602018-06-21 13:03:07 -0700635 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross3f40fa42015-01-30 17:27:36 -0800636 ctx.VisitDepsDepthFirstIf(isFileInstaller,
637 func(m blueprint.Module) {
638 fileInstaller := m.(fileInstaller)
639 files := fileInstaller.filesToInstall()
640 result = append(result, files...)
641 })
642
643 return result
644}
645
Colin Cross635c3b02016-05-18 15:37:25 -0700646func (a *ModuleBase) filesToInstall() Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 return a.installFiles
648}
649
Colin Cross635c3b02016-05-18 15:37:25 -0700650func (p *ModuleBase) NoAddressSanitizer() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800651 return p.noAddressSanitizer
652}
653
Colin Cross635c3b02016-05-18 15:37:25 -0700654func (p *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800655 return false
656}
657
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700658func (p *ModuleBase) InstallInSanitizerDir() bool {
659 return false
660}
661
Jiyong Parkf9332f12018-02-01 00:54:12 +0900662func (p *ModuleBase) InstallInRecovery() bool {
663 return Bool(p.commonProperties.Recovery)
664}
665
Sundong Ahn4fd04bb2018-08-31 18:01:37 +0900666func (a *ModuleBase) Owner() string {
667 return String(a.commonProperties.Owner)
668}
669
Colin Cross0875c522017-11-28 17:34:01 -0800670func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700671 allInstalledFiles := Paths{}
672 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800673 ctx.VisitAllModuleVariants(func(module Module) {
674 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700675 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
676 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800677 })
678
Colin Cross0875c522017-11-28 17:34:01 -0800679 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700680
Jeff Gaston088e29e2017-11-29 16:47:17 -0800681 namespacePrefix := ctx.Namespace().(*Namespace).id
682 if namespacePrefix != "" {
683 namespacePrefix = namespacePrefix + "-"
684 }
685
Colin Cross3f40fa42015-01-30 17:27:36 -0800686 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800687 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800688 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700689 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800690 Output: name,
691 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800692 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700693 })
694 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700695 a.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700696 }
697
698 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800699 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
Colin Cross0875c522017-11-28 17:34:01 -0800700 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700701 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800702 Output: name,
703 Implicits: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700704 })
705 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700706 a.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700707 }
708
709 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800710 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800711 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800712 suffix = "-soong"
713 }
714
Jeff Gaston088e29e2017-11-29 16:47:17 -0800715 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800716 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700717 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800718 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700719 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800720 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700721
722 a.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800723 }
724}
725
Jiyong Park2db76922017-11-08 16:03:48 +0900726func determineModuleKind(a *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
727 var socSpecific = Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
728 var deviceSpecific = Bool(a.commonProperties.Device_specific)
729 var productSpecific = Bool(a.commonProperties.Product_specific)
Dario Freni95cf7672018-08-17 00:57:57 +0100730 var productServicesSpecific = Bool(a.commonProperties.Product_services_specific)
Jiyong Park2db76922017-11-08 16:03:48 +0900731
Dario Frenifd05a742018-05-29 13:28:54 +0100732 msg := "conflicting value set here"
733 if socSpecific && deviceSpecific {
734 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Jiyong Park2db76922017-11-08 16:03:48 +0900735 if Bool(a.commonProperties.Vendor) {
736 ctx.PropertyErrorf("vendor", msg)
737 }
738 if Bool(a.commonProperties.Proprietary) {
739 ctx.PropertyErrorf("proprietary", msg)
740 }
741 if Bool(a.commonProperties.Soc_specific) {
742 ctx.PropertyErrorf("soc_specific", msg)
743 }
744 }
745
Dario Frenifd05a742018-05-29 13:28:54 +0100746 if productSpecific && productServicesSpecific {
747 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and product_services at the same time.")
748 ctx.PropertyErrorf("product_services_specific", msg)
749 }
750
751 if (socSpecific || deviceSpecific) && (productSpecific || productServicesSpecific) {
752 if productSpecific {
753 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
754 } else {
755 ctx.PropertyErrorf("product_services_specific", "a module cannot be specific to SoC or device and product_services at the same time.")
756 }
757 if deviceSpecific {
758 ctx.PropertyErrorf("device_specific", msg)
759 } else {
760 if Bool(a.commonProperties.Vendor) {
761 ctx.PropertyErrorf("vendor", msg)
762 }
763 if Bool(a.commonProperties.Proprietary) {
764 ctx.PropertyErrorf("proprietary", msg)
765 }
766 if Bool(a.commonProperties.Soc_specific) {
767 ctx.PropertyErrorf("soc_specific", msg)
768 }
769 }
770 }
771
Jiyong Park2db76922017-11-08 16:03:48 +0900772 if productSpecific {
773 return productSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +0100774 } else if productServicesSpecific {
775 return productServicesSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900776 } else if deviceSpecific {
777 return deviceSpecificModule
778 } else if socSpecific {
779 return socSpecificModule
780 } else {
781 return platformModule
782 }
783}
784
Colin Cross635c3b02016-05-18 15:37:25 -0700785func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
Colin Cross6362e272015-10-29 15:25:03 -0700786 return androidBaseContextImpl{
Colin Cross8b74d172016-09-13 09:59:14 -0700787 target: a.commonProperties.CompileTarget,
788 targetPrimary: a.commonProperties.CompilePrimary,
Colin Crossee0bc3b2018-10-02 22:01:37 -0700789 multiTargets: a.commonProperties.CompileMultiTargets,
Jiyong Park2db76922017-11-08 16:03:48 +0900790 kind: determineModuleKind(a, ctx),
Colin Cross8b74d172016-09-13 09:59:14 -0700791 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -0800792 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800793}
794
Colin Cross0875c522017-11-28 17:34:01 -0800795func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
796 ctx := &androidModuleContext{
Colin Cross8d8f8e22016-08-03 11:57:50 -0700797 module: a.module,
Colin Cross0875c522017-11-28 17:34:01 -0800798 ModuleContext: blueprintCtx,
799 androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx),
800 installDeps: a.computeInstallDeps(blueprintCtx),
Colin Cross6362e272015-10-29 15:25:03 -0700801 installFiles: a.installFiles,
Colin Cross0875c522017-11-28 17:34:01 -0800802 missingDeps: blueprintCtx.GetMissingDependencies(),
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800803 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -0800804 }
805
Colin Cross4c83e5c2019-02-25 14:54:28 -0800806 if ctx.config.captureBuild {
807 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
808 }
809
Colin Cross67a5c132017-05-09 13:45:28 -0700810 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
811 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -0800812 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
813 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -0700814 }
Colin Cross0875c522017-11-28 17:34:01 -0800815 if !ctx.PrimaryArch() {
816 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -0700817 }
818
819 ctx.Variable(pctx, "moduleDesc", desc)
820
821 s := ""
822 if len(suffix) > 0 {
823 s = " [" + strings.Join(suffix, " ") + "]"
824 }
825 ctx.Variable(pctx, "moduleDescSuffix", s)
826
Dan Willemsen569edc52018-11-19 09:33:29 -0800827 // Some common property checks for properties that will be used later in androidmk.go
828 if a.commonProperties.Dist.Dest != nil {
829 _, err := validateSafePath(*a.commonProperties.Dist.Dest)
830 if err != nil {
831 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
832 }
833 }
834 if a.commonProperties.Dist.Dir != nil {
835 _, err := validateSafePath(*a.commonProperties.Dist.Dir)
836 if err != nil {
837 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
838 }
839 }
840 if a.commonProperties.Dist.Suffix != nil {
841 if strings.Contains(*a.commonProperties.Dist.Suffix, "/") {
842 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
843 }
844 }
845
Colin Cross9b1d13d2016-09-19 15:18:11 -0700846 if a.Enabled() {
Colin Cross0875c522017-11-28 17:34:01 -0800847 a.module.GenerateAndroidBuildActions(ctx)
Colin Cross9b1d13d2016-09-19 15:18:11 -0700848 if ctx.Failed() {
849 return
850 }
851
Colin Cross0875c522017-11-28 17:34:01 -0800852 a.installFiles = append(a.installFiles, ctx.installFiles...)
853 a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...)
Jaewoong Jung62707f72018-11-16 13:26:43 -0800854
855 if a.commonProperties.Notice != nil {
856 // For filegroup-based notice file references.
857 a.noticeFile = ctx.ExpandSource(*a.commonProperties.Notice, "notice")
858 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800859 }
860
Colin Cross9b1d13d2016-09-19 15:18:11 -0700861 if a == ctx.FinalModule().(Module).base() {
862 a.generateModuleTarget(ctx)
863 if ctx.Failed() {
864 return
865 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800866 }
Colin Crosscec81712017-07-13 14:43:27 -0700867
Colin Cross0875c522017-11-28 17:34:01 -0800868 a.buildParams = ctx.buildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800869 a.ruleParams = ctx.ruleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800870 a.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -0800871}
872
Colin Crossf6566ed2015-03-24 11:13:38 -0700873type androidBaseContextImpl struct {
Colin Cross8b74d172016-09-13 09:59:14 -0700874 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -0700875 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -0700876 targetPrimary bool
877 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +0900878 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -0700879 config Config
Colin Crossf6566ed2015-03-24 11:13:38 -0700880}
881
Colin Cross3f40fa42015-01-30 17:27:36 -0800882type androidModuleContext struct {
883 blueprint.ModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -0700884 androidBaseContextImpl
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700885 installDeps Paths
886 installFiles Paths
887 checkbuildFiles Paths
Colin Cross6ff51382015-12-17 16:39:19 -0800888 missingDeps []string
Colin Cross8d8f8e22016-08-03 11:57:50 -0700889 module Module
Colin Crosscec81712017-07-13 14:43:27 -0700890
891 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700892 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800893 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800894 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -0800895}
896
Colin Cross67a5c132017-05-09 13:45:28 -0700897func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
Colin Cross0875c522017-11-28 17:34:01 -0800898 a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700899 Rule: ErrorRule,
900 Description: desc,
901 Outputs: outputs,
902 Optional: true,
Colin Cross6ff51382015-12-17 16:39:19 -0800903 Args: map[string]string{
904 "error": err.Error(),
905 },
906 })
907 return
Colin Cross3f40fa42015-01-30 17:27:36 -0800908}
909
Colin Crossaabf6792017-11-29 00:27:14 -0800910func (a *androidModuleContext) Config() Config {
911 return a.ModuleContext.Config().(Config)
912}
913
Colin Cross0875c522017-11-28 17:34:01 -0800914func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
Colin Crossae887032017-10-23 17:16:14 -0700915 a.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -0800916}
917
Colin Cross0875c522017-11-28 17:34:01 -0800918func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700919 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700920 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -0800921 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -0800922 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700923 Outputs: params.Outputs.Strings(),
924 ImplicitOutputs: params.ImplicitOutputs.Strings(),
925 Inputs: params.Inputs.Strings(),
926 Implicits: params.Implicits.Strings(),
927 OrderOnly: params.OrderOnly.Strings(),
928 Args: params.Args,
929 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700930 }
931
Colin Cross33bfb0a2016-11-21 17:23:08 -0800932 if params.Depfile != nil {
933 bparams.Depfile = params.Depfile.String()
934 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700935 if params.Output != nil {
936 bparams.Outputs = append(bparams.Outputs, params.Output.String())
937 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700938 if params.ImplicitOutput != nil {
939 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
940 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700941 if params.Input != nil {
942 bparams.Inputs = append(bparams.Inputs, params.Input.String())
943 }
944 if params.Implicit != nil {
945 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
946 }
947
Colin Cross0b9f31f2019-02-28 11:00:01 -0800948 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
949 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
950 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
951 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
952 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
953 bparams.Depfile = proptools.NinjaEscapeList([]string{bparams.Depfile})[0]
Colin Crossfe4bc362018-09-12 10:02:13 -0700954
Colin Cross0875c522017-11-28 17:34:01 -0800955 return bparams
956}
957
958func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800959 if a.config.captureBuild {
960 a.variables[name] = value
961 }
962
Colin Cross0875c522017-11-28 17:34:01 -0800963 a.ModuleContext.Variable(pctx.PackageContext, name, value)
964}
965
966func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
967 argNames ...string) blueprint.Rule {
968
Colin Cross4c83e5c2019-02-25 14:54:28 -0800969 rule := a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...)
970
971 if a.config.captureBuild {
972 a.ruleParams[rule] = params
973 }
974
975 return rule
Colin Cross0875c522017-11-28 17:34:01 -0800976}
977
978func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) {
979 if a.config.captureBuild {
980 a.buildParams = append(a.buildParams, params)
981 }
982
983 bparams := convertBuildParams(params)
984
985 if bparams.Description != "" {
986 bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
987 }
988
Colin Cross6ff51382015-12-17 16:39:19 -0800989 if a.missingDeps != nil {
Colin Cross67a5c132017-05-09 13:45:28 -0700990 a.ninjaError(bparams.Description, bparams.Outputs,
991 fmt.Errorf("module %s missing dependencies: %s\n",
992 a.ModuleName(), strings.Join(a.missingDeps, ", ")))
Colin Cross6ff51382015-12-17 16:39:19 -0800993 return
994 }
995
Colin Cross0875c522017-11-28 17:34:01 -0800996 a.ModuleContext.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700997}
998
Colin Cross6ff51382015-12-17 16:39:19 -0800999func (a *androidModuleContext) GetMissingDependencies() []string {
1000 return a.missingDeps
1001}
1002
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001003func (a *androidModuleContext) AddMissingDependencies(deps []string) {
1004 if deps != nil {
1005 a.missingDeps = append(a.missingDeps, deps...)
Colin Crossd11fcda2017-10-23 17:59:01 -07001006 a.missingDeps = FirstUniqueStrings(a.missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001007 }
1008}
1009
Colin Crossd11fcda2017-10-23 17:59:01 -07001010func (a *androidModuleContext) validateAndroidModule(module blueprint.Module) Module {
1011 aModule, _ := module.(Module)
1012 if aModule == nil {
1013 a.ModuleErrorf("module %q not an android module", a.OtherModuleName(aModule))
1014 return nil
1015 }
1016
1017 if !aModule.Enabled() {
Colin Cross6510f912017-11-29 00:27:14 -08001018 if a.Config().AllowMissingDependencies() {
Colin Crossd11fcda2017-10-23 17:59:01 -07001019 a.AddMissingDependencies([]string{a.OtherModuleName(aModule)})
1020 } else {
1021 a.ModuleErrorf("depends on disabled module %q", a.OtherModuleName(aModule))
1022 }
1023 return nil
1024 }
1025
1026 return aModule
1027}
1028
Colin Cross35143d02017-11-16 00:11:20 -08001029func (a *androidModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
1030 a.ModuleContext.VisitDirectDeps(visit)
1031}
1032
Colin Crossd11fcda2017-10-23 17:59:01 -07001033func (a *androidModuleContext) VisitDirectDeps(visit func(Module)) {
1034 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1035 if aModule := a.validateAndroidModule(module); aModule != nil {
1036 visit(aModule)
1037 }
1038 })
1039}
1040
Colin Crossee6143c2017-12-30 17:54:27 -08001041func (a *androidModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
1042 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1043 if aModule := a.validateAndroidModule(module); aModule != nil {
1044 if a.ModuleContext.OtherModuleDependencyTag(aModule) == tag {
1045 visit(aModule)
1046 }
1047 }
1048 })
1049}
1050
Colin Crossd11fcda2017-10-23 17:59:01 -07001051func (a *androidModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
1052 a.ModuleContext.VisitDirectDepsIf(
1053 // pred
1054 func(module blueprint.Module) bool {
1055 if aModule := a.validateAndroidModule(module); aModule != nil {
1056 return pred(aModule)
1057 } else {
1058 return false
1059 }
1060 },
1061 // visit
1062 func(module blueprint.Module) {
1063 visit(module.(Module))
1064 })
1065}
1066
1067func (a *androidModuleContext) VisitDepsDepthFirst(visit func(Module)) {
1068 a.ModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
1069 if aModule := a.validateAndroidModule(module); aModule != nil {
1070 visit(aModule)
1071 }
1072 })
1073}
1074
1075func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
1076 a.ModuleContext.VisitDepsDepthFirstIf(
1077 // pred
1078 func(module blueprint.Module) bool {
1079 if aModule := a.validateAndroidModule(module); aModule != nil {
1080 return pred(aModule)
1081 } else {
1082 return false
1083 }
1084 },
1085 // visit
1086 func(module blueprint.Module) {
1087 visit(module.(Module))
1088 })
1089}
1090
Alex Light778127a2019-02-27 14:19:50 -08001091func (a *androidModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
1092 a.ModuleContext.WalkDeps(visit)
1093}
1094
Colin Crossd11fcda2017-10-23 17:59:01 -07001095func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) {
1096 a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
1097 childAndroidModule := a.validateAndroidModule(child)
1098 parentAndroidModule := a.validateAndroidModule(parent)
1099 if childAndroidModule != nil && parentAndroidModule != nil {
1100 return visit(childAndroidModule, parentAndroidModule)
1101 } else {
1102 return false
1103 }
1104 })
1105}
1106
Colin Cross0875c522017-11-28 17:34:01 -08001107func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) {
1108 a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) {
1109 visit(module.(Module))
1110 })
1111}
1112
1113func (a *androidModuleContext) PrimaryModule() Module {
1114 return a.ModuleContext.PrimaryModule().(Module)
1115}
1116
1117func (a *androidModuleContext) FinalModule() Module {
1118 return a.ModuleContext.FinalModule().(Module)
1119}
1120
Colin Crossa1ad8d12016-06-01 17:09:44 -07001121func (a *androidBaseContextImpl) Target() Target {
1122 return a.target
1123}
1124
Colin Cross8b74d172016-09-13 09:59:14 -07001125func (a *androidBaseContextImpl) TargetPrimary() bool {
1126 return a.targetPrimary
1127}
1128
Colin Crossee0bc3b2018-10-02 22:01:37 -07001129func (a *androidBaseContextImpl) MultiTargets() []Target {
1130 return a.multiTargets
1131}
1132
Colin Crossf6566ed2015-03-24 11:13:38 -07001133func (a *androidBaseContextImpl) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001134 return a.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08001135}
1136
Colin Crossa1ad8d12016-06-01 17:09:44 -07001137func (a *androidBaseContextImpl) Os() OsType {
1138 return a.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001139}
1140
Colin Crossf6566ed2015-03-24 11:13:38 -07001141func (a *androidBaseContextImpl) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001142 return a.target.Os.Class == Host || a.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -07001143}
1144
1145func (a *androidBaseContextImpl) Device() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001146 return a.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07001147}
1148
Colin Cross0af4b842015-04-30 16:36:18 -07001149func (a *androidBaseContextImpl) Darwin() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001150 return a.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07001151}
1152
Doug Horn21b94272019-01-16 12:06:11 -08001153func (a *androidBaseContextImpl) Fuchsia() bool {
1154 return a.target.Os == Fuchsia
1155}
1156
Colin Cross3edeee12017-04-04 12:59:48 -07001157func (a *androidBaseContextImpl) Windows() bool {
1158 return a.target.Os == Windows
1159}
1160
Colin Crossf6566ed2015-03-24 11:13:38 -07001161func (a *androidBaseContextImpl) Debug() bool {
1162 return a.debug
1163}
1164
Colin Cross1e7d3702016-08-24 15:25:47 -07001165func (a *androidBaseContextImpl) PrimaryArch() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001166 if len(a.config.Targets[a.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07001167 return true
1168 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001169 return a.target.Arch.ArchType == a.config.Targets[a.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07001170}
1171
Colin Cross1332b002015-04-07 17:11:30 -07001172func (a *androidBaseContextImpl) AConfig() Config {
1173 return a.config
1174}
1175
Colin Cross9272ade2016-08-17 15:24:12 -07001176func (a *androidBaseContextImpl) DeviceConfig() DeviceConfig {
1177 return DeviceConfig{a.config.deviceConfig}
1178}
1179
Jiyong Park2db76922017-11-08 16:03:48 +09001180func (a *androidBaseContextImpl) Platform() bool {
1181 return a.kind == platformModule
1182}
1183
1184func (a *androidBaseContextImpl) DeviceSpecific() bool {
1185 return a.kind == deviceSpecificModule
1186}
1187
1188func (a *androidBaseContextImpl) SocSpecific() bool {
1189 return a.kind == socSpecificModule
1190}
1191
1192func (a *androidBaseContextImpl) ProductSpecific() bool {
1193 return a.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -08001194}
1195
Dario Frenifd05a742018-05-29 13:28:54 +01001196func (a *androidBaseContextImpl) ProductServicesSpecific() bool {
1197 return a.kind == productServicesSpecificModule
1198}
1199
Jiyong Park5baac542018-08-28 09:55:37 +09001200// Makes this module a platform module, i.e. not specific to soc, device,
1201// product, or product_services.
1202func (a *ModuleBase) MakeAsPlatform() {
1203 a.commonProperties.Vendor = boolPtr(false)
1204 a.commonProperties.Proprietary = boolPtr(false)
1205 a.commonProperties.Soc_specific = boolPtr(false)
1206 a.commonProperties.Product_specific = boolPtr(false)
1207 a.commonProperties.Product_services_specific = boolPtr(false)
1208}
1209
Colin Cross8d8f8e22016-08-03 11:57:50 -07001210func (a *androidModuleContext) InstallInData() bool {
1211 return a.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08001212}
1213
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001214func (a *androidModuleContext) InstallInSanitizerDir() bool {
1215 return a.module.InstallInSanitizerDir()
1216}
1217
Jiyong Parkf9332f12018-02-01 00:54:12 +09001218func (a *androidModuleContext) InstallInRecovery() bool {
1219 return a.module.InstallInRecovery()
1220}
1221
Colin Cross893d8162017-04-26 17:34:03 -07001222func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool {
1223 if a.module.base().commonProperties.SkipInstall {
1224 return true
1225 }
1226
Colin Cross3607f212018-05-07 15:28:05 -07001227 // We'll need a solution for choosing which of modules with the same name in different
1228 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
1229 // list of namespaces to install in a Soong-only build.
1230 if !a.module.base().commonProperties.NamespaceExportedToMake {
1231 return true
1232 }
1233
Colin Cross893d8162017-04-26 17:34:03 -07001234 if a.Device() {
Colin Cross6510f912017-11-29 00:27:14 -08001235 if a.Config().SkipDeviceInstall() {
Colin Cross893d8162017-04-26 17:34:03 -07001236 return true
1237 }
1238
Colin Cross6510f912017-11-29 00:27:14 -08001239 if a.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07001240 return true
1241 }
1242 }
1243
1244 return false
1245}
1246
Colin Cross5c517922017-08-31 12:29:17 -07001247func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
Colin Crossa2344662016-03-24 13:14:12 -07001248 deps ...Path) OutputPath {
Colin Cross5c517922017-08-31 12:29:17 -07001249 return a.installFile(installPath, name, srcPath, Cp, deps)
1250}
1251
1252func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
1253 deps ...Path) OutputPath {
1254 return a.installFile(installPath, name, srcPath, CpExecutable, deps)
1255}
1256
1257func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path,
1258 rule blueprint.Rule, deps []Path) OutputPath {
Colin Cross35cec122015-04-02 14:37:16 -07001259
Dan Willemsen782a2d12015-12-21 14:55:28 -08001260 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001261 a.module.base().hooks.runInstallHooks(a, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001262
Colin Cross893d8162017-04-26 17:34:03 -07001263 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001264
Dan Willemsen322acaf2016-01-12 23:07:05 -08001265 deps = append(deps, a.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001266
Colin Cross89562dc2016-10-03 17:47:19 -07001267 var implicitDeps, orderOnlyDeps Paths
1268
1269 if a.Host() {
1270 // Installed host modules might be used during the build, depend directly on their
1271 // dependencies so their timestamp is updated whenever their dependency is updated
1272 implicitDeps = deps
1273 } else {
1274 orderOnlyDeps = deps
1275 }
1276
Colin Crossae887032017-10-23 17:16:14 -07001277 a.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001278 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001279 Description: "install " + fullInstallPath.Base(),
1280 Output: fullInstallPath,
1281 Input: srcPath,
1282 Implicits: implicitDeps,
1283 OrderOnly: orderOnlyDeps,
Colin Cross6510f912017-11-29 00:27:14 -08001284 Default: !a.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001285 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001286
Dan Willemsen322acaf2016-01-12 23:07:05 -08001287 a.installFiles = append(a.installFiles, fullInstallPath)
1288 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001289 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001290 return fullInstallPath
1291}
1292
Colin Cross3854a602016-01-11 12:49:11 -08001293func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
1294 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001295 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001296
Colin Cross893d8162017-04-26 17:34:03 -07001297 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001298
Alex Lightfb4353d2019-01-17 13:57:45 -08001299 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
1300 if err != nil {
1301 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
1302 }
Colin Crossae887032017-10-23 17:16:14 -07001303 a.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001304 Rule: Symlink,
1305 Description: "install symlink " + fullInstallPath.Base(),
1306 Output: fullInstallPath,
1307 OrderOnly: Paths{srcPath},
Colin Cross6510f912017-11-29 00:27:14 -08001308 Default: !a.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001309 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08001310 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08001311 },
1312 })
Colin Cross3854a602016-01-11 12:49:11 -08001313
Colin Cross12fc4972016-01-11 12:49:11 -08001314 a.installFiles = append(a.installFiles, fullInstallPath)
1315 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1316 }
Colin Cross3854a602016-01-11 12:49:11 -08001317 return fullInstallPath
1318}
1319
Jiyong Parkf1194352019-02-25 11:05:47 +09001320// installPath/name -> absPath where absPath might be a path that is available only at runtime
1321// (e.g. /apex/...)
1322func (a *androidModuleContext) InstallAbsoluteSymlink(installPath OutputPath, name string, absPath string) OutputPath {
1323 fullInstallPath := installPath.Join(a, name)
1324 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
1325
1326 if !a.skipInstall(fullInstallPath) {
1327 a.Build(pctx, BuildParams{
1328 Rule: Symlink,
1329 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
1330 Output: fullInstallPath,
1331 Default: !a.Config().EmbeddedInMake(),
1332 Args: map[string]string{
1333 "fromPath": absPath,
1334 },
1335 })
1336
1337 a.installFiles = append(a.installFiles, fullInstallPath)
1338 }
1339 return fullInstallPath
1340}
1341
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001342func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
Colin Cross3f40fa42015-01-30 17:27:36 -08001343 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1344}
1345
Colin Cross3f40fa42015-01-30 17:27:36 -08001346type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001347 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001348}
1349
1350func isFileInstaller(m blueprint.Module) bool {
1351 _, ok := m.(fileInstaller)
1352 return ok
1353}
1354
1355func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001356 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001357 return ok
1358}
Colin Crossfce53272015-04-08 11:21:40 -07001359
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001360func findStringInSlice(str string, slice []string) int {
1361 for i, s := range slice {
1362 if s == str {
1363 return i
Colin Crossfce53272015-04-08 11:21:40 -07001364 }
1365 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001366 return -1
1367}
1368
Colin Cross068e0fe2016-12-13 15:23:47 -08001369func SrcIsModule(s string) string {
1370 if len(s) > 1 && s[0] == ':' {
1371 return s[1:]
1372 }
1373 return ""
1374}
1375
1376type sourceDependencyTag struct {
1377 blueprint.BaseDependencyTag
1378}
1379
1380var SourceDepTag sourceDependencyTag
1381
Colin Cross366938f2017-12-11 16:29:02 -08001382// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1383// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08001384//
1385// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08001386func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
1387 var deps []string
Nan Zhang2439eb72017-04-10 11:27:50 -07001388 set := make(map[string]bool)
1389
Colin Cross068e0fe2016-12-13 15:23:47 -08001390 for _, s := range srcFiles {
1391 if m := SrcIsModule(s); m != "" {
Nan Zhang2439eb72017-04-10 11:27:50 -07001392 if _, found := set[m]; found {
1393 ctx.ModuleErrorf("found source dependency duplicate: %q!", m)
1394 } else {
1395 set[m] = true
1396 deps = append(deps, m)
1397 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001398 }
1399 }
1400
1401 ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
1402}
1403
Colin Cross366938f2017-12-11 16:29:02 -08001404// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1405// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08001406//
1407// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08001408func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1409 if s != nil {
1410 if m := SrcIsModule(*s); m != "" {
1411 ctx.AddDependency(ctx.Module(), SourceDepTag, m)
1412 }
1413 }
1414}
1415
Colin Cross068e0fe2016-12-13 15:23:47 -08001416type SourceFileProducer interface {
1417 Srcs() Paths
1418}
1419
Colin Cross27b922f2019-03-04 22:35:41 -08001420// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
1421// be tagged with `android:"path" to support automatic source module dependency resolution.
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001422func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
1423 prefix := PathForModuleSrc(ctx).String()
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001424
Colin Cross461b4452018-02-23 09:22:42 -08001425 var expandedExcludes []string
1426 if excludes != nil {
1427 expandedExcludes = make([]string, 0, len(excludes))
1428 }
Nan Zhang27e284d2018-02-09 21:03:53 +00001429
1430 for _, e := range excludes {
1431 if m := SrcIsModule(e); m != "" {
1432 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
1433 if module == nil {
Colin Cross1255a562019-03-07 12:31:38 -08001434 if ctx.Config().AllowMissingDependencies() {
1435 ctx.AddMissingDependencies([]string{m})
1436 } else {
1437 ctx.ModuleErrorf(`missing dependency on %q, is the property annotated with android:"path"?`, m)
1438 }
Nan Zhang27e284d2018-02-09 21:03:53 +00001439 continue
1440 }
1441 if srcProducer, ok := module.(SourceFileProducer); ok {
1442 expandedExcludes = append(expandedExcludes, srcProducer.Srcs().Strings()...)
1443 } else {
1444 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1445 }
1446 } else {
1447 expandedExcludes = append(expandedExcludes, filepath.Join(prefix, e))
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001448 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001449 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001450 expandedSrcFiles := make(Paths, 0, len(srcFiles))
Colin Cross8f101b42015-06-17 15:09:06 -07001451 for _, s := range srcFiles {
Colin Cross068e0fe2016-12-13 15:23:47 -08001452 if m := SrcIsModule(s); m != "" {
1453 module := ctx.GetDirectDepWithTag(m, SourceDepTag)
Colin Cross0617bb82017-10-24 13:01:18 -07001454 if module == nil {
Colin Cross1255a562019-03-07 12:31:38 -08001455 if ctx.Config().AllowMissingDependencies() {
1456 ctx.AddMissingDependencies([]string{m})
1457 } else {
1458 ctx.ModuleErrorf(`missing dependency on %q, is the property annotated with android:"path"?`, m)
1459 }
Colin Cross0617bb82017-10-24 13:01:18 -07001460 continue
1461 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001462 if srcProducer, ok := module.(SourceFileProducer); ok {
Nan Zhang27e284d2018-02-09 21:03:53 +00001463 moduleSrcs := srcProducer.Srcs()
1464 for _, e := range expandedExcludes {
1465 for j, ms := range moduleSrcs {
1466 if ms.String() == e {
1467 moduleSrcs = append(moduleSrcs[:j], moduleSrcs[j+1:]...)
1468 }
1469 }
1470 }
1471 expandedSrcFiles = append(expandedSrcFiles, moduleSrcs...)
Colin Cross068e0fe2016-12-13 15:23:47 -08001472 } else {
1473 ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
1474 }
1475 } else if pathtools.IsGlob(s) {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001476 globbedSrcFiles := ctx.GlobFiles(filepath.Join(prefix, s), expandedExcludes)
Colin Cross2fafa3e2019-03-05 12:39:51 -08001477 globbedSrcFiles = PathsWithModuleSrcSubDir(ctx, globbedSrcFiles, "")
Colin Cross05a39cb2017-10-09 13:35:19 -07001478 expandedSrcFiles = append(expandedSrcFiles, globbedSrcFiles...)
Colin Cross8f101b42015-06-17 15:09:06 -07001479 } else {
Colin Cross2fafa3e2019-03-05 12:39:51 -08001480 p := PathForModuleSrc(ctx, s)
Nan Zhang27e284d2018-02-09 21:03:53 +00001481 j := findStringInSlice(p.String(), expandedExcludes)
1482 if j == -1 {
1483 expandedSrcFiles = append(expandedSrcFiles, p)
1484 }
Colin Cross8f101b42015-06-17 15:09:06 -07001485 }
1486 }
Colin Crossfaeb7aa2017-02-01 14:12:44 -08001487 return expandedSrcFiles
Colin Cross8f101b42015-06-17 15:09:06 -07001488}
1489
Colin Cross2fafa3e2019-03-05 12:39:51 -08001490// Returns a single path expanded from globs and modules referenced using ":module" syntax. The property must
1491// be tagged with `android:"path" to support automatic source module dependency resolution.
1492func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
1493 srcFiles := ctx.ExpandSources([]string{srcFile}, nil)
1494 if len(srcFiles) == 1 {
1495 return srcFiles[0]
1496 } else if len(srcFiles) == 0 {
1497 if ctx.Config().AllowMissingDependencies() {
1498 ctx.AddMissingDependencies([]string{srcFile})
1499 } else {
1500 ctx.PropertyErrorf(prop, "%s path %s does not exist", prop, srcFile)
1501 }
1502 return nil
1503 } else {
1504 ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop)
1505 return nil
1506 }
1507}
1508
1509// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
1510// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
1511// dependency resolution.
1512func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
1513 if srcFile != nil {
1514 return OptionalPathForPath(ctx.ExpandSource(*srcFile, prop))
1515 }
1516 return OptionalPath{}
1517}
1518
Nan Zhang6d34b302017-02-04 17:47:46 -08001519func (ctx *androidModuleContext) RequiredModuleNames() []string {
1520 return ctx.module.base().commonProperties.Required
1521}
1522
Colin Cross7f19f372016-11-01 11:10:25 -07001523func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
1524 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001525 if err != nil {
1526 ctx.ModuleErrorf("glob: %s", err.Error())
1527 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001528 return pathsForModuleSrcFromFullPath(ctx, ret, true)
Colin Crossfce53272015-04-08 11:21:40 -07001529}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001530
Nan Zhang581fd212018-01-10 16:06:12 -08001531func (ctx *androidModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001532 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Nan Zhang581fd212018-01-10 16:06:12 -08001533 if err != nil {
1534 ctx.ModuleErrorf("glob: %s", err.Error())
1535 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001536 return pathsForModuleSrcFromFullPath(ctx, ret, false)
Nan Zhang581fd212018-01-10 16:06:12 -08001537}
1538
Colin Cross463a90e2015-06-17 14:20:06 -07001539func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001540 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001541}
1542
Colin Cross0875c522017-11-28 17:34:01 -08001543func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001544 return &buildTargetSingleton{}
1545}
1546
Colin Cross87d8b562017-04-25 10:01:55 -07001547func parentDir(dir string) string {
1548 dir, _ = filepath.Split(dir)
1549 return filepath.Clean(dir)
1550}
1551
Colin Cross1f8c52b2015-06-16 16:38:17 -07001552type buildTargetSingleton struct{}
1553
Colin Cross0875c522017-11-28 17:34:01 -08001554func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1555 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001556
Colin Cross0875c522017-11-28 17:34:01 -08001557 mmTarget := func(dir string) WritablePath {
1558 return PathForPhony(ctx,
1559 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001560 }
1561
Colin Cross0875c522017-11-28 17:34:01 -08001562 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001563
Colin Cross0875c522017-11-28 17:34:01 -08001564 ctx.VisitAllModules(func(module Module) {
1565 blueprintDir := module.base().blueprintDir
1566 installTarget := module.base().installTarget
1567 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001568
Colin Cross0875c522017-11-28 17:34:01 -08001569 if checkbuildTarget != nil {
1570 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1571 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1572 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001573
Colin Cross0875c522017-11-28 17:34:01 -08001574 if installTarget != nil {
1575 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001576 }
1577 })
1578
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001579 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001580 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001581 suffix = "-soong"
1582 }
1583
Colin Cross1f8c52b2015-06-16 16:38:17 -07001584 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001585 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001586 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001587 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001588 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001589 })
1590
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001591 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001592 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001593 return
1594 }
1595
Colin Cross0875c522017-11-28 17:34:01 -08001596 sortedKeys := func(m map[string]Paths) []string {
1597 s := make([]string, 0, len(m))
1598 for k := range m {
1599 s = append(s, k)
1600 }
1601 sort.Strings(s)
1602 return s
1603 }
1604
Colin Cross87d8b562017-04-25 10:01:55 -07001605 // Ensure ancestor directories are in modulesInDir
1606 dirs := sortedKeys(modulesInDir)
1607 for _, dir := range dirs {
1608 dir := parentDir(dir)
1609 for dir != "." && dir != "/" {
1610 if _, exists := modulesInDir[dir]; exists {
1611 break
1612 }
1613 modulesInDir[dir] = nil
1614 dir = parentDir(dir)
1615 }
1616 }
1617
1618 // Make directories build their direct subdirectories
1619 dirs = sortedKeys(modulesInDir)
1620 for _, dir := range dirs {
1621 p := parentDir(dir)
1622 if p != "." && p != "/" {
1623 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1624 }
1625 }
1626
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001627 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1628 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1629 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001630 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001631 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001632 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001633 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001634 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001635 // HACK: checkbuild should be an optional build, but force it
1636 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001637 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001638 })
1639 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001640
1641 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1642 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001643 ctx.VisitAllModules(func(module Module) {
1644 if module.Enabled() {
1645 os := module.Target().Os
1646 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001647 }
1648 })
1649
Colin Cross0875c522017-11-28 17:34:01 -08001650 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001651 for os, deps := range osDeps {
1652 var className string
1653
1654 switch os.Class {
1655 case Host:
1656 className = "host"
1657 case HostCross:
1658 className = "host-cross"
1659 case Device:
1660 className = "target"
1661 default:
1662 continue
1663 }
1664
Colin Cross0875c522017-11-28 17:34:01 -08001665 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001666 osClass[className] = append(osClass[className], name)
1667
Colin Cross0875c522017-11-28 17:34:01 -08001668 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001669 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001670 Output: name,
1671 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001672 })
1673 }
1674
1675 // Wrap those into host|host-cross|target phony rules
1676 osClasses := sortedKeys(osClass)
1677 for _, class := range osClasses {
Colin Cross0875c522017-11-28 17:34:01 -08001678 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001679 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001680 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001681 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001682 })
1683 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001684}
Colin Crossd779da42015-12-17 18:00:23 -08001685
Brandon Lee5d45c6f2018-08-15 15:35:38 -07001686// Collect information for opening IDE project files in java/jdeps.go.
1687type IDEInfo interface {
1688 IDEInfo(ideInfo *IdeInfo)
1689 BaseModuleName() string
1690}
1691
1692// Extract the base module name from the Import name.
1693// Often the Import name has a prefix "prebuilt_".
1694// Remove the prefix explicitly if needed
1695// until we find a better solution to get the Import name.
1696type IDECustomizedModuleName interface {
1697 IDECustomizedModuleName() string
1698}
1699
1700type IdeInfo struct {
1701 Deps []string `json:"dependencies,omitempty"`
1702 Srcs []string `json:"srcs,omitempty"`
1703 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
1704 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
1705 Jars []string `json:"jars,omitempty"`
1706 Classes []string `json:"class,omitempty"`
1707 Installed_paths []string `json:"installed,omitempty"`
1708}