blob: 48b7c69523813409b8f4547c64e77a3f8d1d4b4e [file] [log] [blame]
Inseob Kimde5744a2020-12-02 13:14:28 +09001// Copyright 2020 The Android Open Source Project
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.
14package cc
15
16// This file defines snapshot prebuilt modules, e.g. vendor snapshot and recovery snapshot. Such
17// snapshot modules will override original source modules with setting BOARD_VNDK_VERSION, with
18// snapshot mutators and snapshot information maps which are also defined in this file.
19
20import (
Justin DeMartino383bfb32021-02-24 10:49:43 -080021 "path/filepath"
Inseob Kimde5744a2020-12-02 13:14:28 +090022 "strings"
Inseob Kimde5744a2020-12-02 13:14:28 +090023
24 "android/soong/android"
Jose Galmes6f843bc2020-12-11 13:36:29 -080025
Colin Crosse0edaf92021-01-11 17:31:17 -080026 "github.com/google/blueprint"
Inseob Kimde5744a2020-12-02 13:14:28 +090027)
28
29// Defines the specifics of different images to which the snapshot process is applicable, e.g.,
30// vendor, recovery, ramdisk.
31type snapshotImage interface {
Jose Galmes6f843bc2020-12-11 13:36:29 -080032 // Returns true if a snapshot should be generated for this image.
33 shouldGenerateSnapshot(ctx android.SingletonContext) bool
34
Inseob Kimde5744a2020-12-02 13:14:28 +090035 // Function that returns true if the module is included in this image.
36 // Using a function return instead of a value to prevent early
37 // evalution of a function that may be not be defined.
Ivan Lozanod7586b62021-04-01 09:49:36 -040038 inImage(m LinkableInterface) func() bool
Inseob Kimde5744a2020-12-02 13:14:28 +090039
Justin Yune09ac172021-01-20 19:49:01 +090040 // Returns true if the module is private and must not be included in the
41 // snapshot. For example VNDK-private modules must return true for the
42 // vendor snapshots. But false for the recovery snapshots.
Ivan Lozanod7586b62021-04-01 09:49:36 -040043 private(m LinkableInterface) bool
Inseob Kimde5744a2020-12-02 13:14:28 +090044
45 // Returns true if a dir under source tree is an SoC-owned proprietary
46 // directory, such as device/, vendor/, etc.
47 //
48 // For a given snapshot (e.g., vendor, recovery, etc.) if
Justin DeMartino383bfb32021-02-24 10:49:43 -080049 // isProprietaryPath(dir, deviceConfig) returns true, then the module in dir
50 // will be built from sources.
51 isProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool
Inseob Kimde5744a2020-12-02 13:14:28 +090052
53 // Whether to include VNDK in the snapshot for this image.
54 includeVndk() bool
55
56 // Whether a given module has been explicitly excluded from the
57 // snapshot, e.g., using the exclude_from_vendor_snapshot or
58 // exclude_from_recovery_snapshot properties.
Ivan Lozanod7586b62021-04-01 09:49:36 -040059 excludeFromSnapshot(m LinkableInterface) bool
Jose Galmes6f843bc2020-12-11 13:36:29 -080060
Jose Galmes6f843bc2020-12-11 13:36:29 -080061 // Returns true if the build is using a snapshot for this image.
62 isUsingSnapshot(cfg android.DeviceConfig) bool
63
Colin Crosse0edaf92021-01-11 17:31:17 -080064 // Returns a version of which the snapshot should be used in this target.
65 // This will only be meaningful when isUsingSnapshot is true.
66 targetSnapshotVersion(cfg android.DeviceConfig) string
Inseob Kim7cf14652021-01-06 23:06:52 +090067
68 // Whether to exclude a given module from the directed snapshot or not.
69 // If the makefile variable DIRECTED_{IMAGE}_SNAPSHOT is true, directed snapshot is turned on,
70 // and only modules listed in {IMAGE}_SNAPSHOT_MODULES will be captured.
71 excludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool
Colin Crosse0edaf92021-01-11 17:31:17 -080072
73 // The image variant name for this snapshot image.
74 // For example, recovery snapshot image will return "recovery", and vendor snapshot image will
75 // return "vendor." + version.
76 imageVariantName(cfg android.DeviceConfig) string
77
78 // The variant suffix for snapshot modules. For example, vendor snapshot modules will have
79 // ".vendor" as their suffix.
80 moduleNameSuffix() string
Inseob Kimde5744a2020-12-02 13:14:28 +090081}
82
83type vendorSnapshotImage struct{}
84type recoverySnapshotImage struct{}
85
Justin DeMartino383bfb32021-02-24 10:49:43 -080086type directoryMap map[string]bool
87
88var (
89 // Modules under following directories are ignored. They are OEM's and vendor's
90 // proprietary modules(device/, kernel/, vendor/, and hardware/).
91 defaultDirectoryExcludedMap = directoryMap{
92 "device": true,
93 "hardware": true,
94 "kernel": true,
95 "vendor": true,
96 }
97
98 // Modules under following directories are included as they are in AOSP,
99 // although hardware/ and kernel/ are normally for vendor's own.
100 defaultDirectoryIncludedMap = directoryMap{
101 "kernel/configs": true,
102 "kernel/prebuilts": true,
103 "kernel/tests": true,
104 "hardware/interfaces": true,
105 "hardware/libhardware": true,
106 "hardware/libhardware_legacy": true,
107 "hardware/ril": true,
108 }
109)
110
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400111func (vendorSnapshotImage) Init(ctx android.RegistrationContext) {
Colin Crosse0edaf92021-01-11 17:31:17 -0800112 ctx.RegisterSingletonType("vendor-snapshot", VendorSnapshotSingleton)
113 ctx.RegisterModuleType("vendor_snapshot", vendorSnapshotFactory)
114 ctx.RegisterModuleType("vendor_snapshot_shared", VendorSnapshotSharedFactory)
115 ctx.RegisterModuleType("vendor_snapshot_static", VendorSnapshotStaticFactory)
116 ctx.RegisterModuleType("vendor_snapshot_header", VendorSnapshotHeaderFactory)
117 ctx.RegisterModuleType("vendor_snapshot_binary", VendorSnapshotBinaryFactory)
118 ctx.RegisterModuleType("vendor_snapshot_object", VendorSnapshotObjectFactory)
Inseob Kime9aec6a2021-01-05 20:03:22 +0900119
Colin Crosse0edaf92021-01-11 17:31:17 -0800120 ctx.RegisterSingletonType("vendor-fake-snapshot", VendorFakeSnapshotSingleton)
Inseob Kimde5744a2020-12-02 13:14:28 +0900121}
122
Jose Galmes6f843bc2020-12-11 13:36:29 -0800123func (vendorSnapshotImage) shouldGenerateSnapshot(ctx android.SingletonContext) bool {
124 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a snapshot.
125 return ctx.DeviceConfig().VndkVersion() == "current"
126}
127
Ivan Lozanod7586b62021-04-01 09:49:36 -0400128func (vendorSnapshotImage) inImage(m LinkableInterface) func() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500129 return m.InVendor
Inseob Kimde5744a2020-12-02 13:14:28 +0900130}
131
Ivan Lozanod7586b62021-04-01 09:49:36 -0400132func (vendorSnapshotImage) private(m LinkableInterface) bool {
Justin Yune09ac172021-01-20 19:49:01 +0900133 return m.IsVndkPrivate()
Inseob Kimde5744a2020-12-02 13:14:28 +0900134}
135
Justin DeMartino383bfb32021-02-24 10:49:43 -0800136func isDirectoryExcluded(dir string, excludedMap directoryMap, includedMap directoryMap) bool {
137 if dir == "." || dir == "/" {
138 return false
139 }
140 if includedMap[dir] {
141 return false
142 } else if excludedMap[dir] {
143 return true
144 } else if defaultDirectoryIncludedMap[dir] {
145 return false
146 } else if defaultDirectoryExcludedMap[dir] {
147 return true
148 } else {
149 return isDirectoryExcluded(filepath.Dir(dir), excludedMap, includedMap)
150 }
151}
152
153func (vendorSnapshotImage) isProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool {
154 return isDirectoryExcluded(dir, deviceConfig.VendorSnapshotDirsExcludedMap(), deviceConfig.VendorSnapshotDirsIncludedMap())
Inseob Kimde5744a2020-12-02 13:14:28 +0900155}
156
157// vendor snapshot includes static/header libraries with vndk: {enabled: true}.
158func (vendorSnapshotImage) includeVndk() bool {
159 return true
160}
161
Ivan Lozanod7586b62021-04-01 09:49:36 -0400162func (vendorSnapshotImage) excludeFromSnapshot(m LinkableInterface) bool {
Inseob Kimde5744a2020-12-02 13:14:28 +0900163 return m.ExcludeFromVendorSnapshot()
164}
165
Jose Galmes6f843bc2020-12-11 13:36:29 -0800166func (vendorSnapshotImage) isUsingSnapshot(cfg android.DeviceConfig) bool {
167 vndkVersion := cfg.VndkVersion()
168 return vndkVersion != "current" && vndkVersion != ""
169}
170
Colin Crosse0edaf92021-01-11 17:31:17 -0800171func (vendorSnapshotImage) targetSnapshotVersion(cfg android.DeviceConfig) string {
172 return cfg.VndkVersion()
Jose Galmes6f843bc2020-12-11 13:36:29 -0800173}
174
Inseob Kim7cf14652021-01-06 23:06:52 +0900175// returns true iff a given module SHOULD BE EXCLUDED, false if included
176func (vendorSnapshotImage) excludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool {
177 // If we're using full snapshot, not directed snapshot, capture every module
178 if !cfg.DirectedVendorSnapshot() {
179 return false
180 }
181 // Else, checks if name is in VENDOR_SNAPSHOT_MODULES.
182 return !cfg.VendorSnapshotModules()[name]
183}
184
Colin Crosse0edaf92021-01-11 17:31:17 -0800185func (vendorSnapshotImage) imageVariantName(cfg android.DeviceConfig) string {
186 return VendorVariationPrefix + cfg.VndkVersion()
187}
188
189func (vendorSnapshotImage) moduleNameSuffix() string {
Ivan Lozanoe6d30982021-02-05 10:57:43 -0500190 return VendorSuffix
Colin Crosse0edaf92021-01-11 17:31:17 -0800191}
192
193func (recoverySnapshotImage) init(ctx android.RegistrationContext) {
194 ctx.RegisterSingletonType("recovery-snapshot", RecoverySnapshotSingleton)
195 ctx.RegisterModuleType("recovery_snapshot", recoverySnapshotFactory)
196 ctx.RegisterModuleType("recovery_snapshot_shared", RecoverySnapshotSharedFactory)
197 ctx.RegisterModuleType("recovery_snapshot_static", RecoverySnapshotStaticFactory)
198 ctx.RegisterModuleType("recovery_snapshot_header", RecoverySnapshotHeaderFactory)
199 ctx.RegisterModuleType("recovery_snapshot_binary", RecoverySnapshotBinaryFactory)
200 ctx.RegisterModuleType("recovery_snapshot_object", RecoverySnapshotObjectFactory)
Inseob Kimde5744a2020-12-02 13:14:28 +0900201}
202
Jose Galmes6f843bc2020-12-11 13:36:29 -0800203func (recoverySnapshotImage) shouldGenerateSnapshot(ctx android.SingletonContext) bool {
204 // RECOVERY_SNAPSHOT_VERSION must be set to 'current' in order to generate a
205 // snapshot.
206 return ctx.DeviceConfig().RecoverySnapshotVersion() == "current"
207}
208
Ivan Lozanod7586b62021-04-01 09:49:36 -0400209func (recoverySnapshotImage) inImage(m LinkableInterface) func() bool {
Inseob Kimde5744a2020-12-02 13:14:28 +0900210 return m.InRecovery
211}
212
Justin Yune09ac172021-01-20 19:49:01 +0900213// recovery snapshot does not have private libraries.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400214func (recoverySnapshotImage) private(m LinkableInterface) bool {
Justin Yune09ac172021-01-20 19:49:01 +0900215 return false
Inseob Kimde5744a2020-12-02 13:14:28 +0900216}
217
Justin DeMartino383bfb32021-02-24 10:49:43 -0800218func (recoverySnapshotImage) isProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool {
219 return isDirectoryExcluded(dir, deviceConfig.RecoverySnapshotDirsExcludedMap(), deviceConfig.RecoverySnapshotDirsIncludedMap())
Inseob Kimde5744a2020-12-02 13:14:28 +0900220}
221
222// recovery snapshot does NOT treat vndk specially.
223func (recoverySnapshotImage) includeVndk() bool {
224 return false
225}
226
Ivan Lozanod7586b62021-04-01 09:49:36 -0400227func (recoverySnapshotImage) excludeFromSnapshot(m LinkableInterface) bool {
Inseob Kimde5744a2020-12-02 13:14:28 +0900228 return m.ExcludeFromRecoverySnapshot()
229}
230
Jose Galmes6f843bc2020-12-11 13:36:29 -0800231func (recoverySnapshotImage) isUsingSnapshot(cfg android.DeviceConfig) bool {
232 recoverySnapshotVersion := cfg.RecoverySnapshotVersion()
233 return recoverySnapshotVersion != "current" && recoverySnapshotVersion != ""
234}
235
Colin Crosse0edaf92021-01-11 17:31:17 -0800236func (recoverySnapshotImage) targetSnapshotVersion(cfg android.DeviceConfig) string {
237 return cfg.RecoverySnapshotVersion()
Jose Galmes6f843bc2020-12-11 13:36:29 -0800238}
239
Inseob Kim7cf14652021-01-06 23:06:52 +0900240func (recoverySnapshotImage) excludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool {
Jose Galmes4c6895e2021-02-09 07:44:30 -0800241 // If we're using full snapshot, not directed snapshot, capture every module
242 if !cfg.DirectedRecoverySnapshot() {
243 return false
244 }
245 // Else, checks if name is in RECOVERY_SNAPSHOT_MODULES.
246 return !cfg.RecoverySnapshotModules()[name]
Inseob Kim7cf14652021-01-06 23:06:52 +0900247}
248
Colin Crosse0edaf92021-01-11 17:31:17 -0800249func (recoverySnapshotImage) imageVariantName(cfg android.DeviceConfig) string {
250 return android.RecoveryVariation
251}
252
253func (recoverySnapshotImage) moduleNameSuffix() string {
254 return recoverySuffix
255}
256
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400257var VendorSnapshotImageSingleton vendorSnapshotImage
Inseob Kimde5744a2020-12-02 13:14:28 +0900258var recoverySnapshotImageSingleton recoverySnapshotImage
259
260func init() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400261 VendorSnapshotImageSingleton.Init(android.InitRegistrationContext)
Colin Crosse0edaf92021-01-11 17:31:17 -0800262 recoverySnapshotImageSingleton.init(android.InitRegistrationContext)
Inseob Kimde5744a2020-12-02 13:14:28 +0900263}
264
265const (
Colin Crosse0edaf92021-01-11 17:31:17 -0800266 snapshotHeaderSuffix = "_header."
267 snapshotSharedSuffix = "_shared."
268 snapshotStaticSuffix = "_static."
269 snapshotBinarySuffix = "_binary."
270 snapshotObjectSuffix = "_object."
Inseob Kimde5744a2020-12-02 13:14:28 +0900271)
272
Colin Crosse0edaf92021-01-11 17:31:17 -0800273type SnapshotProperties struct {
274 Header_libs []string `android:"arch_variant"`
275 Static_libs []string `android:"arch_variant"`
276 Shared_libs []string `android:"arch_variant"`
277 Vndk_libs []string `android:"arch_variant"`
278 Binaries []string `android:"arch_variant"`
279 Objects []string `android:"arch_variant"`
280}
281
282type snapshot struct {
283 android.ModuleBase
284
285 properties SnapshotProperties
286
287 baseSnapshot baseSnapshotDecorator
288
289 image snapshotImage
290}
291
292func (s *snapshot) ImageMutatorBegin(ctx android.BaseModuleContext) {
293 cfg := ctx.DeviceConfig()
294 if !s.image.isUsingSnapshot(cfg) || s.image.targetSnapshotVersion(cfg) != s.baseSnapshot.version() {
295 s.Disable()
296 }
297}
298
299func (s *snapshot) CoreVariantNeeded(ctx android.BaseModuleContext) bool {
300 return false
301}
302
303func (s *snapshot) RamdiskVariantNeeded(ctx android.BaseModuleContext) bool {
304 return false
305}
306
307func (s *snapshot) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) bool {
308 return false
309}
310
Inseob Kim08758f02021-04-08 21:13:22 +0900311func (s *snapshot) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool {
312 return false
313}
314
Colin Crosse0edaf92021-01-11 17:31:17 -0800315func (s *snapshot) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool {
316 return false
317}
318
319func (s *snapshot) ExtraImageVariations(ctx android.BaseModuleContext) []string {
320 return []string{s.image.imageVariantName(ctx.DeviceConfig())}
321}
322
323func (s *snapshot) SetImageVariation(ctx android.BaseModuleContext, variation string, module android.Module) {
324}
325
326func (s *snapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) {
327 // Nothing, the snapshot module is only used to forward dependency information in DepsMutator.
328}
329
Justin Yun07b9f862021-02-26 14:00:03 +0900330func getSnapshotNameSuffix(moduleSuffix, version, arch string) string {
331 versionSuffix := version
332 if arch != "" {
333 versionSuffix += "." + arch
334 }
335 return moduleSuffix + versionSuffix
336}
Colin Crosse0edaf92021-01-11 17:31:17 -0800337
Justin Yun07b9f862021-02-26 14:00:03 +0900338func (s *snapshot) DepsMutator(ctx android.BottomUpMutatorContext) {
339 collectSnapshotMap := func(names []string, snapshotSuffix, moduleSuffix string) map[string]string {
Colin Crosse0edaf92021-01-11 17:31:17 -0800340 snapshotMap := make(map[string]string)
Justin Yun48138672021-02-25 18:21:27 +0900341 for _, name := range names {
342 snapshotMap[name] = name +
Justin Yun07b9f862021-02-26 14:00:03 +0900343 getSnapshotNameSuffix(snapshotSuffix+moduleSuffix,
Jose Galmesf9523ed2021-04-06 19:48:10 -0700344 s.baseSnapshot.version(),
345 ctx.DeviceConfig().Arches()[0].ArchType.String())
Colin Crosse0edaf92021-01-11 17:31:17 -0800346 }
347 return snapshotMap
348 }
349
350 snapshotSuffix := s.image.moduleNameSuffix()
Justin Yun07b9f862021-02-26 14:00:03 +0900351 headers := collectSnapshotMap(s.properties.Header_libs, snapshotSuffix, snapshotHeaderSuffix)
352 binaries := collectSnapshotMap(s.properties.Binaries, snapshotSuffix, snapshotBinarySuffix)
353 objects := collectSnapshotMap(s.properties.Objects, snapshotSuffix, snapshotObjectSuffix)
354 staticLibs := collectSnapshotMap(s.properties.Static_libs, snapshotSuffix, snapshotStaticSuffix)
355 sharedLibs := collectSnapshotMap(s.properties.Shared_libs, snapshotSuffix, snapshotSharedSuffix)
356 vndkLibs := collectSnapshotMap(s.properties.Vndk_libs, "", vndkSuffix)
Colin Crosse0edaf92021-01-11 17:31:17 -0800357 for k, v := range vndkLibs {
358 sharedLibs[k] = v
359 }
Justin Yun07b9f862021-02-26 14:00:03 +0900360
Colin Crosse0edaf92021-01-11 17:31:17 -0800361 ctx.SetProvider(SnapshotInfoProvider, SnapshotInfo{
362 HeaderLibs: headers,
363 Binaries: binaries,
364 Objects: objects,
365 StaticLibs: staticLibs,
366 SharedLibs: sharedLibs,
367 })
368}
369
370type SnapshotInfo struct {
371 HeaderLibs, Binaries, Objects, StaticLibs, SharedLibs map[string]string
372}
373
374var SnapshotInfoProvider = blueprint.NewMutatorProvider(SnapshotInfo{}, "deps")
375
376var _ android.ImageInterface = (*snapshot)(nil)
377
378func vendorSnapshotFactory() android.Module {
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400379 return snapshotFactory(VendorSnapshotImageSingleton)
Colin Crosse0edaf92021-01-11 17:31:17 -0800380}
381
382func recoverySnapshotFactory() android.Module {
383 return snapshotFactory(recoverySnapshotImageSingleton)
384}
385
386func snapshotFactory(image snapshotImage) android.Module {
387 snapshot := &snapshot{}
388 snapshot.image = image
389 snapshot.AddProperties(
390 &snapshot.properties,
391 &snapshot.baseSnapshot.baseProperties)
392 android.InitAndroidArchModule(snapshot, android.DeviceSupported, android.MultilibBoth)
393 return snapshot
394}
395
Inseob Kimde5744a2020-12-02 13:14:28 +0900396type baseSnapshotDecoratorProperties struct {
397 // snapshot version.
398 Version string
399
400 // Target arch name of the snapshot (e.g. 'arm64' for variant 'aosp_arm64')
401 Target_arch string
Jose Galmes6f843bc2020-12-11 13:36:29 -0800402
Colin Crossa8890802021-01-22 14:06:33 -0800403 // Suffix to be added to the module name when exporting to Android.mk, e.g. ".vendor".
Inseob Kim1b6fb872021-04-05 13:37:02 +0900404 Androidmk_suffix string `blueprint:"mutated"`
Colin Crossa8890802021-01-22 14:06:33 -0800405
Jose Galmes6f843bc2020-12-11 13:36:29 -0800406 // Suffix to be added to the module name, e.g., vendor_shared,
407 // recovery_shared, etc.
Colin Crosse0edaf92021-01-11 17:31:17 -0800408 ModuleSuffix string `blueprint:"mutated"`
Inseob Kimde5744a2020-12-02 13:14:28 +0900409}
410
411// baseSnapshotDecorator provides common basic functions for all snapshot modules, such as snapshot
412// version, snapshot arch, etc. It also adds a special suffix to Soong module name, so it doesn't
413// collide with source modules. e.g. the following example module,
414//
415// vendor_snapshot_static {
416// name: "libbase",
417// arch: "arm64",
418// version: 30,
419// ...
420// }
421//
422// will be seen as "libbase.vendor_static.30.arm64" by Soong.
423type baseSnapshotDecorator struct {
424 baseProperties baseSnapshotDecoratorProperties
Inseob Kim1b6fb872021-04-05 13:37:02 +0900425 image snapshotImage
Inseob Kimde5744a2020-12-02 13:14:28 +0900426}
427
428func (p *baseSnapshotDecorator) Name(name string) string {
429 return name + p.NameSuffix()
430}
431
432func (p *baseSnapshotDecorator) NameSuffix() string {
Justin Yun07b9f862021-02-26 14:00:03 +0900433 return getSnapshotNameSuffix(p.moduleSuffix(), p.version(), p.arch())
Inseob Kimde5744a2020-12-02 13:14:28 +0900434}
435
436func (p *baseSnapshotDecorator) version() string {
437 return p.baseProperties.Version
438}
439
440func (p *baseSnapshotDecorator) arch() string {
441 return p.baseProperties.Target_arch
442}
443
Colin Crosse0edaf92021-01-11 17:31:17 -0800444func (p *baseSnapshotDecorator) moduleSuffix() string {
445 return p.baseProperties.ModuleSuffix
Jose Galmes6f843bc2020-12-11 13:36:29 -0800446}
447
Inseob Kimde5744a2020-12-02 13:14:28 +0900448func (p *baseSnapshotDecorator) isSnapshotPrebuilt() bool {
449 return true
450}
451
Colin Crossa8890802021-01-22 14:06:33 -0800452func (p *baseSnapshotDecorator) snapshotAndroidMkSuffix() string {
453 return p.baseProperties.Androidmk_suffix
454}
455
Jose Galmes7fdc3362021-05-26 21:16:52 -0700456func (p *baseSnapshotDecorator) setSnapshotAndroidMkSuffix(ctx android.ModuleContext, variant string) {
457 // If there are any 2 or more variations among {core, product, vendor, recovery}
458 // we have to add the androidmk suffix to avoid duplicate modules with the same
459 // name.
460 variations := append(ctx.Target().Variations(), blueprint.Variation{
Bill Peckham4016d7b2021-05-20 11:54:21 -0700461 Mutator: "image",
462 Variation: android.CoreVariation})
463
Jose Galmes7fdc3362021-05-26 21:16:52 -0700464 if ctx.OtherModuleFarDependencyVariantExists(variations, ctx.Module().(*Module).BaseModuleName()) {
Inseob Kim1b6fb872021-04-05 13:37:02 +0900465 p.baseProperties.Androidmk_suffix = p.image.moduleNameSuffix()
Bill Peckham4016d7b2021-05-20 11:54:21 -0700466 return
Inseob Kim1b6fb872021-04-05 13:37:02 +0900467 }
Bill Peckham4016d7b2021-05-20 11:54:21 -0700468
Jose Galmes7fdc3362021-05-26 21:16:52 -0700469 variations = append(ctx.Target().Variations(), blueprint.Variation{
Bill Peckham4016d7b2021-05-20 11:54:21 -0700470 Mutator: "image",
471 Variation: ProductVariationPrefix + ctx.DeviceConfig().PlatformVndkVersion()})
472
Jose Galmes7fdc3362021-05-26 21:16:52 -0700473 if ctx.OtherModuleFarDependencyVariantExists(variations, ctx.Module().(*Module).BaseModuleName()) {
Bill Peckham4016d7b2021-05-20 11:54:21 -0700474 p.baseProperties.Androidmk_suffix = p.image.moduleNameSuffix()
475 return
476 }
477
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400478 images := []snapshotImage{VendorSnapshotImageSingleton, recoverySnapshotImageSingleton}
Jose Galmes7fdc3362021-05-26 21:16:52 -0700479
480 for _, image := range images {
481 if p.image == image {
482 continue
483 }
484 variations = append(ctx.Target().Variations(), blueprint.Variation{
485 Mutator: "image",
486 Variation: image.imageVariantName(ctx.DeviceConfig())})
487
488 if ctx.OtherModuleFarDependencyVariantExists(variations,
489 ctx.Module().(*Module).BaseModuleName()+
490 getSnapshotNameSuffix(
491 image.moduleNameSuffix()+variant,
492 p.version(),
493 ctx.DeviceConfig().Arches()[0].ArchType.String())) {
494 p.baseProperties.Androidmk_suffix = p.image.moduleNameSuffix()
495 return
496 }
497 }
498
Bill Peckham4016d7b2021-05-20 11:54:21 -0700499 p.baseProperties.Androidmk_suffix = ""
Inseob Kim1b6fb872021-04-05 13:37:02 +0900500}
501
Inseob Kimde5744a2020-12-02 13:14:28 +0900502// Call this with a module suffix after creating a snapshot module, such as
503// vendorSnapshotSharedSuffix, recoverySnapshotBinarySuffix, etc.
Inseob Kim1b6fb872021-04-05 13:37:02 +0900504func (p *baseSnapshotDecorator) init(m *Module, image snapshotImage, moduleSuffix string) {
505 p.image = image
506 p.baseProperties.ModuleSuffix = image.moduleNameSuffix() + moduleSuffix
Inseob Kimde5744a2020-12-02 13:14:28 +0900507 m.AddProperties(&p.baseProperties)
508 android.AddLoadHook(m, func(ctx android.LoadHookContext) {
509 vendorSnapshotLoadHook(ctx, p)
510 })
511}
512
513// vendorSnapshotLoadHook disables snapshots if it's not BOARD_VNDK_VERSION.
514// As vendor snapshot is only for vendor, such modules won't be used at all.
515func vendorSnapshotLoadHook(ctx android.LoadHookContext, p *baseSnapshotDecorator) {
516 if p.version() != ctx.DeviceConfig().VndkVersion() {
517 ctx.Module().Disable()
518 return
519 }
520}
521
522//
523// Module definitions for snapshots of libraries (shared, static, header).
524//
525// Modules (vendor|recovery)_snapshot_(shared|static|header) are defined here. Shared libraries and
526// static libraries have their prebuilt library files (.so for shared, .a for static) as their src,
527// which can be installed or linked against. Also they export flags needed when linked, such as
528// include directories, c flags, sanitize dependency information, etc.
529//
530// These modules are auto-generated by development/vendor_snapshot/update.py.
531type snapshotLibraryProperties struct {
532 // Prebuilt file for each arch.
533 Src *string `android:"arch_variant"`
534
535 // list of directories that will be added to the include path (using -I).
536 Export_include_dirs []string `android:"arch_variant"`
537
538 // list of directories that will be added to the system path (using -isystem).
539 Export_system_include_dirs []string `android:"arch_variant"`
540
541 // list of flags that will be used for any module that links against this module.
542 Export_flags []string `android:"arch_variant"`
543
544 // Whether this prebuilt needs to depend on sanitize ubsan runtime or not.
545 Sanitize_ubsan_dep *bool `android:"arch_variant"`
546
547 // Whether this prebuilt needs to depend on sanitize minimal runtime or not.
548 Sanitize_minimal_dep *bool `android:"arch_variant"`
549}
550
551type snapshotSanitizer interface {
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500552 isSanitizerEnabled(t SanitizerType) bool
553 setSanitizerVariation(t SanitizerType, enabled bool)
Inseob Kimde5744a2020-12-02 13:14:28 +0900554}
555
556type snapshotLibraryDecorator struct {
557 baseSnapshotDecorator
558 *libraryDecorator
559 properties snapshotLibraryProperties
560 sanitizerProperties struct {
561 CfiEnabled bool `blueprint:"mutated"`
562
563 // Library flags for cfi variant.
564 Cfi snapshotLibraryProperties `android:"arch_variant"`
565 }
Inseob Kimde5744a2020-12-02 13:14:28 +0900566}
567
568func (p *snapshotLibraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
569 p.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), p.NameSuffix())
570 return p.libraryDecorator.linkerFlags(ctx, flags)
571}
572
573func (p *snapshotLibraryDecorator) matchesWithDevice(config android.DeviceConfig) bool {
574 arches := config.Arches()
575 if len(arches) == 0 || arches[0].ArchType.String() != p.arch() {
576 return false
577 }
578 if !p.header() && p.properties.Src == nil {
579 return false
580 }
581 return true
582}
583
584// cc modules' link functions are to link compiled objects into final binaries.
585// As snapshots are prebuilts, this just returns the prebuilt binary after doing things which are
586// done by normal library decorator, e.g. exporting flags.
587func (p *snapshotLibraryDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path {
Jose Galmes7fdc3362021-05-26 21:16:52 -0700588 var variant string
589 if p.shared() {
590 variant = snapshotSharedSuffix
591 } else if p.static() {
592 variant = snapshotStaticSuffix
593 } else {
594 variant = snapshotHeaderSuffix
595 }
596
597 p.setSnapshotAndroidMkSuffix(ctx, variant)
Inseob Kim1b6fb872021-04-05 13:37:02 +0900598
Inseob Kimde5744a2020-12-02 13:14:28 +0900599 if p.header() {
600 return p.libraryDecorator.link(ctx, flags, deps, objs)
601 }
602
603 if p.sanitizerProperties.CfiEnabled {
604 p.properties = p.sanitizerProperties.Cfi
605 }
606
607 if !p.matchesWithDevice(ctx.DeviceConfig()) {
608 return nil
609 }
610
Inseob Kimdd0295d2021-04-12 21:09:59 +0900611 // Flags specified directly to this module.
Inseob Kimde5744a2020-12-02 13:14:28 +0900612 p.libraryDecorator.reexportDirs(android.PathsForModuleSrc(ctx, p.properties.Export_include_dirs)...)
613 p.libraryDecorator.reexportSystemDirs(android.PathsForModuleSrc(ctx, p.properties.Export_system_include_dirs)...)
614 p.libraryDecorator.reexportFlags(p.properties.Export_flags...)
615
Inseob Kimdd0295d2021-04-12 21:09:59 +0900616 // Flags reexported from dependencies. (e.g. vndk_prebuilt_shared)
617 p.libraryDecorator.reexportDirs(deps.ReexportedDirs...)
618 p.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...)
619 p.libraryDecorator.reexportFlags(deps.ReexportedFlags...)
620 p.libraryDecorator.reexportDeps(deps.ReexportedDeps...)
621 p.libraryDecorator.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...)
622
Inseob Kimde5744a2020-12-02 13:14:28 +0900623 in := android.PathForModuleSrc(ctx, *p.properties.Src)
624 p.unstrippedOutputFile = in
625
626 if p.shared() {
627 libName := in.Base()
628 builderFlags := flagsToBuilderFlags(flags)
629
630 // Optimize out relinking against shared libraries whose interface hasn't changed by
631 // depending on a table of contents file instead of the library itself.
632 tocFile := android.PathForModuleOut(ctx, libName+".toc")
633 p.tocFile = android.OptionalPathForPath(tocFile)
634 transformSharedObjectToToc(ctx, in, tocFile, builderFlags)
635
636 ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{
637 SharedLibrary: in,
638 UnstrippedSharedLibrary: p.unstrippedOutputFile,
Colin Cross2df81772021-01-26 11:00:18 -0800639 Target: ctx.Target(),
Inseob Kimde5744a2020-12-02 13:14:28 +0900640
641 TableOfContents: p.tocFile,
642 })
643 }
644
645 if p.static() {
646 depSet := android.NewDepSetBuilder(android.TOPOLOGICAL).Direct(in).Build()
647 ctx.SetProvider(StaticLibraryInfoProvider, StaticLibraryInfo{
648 StaticLibrary: in,
649
650 TransitiveStaticLibrariesForOrdering: depSet,
651 })
652 }
653
654 p.libraryDecorator.flagExporter.setProvider(ctx)
655
656 return in
657}
658
659func (p *snapshotLibraryDecorator) install(ctx ModuleContext, file android.Path) {
660 if p.matchesWithDevice(ctx.DeviceConfig()) && (p.shared() || p.static()) {
661 p.baseInstaller.install(ctx, file)
662 }
663}
664
665func (p *snapshotLibraryDecorator) nativeCoverage() bool {
666 return false
667}
668
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500669func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool {
Inseob Kimde5744a2020-12-02 13:14:28 +0900670 switch t {
671 case cfi:
672 return p.sanitizerProperties.Cfi.Src != nil
673 default:
674 return false
675 }
676}
677
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500678func (p *snapshotLibraryDecorator) setSanitizerVariation(t SanitizerType, enabled bool) {
Inseob Kimde5744a2020-12-02 13:14:28 +0900679 if !enabled {
680 return
681 }
682 switch t {
683 case cfi:
684 p.sanitizerProperties.CfiEnabled = true
685 default:
686 return
687 }
688}
689
Inseob Kim1b6fb872021-04-05 13:37:02 +0900690func snapshotLibraryFactory(image snapshotImage, moduleSuffix string) (*Module, *snapshotLibraryDecorator) {
Inseob Kimde5744a2020-12-02 13:14:28 +0900691 module, library := NewLibrary(android.DeviceSupported)
692
693 module.stl = nil
694 module.sanitize = nil
695 library.disableStripping()
696
697 prebuilt := &snapshotLibraryDecorator{
698 libraryDecorator: library,
699 }
700
701 prebuilt.baseLinker.Properties.No_libcrt = BoolPtr(true)
702 prebuilt.baseLinker.Properties.Nocrt = BoolPtr(true)
703
704 // Prevent default system libs (libc, libm, and libdl) from being linked
705 if prebuilt.baseLinker.Properties.System_shared_libs == nil {
706 prebuilt.baseLinker.Properties.System_shared_libs = []string{}
707 }
708
709 module.compiler = nil
710 module.linker = prebuilt
711 module.installer = prebuilt
712
Inseob Kim1b6fb872021-04-05 13:37:02 +0900713 prebuilt.init(module, image, moduleSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900714 module.AddProperties(
715 &prebuilt.properties,
716 &prebuilt.sanitizerProperties,
717 )
718
719 return module, prebuilt
720}
721
722// vendor_snapshot_shared is a special prebuilt shared library which is auto-generated by
723// development/vendor_snapshot/update.py. As a part of vendor snapshot, vendor_snapshot_shared
724// overrides the vendor variant of the cc shared library with the same name, if BOARD_VNDK_VERSION
725// is set.
726func VendorSnapshotSharedFactory() android.Module {
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400727 module, prebuilt := snapshotLibraryFactory(VendorSnapshotImageSingleton, snapshotSharedSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900728 prebuilt.libraryDecorator.BuildOnlyShared()
729 return module.Init()
730}
731
732// recovery_snapshot_shared is a special prebuilt shared library which is auto-generated by
733// development/vendor_snapshot/update.py. As a part of recovery snapshot, recovery_snapshot_shared
734// overrides the recovery variant of the cc shared library with the same name, if BOARD_VNDK_VERSION
735// is set.
736func RecoverySnapshotSharedFactory() android.Module {
Inseob Kim1b6fb872021-04-05 13:37:02 +0900737 module, prebuilt := snapshotLibraryFactory(recoverySnapshotImageSingleton, snapshotSharedSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900738 prebuilt.libraryDecorator.BuildOnlyShared()
739 return module.Init()
740}
741
742// vendor_snapshot_static is a special prebuilt static library which is auto-generated by
743// development/vendor_snapshot/update.py. As a part of vendor snapshot, vendor_snapshot_static
744// overrides the vendor variant of the cc static library with the same name, if BOARD_VNDK_VERSION
745// is set.
746func VendorSnapshotStaticFactory() android.Module {
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400747 module, prebuilt := snapshotLibraryFactory(VendorSnapshotImageSingleton, snapshotStaticSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900748 prebuilt.libraryDecorator.BuildOnlyStatic()
749 return module.Init()
750}
751
752// recovery_snapshot_static is a special prebuilt static library which is auto-generated by
753// development/vendor_snapshot/update.py. As a part of recovery snapshot, recovery_snapshot_static
754// overrides the recovery variant of the cc static library with the same name, if BOARD_VNDK_VERSION
755// is set.
756func RecoverySnapshotStaticFactory() android.Module {
Inseob Kim1b6fb872021-04-05 13:37:02 +0900757 module, prebuilt := snapshotLibraryFactory(recoverySnapshotImageSingleton, snapshotStaticSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900758 prebuilt.libraryDecorator.BuildOnlyStatic()
759 return module.Init()
760}
761
762// vendor_snapshot_header is a special header library which is auto-generated by
763// development/vendor_snapshot/update.py. As a part of vendor snapshot, vendor_snapshot_header
764// overrides the vendor variant of the cc header library with the same name, if BOARD_VNDK_VERSION
765// is set.
766func VendorSnapshotHeaderFactory() android.Module {
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400767 module, prebuilt := snapshotLibraryFactory(VendorSnapshotImageSingleton, snapshotHeaderSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900768 prebuilt.libraryDecorator.HeaderOnly()
769 return module.Init()
770}
771
772// recovery_snapshot_header is a special header library which is auto-generated by
773// development/vendor_snapshot/update.py. As a part of recovery snapshot, recovery_snapshot_header
774// overrides the recovery variant of the cc header library with the same name, if BOARD_VNDK_VERSION
775// is set.
776func RecoverySnapshotHeaderFactory() android.Module {
Inseob Kim1b6fb872021-04-05 13:37:02 +0900777 module, prebuilt := snapshotLibraryFactory(recoverySnapshotImageSingleton, snapshotHeaderSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900778 prebuilt.libraryDecorator.HeaderOnly()
779 return module.Init()
780}
781
782var _ snapshotSanitizer = (*snapshotLibraryDecorator)(nil)
783
784//
785// Module definitions for snapshots of executable binaries.
786//
787// Modules (vendor|recovery)_snapshot_binary are defined here. They have their prebuilt executable
788// binaries (e.g. toybox, sh) as their src, which can be installed.
789//
790// These modules are auto-generated by development/vendor_snapshot/update.py.
791type snapshotBinaryProperties struct {
792 // Prebuilt file for each arch.
793 Src *string `android:"arch_variant"`
794}
795
796type snapshotBinaryDecorator struct {
797 baseSnapshotDecorator
798 *binaryDecorator
Colin Crossa8890802021-01-22 14:06:33 -0800799 properties snapshotBinaryProperties
Inseob Kimde5744a2020-12-02 13:14:28 +0900800}
801
802func (p *snapshotBinaryDecorator) matchesWithDevice(config android.DeviceConfig) bool {
803 if config.DeviceArch() != p.arch() {
804 return false
805 }
806 if p.properties.Src == nil {
807 return false
808 }
809 return true
810}
811
812// cc modules' link functions are to link compiled objects into final binaries.
813// As snapshots are prebuilts, this just returns the prebuilt binary
814func (p *snapshotBinaryDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path {
Jose Galmes7fdc3362021-05-26 21:16:52 -0700815 p.setSnapshotAndroidMkSuffix(ctx, snapshotBinarySuffix)
Inseob Kim1b6fb872021-04-05 13:37:02 +0900816
Inseob Kimde5744a2020-12-02 13:14:28 +0900817 if !p.matchesWithDevice(ctx.DeviceConfig()) {
818 return nil
819 }
820
821 in := android.PathForModuleSrc(ctx, *p.properties.Src)
822 p.unstrippedOutputFile = in
823 binName := in.Base()
824
Inseob Kimde5744a2020-12-02 13:14:28 +0900825 // use cpExecutable to make it executable
826 outputFile := android.PathForModuleOut(ctx, binName)
827 ctx.Build(pctx, android.BuildParams{
828 Rule: android.CpExecutable,
829 Description: "prebuilt",
830 Output: outputFile,
831 Input: in,
832 })
833
834 return outputFile
835}
836
837func (p *snapshotBinaryDecorator) nativeCoverage() bool {
838 return false
839}
840
841// vendor_snapshot_binary is a special prebuilt executable binary which is auto-generated by
842// development/vendor_snapshot/update.py. As a part of vendor snapshot, vendor_snapshot_binary
843// overrides the vendor variant of the cc binary with the same name, if BOARD_VNDK_VERSION is set.
844func VendorSnapshotBinaryFactory() android.Module {
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400845 return snapshotBinaryFactory(VendorSnapshotImageSingleton, snapshotBinarySuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900846}
847
848// recovery_snapshot_binary is a special prebuilt executable binary which is auto-generated by
849// development/vendor_snapshot/update.py. As a part of recovery snapshot, recovery_snapshot_binary
850// overrides the recovery variant of the cc binary with the same name, if BOARD_VNDK_VERSION is set.
851func RecoverySnapshotBinaryFactory() android.Module {
Inseob Kim1b6fb872021-04-05 13:37:02 +0900852 return snapshotBinaryFactory(recoverySnapshotImageSingleton, snapshotBinarySuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900853}
854
Inseob Kim1b6fb872021-04-05 13:37:02 +0900855func snapshotBinaryFactory(image snapshotImage, moduleSuffix string) android.Module {
Inseob Kimde5744a2020-12-02 13:14:28 +0900856 module, binary := NewBinary(android.DeviceSupported)
857 binary.baseLinker.Properties.No_libcrt = BoolPtr(true)
858 binary.baseLinker.Properties.Nocrt = BoolPtr(true)
859
860 // Prevent default system libs (libc, libm, and libdl) from being linked
861 if binary.baseLinker.Properties.System_shared_libs == nil {
862 binary.baseLinker.Properties.System_shared_libs = []string{}
863 }
864
865 prebuilt := &snapshotBinaryDecorator{
866 binaryDecorator: binary,
867 }
868
869 module.compiler = nil
870 module.sanitize = nil
871 module.stl = nil
872 module.linker = prebuilt
873
Inseob Kim1b6fb872021-04-05 13:37:02 +0900874 prebuilt.init(module, image, moduleSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900875 module.AddProperties(&prebuilt.properties)
876 return module.Init()
877}
878
879//
880// Module definitions for snapshots of object files (*.o).
881//
882// Modules (vendor|recovery)_snapshot_object are defined here. They have their prebuilt object
883// files (*.o) as their src.
884//
885// These modules are auto-generated by development/vendor_snapshot/update.py.
886type vendorSnapshotObjectProperties struct {
887 // Prebuilt file for each arch.
888 Src *string `android:"arch_variant"`
889}
890
891type snapshotObjectLinker struct {
892 baseSnapshotDecorator
893 objectLinker
Colin Crossa8890802021-01-22 14:06:33 -0800894 properties vendorSnapshotObjectProperties
Inseob Kimde5744a2020-12-02 13:14:28 +0900895}
896
897func (p *snapshotObjectLinker) matchesWithDevice(config android.DeviceConfig) bool {
898 if config.DeviceArch() != p.arch() {
899 return false
900 }
901 if p.properties.Src == nil {
902 return false
903 }
904 return true
905}
906
907// cc modules' link functions are to link compiled objects into final binaries.
908// As snapshots are prebuilts, this just returns the prebuilt binary
909func (p *snapshotObjectLinker) link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path {
Jose Galmes7fdc3362021-05-26 21:16:52 -0700910 p.setSnapshotAndroidMkSuffix(ctx, snapshotObjectSuffix)
Inseob Kim1b6fb872021-04-05 13:37:02 +0900911
Inseob Kimde5744a2020-12-02 13:14:28 +0900912 if !p.matchesWithDevice(ctx.DeviceConfig()) {
913 return nil
914 }
915
Inseob Kimde5744a2020-12-02 13:14:28 +0900916 return android.PathForModuleSrc(ctx, *p.properties.Src)
917}
918
919func (p *snapshotObjectLinker) nativeCoverage() bool {
920 return false
921}
922
923// vendor_snapshot_object is a special prebuilt compiled object file which is auto-generated by
924// development/vendor_snapshot/update.py. As a part of vendor snapshot, vendor_snapshot_object
925// overrides the vendor variant of the cc object with the same name, if BOARD_VNDK_VERSION is set.
926func VendorSnapshotObjectFactory() android.Module {
927 module := newObject()
928
929 prebuilt := &snapshotObjectLinker{
930 objectLinker: objectLinker{
931 baseLinker: NewBaseLinker(nil),
932 },
933 }
934 module.linker = prebuilt
935
Ivan Lozanod67a6b02021-05-20 13:01:32 -0400936 prebuilt.init(module, VendorSnapshotImageSingleton, snapshotObjectSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900937 module.AddProperties(&prebuilt.properties)
938 return module.Init()
939}
940
941// recovery_snapshot_object is a special prebuilt compiled object file which is auto-generated by
942// development/vendor_snapshot/update.py. As a part of recovery snapshot, recovery_snapshot_object
943// overrides the recovery variant of the cc object with the same name, if BOARD_VNDK_VERSION is set.
944func RecoverySnapshotObjectFactory() android.Module {
945 module := newObject()
946
947 prebuilt := &snapshotObjectLinker{
948 objectLinker: objectLinker{
949 baseLinker: NewBaseLinker(nil),
950 },
951 }
952 module.linker = prebuilt
953
Inseob Kim1b6fb872021-04-05 13:37:02 +0900954 prebuilt.init(module, recoverySnapshotImageSingleton, snapshotObjectSuffix)
Inseob Kimde5744a2020-12-02 13:14:28 +0900955 module.AddProperties(&prebuilt.properties)
956 return module.Init()
957}
958
959type snapshotInterface interface {
960 matchesWithDevice(config android.DeviceConfig) bool
Colin Crossa8890802021-01-22 14:06:33 -0800961 isSnapshotPrebuilt() bool
962 version() string
963 snapshotAndroidMkSuffix() string
Inseob Kimde5744a2020-12-02 13:14:28 +0900964}
965
966var _ snapshotInterface = (*vndkPrebuiltLibraryDecorator)(nil)
967var _ snapshotInterface = (*snapshotLibraryDecorator)(nil)
968var _ snapshotInterface = (*snapshotBinaryDecorator)(nil)
969var _ snapshotInterface = (*snapshotObjectLinker)(nil)