blob: 17ddb05013591925f60af882bea60ae13bb35726 [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
Jaewoong Jung1ffd7932019-09-11 10:25:18 -0700132 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700133 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900134 InstallInRecovery() bool
Nan Zhang6d34b302017-02-04 17:47:46 -0800135
136 RequiredModuleNames() []string
Colin Cross3f68a132017-10-23 17:10:29 -0700137
138 // android.ModuleContext methods
139 // These are duplicated instead of embedded so that can eventually be wrapped to take an
140 // android.Module instead of a blueprint.Module
141 OtherModuleName(m blueprint.Module) string
142 OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
143 OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
144
145 GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module
146 GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
147
148 ModuleSubDir() string
149
Colin Cross35143d02017-11-16 00:11:20 -0800150 VisitDirectDepsBlueprint(visit func(blueprint.Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700151 VisitDirectDeps(visit func(Module))
Colin Crossee6143c2017-12-30 17:54:27 -0800152 VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
Colin Crossd11fcda2017-10-23 17:59:01 -0700153 VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -0700154 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Crossd11fcda2017-10-23 17:59:01 -0700155 VisitDepsDepthFirst(visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -0700156 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Crossd11fcda2017-10-23 17:59:01 -0700157 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
158 WalkDeps(visit func(Module, Module) bool)
Alex Light778127a2019-02-27 14:19:50 -0800159 WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool)
Colin Cross3f68a132017-10-23 17:10:29 -0700160
Colin Cross0875c522017-11-28 17:34:01 -0800161 Variable(pctx PackageContext, name, value string)
162 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Crossae887032017-10-23 17:16:14 -0700163 // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string,
164 // and performs more verification.
Colin Cross0875c522017-11-28 17:34:01 -0800165 Build(pctx PackageContext, params BuildParams)
Colin Cross3f68a132017-10-23 17:10:29 -0700166
Colin Cross0875c522017-11-28 17:34:01 -0800167 PrimaryModule() Module
168 FinalModule() Module
169 VisitAllModuleVariants(visit func(Module))
Colin Cross3f68a132017-10-23 17:10:29 -0700170
171 GetMissingDependencies() []string
Jeff Gaston088e29e2017-11-29 16:47:17 -0800172 Namespace() blueprint.Namespace
Colin Cross3f40fa42015-01-30 17:27:36 -0800173}
174
Colin Cross635c3b02016-05-18 15:37:25 -0700175type Module interface {
Colin Cross3f40fa42015-01-30 17:27:36 -0800176 blueprint.Module
177
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700178 // GenerateAndroidBuildActions is analogous to Blueprints' GenerateBuildActions,
179 // but GenerateAndroidBuildActions also has access to Android-specific information.
180 // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go
Colin Cross635c3b02016-05-18 15:37:25 -0700181 GenerateAndroidBuildActions(ModuleContext)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700182
Colin Cross1e676be2016-10-12 14:38:15 -0700183 DepsMutator(BottomUpMutatorContext)
Colin Cross3f40fa42015-01-30 17:27:36 -0800184
Colin Cross635c3b02016-05-18 15:37:25 -0700185 base() *ModuleBase
Dan Willemsen0effe062015-11-30 16:06:01 -0800186 Enabled() bool
Colin Crossa1ad8d12016-06-01 17:09:44 -0700187 Target() Target
Dan Willemsen782a2d12015-12-21 14:55:28 -0800188 InstallInData() bool
Jaewoong Jung1ffd7932019-09-11 10:25:18 -0700189 InstallInTestcases() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700190 InstallInSanitizerDir() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900191 InstallInRecovery() bool
Colin Crossa2f296f2016-11-29 15:16:18 -0800192 SkipInstall()
Jiyong Park374510b2018-03-19 18:23:01 +0900193 ExportedToMake() bool
Jiyong Park52818fc2019-03-18 12:01:38 +0900194 NoticeFile() OptionalPath
Colin Cross36242852017-06-23 15:06:31 -0700195
196 AddProperties(props ...interface{})
197 GetProperties() []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700198
Colin Crossae887032017-10-23 17:16:14 -0700199 BuildParamsForTests() []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800200 RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800201 VariablesForTests() map[string]string
Colin Cross3f40fa42015-01-30 17:27:36 -0800202}
203
Colin Crossfc754582016-05-17 16:34:16 -0700204type nameProperties struct {
205 // The name of the module. Must be unique across all modules.
Nan Zhang0007d812017-11-07 10:57:05 -0800206 Name *string
Colin Crossfc754582016-05-17 16:34:16 -0700207}
208
209type commonProperties struct {
Dan Willemsen0effe062015-11-30 16:06:01 -0800210 // emit build rules for this module
211 Enabled *bool `android:"arch_variant"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800212
Colin Cross7d5136f2015-05-11 13:39:40 -0700213 // control whether this module compiles for 32-bit, 64-bit, or both. Possible values
Colin Cross3f40fa42015-01-30 17:27:36 -0800214 // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both
215 // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit
216 // platform
Colin Cross7d716ba2017-11-01 10:38:29 -0700217 Compile_multilib *string `android:"arch_variant"`
Colin Cross69617d32016-09-06 10:39:07 -0700218
219 Target struct {
220 Host struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700221 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700222 }
223 Android struct {
Colin Cross7d716ba2017-11-01 10:38:29 -0700224 Compile_multilib *string
Colin Cross69617d32016-09-06 10:39:07 -0700225 }
226 }
227
Colin Crossee0bc3b2018-10-02 22:01:37 -0700228 UseTargetVariants bool `blueprint:"mutated"`
229 Default_multilib string `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800230
Dan Willemsen782a2d12015-12-21 14:55:28 -0800231 // whether this is a proprietary vendor module, and should be installed into /vendor
Colin Cross7d716ba2017-11-01 10:38:29 -0700232 Proprietary *bool
Dan Willemsen782a2d12015-12-21 14:55:28 -0800233
Colin Cross55708f32017-03-20 13:23:34 -0700234 // vendor who owns this module
Dan Willemsenefac4a82017-07-18 19:42:09 -0700235 Owner *string
Colin Cross55708f32017-03-20 13:23:34 -0700236
Jiyong Park2db76922017-11-08 16:03:48 +0900237 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
238 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
239 // Use `soc_specific` instead for better meaning.
Colin Cross7d716ba2017-11-01 10:38:29 -0700240 Vendor *bool
Dan Willemsenaa118f92017-04-06 12:49:58 -0700241
Jiyong Park2db76922017-11-08 16:03:48 +0900242 // whether this module is specific to an SoC (System-On-a-Chip). When set to true,
243 // it is installed into /vendor (or /system/vendor if vendor partition does not exist).
244 Soc_specific *bool
245
246 // whether this module is specific to a device, not only for SoC, but also for off-chip
247 // peripherals. When set to true, it is installed into /odm (or /vendor/odm if odm partition
248 // does not exist, or /system/vendor/odm if both odm and vendor partitions do not exist).
249 // This implies `soc_specific:true`.
250 Device_specific *bool
251
252 // whether this module is specific to a software configuration of a product (e.g. country,
Jaekyun Seok5cfbfbb2018-01-10 19:00:15 +0900253 // network operator, etc). When set to true, it is installed into /product (or
254 // /system/product if product partition does not exist).
Jiyong Park2db76922017-11-08 16:03:48 +0900255 Product_specific *bool
256
Dario Frenifd05a742018-05-29 13:28:54 +0100257 // whether this module provides services owned by the OS provider to the core platform. When set
Dario Freni95cf7672018-08-17 00:57:57 +0100258 // to true, it is installed into /product_services (or /system/product_services if
259 // product_services partition does not exist).
260 Product_services_specific *bool
Dario Frenifd05a742018-05-29 13:28:54 +0100261
Jiyong Parkf9332f12018-02-01 00:54:12 +0900262 // Whether this module is installed to recovery partition
263 Recovery *bool
264
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700265 // init.rc files to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800266 Init_rc []string `android:"path"`
Dan Willemsen2277bcb2016-07-25 20:27:39 -0700267
Steven Moreland57a23d22018-04-04 15:42:19 -0700268 // VINTF manifest fragments to be installed if this module is installed
Colin Cross27b922f2019-03-04 22:35:41 -0800269 Vintf_fragments []string `android:"path"`
Steven Moreland57a23d22018-04-04 15:42:19 -0700270
Chris Wolfe998306e2016-08-15 14:47:23 -0400271 // names of other modules to install if this module is installed
Colin Crossc602b7d2017-05-05 13:36:36 -0700272 Required []string `android:"arch_variant"`
Chris Wolfe998306e2016-08-15 14:47:23 -0400273
Colin Cross5aac3622017-08-31 15:07:09 -0700274 // relative path to a file to include in the list of notices for the device
Colin Cross27b922f2019-03-04 22:35:41 -0800275 Notice *string `android:"path"`
Colin Cross5aac3622017-08-31 15:07:09 -0700276
Dan Willemsen569edc52018-11-19 09:33:29 -0800277 Dist struct {
278 // copy the output of this module to the $DIST_DIR when `dist` is specified on the
279 // command line and any of these targets are also on the command line, or otherwise
280 // built
281 Targets []string `android:"arch_variant"`
282
283 // The name of the output artifact. This defaults to the basename of the output of
284 // the module.
285 Dest *string `android:"arch_variant"`
286
287 // The directory within the dist directory to store the artifact. Defaults to the
288 // top level directory ("").
289 Dir *string `android:"arch_variant"`
290
291 // A suffix to add to the artifact file name (before any extension).
292 Suffix *string `android:"arch_variant"`
293 } `android:"arch_variant"`
294
Colin Crossa1ad8d12016-06-01 17:09:44 -0700295 // Set by TargetMutator
Colin Crossee0bc3b2018-10-02 22:01:37 -0700296 CompileTarget Target `blueprint:"mutated"`
297 CompileMultiTargets []Target `blueprint:"mutated"`
298 CompilePrimary bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800299
300 // Set by InitAndroidModule
301 HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
Dan Willemsen0b24c742016-10-04 15:13:37 -0700302 ArchSpecific bool `blueprint:"mutated"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700303
304 SkipInstall bool `blueprint:"mutated"`
Jeff Gaston088e29e2017-11-29 16:47:17 -0800305
306 NamespaceExportedToMake bool `blueprint:"mutated"`
Sam Mortimer73cf7502019-10-07 11:41:14 -0700307
308 // Whether this module provides a boot jar
309 BootJarProvider bool `blueprint:"mutated"`
Colin Cross3f40fa42015-01-30 17:27:36 -0800310}
311
312type hostAndDeviceProperties struct {
Colin Cross4e81d702018-11-09 10:36:55 -0800313 // If set to true, build a variant of the module for the host. Defaults to false.
314 Host_supported *bool
315
316 // If set to true, build a variant of the module for the device. Defaults to true.
Colin Crossa4190c12016-07-12 13:11:25 -0700317 Device_supported *bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800318}
319
Colin Crossc472d572015-03-17 15:06:21 -0700320type Multilib string
321
322const (
Colin Cross6b4a32d2017-12-05 13:42:45 -0800323 MultilibBoth Multilib = "both"
324 MultilibFirst Multilib = "first"
325 MultilibCommon Multilib = "common"
326 MultilibCommonFirst Multilib = "common_first"
327 MultilibDefault Multilib = ""
Colin Crossc472d572015-03-17 15:06:21 -0700328)
329
Colin Crossa1ad8d12016-06-01 17:09:44 -0700330type HostOrDeviceSupported int
331
332const (
333 _ HostOrDeviceSupported = iota
Dan Albert0981b5c2018-08-02 13:46:35 -0700334
335 // Host and HostCross are built by default. Device is not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700336 HostSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700337
338 // Host is built by default. HostCross and Device are not supported.
Dan Albertc6345fb2016-10-20 01:36:11 -0700339 HostSupportedNoCross
Dan Albert0981b5c2018-08-02 13:46:35 -0700340
341 // Device is built by default. Host and HostCross are not supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700342 DeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700343
344 // Device is built by default. Host and HostCross are supported.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700345 HostAndDeviceSupported
Dan Albert0981b5c2018-08-02 13:46:35 -0700346
347 // Host, HostCross, and Device are built by default.
Colin Crossa1ad8d12016-06-01 17:09:44 -0700348 HostAndDeviceDefault
Dan Albert0981b5c2018-08-02 13:46:35 -0700349
350 // Nothing is supported. This is not exposed to the user, but used to mark a
351 // host only module as unsupported when the module type is not supported on
352 // the host OS. E.g. benchmarks are supported on Linux but not Darwin.
Dan Willemsen0b24c742016-10-04 15:13:37 -0700353 NeitherHostNorDeviceSupported
Colin Crossa1ad8d12016-06-01 17:09:44 -0700354)
355
Jiyong Park2db76922017-11-08 16:03:48 +0900356type moduleKind int
357
358const (
359 platformModule moduleKind = iota
360 deviceSpecificModule
361 socSpecificModule
362 productSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +0100363 productServicesSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900364)
365
366func (k moduleKind) String() string {
367 switch k {
368 case platformModule:
369 return "platform"
370 case deviceSpecificModule:
371 return "device-specific"
372 case socSpecificModule:
373 return "soc-specific"
374 case productSpecificModule:
375 return "product-specific"
Dario Frenifd05a742018-05-29 13:28:54 +0100376 case productServicesSpecificModule:
377 return "productservices-specific"
Jiyong Park2db76922017-11-08 16:03:48 +0900378 default:
379 panic(fmt.Errorf("unknown module kind %d", k))
380 }
381}
382
Colin Cross36242852017-06-23 15:06:31 -0700383func InitAndroidModule(m Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800384 base := m.base()
385 base.module = m
Colin Cross5049f022015-03-18 13:28:46 -0700386
Colin Cross36242852017-06-23 15:06:31 -0700387 m.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -0700388 &base.nameProperties,
389 &base.commonProperties,
390 &base.variableProperties)
Colin Crossa3a97412019-03-18 12:24:29 -0700391 base.generalProperties = m.GetProperties()
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700392 base.customizableProperties = m.GetProperties()
Colin Cross5049f022015-03-18 13:28:46 -0700393}
394
Colin Cross36242852017-06-23 15:06:31 -0700395func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
396 InitAndroidModule(m)
Colin Cross5049f022015-03-18 13:28:46 -0700397
398 base := m.base()
Colin Cross3f40fa42015-01-30 17:27:36 -0800399 base.commonProperties.HostOrDeviceSupported = hod
Colin Cross69617d32016-09-06 10:39:07 -0700400 base.commonProperties.Default_multilib = string(defaultMultilib)
Dan Willemsen0b24c742016-10-04 15:13:37 -0700401 base.commonProperties.ArchSpecific = true
Colin Crossee0bc3b2018-10-02 22:01:37 -0700402 base.commonProperties.UseTargetVariants = true
Colin Cross3f40fa42015-01-30 17:27:36 -0800403
Dan Willemsen218f6562015-07-08 18:13:11 -0700404 switch hod {
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700405 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Cross36242852017-06-23 15:06:31 -0700406 m.AddProperties(&base.hostAndDeviceProperties)
Colin Cross3f40fa42015-01-30 17:27:36 -0800407 }
408
Colin Cross36242852017-06-23 15:06:31 -0700409 InitArchModule(m)
Colin Cross3f40fa42015-01-30 17:27:36 -0800410}
411
Colin Crossee0bc3b2018-10-02 22:01:37 -0700412func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
413 InitAndroidArchModule(m, hod, defaultMultilib)
414 m.base().commonProperties.UseTargetVariants = false
415}
416
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800417// A ModuleBase object contains the properties that are common to all Android
Colin Cross3f40fa42015-01-30 17:27:36 -0800418// modules. It should be included as an anonymous field in every module
419// struct definition. InitAndroidModule should then be called from the module's
420// factory function, and the return values from InitAndroidModule should be
421// returned from the factory function.
422//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800423// The ModuleBase type is responsible for implementing the GenerateBuildActions
424// method to support the blueprint.Module interface. This method will then call
425// the module's GenerateAndroidBuildActions method once for each build variant
426// that is to be built. GenerateAndroidBuildActions is passed a
427// AndroidModuleContext rather than the usual blueprint.ModuleContext.
Colin Cross3f40fa42015-01-30 17:27:36 -0800428// AndroidModuleContext exposes extra functionality specific to the Android build
429// system including details about the particular build variant that is to be
430// generated.
431//
432// For example:
433//
434// import (
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800435// "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800436// )
437//
438// type myModule struct {
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800439// android.ModuleBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800440// properties struct {
441// MyProperty string
442// }
443// }
444//
Colin Cross36242852017-06-23 15:06:31 -0700445// func NewMyModule() android.Module) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800446// m := &myModule{}
Colin Cross36242852017-06-23 15:06:31 -0700447// m.AddProperties(&m.properties)
448// android.InitAndroidModule(m)
449// return m
Colin Cross3f40fa42015-01-30 17:27:36 -0800450// }
451//
Nan Zhangb9eeb1d2017-02-02 10:46:07 -0800452// func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800453// // Get the CPU architecture for the current build variant.
454// variantArch := ctx.Arch()
455//
456// // ...
457// }
Colin Cross635c3b02016-05-18 15:37:25 -0700458type ModuleBase struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800459 // Putting the curiously recurring thing pointing to the thing that contains
460 // the thing pattern to good use.
Colin Cross36242852017-06-23 15:06:31 -0700461 // TODO: remove this
Colin Cross635c3b02016-05-18 15:37:25 -0700462 module Module
Colin Cross3f40fa42015-01-30 17:27:36 -0800463
Colin Crossfc754582016-05-17 16:34:16 -0700464 nameProperties nameProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800465 commonProperties commonProperties
Colin Cross7f64b6d2015-07-09 13:57:48 -0700466 variableProperties variableProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800467 hostAndDeviceProperties hostAndDeviceProperties
468 generalProperties []interface{}
Colin Crossc17727d2018-10-24 12:42:09 -0700469 archProperties [][]interface{}
Colin Crossa120ec12016-08-19 16:07:38 -0700470 customizableProperties []interface{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800471
472 noAddressSanitizer bool
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700473 installFiles Paths
474 checkbuildFiles Paths
Jiyong Park52818fc2019-03-18 12:01:38 +0900475 noticeFile OptionalPath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700476
477 // Used by buildTargetSingleton to create checkbuild and per-directory build targets
478 // Only set on the final variant of each module
Colin Cross0875c522017-11-28 17:34:01 -0800479 installTarget WritablePath
480 checkbuildTarget WritablePath
Colin Cross1f8c52b2015-06-16 16:38:17 -0700481 blueprintDir string
Colin Crossa120ec12016-08-19 16:07:38 -0700482
Colin Cross178a5092016-09-13 13:42:32 -0700483 hooks hooks
Colin Cross36242852017-06-23 15:06:31 -0700484
485 registerProps []interface{}
Colin Crosscec81712017-07-13 14:43:27 -0700486
487 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700488 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800489 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800490 variables map[string]string
Colin Crossa9d8bee2018-10-02 13:59:46 -0700491
492 prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
Colin Cross36242852017-06-23 15:06:31 -0700493}
494
Colin Cross5f692ec2019-02-01 16:53:07 -0800495func (a *ModuleBase) DepsMutator(BottomUpMutatorContext) {}
496
Colin Cross36242852017-06-23 15:06:31 -0700497func (a *ModuleBase) AddProperties(props ...interface{}) {
498 a.registerProps = append(a.registerProps, props...)
499}
500
501func (a *ModuleBase) GetProperties() []interface{} {
502 return a.registerProps
Colin Cross3f40fa42015-01-30 17:27:36 -0800503}
504
Colin Crossae887032017-10-23 17:16:14 -0700505func (a *ModuleBase) BuildParamsForTests() []BuildParams {
Colin Crosscec81712017-07-13 14:43:27 -0700506 return a.buildParams
507}
508
Colin Cross4c83e5c2019-02-25 14:54:28 -0800509func (a *ModuleBase) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
510 return a.ruleParams
511}
512
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800513func (a *ModuleBase) VariablesForTests() map[string]string {
514 return a.variables
515}
516
Colin Crossa9d8bee2018-10-02 13:59:46 -0700517func (a *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
518 a.prefer32 = prefer32
519}
520
Colin Crossce75d2c2016-10-06 16:12:58 -0700521// Name returns the name of the module. It may be overridden by individual module types, for
522// example prebuilts will prepend prebuilt_ to the name.
Colin Crossfc754582016-05-17 16:34:16 -0700523func (a *ModuleBase) Name() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800524 return String(a.nameProperties.Name)
Colin Crossfc754582016-05-17 16:34:16 -0700525}
526
Sam Mortimer73cf7502019-10-07 11:41:14 -0700527func (a *ModuleBase) BootJarProvider() bool {
528 return a.commonProperties.BootJarProvider
529}
530
Colin Crossce75d2c2016-10-06 16:12:58 -0700531// BaseModuleName returns the name of the module as specified in the blueprints file.
532func (a *ModuleBase) BaseModuleName() string {
Nan Zhang0007d812017-11-07 10:57:05 -0800533 return String(a.nameProperties.Name)
Colin Crossce75d2c2016-10-06 16:12:58 -0700534}
535
Colin Cross635c3b02016-05-18 15:37:25 -0700536func (a *ModuleBase) base() *ModuleBase {
Colin Cross3f40fa42015-01-30 17:27:36 -0800537 return a
538}
539
Colin Crossee0bc3b2018-10-02 22:01:37 -0700540func (a *ModuleBase) SetTarget(target Target, multiTargets []Target, primary bool) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700541 a.commonProperties.CompileTarget = target
Colin Crossee0bc3b2018-10-02 22:01:37 -0700542 a.commonProperties.CompileMultiTargets = multiTargets
Colin Cross8b74d172016-09-13 09:59:14 -0700543 a.commonProperties.CompilePrimary = primary
Colin Crossd3ba0392015-05-07 14:11:29 -0700544}
545
Colin Crossa1ad8d12016-06-01 17:09:44 -0700546func (a *ModuleBase) Target() Target {
547 return a.commonProperties.CompileTarget
Dan Willemsen490fd492015-11-24 17:53:15 -0800548}
549
Colin Cross8b74d172016-09-13 09:59:14 -0700550func (a *ModuleBase) TargetPrimary() bool {
551 return a.commonProperties.CompilePrimary
552}
553
Colin Crossee0bc3b2018-10-02 22:01:37 -0700554func (a *ModuleBase) MultiTargets() []Target {
555 return a.commonProperties.CompileMultiTargets
556}
557
Colin Crossa1ad8d12016-06-01 17:09:44 -0700558func (a *ModuleBase) Os() OsType {
559 return a.Target().Os
Dan Willemsen490fd492015-11-24 17:53:15 -0800560}
561
Colin Cross635c3b02016-05-18 15:37:25 -0700562func (a *ModuleBase) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700563 return a.Os().Class == Host || a.Os().Class == HostCross
Dan Willemsen97750522016-02-09 17:43:51 -0800564}
565
Colin Cross635c3b02016-05-18 15:37:25 -0700566func (a *ModuleBase) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700567 return a.Target().Arch
Dan Willemsen97750522016-02-09 17:43:51 -0800568}
569
Dan Willemsen0b24c742016-10-04 15:13:37 -0700570func (a *ModuleBase) ArchSpecific() bool {
571 return a.commonProperties.ArchSpecific
572}
573
Colin Crossa1ad8d12016-06-01 17:09:44 -0700574func (a *ModuleBase) OsClassSupported() []OsClass {
575 switch a.commonProperties.HostOrDeviceSupported {
576 case HostSupported:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700577 return []OsClass{Host, HostCross}
Dan Albertc6345fb2016-10-20 01:36:11 -0700578 case HostSupportedNoCross:
579 return []OsClass{Host}
Colin Crossa1ad8d12016-06-01 17:09:44 -0700580 case DeviceSupported:
581 return []OsClass{Device}
Dan Albert0981b5c2018-08-02 13:46:35 -0700582 case HostAndDeviceSupported, HostAndDeviceDefault:
Colin Crossa1ad8d12016-06-01 17:09:44 -0700583 var supported []OsClass
Dan Albert0981b5c2018-08-02 13:46:35 -0700584 if Bool(a.hostAndDeviceProperties.Host_supported) ||
585 (a.commonProperties.HostOrDeviceSupported == HostAndDeviceDefault &&
586 a.hostAndDeviceProperties.Host_supported == nil) {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700587 supported = append(supported, Host, HostCross)
588 }
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700589 if a.hostAndDeviceProperties.Device_supported == nil ||
590 *a.hostAndDeviceProperties.Device_supported {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700591 supported = append(supported, Device)
592 }
593 return supported
594 default:
595 return nil
596 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800597}
598
Colin Cross635c3b02016-05-18 15:37:25 -0700599func (a *ModuleBase) DeviceSupported() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800600 return a.commonProperties.HostOrDeviceSupported == DeviceSupported ||
601 a.commonProperties.HostOrDeviceSupported == HostAndDeviceSupported &&
Nan Zhang1a0f09b2017-07-05 10:35:11 -0700602 (a.hostAndDeviceProperties.Device_supported == nil ||
603 *a.hostAndDeviceProperties.Device_supported)
Colin Cross3f40fa42015-01-30 17:27:36 -0800604}
605
Jiyong Parkc678ad32018-04-10 13:07:10 +0900606func (a *ModuleBase) Platform() bool {
Dario Frenifd05a742018-05-29 13:28:54 +0100607 return !a.DeviceSpecific() && !a.SocSpecific() && !a.ProductSpecific() && !a.ProductServicesSpecific()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900608}
609
610func (a *ModuleBase) DeviceSpecific() bool {
611 return Bool(a.commonProperties.Device_specific)
612}
613
614func (a *ModuleBase) SocSpecific() bool {
615 return Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
616}
617
618func (a *ModuleBase) ProductSpecific() bool {
619 return Bool(a.commonProperties.Product_specific)
620}
621
Dario Frenifd05a742018-05-29 13:28:54 +0100622func (a *ModuleBase) ProductServicesSpecific() bool {
Dario Freni95cf7672018-08-17 00:57:57 +0100623 return Bool(a.commonProperties.Product_services_specific)
Dario Frenifd05a742018-05-29 13:28:54 +0100624}
625
Colin Cross635c3b02016-05-18 15:37:25 -0700626func (a *ModuleBase) Enabled() bool {
Dan Willemsen0effe062015-11-30 16:06:01 -0800627 if a.commonProperties.Enabled == nil {
Dan Willemsen0a37a2a2016-11-13 10:16:05 -0800628 return !a.Os().DefaultDisabled
Dan Willemsen490fd492015-11-24 17:53:15 -0800629 }
Dan Willemsen0effe062015-11-30 16:06:01 -0800630 return *a.commonProperties.Enabled
Colin Cross3f40fa42015-01-30 17:27:36 -0800631}
632
Colin Crossce75d2c2016-10-06 16:12:58 -0700633func (a *ModuleBase) SkipInstall() {
634 a.commonProperties.SkipInstall = true
635}
636
Jiyong Park374510b2018-03-19 18:23:01 +0900637func (a *ModuleBase) ExportedToMake() bool {
638 return a.commonProperties.NamespaceExportedToMake
639}
640
Colin Cross635c3b02016-05-18 15:37:25 -0700641func (a *ModuleBase) computeInstallDeps(
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700642 ctx blueprint.ModuleContext) Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800643
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700644 result := Paths{}
Colin Cross6b753602018-06-21 13:03:07 -0700645 // TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
Colin Cross3f40fa42015-01-30 17:27:36 -0800646 ctx.VisitDepsDepthFirstIf(isFileInstaller,
647 func(m blueprint.Module) {
648 fileInstaller := m.(fileInstaller)
649 files := fileInstaller.filesToInstall()
650 result = append(result, files...)
651 })
652
653 return result
654}
655
Colin Cross635c3b02016-05-18 15:37:25 -0700656func (a *ModuleBase) filesToInstall() Paths {
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 return a.installFiles
658}
659
Colin Cross635c3b02016-05-18 15:37:25 -0700660func (p *ModuleBase) NoAddressSanitizer() bool {
Colin Cross3f40fa42015-01-30 17:27:36 -0800661 return p.noAddressSanitizer
662}
663
Colin Cross635c3b02016-05-18 15:37:25 -0700664func (p *ModuleBase) InstallInData() bool {
Dan Willemsen782a2d12015-12-21 14:55:28 -0800665 return false
666}
667
Jaewoong Jung1ffd7932019-09-11 10:25:18 -0700668func (p *ModuleBase) InstallInTestcases() bool {
669 return false
670}
671
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700672func (p *ModuleBase) InstallInSanitizerDir() bool {
673 return false
674}
675
Jiyong Parkf9332f12018-02-01 00:54:12 +0900676func (p *ModuleBase) InstallInRecovery() bool {
677 return Bool(p.commonProperties.Recovery)
678}
679
Sundong Ahn4fd04bb2018-08-31 18:01:37 +0900680func (a *ModuleBase) Owner() string {
681 return String(a.commonProperties.Owner)
682}
683
Jiyong Park52818fc2019-03-18 12:01:38 +0900684func (a *ModuleBase) NoticeFile() OptionalPath {
685 return a.noticeFile
686}
687
Colin Cross0875c522017-11-28 17:34:01 -0800688func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700689 allInstalledFiles := Paths{}
690 allCheckbuildFiles := Paths{}
Colin Cross0875c522017-11-28 17:34:01 -0800691 ctx.VisitAllModuleVariants(func(module Module) {
692 a := module.base()
Colin Crossc9404352015-03-26 16:10:12 -0700693 allInstalledFiles = append(allInstalledFiles, a.installFiles...)
694 allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800695 })
696
Colin Cross0875c522017-11-28 17:34:01 -0800697 var deps Paths
Colin Cross9454bfa2015-03-17 13:24:18 -0700698
Jeff Gaston088e29e2017-11-29 16:47:17 -0800699 namespacePrefix := ctx.Namespace().(*Namespace).id
700 if namespacePrefix != "" {
701 namespacePrefix = namespacePrefix + "-"
702 }
703
Colin Cross3f40fa42015-01-30 17:27:36 -0800704 if len(allInstalledFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800705 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-install")
Colin Cross0875c522017-11-28 17:34:01 -0800706 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700707 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800708 Output: name,
709 Implicits: allInstalledFiles,
Colin Crossaabf6792017-11-29 00:27:14 -0800710 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross9454bfa2015-03-17 13:24:18 -0700711 })
712 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700713 a.installTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700714 }
715
716 if len(allCheckbuildFiles) > 0 {
Jeff Gaston088e29e2017-11-29 16:47:17 -0800717 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+"-checkbuild")
Colin Cross0875c522017-11-28 17:34:01 -0800718 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700719 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -0800720 Output: name,
721 Implicits: allCheckbuildFiles,
Colin Cross9454bfa2015-03-17 13:24:18 -0700722 })
723 deps = append(deps, name)
Colin Cross1f8c52b2015-06-16 16:38:17 -0700724 a.checkbuildTarget = name
Colin Cross9454bfa2015-03-17 13:24:18 -0700725 }
726
727 if len(deps) > 0 {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800728 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -0800729 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -0800730 suffix = "-soong"
731 }
732
Jeff Gaston088e29e2017-11-29 16:47:17 -0800733 name := PathForPhony(ctx, namespacePrefix+ctx.ModuleName()+suffix)
Colin Cross0875c522017-11-28 17:34:01 -0800734 ctx.Build(pctx, BuildParams{
Colin Cross9454bfa2015-03-17 13:24:18 -0700735 Rule: blueprint.Phony,
Jeff Gaston088e29e2017-11-29 16:47:17 -0800736 Outputs: []WritablePath{name},
Colin Cross9454bfa2015-03-17 13:24:18 -0700737 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800738 })
Colin Cross1f8c52b2015-06-16 16:38:17 -0700739
740 a.blueprintDir = ctx.ModuleDir()
Colin Cross3f40fa42015-01-30 17:27:36 -0800741 }
742}
743
Jiyong Park2db76922017-11-08 16:03:48 +0900744func determineModuleKind(a *ModuleBase, ctx blueprint.BaseModuleContext) moduleKind {
745 var socSpecific = Bool(a.commonProperties.Vendor) || Bool(a.commonProperties.Proprietary) || Bool(a.commonProperties.Soc_specific)
746 var deviceSpecific = Bool(a.commonProperties.Device_specific)
747 var productSpecific = Bool(a.commonProperties.Product_specific)
Dario Freni95cf7672018-08-17 00:57:57 +0100748 var productServicesSpecific = Bool(a.commonProperties.Product_services_specific)
Jiyong Park2db76922017-11-08 16:03:48 +0900749
Dario Frenifd05a742018-05-29 13:28:54 +0100750 msg := "conflicting value set here"
751 if socSpecific && deviceSpecific {
752 ctx.PropertyErrorf("device_specific", "a module cannot be specific to SoC and device at the same time.")
Jiyong Park2db76922017-11-08 16:03:48 +0900753 if Bool(a.commonProperties.Vendor) {
754 ctx.PropertyErrorf("vendor", msg)
755 }
756 if Bool(a.commonProperties.Proprietary) {
757 ctx.PropertyErrorf("proprietary", msg)
758 }
759 if Bool(a.commonProperties.Soc_specific) {
760 ctx.PropertyErrorf("soc_specific", msg)
761 }
762 }
763
Dario Frenifd05a742018-05-29 13:28:54 +0100764 if productSpecific && productServicesSpecific {
765 ctx.PropertyErrorf("product_specific", "a module cannot be specific to product and product_services at the same time.")
766 ctx.PropertyErrorf("product_services_specific", msg)
767 }
768
769 if (socSpecific || deviceSpecific) && (productSpecific || productServicesSpecific) {
770 if productSpecific {
771 ctx.PropertyErrorf("product_specific", "a module cannot be specific to SoC or device and product at the same time.")
772 } else {
773 ctx.PropertyErrorf("product_services_specific", "a module cannot be specific to SoC or device and product_services at the same time.")
774 }
775 if deviceSpecific {
776 ctx.PropertyErrorf("device_specific", msg)
777 } else {
778 if Bool(a.commonProperties.Vendor) {
779 ctx.PropertyErrorf("vendor", msg)
780 }
781 if Bool(a.commonProperties.Proprietary) {
782 ctx.PropertyErrorf("proprietary", msg)
783 }
784 if Bool(a.commonProperties.Soc_specific) {
785 ctx.PropertyErrorf("soc_specific", msg)
786 }
787 }
788 }
789
Jiyong Park2db76922017-11-08 16:03:48 +0900790 if productSpecific {
791 return productSpecificModule
Dario Frenifd05a742018-05-29 13:28:54 +0100792 } else if productServicesSpecific {
793 return productServicesSpecificModule
Jiyong Park2db76922017-11-08 16:03:48 +0900794 } else if deviceSpecific {
795 return deviceSpecificModule
796 } else if socSpecific {
797 return socSpecificModule
798 } else {
799 return platformModule
800 }
801}
802
Colin Cross635c3b02016-05-18 15:37:25 -0700803func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl {
Colin Cross6362e272015-10-29 15:25:03 -0700804 return androidBaseContextImpl{
Colin Cross8b74d172016-09-13 09:59:14 -0700805 target: a.commonProperties.CompileTarget,
806 targetPrimary: a.commonProperties.CompilePrimary,
Colin Crossee0bc3b2018-10-02 22:01:37 -0700807 multiTargets: a.commonProperties.CompileMultiTargets,
Jiyong Park2db76922017-11-08 16:03:48 +0900808 kind: determineModuleKind(a, ctx),
Colin Cross8b74d172016-09-13 09:59:14 -0700809 config: ctx.Config().(Config),
Colin Cross3f40fa42015-01-30 17:27:36 -0800810 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800811}
812
Colin Cross0875c522017-11-28 17:34:01 -0800813func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
814 ctx := &androidModuleContext{
Colin Cross8d8f8e22016-08-03 11:57:50 -0700815 module: a.module,
Colin Cross0875c522017-11-28 17:34:01 -0800816 ModuleContext: blueprintCtx,
817 androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx),
818 installDeps: a.computeInstallDeps(blueprintCtx),
Colin Cross6362e272015-10-29 15:25:03 -0700819 installFiles: a.installFiles,
Colin Cross0875c522017-11-28 17:34:01 -0800820 missingDeps: blueprintCtx.GetMissingDependencies(),
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800821 variables: make(map[string]string),
Colin Cross3f40fa42015-01-30 17:27:36 -0800822 }
823
Colin Cross4c83e5c2019-02-25 14:54:28 -0800824 if ctx.config.captureBuild {
825 ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
826 }
827
Colin Cross67a5c132017-05-09 13:45:28 -0700828 desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
829 var suffix []string
Colin Cross0875c522017-11-28 17:34:01 -0800830 if ctx.Os().Class != Device && ctx.Os().Class != Generic {
831 suffix = append(suffix, ctx.Os().String())
Colin Cross67a5c132017-05-09 13:45:28 -0700832 }
Colin Cross0875c522017-11-28 17:34:01 -0800833 if !ctx.PrimaryArch() {
834 suffix = append(suffix, ctx.Arch().ArchType.String())
Colin Cross67a5c132017-05-09 13:45:28 -0700835 }
836
837 ctx.Variable(pctx, "moduleDesc", desc)
838
839 s := ""
840 if len(suffix) > 0 {
841 s = " [" + strings.Join(suffix, " ") + "]"
842 }
843 ctx.Variable(pctx, "moduleDescSuffix", s)
844
Dan Willemsen569edc52018-11-19 09:33:29 -0800845 // Some common property checks for properties that will be used later in androidmk.go
846 if a.commonProperties.Dist.Dest != nil {
847 _, err := validateSafePath(*a.commonProperties.Dist.Dest)
848 if err != nil {
849 ctx.PropertyErrorf("dist.dest", "%s", err.Error())
850 }
851 }
852 if a.commonProperties.Dist.Dir != nil {
853 _, err := validateSafePath(*a.commonProperties.Dist.Dir)
854 if err != nil {
855 ctx.PropertyErrorf("dist.dir", "%s", err.Error())
856 }
857 }
858 if a.commonProperties.Dist.Suffix != nil {
859 if strings.Contains(*a.commonProperties.Dist.Suffix, "/") {
860 ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
861 }
862 }
863
Colin Cross9b1d13d2016-09-19 15:18:11 -0700864 if a.Enabled() {
Jiyong Park52818fc2019-03-18 12:01:38 +0900865 notice := proptools.StringDefault(a.commonProperties.Notice, "NOTICE")
866 if m := SrcIsModule(notice); m != "" {
867 a.noticeFile = ctx.ExpandOptionalSource(&notice, "notice")
868 } else {
869 noticePath := filepath.Join(ctx.ModuleDir(), notice)
870 a.noticeFile = ExistentPathForSource(ctx, noticePath)
Jaewoong Jung62707f72018-11-16 13:26:43 -0800871 }
Jaewoong Jung5c6572e2019-06-17 17:40:56 -0700872
873 a.module.GenerateAndroidBuildActions(ctx)
874 if ctx.Failed() {
875 return
876 }
877
878 a.installFiles = append(a.installFiles, ctx.installFiles...)
879 a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800880 }
881
Colin Cross9b1d13d2016-09-19 15:18:11 -0700882 if a == ctx.FinalModule().(Module).base() {
883 a.generateModuleTarget(ctx)
884 if ctx.Failed() {
885 return
886 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800887 }
Colin Crosscec81712017-07-13 14:43:27 -0700888
Colin Cross0875c522017-11-28 17:34:01 -0800889 a.buildParams = ctx.buildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800890 a.ruleParams = ctx.ruleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800891 a.variables = ctx.variables
Colin Cross3f40fa42015-01-30 17:27:36 -0800892}
893
Colin Crossf6566ed2015-03-24 11:13:38 -0700894type androidBaseContextImpl struct {
Colin Cross8b74d172016-09-13 09:59:14 -0700895 target Target
Colin Crossee0bc3b2018-10-02 22:01:37 -0700896 multiTargets []Target
Colin Cross8b74d172016-09-13 09:59:14 -0700897 targetPrimary bool
898 debug bool
Jiyong Park2db76922017-11-08 16:03:48 +0900899 kind moduleKind
Colin Cross8b74d172016-09-13 09:59:14 -0700900 config Config
Colin Crossf6566ed2015-03-24 11:13:38 -0700901}
902
Colin Cross3f40fa42015-01-30 17:27:36 -0800903type androidModuleContext struct {
904 blueprint.ModuleContext
Colin Crossf6566ed2015-03-24 11:13:38 -0700905 androidBaseContextImpl
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700906 installDeps Paths
907 installFiles Paths
908 checkbuildFiles Paths
Colin Cross6ff51382015-12-17 16:39:19 -0800909 missingDeps []string
Colin Cross8d8f8e22016-08-03 11:57:50 -0700910 module Module
Colin Crosscec81712017-07-13 14:43:27 -0700911
912 // For tests
Colin Crossae887032017-10-23 17:16:14 -0700913 buildParams []BuildParams
Colin Cross4c83e5c2019-02-25 14:54:28 -0800914 ruleParams map[blueprint.Rule]blueprint.RuleParams
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800915 variables map[string]string
Colin Cross6ff51382015-12-17 16:39:19 -0800916}
917
Colin Cross67a5c132017-05-09 13:45:28 -0700918func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
Colin Cross0875c522017-11-28 17:34:01 -0800919 a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700920 Rule: ErrorRule,
921 Description: desc,
922 Outputs: outputs,
923 Optional: true,
Colin Cross6ff51382015-12-17 16:39:19 -0800924 Args: map[string]string{
925 "error": err.Error(),
926 },
927 })
928 return
Colin Cross3f40fa42015-01-30 17:27:36 -0800929}
930
Colin Crossaabf6792017-11-29 00:27:14 -0800931func (a *androidModuleContext) Config() Config {
932 return a.ModuleContext.Config().(Config)
933}
934
Colin Cross0875c522017-11-28 17:34:01 -0800935func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) {
Colin Crossae887032017-10-23 17:16:14 -0700936 a.Build(pctx, BuildParams(params))
Colin Cross3f40fa42015-01-30 17:27:36 -0800937}
938
Colin Cross0875c522017-11-28 17:34:01 -0800939func convertBuildParams(params BuildParams) blueprint.BuildParams {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700940 bparams := blueprint.BuildParams{
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700941 Rule: params.Rule,
Colin Cross0875c522017-11-28 17:34:01 -0800942 Description: params.Description,
Colin Cross33bfb0a2016-11-21 17:23:08 -0800943 Deps: params.Deps,
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700944 Outputs: params.Outputs.Strings(),
945 ImplicitOutputs: params.ImplicitOutputs.Strings(),
946 Inputs: params.Inputs.Strings(),
947 Implicits: params.Implicits.Strings(),
948 OrderOnly: params.OrderOnly.Strings(),
949 Args: params.Args,
950 Optional: !params.Default,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700951 }
952
Colin Cross33bfb0a2016-11-21 17:23:08 -0800953 if params.Depfile != nil {
954 bparams.Depfile = params.Depfile.String()
955 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700956 if params.Output != nil {
957 bparams.Outputs = append(bparams.Outputs, params.Output.String())
958 }
Dan Willemsen9f3c5742016-11-03 14:28:31 -0700959 if params.ImplicitOutput != nil {
960 bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
961 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700962 if params.Input != nil {
963 bparams.Inputs = append(bparams.Inputs, params.Input.String())
964 }
965 if params.Implicit != nil {
966 bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
967 }
968
Colin Cross0b9f31f2019-02-28 11:00:01 -0800969 bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
970 bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
971 bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
972 bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
973 bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
974 bparams.Depfile = proptools.NinjaEscapeList([]string{bparams.Depfile})[0]
Colin Crossfe4bc362018-09-12 10:02:13 -0700975
Colin Cross0875c522017-11-28 17:34:01 -0800976 return bparams
977}
978
979func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
Jaewoong Jung38e4fb22018-12-12 09:01:34 -0800980 if a.config.captureBuild {
981 a.variables[name] = value
982 }
983
Colin Cross0875c522017-11-28 17:34:01 -0800984 a.ModuleContext.Variable(pctx.PackageContext, name, value)
985}
986
987func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams,
988 argNames ...string) blueprint.Rule {
989
Colin Cross4c83e5c2019-02-25 14:54:28 -0800990 rule := a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...)
991
992 if a.config.captureBuild {
993 a.ruleParams[rule] = params
994 }
995
996 return rule
Colin Cross0875c522017-11-28 17:34:01 -0800997}
998
999func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) {
1000 if a.config.captureBuild {
1001 a.buildParams = append(a.buildParams, params)
1002 }
1003
1004 bparams := convertBuildParams(params)
1005
1006 if bparams.Description != "" {
1007 bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}"
1008 }
1009
Colin Cross6ff51382015-12-17 16:39:19 -08001010 if a.missingDeps != nil {
Colin Cross67a5c132017-05-09 13:45:28 -07001011 a.ninjaError(bparams.Description, bparams.Outputs,
1012 fmt.Errorf("module %s missing dependencies: %s\n",
1013 a.ModuleName(), strings.Join(a.missingDeps, ", ")))
Colin Cross6ff51382015-12-17 16:39:19 -08001014 return
1015 }
1016
Colin Cross0875c522017-11-28 17:34:01 -08001017 a.ModuleContext.Build(pctx.PackageContext, bparams)
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001018}
1019
Colin Cross6ff51382015-12-17 16:39:19 -08001020func (a *androidModuleContext) GetMissingDependencies() []string {
1021 return a.missingDeps
1022}
1023
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001024func (a *androidModuleContext) AddMissingDependencies(deps []string) {
1025 if deps != nil {
1026 a.missingDeps = append(a.missingDeps, deps...)
Colin Crossd11fcda2017-10-23 17:59:01 -07001027 a.missingDeps = FirstUniqueStrings(a.missingDeps)
Dan Willemsen6553f5e2016-03-10 18:14:25 -08001028 }
1029}
1030
Colin Crossd11fcda2017-10-23 17:59:01 -07001031func (a *androidModuleContext) validateAndroidModule(module blueprint.Module) Module {
1032 aModule, _ := module.(Module)
1033 if aModule == nil {
1034 a.ModuleErrorf("module %q not an android module", a.OtherModuleName(aModule))
1035 return nil
1036 }
1037
1038 if !aModule.Enabled() {
Colin Cross6510f912017-11-29 00:27:14 -08001039 if a.Config().AllowMissingDependencies() {
Colin Crossd11fcda2017-10-23 17:59:01 -07001040 a.AddMissingDependencies([]string{a.OtherModuleName(aModule)})
1041 } else {
1042 a.ModuleErrorf("depends on disabled module %q", a.OtherModuleName(aModule))
1043 }
1044 return nil
1045 }
1046
1047 return aModule
1048}
1049
Jiyong Park1570c802019-04-17 21:47:37 +09001050func (a *androidModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) {
1051 type dep struct {
1052 mod blueprint.Module
1053 tag blueprint.DependencyTag
1054 }
1055 var deps []dep
1056 a.VisitDirectDepsBlueprint(func(m blueprint.Module) {
1057 if aModule, _ := m.(Module); aModule != nil && aModule.base().BaseModuleName() == name {
1058 returnedTag := a.ModuleContext.OtherModuleDependencyTag(aModule)
1059 if tag == nil || returnedTag == tag {
1060 deps = append(deps, dep{aModule, returnedTag})
1061 }
1062 }
1063 })
1064 if len(deps) == 1 {
1065 return deps[0].mod, deps[0].tag
1066 } else if len(deps) >= 2 {
1067 panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q",
1068 name, a.ModuleName()))
1069 } else {
1070 return nil, nil
1071 }
1072}
1073
1074func (a *androidModuleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) blueprint.Module {
1075 m, _ := a.getDirectDepInternal(name, tag)
1076 return m
1077}
1078
1079func (a *androidModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) {
1080 return a.getDirectDepInternal(name, nil)
1081}
1082
Colin Cross35143d02017-11-16 00:11:20 -08001083func (a *androidModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
1084 a.ModuleContext.VisitDirectDeps(visit)
1085}
1086
Colin Crossd11fcda2017-10-23 17:59:01 -07001087func (a *androidModuleContext) VisitDirectDeps(visit func(Module)) {
1088 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1089 if aModule := a.validateAndroidModule(module); aModule != nil {
1090 visit(aModule)
1091 }
1092 })
1093}
1094
Colin Crossee6143c2017-12-30 17:54:27 -08001095func (a *androidModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
1096 a.ModuleContext.VisitDirectDeps(func(module blueprint.Module) {
1097 if aModule := a.validateAndroidModule(module); aModule != nil {
1098 if a.ModuleContext.OtherModuleDependencyTag(aModule) == tag {
1099 visit(aModule)
1100 }
1101 }
1102 })
1103}
1104
Colin Crossd11fcda2017-10-23 17:59:01 -07001105func (a *androidModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
1106 a.ModuleContext.VisitDirectDepsIf(
1107 // pred
1108 func(module blueprint.Module) bool {
1109 if aModule := a.validateAndroidModule(module); aModule != nil {
1110 return pred(aModule)
1111 } else {
1112 return false
1113 }
1114 },
1115 // visit
1116 func(module blueprint.Module) {
1117 visit(module.(Module))
1118 })
1119}
1120
1121func (a *androidModuleContext) VisitDepsDepthFirst(visit func(Module)) {
1122 a.ModuleContext.VisitDepsDepthFirst(func(module blueprint.Module) {
1123 if aModule := a.validateAndroidModule(module); aModule != nil {
1124 visit(aModule)
1125 }
1126 })
1127}
1128
1129func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) {
1130 a.ModuleContext.VisitDepsDepthFirstIf(
1131 // pred
1132 func(module blueprint.Module) bool {
1133 if aModule := a.validateAndroidModule(module); aModule != nil {
1134 return pred(aModule)
1135 } else {
1136 return false
1137 }
1138 },
1139 // visit
1140 func(module blueprint.Module) {
1141 visit(module.(Module))
1142 })
1143}
1144
Alex Light778127a2019-02-27 14:19:50 -08001145func (a *androidModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) {
1146 a.ModuleContext.WalkDeps(visit)
1147}
1148
Colin Crossd11fcda2017-10-23 17:59:01 -07001149func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) {
1150 a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool {
1151 childAndroidModule := a.validateAndroidModule(child)
1152 parentAndroidModule := a.validateAndroidModule(parent)
1153 if childAndroidModule != nil && parentAndroidModule != nil {
1154 return visit(childAndroidModule, parentAndroidModule)
1155 } else {
1156 return false
1157 }
1158 })
1159}
1160
Colin Cross0875c522017-11-28 17:34:01 -08001161func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) {
1162 a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) {
1163 visit(module.(Module))
1164 })
1165}
1166
1167func (a *androidModuleContext) PrimaryModule() Module {
1168 return a.ModuleContext.PrimaryModule().(Module)
1169}
1170
1171func (a *androidModuleContext) FinalModule() Module {
1172 return a.ModuleContext.FinalModule().(Module)
1173}
1174
Colin Crossa1ad8d12016-06-01 17:09:44 -07001175func (a *androidBaseContextImpl) Target() Target {
1176 return a.target
1177}
1178
Colin Cross8b74d172016-09-13 09:59:14 -07001179func (a *androidBaseContextImpl) TargetPrimary() bool {
1180 return a.targetPrimary
1181}
1182
Colin Crossee0bc3b2018-10-02 22:01:37 -07001183func (a *androidBaseContextImpl) MultiTargets() []Target {
1184 return a.multiTargets
1185}
1186
Colin Crossf6566ed2015-03-24 11:13:38 -07001187func (a *androidBaseContextImpl) Arch() Arch {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001188 return a.target.Arch
Colin Cross3f40fa42015-01-30 17:27:36 -08001189}
1190
Colin Crossa1ad8d12016-06-01 17:09:44 -07001191func (a *androidBaseContextImpl) Os() OsType {
1192 return a.target.Os
Dan Willemsen490fd492015-11-24 17:53:15 -08001193}
1194
Colin Crossf6566ed2015-03-24 11:13:38 -07001195func (a *androidBaseContextImpl) Host() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001196 return a.target.Os.Class == Host || a.target.Os.Class == HostCross
Colin Crossf6566ed2015-03-24 11:13:38 -07001197}
1198
1199func (a *androidBaseContextImpl) Device() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001200 return a.target.Os.Class == Device
Colin Crossf6566ed2015-03-24 11:13:38 -07001201}
1202
Colin Cross0af4b842015-04-30 16:36:18 -07001203func (a *androidBaseContextImpl) Darwin() bool {
Colin Crossa1ad8d12016-06-01 17:09:44 -07001204 return a.target.Os == Darwin
Colin Cross0af4b842015-04-30 16:36:18 -07001205}
1206
Doug Horn21b94272019-01-16 12:06:11 -08001207func (a *androidBaseContextImpl) Fuchsia() bool {
1208 return a.target.Os == Fuchsia
1209}
1210
Colin Cross3edeee12017-04-04 12:59:48 -07001211func (a *androidBaseContextImpl) Windows() bool {
1212 return a.target.Os == Windows
1213}
1214
Colin Crossf6566ed2015-03-24 11:13:38 -07001215func (a *androidBaseContextImpl) Debug() bool {
1216 return a.debug
1217}
1218
Colin Cross1e7d3702016-08-24 15:25:47 -07001219func (a *androidBaseContextImpl) PrimaryArch() bool {
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001220 if len(a.config.Targets[a.target.Os]) <= 1 {
Colin Cross67a5c132017-05-09 13:45:28 -07001221 return true
1222 }
Dan Willemsen0ef639b2018-10-10 17:02:29 -07001223 return a.target.Arch.ArchType == a.config.Targets[a.target.Os][0].Arch.ArchType
Colin Cross1e7d3702016-08-24 15:25:47 -07001224}
1225
Colin Cross1332b002015-04-07 17:11:30 -07001226func (a *androidBaseContextImpl) AConfig() Config {
1227 return a.config
1228}
1229
Colin Cross9272ade2016-08-17 15:24:12 -07001230func (a *androidBaseContextImpl) DeviceConfig() DeviceConfig {
1231 return DeviceConfig{a.config.deviceConfig}
1232}
1233
Jiyong Park2db76922017-11-08 16:03:48 +09001234func (a *androidBaseContextImpl) Platform() bool {
1235 return a.kind == platformModule
1236}
1237
1238func (a *androidBaseContextImpl) DeviceSpecific() bool {
1239 return a.kind == deviceSpecificModule
1240}
1241
1242func (a *androidBaseContextImpl) SocSpecific() bool {
1243 return a.kind == socSpecificModule
1244}
1245
1246func (a *androidBaseContextImpl) ProductSpecific() bool {
1247 return a.kind == productSpecificModule
Dan Willemsen782a2d12015-12-21 14:55:28 -08001248}
1249
Dario Frenifd05a742018-05-29 13:28:54 +01001250func (a *androidBaseContextImpl) ProductServicesSpecific() bool {
1251 return a.kind == productServicesSpecificModule
1252}
1253
Jiyong Park5baac542018-08-28 09:55:37 +09001254// Makes this module a platform module, i.e. not specific to soc, device,
1255// product, or product_services.
1256func (a *ModuleBase) MakeAsPlatform() {
1257 a.commonProperties.Vendor = boolPtr(false)
1258 a.commonProperties.Proprietary = boolPtr(false)
1259 a.commonProperties.Soc_specific = boolPtr(false)
1260 a.commonProperties.Product_specific = boolPtr(false)
1261 a.commonProperties.Product_services_specific = boolPtr(false)
1262}
1263
Colin Cross8d8f8e22016-08-03 11:57:50 -07001264func (a *androidModuleContext) InstallInData() bool {
1265 return a.module.InstallInData()
Dan Willemsen782a2d12015-12-21 14:55:28 -08001266}
1267
Jaewoong Jung1ffd7932019-09-11 10:25:18 -07001268func (a *androidModuleContext) InstallInTestcases() bool {
1269 return a.module.InstallInTestcases()
1270}
1271
Vishwath Mohan1dd88392017-03-29 22:00:18 -07001272func (a *androidModuleContext) InstallInSanitizerDir() bool {
1273 return a.module.InstallInSanitizerDir()
1274}
1275
Jiyong Parkf9332f12018-02-01 00:54:12 +09001276func (a *androidModuleContext) InstallInRecovery() bool {
1277 return a.module.InstallInRecovery()
1278}
1279
Colin Cross893d8162017-04-26 17:34:03 -07001280func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool {
1281 if a.module.base().commonProperties.SkipInstall {
1282 return true
1283 }
1284
Colin Cross3607f212018-05-07 15:28:05 -07001285 // We'll need a solution for choosing which of modules with the same name in different
1286 // namespaces to install. For now, reuse the list of namespaces exported to Make as the
1287 // list of namespaces to install in a Soong-only build.
1288 if !a.module.base().commonProperties.NamespaceExportedToMake {
1289 return true
1290 }
1291
Colin Cross893d8162017-04-26 17:34:03 -07001292 if a.Device() {
Colin Cross6510f912017-11-29 00:27:14 -08001293 if a.Config().SkipDeviceInstall() {
Colin Cross893d8162017-04-26 17:34:03 -07001294 return true
1295 }
1296
Colin Cross6510f912017-11-29 00:27:14 -08001297 if a.Config().SkipMegaDeviceInstall(fullInstallPath.String()) {
Colin Cross893d8162017-04-26 17:34:03 -07001298 return true
1299 }
1300 }
1301
1302 return false
1303}
1304
Colin Cross5c517922017-08-31 12:29:17 -07001305func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
Colin Crossa2344662016-03-24 13:14:12 -07001306 deps ...Path) OutputPath {
Colin Cross5c517922017-08-31 12:29:17 -07001307 return a.installFile(installPath, name, srcPath, Cp, deps)
1308}
1309
1310func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
1311 deps ...Path) OutputPath {
1312 return a.installFile(installPath, name, srcPath, CpExecutable, deps)
1313}
1314
1315func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path,
1316 rule blueprint.Rule, deps []Path) OutputPath {
Colin Cross35cec122015-04-02 14:37:16 -07001317
Dan Willemsen782a2d12015-12-21 14:55:28 -08001318 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001319 a.module.base().hooks.runInstallHooks(a, fullInstallPath, false)
Colin Cross3f40fa42015-01-30 17:27:36 -08001320
Colin Cross893d8162017-04-26 17:34:03 -07001321 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001322
Dan Willemsen322acaf2016-01-12 23:07:05 -08001323 deps = append(deps, a.installDeps...)
Colin Cross35cec122015-04-02 14:37:16 -07001324
Colin Cross89562dc2016-10-03 17:47:19 -07001325 var implicitDeps, orderOnlyDeps Paths
1326
1327 if a.Host() {
1328 // Installed host modules might be used during the build, depend directly on their
1329 // dependencies so their timestamp is updated whenever their dependency is updated
1330 implicitDeps = deps
1331 } else {
1332 orderOnlyDeps = deps
1333 }
1334
Colin Crossae887032017-10-23 17:16:14 -07001335 a.Build(pctx, BuildParams{
Colin Cross5c517922017-08-31 12:29:17 -07001336 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -07001337 Description: "install " + fullInstallPath.Base(),
1338 Output: fullInstallPath,
1339 Input: srcPath,
1340 Implicits: implicitDeps,
1341 OrderOnly: orderOnlyDeps,
Colin Cross6510f912017-11-29 00:27:14 -08001342 Default: !a.Config().EmbeddedInMake(),
Dan Willemsen322acaf2016-01-12 23:07:05 -08001343 })
Colin Cross3f40fa42015-01-30 17:27:36 -08001344
Dan Willemsen322acaf2016-01-12 23:07:05 -08001345 a.installFiles = append(a.installFiles, fullInstallPath)
1346 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001347 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
Colin Cross35cec122015-04-02 14:37:16 -07001348 return fullInstallPath
1349}
1350
Colin Cross3854a602016-01-11 12:49:11 -08001351func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
1352 fullInstallPath := installPath.Join(a, name)
Colin Cross178a5092016-09-13 13:42:32 -07001353 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
Colin Cross3854a602016-01-11 12:49:11 -08001354
Colin Cross893d8162017-04-26 17:34:03 -07001355 if !a.skipInstall(fullInstallPath) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001356
Alex Lightfb4353d2019-01-17 13:57:45 -08001357 relPath, err := filepath.Rel(path.Dir(fullInstallPath.String()), srcPath.String())
1358 if err != nil {
1359 panic(fmt.Sprintf("Unable to generate symlink between %q and %q: %s", fullInstallPath.Base(), srcPath.Base(), err))
1360 }
Colin Crossae887032017-10-23 17:16:14 -07001361 a.Build(pctx, BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -07001362 Rule: Symlink,
1363 Description: "install symlink " + fullInstallPath.Base(),
1364 Output: fullInstallPath,
1365 OrderOnly: Paths{srcPath},
Colin Cross6510f912017-11-29 00:27:14 -08001366 Default: !a.Config().EmbeddedInMake(),
Colin Cross12fc4972016-01-11 12:49:11 -08001367 Args: map[string]string{
Alex Lightfb4353d2019-01-17 13:57:45 -08001368 "fromPath": relPath,
Colin Cross12fc4972016-01-11 12:49:11 -08001369 },
1370 })
Colin Cross3854a602016-01-11 12:49:11 -08001371
Colin Cross12fc4972016-01-11 12:49:11 -08001372 a.installFiles = append(a.installFiles, fullInstallPath)
1373 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1374 }
Colin Cross3854a602016-01-11 12:49:11 -08001375 return fullInstallPath
1376}
1377
Jiyong Parkf1194352019-02-25 11:05:47 +09001378// installPath/name -> absPath where absPath might be a path that is available only at runtime
1379// (e.g. /apex/...)
1380func (a *androidModuleContext) InstallAbsoluteSymlink(installPath OutputPath, name string, absPath string) OutputPath {
1381 fullInstallPath := installPath.Join(a, name)
1382 a.module.base().hooks.runInstallHooks(a, fullInstallPath, true)
1383
1384 if !a.skipInstall(fullInstallPath) {
1385 a.Build(pctx, BuildParams{
1386 Rule: Symlink,
1387 Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath,
1388 Output: fullInstallPath,
1389 Default: !a.Config().EmbeddedInMake(),
1390 Args: map[string]string{
1391 "fromPath": absPath,
1392 },
1393 })
1394
1395 a.installFiles = append(a.installFiles, fullInstallPath)
1396 }
1397 return fullInstallPath
1398}
1399
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001400func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
Colin Cross3f40fa42015-01-30 17:27:36 -08001401 a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
1402}
1403
Colin Cross3f40fa42015-01-30 17:27:36 -08001404type fileInstaller interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001405 filesToInstall() Paths
Colin Cross3f40fa42015-01-30 17:27:36 -08001406}
1407
1408func isFileInstaller(m blueprint.Module) bool {
1409 _, ok := m.(fileInstaller)
1410 return ok
1411}
1412
1413func isAndroidModule(m blueprint.Module) bool {
Colin Cross635c3b02016-05-18 15:37:25 -07001414 _, ok := m.(Module)
Colin Cross3f40fa42015-01-30 17:27:36 -08001415 return ok
1416}
Colin Crossfce53272015-04-08 11:21:40 -07001417
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001418func findStringInSlice(str string, slice []string) int {
1419 for i, s := range slice {
1420 if s == str {
1421 return i
Colin Crossfce53272015-04-08 11:21:40 -07001422 }
1423 }
Dan Willemsen2ef08f42015-06-30 18:15:24 -07001424 return -1
1425}
1426
Colin Cross068e0fe2016-12-13 15:23:47 -08001427func SrcIsModule(s string) string {
1428 if len(s) > 1 && s[0] == ':' {
1429 return s[1:]
1430 }
1431 return ""
1432}
1433
1434type sourceDependencyTag struct {
1435 blueprint.BaseDependencyTag
1436}
1437
1438var SourceDepTag sourceDependencyTag
1439
Colin Cross366938f2017-12-11 16:29:02 -08001440// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
1441// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08001442//
1443// Deprecated: tag the property with `android:"path"` instead.
Colin Cross068e0fe2016-12-13 15:23:47 -08001444func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
1445 var deps []string
Nan Zhang2439eb72017-04-10 11:27:50 -07001446 set := make(map[string]bool)
1447
Colin Cross068e0fe2016-12-13 15:23:47 -08001448 for _, s := range srcFiles {
1449 if m := SrcIsModule(s); m != "" {
Nan Zhang2439eb72017-04-10 11:27:50 -07001450 if _, found := set[m]; found {
1451 ctx.ModuleErrorf("found source dependency duplicate: %q!", m)
1452 } else {
1453 set[m] = true
1454 deps = append(deps, m)
1455 }
Colin Cross068e0fe2016-12-13 15:23:47 -08001456 }
1457 }
1458
1459 ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
1460}
1461
Colin Cross366938f2017-12-11 16:29:02 -08001462// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
1463// using ":module" syntax, if any.
Colin Cross27b922f2019-03-04 22:35:41 -08001464//
1465// Deprecated: tag the property with `android:"path"` instead.
Colin Cross366938f2017-12-11 16:29:02 -08001466func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
1467 if s != nil {
1468 if m := SrcIsModule(*s); m != "" {
1469 ctx.AddDependency(ctx.Module(), SourceDepTag, m)
1470 }
1471 }
1472}
1473
Colin Cross068e0fe2016-12-13 15:23:47 -08001474type SourceFileProducer interface {
1475 Srcs() Paths
1476}
1477
Colin Crossfe17f6f2019-03-28 19:30:56 -07001478type HostToolProvider interface {
1479 HostToolPath() OptionalPath
1480}
1481
Colin Cross27b922f2019-03-04 22:35:41 -08001482// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
1483// be tagged with `android:"path" to support automatic source module dependency resolution.
Colin Cross8a497952019-03-05 22:25:09 -08001484//
1485// Deprecated: use PathsForModuleSrc or PathsForModuleSrcExcludes instead.
Dan Willemsen34cc69e2015-09-23 15:26:20 -07001486func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
Colin Cross8a497952019-03-05 22:25:09 -08001487 return PathsForModuleSrcExcludes(ctx, srcFiles, excludes)
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.
Colin Cross8a497952019-03-05 22:25:09 -08001492//
1493// Deprecated: use PathForModuleSrc instead.
Colin Cross2fafa3e2019-03-05 12:39:51 -08001494func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
Colin Cross8a497952019-03-05 22:25:09 -08001495 return PathForModuleSrc(ctx, srcFile)
Colin Cross2fafa3e2019-03-05 12:39:51 -08001496}
1497
1498// Returns an optional single path expanded from globs and modules referenced using ":module" syntax if
1499// the srcFile is non-nil. The property must be tagged with `android:"path" to support automatic source module
1500// dependency resolution.
1501func (ctx *androidModuleContext) ExpandOptionalSource(srcFile *string, prop string) OptionalPath {
1502 if srcFile != nil {
Colin Cross8a497952019-03-05 22:25:09 -08001503 return OptionalPathForPath(PathForModuleSrc(ctx, *srcFile))
Colin Cross2fafa3e2019-03-05 12:39:51 -08001504 }
1505 return OptionalPath{}
1506}
1507
Nan Zhang6d34b302017-02-04 17:47:46 -08001508func (ctx *androidModuleContext) RequiredModuleNames() []string {
1509 return ctx.module.base().commonProperties.Required
1510}
1511
Colin Cross7f19f372016-11-01 11:10:25 -07001512func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
1513 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Colin Cross8f101b42015-06-17 15:09:06 -07001514 if err != nil {
1515 ctx.ModuleErrorf("glob: %s", err.Error())
1516 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001517 return pathsForModuleSrcFromFullPath(ctx, ret, true)
Colin Crossfce53272015-04-08 11:21:40 -07001518}
Colin Cross1f8c52b2015-06-16 16:38:17 -07001519
Nan Zhang581fd212018-01-10 16:06:12 -08001520func (ctx *androidModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
Dan Willemsen540a78c2018-02-26 21:50:08 -08001521 ret, err := ctx.GlobWithDeps(globPattern, excludes)
Nan Zhang581fd212018-01-10 16:06:12 -08001522 if err != nil {
1523 ctx.ModuleErrorf("glob: %s", err.Error())
1524 }
Dan Willemsen540a78c2018-02-26 21:50:08 -08001525 return pathsForModuleSrcFromFullPath(ctx, ret, false)
Nan Zhang581fd212018-01-10 16:06:12 -08001526}
1527
Colin Cross463a90e2015-06-17 14:20:06 -07001528func init() {
Colin Cross798bfce2016-10-12 14:28:16 -07001529 RegisterSingletonType("buildtarget", BuildTargetSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -07001530}
1531
Colin Cross0875c522017-11-28 17:34:01 -08001532func BuildTargetSingleton() Singleton {
Colin Cross1f8c52b2015-06-16 16:38:17 -07001533 return &buildTargetSingleton{}
1534}
1535
Colin Cross87d8b562017-04-25 10:01:55 -07001536func parentDir(dir string) string {
1537 dir, _ = filepath.Split(dir)
1538 return filepath.Clean(dir)
1539}
1540
Colin Cross1f8c52b2015-06-16 16:38:17 -07001541type buildTargetSingleton struct{}
1542
Colin Cross0875c522017-11-28 17:34:01 -08001543func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
1544 var checkbuildDeps Paths
Colin Cross1f8c52b2015-06-16 16:38:17 -07001545
Colin Cross0875c522017-11-28 17:34:01 -08001546 mmTarget := func(dir string) WritablePath {
1547 return PathForPhony(ctx,
1548 "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1))
Colin Cross87d8b562017-04-25 10:01:55 -07001549 }
1550
Colin Cross0875c522017-11-28 17:34:01 -08001551 modulesInDir := make(map[string]Paths)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001552
Colin Cross0875c522017-11-28 17:34:01 -08001553 ctx.VisitAllModules(func(module Module) {
1554 blueprintDir := module.base().blueprintDir
1555 installTarget := module.base().installTarget
1556 checkbuildTarget := module.base().checkbuildTarget
Colin Cross1f8c52b2015-06-16 16:38:17 -07001557
Colin Cross0875c522017-11-28 17:34:01 -08001558 if checkbuildTarget != nil {
1559 checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
1560 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget)
1561 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001562
Colin Cross0875c522017-11-28 17:34:01 -08001563 if installTarget != nil {
1564 modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget)
Colin Cross1f8c52b2015-06-16 16:38:17 -07001565 }
1566 })
1567
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001568 suffix := ""
Colin Crossaabf6792017-11-29 00:27:14 -08001569 if ctx.Config().EmbeddedInMake() {
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001570 suffix = "-soong"
1571 }
1572
Colin Cross1f8c52b2015-06-16 16:38:17 -07001573 // Create a top-level checkbuild target that depends on all modules
Colin Cross0875c522017-11-28 17:34:01 -08001574 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001575 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001576 Output: PathForPhony(ctx, "checkbuild"+suffix),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001577 Implicits: checkbuildDeps,
Colin Cross1f8c52b2015-06-16 16:38:17 -07001578 })
1579
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001580 // Make will generate the MODULES-IN-* targets
Colin Crossaabf6792017-11-29 00:27:14 -08001581 if ctx.Config().EmbeddedInMake() {
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001582 return
1583 }
1584
Colin Cross0875c522017-11-28 17:34:01 -08001585 sortedKeys := func(m map[string]Paths) []string {
1586 s := make([]string, 0, len(m))
1587 for k := range m {
1588 s = append(s, k)
1589 }
1590 sort.Strings(s)
1591 return s
1592 }
1593
Colin Cross87d8b562017-04-25 10:01:55 -07001594 // Ensure ancestor directories are in modulesInDir
1595 dirs := sortedKeys(modulesInDir)
1596 for _, dir := range dirs {
1597 dir := parentDir(dir)
1598 for dir != "." && dir != "/" {
1599 if _, exists := modulesInDir[dir]; exists {
1600 break
1601 }
1602 modulesInDir[dir] = nil
1603 dir = parentDir(dir)
1604 }
1605 }
1606
1607 // Make directories build their direct subdirectories
1608 dirs = sortedKeys(modulesInDir)
1609 for _, dir := range dirs {
1610 p := parentDir(dir)
1611 if p != "." && p != "/" {
1612 modulesInDir[p] = append(modulesInDir[p], mmTarget(dir))
1613 }
1614 }
1615
Dan Willemsend2e95fb2017-09-20 14:30:50 -07001616 // Create a MODULES-IN-<directory> target that depends on all modules in a directory, and
1617 // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp
1618 // files.
Colin Cross1f8c52b2015-06-16 16:38:17 -07001619 for _, dir := range dirs {
Colin Cross0875c522017-11-28 17:34:01 -08001620 ctx.Build(pctx, BuildParams{
Colin Cross1f8c52b2015-06-16 16:38:17 -07001621 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001622 Output: mmTarget(dir),
Colin Cross87d8b562017-04-25 10:01:55 -07001623 Implicits: modulesInDir[dir],
Dan Willemsen5ba07e82015-12-11 13:51:06 -08001624 // HACK: checkbuild should be an optional build, but force it
1625 // enabled for now in standalone builds
Colin Crossaabf6792017-11-29 00:27:14 -08001626 Default: !ctx.Config().EmbeddedInMake(),
Colin Cross1f8c52b2015-06-16 16:38:17 -07001627 })
1628 }
Dan Willemsen61d88b82017-09-20 17:29:08 -07001629
1630 // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild.
1631 osDeps := map[OsType]Paths{}
Colin Cross0875c522017-11-28 17:34:01 -08001632 ctx.VisitAllModules(func(module Module) {
1633 if module.Enabled() {
1634 os := module.Target().Os
1635 osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001636 }
1637 })
1638
Colin Cross0875c522017-11-28 17:34:01 -08001639 osClass := make(map[string]Paths)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001640 for os, deps := range osDeps {
1641 var className string
1642
1643 switch os.Class {
1644 case Host:
1645 className = "host"
1646 case HostCross:
1647 className = "host-cross"
1648 case Device:
1649 className = "target"
1650 default:
1651 continue
1652 }
1653
Colin Cross0875c522017-11-28 17:34:01 -08001654 name := PathForPhony(ctx, className+"-"+os.Name)
Dan Willemsen61d88b82017-09-20 17:29:08 -07001655 osClass[className] = append(osClass[className], name)
1656
Colin Cross0875c522017-11-28 17:34:01 -08001657 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001658 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001659 Output: name,
1660 Implicits: deps,
Dan Willemsen61d88b82017-09-20 17:29:08 -07001661 })
1662 }
1663
1664 // Wrap those into host|host-cross|target phony rules
1665 osClasses := sortedKeys(osClass)
1666 for _, class := range osClasses {
Colin Cross0875c522017-11-28 17:34:01 -08001667 ctx.Build(pctx, BuildParams{
Dan Willemsen61d88b82017-09-20 17:29:08 -07001668 Rule: blueprint.Phony,
Colin Cross0875c522017-11-28 17:34:01 -08001669 Output: PathForPhony(ctx, class),
Dan Willemsen61d88b82017-09-20 17:29:08 -07001670 Implicits: osClass[class],
Dan Willemsen61d88b82017-09-20 17:29:08 -07001671 })
1672 }
Colin Cross1f8c52b2015-06-16 16:38:17 -07001673}
Colin Crossd779da42015-12-17 18:00:23 -08001674
Brandon Lee5d45c6f2018-08-15 15:35:38 -07001675// Collect information for opening IDE project files in java/jdeps.go.
1676type IDEInfo interface {
1677 IDEInfo(ideInfo *IdeInfo)
1678 BaseModuleName() string
1679}
1680
1681// Extract the base module name from the Import name.
1682// Often the Import name has a prefix "prebuilt_".
1683// Remove the prefix explicitly if needed
1684// until we find a better solution to get the Import name.
1685type IDECustomizedModuleName interface {
1686 IDECustomizedModuleName() string
1687}
1688
1689type IdeInfo struct {
1690 Deps []string `json:"dependencies,omitempty"`
1691 Srcs []string `json:"srcs,omitempty"`
1692 Aidl_include_dirs []string `json:"aidl_include_dirs,omitempty"`
1693 Jarjar_rules []string `json:"jarjar_rules,omitempty"`
1694 Jars []string `json:"jars,omitempty"`
1695 Classes []string `json:"class,omitempty"`
1696 Installed_paths []string `json:"installed,omitempty"`
1697}