blob: 9cad05656f103ab6bb867d7d479230cfd28c2df6 [file] [log] [blame]
Colin Cross7228ecd2019-11-18 16:00:16 -08001// Copyright 2019 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
15package android
16
Colin Crossae6c5202019-11-20 13:35:50 -080017// ImageInterface is implemented by modules that need to be split by the imageMutator.
Colin Cross7228ecd2019-11-18 16:00:16 -080018type ImageInterface interface {
19 // ImageMutatorBegin is called before any other method in the ImageInterface.
20 ImageMutatorBegin(ctx BaseModuleContext)
21
22 // CoreVariantNeeded should return true if the module needs a core variant (installed on the system image).
23 CoreVariantNeeded(ctx BaseModuleContext) bool
24
Yifan Hong1b3348d2020-01-21 15:53:22 -080025 // RamdiskVariantNeeded should return true if the module needs a ramdisk variant (installed on the
26 // ramdisk partition).
27 RamdiskVariantNeeded(ctx BaseModuleContext) bool
28
Yifan Hong60e0cfb2020-10-21 15:17:56 -070029 // VendorRamdiskVariantNeeded should return true if the module needs a vendor ramdisk variant (installed on the
30 // vendor ramdisk partition).
31 VendorRamdiskVariantNeeded(ctx BaseModuleContext) bool
32
Inseob Kim08758f02021-04-08 21:13:22 +090033 // DebugRamdiskVariantNeeded should return true if the module needs a debug ramdisk variant (installed on the
34 // debug ramdisk partition: $(PRODUCT_OUT)/debug_ramdisk).
35 DebugRamdiskVariantNeeded(ctx BaseModuleContext) bool
36
Colin Cross7228ecd2019-11-18 16:00:16 -080037 // RecoveryVariantNeeded should return true if the module needs a recovery variant (installed on the
38 // recovery partition).
39 RecoveryVariantNeeded(ctx BaseModuleContext) bool
40
41 // ExtraImageVariations should return a list of the additional variations needed for the module. After the
42 // variants are created the SetImageVariation method will be called on each newly created variant with the
43 // its variation.
44 ExtraImageVariations(ctx BaseModuleContext) []string
45
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +020046 // SetImageVariation is called for each newly created image variant. The receiver is the original
Jihoon Kang7583e832024-06-13 21:25:45 +000047 // module, "variation" is the name of the newly created variant. "variation" is set on the receiver.
48 SetImageVariation(ctx BaseModuleContext, variation string)
Colin Cross7228ecd2019-11-18 16:00:16 -080049}
50
51const (
52 // CoreVariation is the variant used for framework-private libraries, or
53 // SDK libraries. (which framework-private libraries can use), which
54 // will be installed to the system image.
Colin Cross7113d202019-11-20 16:39:12 -080055 CoreVariation string = ""
Colin Cross7228ecd2019-11-18 16:00:16 -080056
57 // RecoveryVariation means a module to be installed to recovery image.
58 RecoveryVariation string = "recovery"
Yifan Hong1b3348d2020-01-21 15:53:22 -080059
60 // RamdiskVariation means a module to be installed to ramdisk image.
61 RamdiskVariation string = "ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -070062
63 // VendorRamdiskVariation means a module to be installed to vendor ramdisk image.
64 VendorRamdiskVariation string = "vendor_ramdisk"
Inseob Kim08758f02021-04-08 21:13:22 +090065
66 // DebugRamdiskVariation means a module to be installed to debug ramdisk image.
67 DebugRamdiskVariation string = "debug_ramdisk"
Colin Cross7228ecd2019-11-18 16:00:16 -080068)
69
Colin Crossae6c5202019-11-20 13:35:50 -080070// imageMutator creates variants for modules that implement the ImageInterface that
Colin Cross7228ecd2019-11-18 16:00:16 -080071// allow them to build differently for each partition (recovery, core, vendor, etc.).
Colin Crossae6c5202019-11-20 13:35:50 -080072func imageMutator(ctx BottomUpMutatorContext) {
Colin Cross7228ecd2019-11-18 16:00:16 -080073 if ctx.Os() != Android {
74 return
75 }
76
77 if m, ok := ctx.Module().(ImageInterface); ok {
78 m.ImageMutatorBegin(ctx)
79
80 var variations []string
81
82 if m.CoreVariantNeeded(ctx) {
83 variations = append(variations, CoreVariation)
84 }
Yifan Hong1b3348d2020-01-21 15:53:22 -080085 if m.RamdiskVariantNeeded(ctx) {
86 variations = append(variations, RamdiskVariation)
87 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -070088 if m.VendorRamdiskVariantNeeded(ctx) {
89 variations = append(variations, VendorRamdiskVariation)
90 }
Inseob Kim08758f02021-04-08 21:13:22 +090091 if m.DebugRamdiskVariantNeeded(ctx) {
92 variations = append(variations, DebugRamdiskVariation)
93 }
Colin Cross7228ecd2019-11-18 16:00:16 -080094 if m.RecoveryVariantNeeded(ctx) {
95 variations = append(variations, RecoveryVariation)
96 }
97
98 extraVariations := m.ExtraImageVariations(ctx)
99 variations = append(variations, extraVariations...)
100
101 if len(variations) == 0 {
102 return
103 }
104
105 mod := ctx.CreateVariations(variations...)
106 for i, v := range variations {
107 mod[i].base().setImageVariation(v)
Jihoon Kang7583e832024-06-13 21:25:45 +0000108 mod[i].(ImageInterface).SetImageVariation(ctx, v)
Colin Cross7228ecd2019-11-18 16:00:16 -0800109 }
110 }
111}