xref: /aosp_15_r20/build/soong/cc/image.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//	http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Workerpackage cc
15*333d2b36SAndroid Build Coastguard Worker
16*333d2b36SAndroid Build Coastguard Worker// This file contains image variant related things, including image mutator functions, utility
17*333d2b36SAndroid Build Coastguard Worker// functions to determine where a module is installed, etc.
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Workerimport (
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workervar _ android.ImageInterface = (*Module)(nil)
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Workertype ImageVariantType string
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerconst (
32*333d2b36SAndroid Build Coastguard Worker	coreImageVariant          ImageVariantType = "core"
33*333d2b36SAndroid Build Coastguard Worker	vendorImageVariant        ImageVariantType = "vendor"
34*333d2b36SAndroid Build Coastguard Worker	productImageVariant       ImageVariantType = "product"
35*333d2b36SAndroid Build Coastguard Worker	ramdiskImageVariant       ImageVariantType = "ramdisk"
36*333d2b36SAndroid Build Coastguard Worker	vendorRamdiskImageVariant ImageVariantType = "vendor_ramdisk"
37*333d2b36SAndroid Build Coastguard Worker	recoveryImageVariant      ImageVariantType = "recovery"
38*333d2b36SAndroid Build Coastguard Worker	hostImageVariant          ImageVariantType = "host"
39*333d2b36SAndroid Build Coastguard Worker)
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workerconst (
42*333d2b36SAndroid Build Coastguard Worker	// VendorVariationPrefix is the variant prefix used for /vendor code that compiles
43*333d2b36SAndroid Build Coastguard Worker	// against the VNDK.
44*333d2b36SAndroid Build Coastguard Worker	VendorVariationPrefix = "vendor."
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	// ProductVariationPrefix is the variant prefix used for /product code that compiles
47*333d2b36SAndroid Build Coastguard Worker	// against the VNDK.
48*333d2b36SAndroid Build Coastguard Worker	ProductVariationPrefix = "product."
49*333d2b36SAndroid Build Coastguard Worker)
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inProduct() bool {
52*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.InProduct()
53*333d2b36SAndroid Build Coastguard Worker}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inVendor() bool {
56*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.InVendor()
57*333d2b36SAndroid Build Coastguard Worker}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inRamdisk() bool {
60*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.InRamdisk()
61*333d2b36SAndroid Build Coastguard Worker}
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inVendorRamdisk() bool {
64*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.InVendorRamdisk()
65*333d2b36SAndroid Build Coastguard Worker}
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContextImpl) inRecovery() bool {
68*333d2b36SAndroid Build Coastguard Worker	return ctx.mod.InRecovery()
69*333d2b36SAndroid Build Coastguard Worker}
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInProduct() bool {
72*333d2b36SAndroid Build Coastguard Worker	// Additionally check if this module is inProduct() that means it is a "product" variant of a
73*333d2b36SAndroid Build Coastguard Worker	// module. As well as product specific modules, product variants must be installed to /product.
74*333d2b36SAndroid Build Coastguard Worker	return c.InProduct()
75*333d2b36SAndroid Build Coastguard Worker}
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInVendor() bool {
78*333d2b36SAndroid Build Coastguard Worker	// Additionally check if this module is inVendor() that means it is a "vendor" variant of a
79*333d2b36SAndroid Build Coastguard Worker	// module. As well as SoC specific modules, vendor variants must be installed to /vendor
80*333d2b36SAndroid Build Coastguard Worker	// unless they have "odm_available: true".
81*333d2b36SAndroid Build Coastguard Worker	return c.HasVendorVariant() && c.InVendor() && !c.VendorVariantToOdm()
82*333d2b36SAndroid Build Coastguard Worker}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InstallInOdm() bool {
85*333d2b36SAndroid Build Coastguard Worker	// Some vendor variants want to be installed to /odm by setting "odm_available: true".
86*333d2b36SAndroid Build Coastguard Worker	return c.InVendor() && c.VendorVariantToOdm()
87*333d2b36SAndroid Build Coastguard Worker}
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and vendor variants.
90*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasVendorVariant() bool {
91*333d2b36SAndroid Build Coastguard Worker	return Bool(c.VendorProperties.Vendor_available) || Bool(c.VendorProperties.Odm_available)
92*333d2b36SAndroid Build Coastguard Worker}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker// Returns true when this module creates a vendor variant and wants to install the vendor variant
95*333d2b36SAndroid Build Coastguard Worker// to the odm partition.
96*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorVariantToOdm() bool {
97*333d2b36SAndroid Build Coastguard Worker	return Bool(c.VendorProperties.Odm_available)
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and product variants.
101*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasProductVariant() bool {
102*333d2b36SAndroid Build Coastguard Worker	return Bool(c.VendorProperties.Product_available)
103*333d2b36SAndroid Build Coastguard Worker}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker// Returns true when this module is configured to have core and either product or vendor variants.
106*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) HasNonSystemVariants() bool {
107*333d2b36SAndroid Build Coastguard Worker	return c.HasVendorVariant() || c.HasProductVariant()
108*333d2b36SAndroid Build Coastguard Worker}
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "product" variant. Usually these modules are installed in /product
111*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InProduct() bool {
112*333d2b36SAndroid Build Coastguard Worker	return c.Properties.ImageVariation == android.ProductVariation
113*333d2b36SAndroid Build Coastguard Worker}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "vendor" variant. Usually these modules are installed in /vendor
116*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InVendor() bool {
117*333d2b36SAndroid Build Coastguard Worker	return c.Properties.ImageVariation == android.VendorVariation
118*333d2b36SAndroid Build Coastguard Worker}
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker// Returns true if the module is "vendor" or "product" variant. This replaces previous UseVndk usages
121*333d2b36SAndroid Build Coastguard Worker// which were misused to check if the module variant is vendor or product.
122*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InVendorOrProduct() bool {
123*333d2b36SAndroid Build Coastguard Worker	return c.InVendor() || c.InProduct()
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InRamdisk() bool {
127*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.InRamdisk() || c.ModuleBase.InstallInRamdisk()
128*333d2b36SAndroid Build Coastguard Worker}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InVendorRamdisk() bool {
131*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.InVendorRamdisk() || c.ModuleBase.InstallInVendorRamdisk()
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) InRecovery() bool {
135*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.InRecovery() || c.ModuleBase.InstallInRecovery()
136*333d2b36SAndroid Build Coastguard Worker}
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OnlyInRamdisk() bool {
139*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.InstallInRamdisk()
140*333d2b36SAndroid Build Coastguard Worker}
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OnlyInVendorRamdisk() bool {
143*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.InstallInVendorRamdisk()
144*333d2b36SAndroid Build Coastguard Worker}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) OnlyInRecovery() bool {
147*333d2b36SAndroid Build Coastguard Worker	return c.ModuleBase.InstallInRecovery()
148*333d2b36SAndroid Build Coastguard Worker}
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker// ImageMutatableModule provides a common image mutation interface for  LinkableInterface modules.
151*333d2b36SAndroid Build Coastguard Workertype ImageMutatableModule interface {
152*333d2b36SAndroid Build Coastguard Worker	android.Module
153*333d2b36SAndroid Build Coastguard Worker	LinkableInterface
154*333d2b36SAndroid Build Coastguard Worker
155*333d2b36SAndroid Build Coastguard Worker	// AndroidModuleBase returns the android.ModuleBase for this module
156*333d2b36SAndroid Build Coastguard Worker	AndroidModuleBase() *android.ModuleBase
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	// VendorAvailable returns true if this module is available on the vendor image.
159*333d2b36SAndroid Build Coastguard Worker	VendorAvailable() bool
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker	// OdmAvailable returns true if this module is available on the odm image.
162*333d2b36SAndroid Build Coastguard Worker	OdmAvailable() bool
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Worker	// ProductAvailable returns true if this module is available on the product image.
165*333d2b36SAndroid Build Coastguard Worker	ProductAvailable() bool
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker	// RamdiskAvailable returns true if this module is available on the ramdisk image.
168*333d2b36SAndroid Build Coastguard Worker	RamdiskAvailable() bool
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker	// RecoveryAvailable returns true if this module is available on the recovery image.
171*333d2b36SAndroid Build Coastguard Worker	RecoveryAvailable() bool
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Worker	// VendorRamdiskAvailable returns true if this module is available on the vendor ramdisk image.
174*333d2b36SAndroid Build Coastguard Worker	VendorRamdiskAvailable() bool
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker	// IsSnapshotPrebuilt returns true if this module is a snapshot prebuilt.
177*333d2b36SAndroid Build Coastguard Worker	IsSnapshotPrebuilt() bool
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	// SnapshotVersion returns the snapshot version for this module.
180*333d2b36SAndroid Build Coastguard Worker	SnapshotVersion(mctx android.ImageInterfaceContext) string
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Worker	// ExtraVariants returns the list of extra variants this module requires.
183*333d2b36SAndroid Build Coastguard Worker	ExtraVariants() []string
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Worker	// AppendExtraVariant returns an extra variant to the list of extra variants this module requires.
186*333d2b36SAndroid Build Coastguard Worker	AppendExtraVariant(extraVariant string)
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Worker	// SetRamdiskVariantNeeded sets whether the Ramdisk Variant is needed.
189*333d2b36SAndroid Build Coastguard Worker	SetRamdiskVariantNeeded(b bool)
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	// SetVendorRamdiskVariantNeeded sets whether the Vendor Ramdisk Variant is needed.
192*333d2b36SAndroid Build Coastguard Worker	SetVendorRamdiskVariantNeeded(b bool)
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker	// SetRecoveryVariantNeeded sets whether the Recovery Variant is needed.
195*333d2b36SAndroid Build Coastguard Worker	SetRecoveryVariantNeeded(b bool)
196*333d2b36SAndroid Build Coastguard Worker
197*333d2b36SAndroid Build Coastguard Worker	// SetCoreVariantNeeded sets whether the Core Variant is needed.
198*333d2b36SAndroid Build Coastguard Worker	SetCoreVariantNeeded(b bool)
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Worker	// SetProductVariantNeeded sets whether the Product Variant is needed.
201*333d2b36SAndroid Build Coastguard Worker	SetProductVariantNeeded(b bool)
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Worker	// SetVendorVariantNeeded sets whether the Vendor Variant is needed.
204*333d2b36SAndroid Build Coastguard Worker	SetVendorVariantNeeded(b bool)
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workervar _ ImageMutatableModule = (*Module)(nil)
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) ImageMutatorBegin(mctx android.ImageInterfaceContext) {
210*333d2b36SAndroid Build Coastguard Worker	MutateImage(mctx, m)
211*333d2b36SAndroid Build Coastguard Worker}
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) VendorAvailable() bool {
214*333d2b36SAndroid Build Coastguard Worker	return Bool(m.VendorProperties.Vendor_available)
215*333d2b36SAndroid Build Coastguard Worker}
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) OdmAvailable() bool {
218*333d2b36SAndroid Build Coastguard Worker	return Bool(m.VendorProperties.Odm_available)
219*333d2b36SAndroid Build Coastguard Worker}
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) ProductAvailable() bool {
222*333d2b36SAndroid Build Coastguard Worker	return Bool(m.VendorProperties.Product_available)
223*333d2b36SAndroid Build Coastguard Worker}
224*333d2b36SAndroid Build Coastguard Worker
225*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) RamdiskAvailable() bool {
226*333d2b36SAndroid Build Coastguard Worker	return Bool(m.Properties.Ramdisk_available)
227*333d2b36SAndroid Build Coastguard Worker}
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) VendorRamdiskAvailable() bool {
230*333d2b36SAndroid Build Coastguard Worker	return Bool(m.Properties.Vendor_ramdisk_available)
231*333d2b36SAndroid Build Coastguard Worker}
232*333d2b36SAndroid Build Coastguard Worker
233*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) AndroidModuleBase() *android.ModuleBase {
234*333d2b36SAndroid Build Coastguard Worker	return &m.ModuleBase
235*333d2b36SAndroid Build Coastguard Worker}
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) RecoveryAvailable() bool {
238*333d2b36SAndroid Build Coastguard Worker	return Bool(m.Properties.Recovery_available)
239*333d2b36SAndroid Build Coastguard Worker}
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) ExtraVariants() []string {
242*333d2b36SAndroid Build Coastguard Worker	return m.Properties.ExtraVersionedImageVariations
243*333d2b36SAndroid Build Coastguard Worker}
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) AppendExtraVariant(extraVariant string) {
246*333d2b36SAndroid Build Coastguard Worker	m.Properties.ExtraVersionedImageVariations = append(m.Properties.ExtraVersionedImageVariations, extraVariant)
247*333d2b36SAndroid Build Coastguard Worker}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetRamdiskVariantNeeded(b bool) {
250*333d2b36SAndroid Build Coastguard Worker	m.Properties.RamdiskVariantNeeded = b
251*333d2b36SAndroid Build Coastguard Worker}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetVendorRamdiskVariantNeeded(b bool) {
254*333d2b36SAndroid Build Coastguard Worker	m.Properties.VendorRamdiskVariantNeeded = b
255*333d2b36SAndroid Build Coastguard Worker}
256*333d2b36SAndroid Build Coastguard Worker
257*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetRecoveryVariantNeeded(b bool) {
258*333d2b36SAndroid Build Coastguard Worker	m.Properties.RecoveryVariantNeeded = b
259*333d2b36SAndroid Build Coastguard Worker}
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetCoreVariantNeeded(b bool) {
262*333d2b36SAndroid Build Coastguard Worker	m.Properties.CoreVariantNeeded = b
263*333d2b36SAndroid Build Coastguard Worker}
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetProductVariantNeeded(b bool) {
266*333d2b36SAndroid Build Coastguard Worker	m.Properties.ProductVariantNeeded = b
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SetVendorVariantNeeded(b bool) {
270*333d2b36SAndroid Build Coastguard Worker	m.Properties.VendorVariantNeeded = b
271*333d2b36SAndroid Build Coastguard Worker}
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) SnapshotVersion(mctx android.ImageInterfaceContext) string {
274*333d2b36SAndroid Build Coastguard Worker	if snapshot, ok := m.linker.(SnapshotInterface); ok {
275*333d2b36SAndroid Build Coastguard Worker		return snapshot.Version()
276*333d2b36SAndroid Build Coastguard Worker	} else {
277*333d2b36SAndroid Build Coastguard Worker		mctx.ModuleErrorf("version is unknown for snapshot prebuilt")
278*333d2b36SAndroid Build Coastguard Worker		// Should we be panicking here instead?
279*333d2b36SAndroid Build Coastguard Worker		return ""
280*333d2b36SAndroid Build Coastguard Worker	}
281*333d2b36SAndroid Build Coastguard Worker}
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) KernelHeadersDecorator() bool {
284*333d2b36SAndroid Build Coastguard Worker	if _, ok := m.linker.(*kernelHeadersDecorator); ok {
285*333d2b36SAndroid Build Coastguard Worker		return true
286*333d2b36SAndroid Build Coastguard Worker	}
287*333d2b36SAndroid Build Coastguard Worker	return false
288*333d2b36SAndroid Build Coastguard Worker}
289*333d2b36SAndroid Build Coastguard Worker
290*333d2b36SAndroid Build Coastguard Worker// MutateImage handles common image mutations for ImageMutatableModule interfaces.
291*333d2b36SAndroid Build Coastguard Workerfunc MutateImage(mctx android.ImageInterfaceContext, m ImageMutatableModule) {
292*333d2b36SAndroid Build Coastguard Worker	// Validation check
293*333d2b36SAndroid Build Coastguard Worker	vendorSpecific := mctx.SocSpecific() || mctx.DeviceSpecific()
294*333d2b36SAndroid Build Coastguard Worker	productSpecific := mctx.ProductSpecific()
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Worker	if m.VendorAvailable() {
297*333d2b36SAndroid Build Coastguard Worker		if vendorSpecific {
298*333d2b36SAndroid Build Coastguard Worker			mctx.PropertyErrorf("vendor_available",
299*333d2b36SAndroid Build Coastguard Worker				"doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific: true`")
300*333d2b36SAndroid Build Coastguard Worker		}
301*333d2b36SAndroid Build Coastguard Worker		if m.OdmAvailable() {
302*333d2b36SAndroid Build Coastguard Worker			mctx.PropertyErrorf("vendor_available",
303*333d2b36SAndroid Build Coastguard Worker				"doesn't make sense at the same time as `odm_available: true`")
304*333d2b36SAndroid Build Coastguard Worker		}
305*333d2b36SAndroid Build Coastguard Worker	}
306*333d2b36SAndroid Build Coastguard Worker
307*333d2b36SAndroid Build Coastguard Worker	if m.OdmAvailable() {
308*333d2b36SAndroid Build Coastguard Worker		if vendorSpecific {
309*333d2b36SAndroid Build Coastguard Worker			mctx.PropertyErrorf("odm_available",
310*333d2b36SAndroid Build Coastguard Worker				"doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific: true`")
311*333d2b36SAndroid Build Coastguard Worker		}
312*333d2b36SAndroid Build Coastguard Worker	}
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Worker	if m.ProductAvailable() {
315*333d2b36SAndroid Build Coastguard Worker		if productSpecific {
316*333d2b36SAndroid Build Coastguard Worker			mctx.PropertyErrorf("product_available",
317*333d2b36SAndroid Build Coastguard Worker				"doesn't make sense at the same time as `product_specific: true`")
318*333d2b36SAndroid Build Coastguard Worker		}
319*333d2b36SAndroid Build Coastguard Worker		if vendorSpecific {
320*333d2b36SAndroid Build Coastguard Worker			mctx.PropertyErrorf("product_available",
321*333d2b36SAndroid Build Coastguard Worker				"cannot provide product variant from a vendor module. Please use `product_specific: true` with `vendor_available: true`")
322*333d2b36SAndroid Build Coastguard Worker		}
323*333d2b36SAndroid Build Coastguard Worker	}
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker	var vendorVariantNeeded bool = false
326*333d2b36SAndroid Build Coastguard Worker	var productVariantNeeded bool = false
327*333d2b36SAndroid Build Coastguard Worker	var coreVariantNeeded bool = false
328*333d2b36SAndroid Build Coastguard Worker	var ramdiskVariantNeeded bool = false
329*333d2b36SAndroid Build Coastguard Worker	var vendorRamdiskVariantNeeded bool = false
330*333d2b36SAndroid Build Coastguard Worker	var recoveryVariantNeeded bool = false
331*333d2b36SAndroid Build Coastguard Worker
332*333d2b36SAndroid Build Coastguard Worker	if m.NeedsLlndkVariants() {
333*333d2b36SAndroid Build Coastguard Worker		// This is an LLNDK library.  The implementation of the library will be on /system,
334*333d2b36SAndroid Build Coastguard Worker		// and vendor and product variants will be created with LLNDK stubs.
335*333d2b36SAndroid Build Coastguard Worker		// The LLNDK libraries need vendor variants even if there is no VNDK.
336*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = true
337*333d2b36SAndroid Build Coastguard Worker		vendorVariantNeeded = true
338*333d2b36SAndroid Build Coastguard Worker		productVariantNeeded = true
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Worker	} else if m.NeedsVendorPublicLibraryVariants() {
341*333d2b36SAndroid Build Coastguard Worker		// A vendor public library has the implementation on /vendor, with stub variants
342*333d2b36SAndroid Build Coastguard Worker		// for system and product.
343*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = true
344*333d2b36SAndroid Build Coastguard Worker		vendorVariantNeeded = true
345*333d2b36SAndroid Build Coastguard Worker		productVariantNeeded = true
346*333d2b36SAndroid Build Coastguard Worker	} else if m.IsSnapshotPrebuilt() {
347*333d2b36SAndroid Build Coastguard Worker		// Make vendor variants only for the versions in BOARD_VNDK_VERSION and
348*333d2b36SAndroid Build Coastguard Worker		// PRODUCT_EXTRA_VNDK_VERSIONS.
349*333d2b36SAndroid Build Coastguard Worker		if m.InstallInRecovery() {
350*333d2b36SAndroid Build Coastguard Worker			recoveryVariantNeeded = true
351*333d2b36SAndroid Build Coastguard Worker		} else {
352*333d2b36SAndroid Build Coastguard Worker			m.AppendExtraVariant(VendorVariationPrefix + m.SnapshotVersion(mctx))
353*333d2b36SAndroid Build Coastguard Worker		}
354*333d2b36SAndroid Build Coastguard Worker	} else if m.HasNonSystemVariants() {
355*333d2b36SAndroid Build Coastguard Worker		// This will be available to /system unless it is product_specific
356*333d2b36SAndroid Build Coastguard Worker		// which will be handled later.
357*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = true
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker		// We assume that modules under proprietary paths are compatible for
360*333d2b36SAndroid Build Coastguard Worker		// BOARD_VNDK_VERSION. The other modules are regarded as AOSP, or
361*333d2b36SAndroid Build Coastguard Worker		// PLATFORM_VNDK_VERSION.
362*333d2b36SAndroid Build Coastguard Worker		if m.HasVendorVariant() {
363*333d2b36SAndroid Build Coastguard Worker			vendorVariantNeeded = true
364*333d2b36SAndroid Build Coastguard Worker		}
365*333d2b36SAndroid Build Coastguard Worker
366*333d2b36SAndroid Build Coastguard Worker		// product_available modules are available to /product.
367*333d2b36SAndroid Build Coastguard Worker		if m.HasProductVariant() {
368*333d2b36SAndroid Build Coastguard Worker			productVariantNeeded = true
369*333d2b36SAndroid Build Coastguard Worker		}
370*333d2b36SAndroid Build Coastguard Worker	} else if vendorSpecific {
371*333d2b36SAndroid Build Coastguard Worker		// This will be available in /vendor (or /odm) only
372*333d2b36SAndroid Build Coastguard Worker		vendorVariantNeeded = true
373*333d2b36SAndroid Build Coastguard Worker	} else {
374*333d2b36SAndroid Build Coastguard Worker		// This is either in /system (or similar: /data), or is a
375*333d2b36SAndroid Build Coastguard Worker		// module built with the NDK. Modules built with the NDK
376*333d2b36SAndroid Build Coastguard Worker		// will be restricted using the existing link type checks.
377*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = true
378*333d2b36SAndroid Build Coastguard Worker	}
379*333d2b36SAndroid Build Coastguard Worker
380*333d2b36SAndroid Build Coastguard Worker	if coreVariantNeeded && productSpecific {
381*333d2b36SAndroid Build Coastguard Worker		// The module has "product_specific: true" that does not create core variant.
382*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = false
383*333d2b36SAndroid Build Coastguard Worker		productVariantNeeded = true
384*333d2b36SAndroid Build Coastguard Worker	}
385*333d2b36SAndroid Build Coastguard Worker
386*333d2b36SAndroid Build Coastguard Worker	if m.RamdiskAvailable() {
387*333d2b36SAndroid Build Coastguard Worker		ramdiskVariantNeeded = true
388*333d2b36SAndroid Build Coastguard Worker	}
389*333d2b36SAndroid Build Coastguard Worker
390*333d2b36SAndroid Build Coastguard Worker	if m.AndroidModuleBase().InstallInRamdisk() {
391*333d2b36SAndroid Build Coastguard Worker		ramdiskVariantNeeded = true
392*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = false
393*333d2b36SAndroid Build Coastguard Worker	}
394*333d2b36SAndroid Build Coastguard Worker
395*333d2b36SAndroid Build Coastguard Worker	if m.VendorRamdiskAvailable() {
396*333d2b36SAndroid Build Coastguard Worker		vendorRamdiskVariantNeeded = true
397*333d2b36SAndroid Build Coastguard Worker	}
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Worker	if m.AndroidModuleBase().InstallInVendorRamdisk() {
400*333d2b36SAndroid Build Coastguard Worker		vendorRamdiskVariantNeeded = true
401*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = false
402*333d2b36SAndroid Build Coastguard Worker	}
403*333d2b36SAndroid Build Coastguard Worker
404*333d2b36SAndroid Build Coastguard Worker	if m.RecoveryAvailable() {
405*333d2b36SAndroid Build Coastguard Worker		recoveryVariantNeeded = true
406*333d2b36SAndroid Build Coastguard Worker	}
407*333d2b36SAndroid Build Coastguard Worker
408*333d2b36SAndroid Build Coastguard Worker	if m.AndroidModuleBase().InstallInRecovery() {
409*333d2b36SAndroid Build Coastguard Worker		recoveryVariantNeeded = true
410*333d2b36SAndroid Build Coastguard Worker		coreVariantNeeded = false
411*333d2b36SAndroid Build Coastguard Worker	}
412*333d2b36SAndroid Build Coastguard Worker
413*333d2b36SAndroid Build Coastguard Worker	m.SetRamdiskVariantNeeded(ramdiskVariantNeeded)
414*333d2b36SAndroid Build Coastguard Worker	m.SetVendorRamdiskVariantNeeded(vendorRamdiskVariantNeeded)
415*333d2b36SAndroid Build Coastguard Worker	m.SetRecoveryVariantNeeded(recoveryVariantNeeded)
416*333d2b36SAndroid Build Coastguard Worker	m.SetCoreVariantNeeded(coreVariantNeeded)
417*333d2b36SAndroid Build Coastguard Worker	m.SetProductVariantNeeded(productVariantNeeded)
418*333d2b36SAndroid Build Coastguard Worker	m.SetVendorVariantNeeded(vendorVariantNeeded)
419*333d2b36SAndroid Build Coastguard Worker
420*333d2b36SAndroid Build Coastguard Worker	// Disable the module if no variants are needed.
421*333d2b36SAndroid Build Coastguard Worker	if !ramdiskVariantNeeded &&
422*333d2b36SAndroid Build Coastguard Worker		!recoveryVariantNeeded &&
423*333d2b36SAndroid Build Coastguard Worker		!coreVariantNeeded &&
424*333d2b36SAndroid Build Coastguard Worker		!productVariantNeeded &&
425*333d2b36SAndroid Build Coastguard Worker		!vendorVariantNeeded &&
426*333d2b36SAndroid Build Coastguard Worker		len(m.ExtraVariants()) == 0 {
427*333d2b36SAndroid Build Coastguard Worker		m.Disable()
428*333d2b36SAndroid Build Coastguard Worker	}
429*333d2b36SAndroid Build Coastguard Worker}
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool {
432*333d2b36SAndroid Build Coastguard Worker	return c.Properties.VendorVariantNeeded
433*333d2b36SAndroid Build Coastguard Worker}
434*333d2b36SAndroid Build Coastguard Worker
435*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool {
436*333d2b36SAndroid Build Coastguard Worker	return c.Properties.ProductVariantNeeded
437*333d2b36SAndroid Build Coastguard Worker}
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool {
440*333d2b36SAndroid Build Coastguard Worker	return c.Properties.CoreVariantNeeded
441*333d2b36SAndroid Build Coastguard Worker}
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool {
444*333d2b36SAndroid Build Coastguard Worker	return c.Properties.RamdiskVariantNeeded
445*333d2b36SAndroid Build Coastguard Worker}
446*333d2b36SAndroid Build Coastguard Worker
447*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool {
448*333d2b36SAndroid Build Coastguard Worker	return c.Properties.VendorRamdiskVariantNeeded
449*333d2b36SAndroid Build Coastguard Worker}
450*333d2b36SAndroid Build Coastguard Worker
451*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool {
452*333d2b36SAndroid Build Coastguard Worker	return false
453*333d2b36SAndroid Build Coastguard Worker}
454*333d2b36SAndroid Build Coastguard Worker
455*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) RecoveryVariantNeeded(ctx android.ImageInterfaceContext) bool {
456*333d2b36SAndroid Build Coastguard Worker	return c.Properties.RecoveryVariantNeeded
457*333d2b36SAndroid Build Coastguard Worker}
458*333d2b36SAndroid Build Coastguard Worker
459*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) ExtraImageVariations(ctx android.ImageInterfaceContext) []string {
460*333d2b36SAndroid Build Coastguard Worker	return c.Properties.ExtraVersionedImageVariations
461*333d2b36SAndroid Build Coastguard Worker}
462*333d2b36SAndroid Build Coastguard Worker
463*333d2b36SAndroid Build Coastguard Workerfunc squashVendorSrcs(m *Module) {
464*333d2b36SAndroid Build Coastguard Worker	if lib, ok := m.compiler.(*libraryDecorator); ok {
465*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Vendor.Srcs)
466*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs)
467*333d2b36SAndroid Build Coastguard Worker
468*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
469*333d2b36SAndroid Build Coastguard Worker			lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...)
470*333d2b36SAndroid Build Coastguard Worker
471*333d2b36SAndroid Build Coastguard Worker		if lib.Properties.Target.Vendor.No_stubs {
472*333d2b36SAndroid Build Coastguard Worker			proptools.Clear(&lib.Properties.Stubs)
473*333d2b36SAndroid Build Coastguard Worker		}
474*333d2b36SAndroid Build Coastguard Worker	}
475*333d2b36SAndroid Build Coastguard Worker}
476*333d2b36SAndroid Build Coastguard Worker
477*333d2b36SAndroid Build Coastguard Workerfunc squashProductSrcs(m *Module) {
478*333d2b36SAndroid Build Coastguard Worker	if lib, ok := m.compiler.(*libraryDecorator); ok {
479*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Product.Srcs)
480*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Product.Exclude_srcs)
481*333d2b36SAndroid Build Coastguard Worker
482*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
483*333d2b36SAndroid Build Coastguard Worker			lib.baseCompiler.Properties.Target.Product.Exclude_generated_sources...)
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker		if lib.Properties.Target.Product.No_stubs {
486*333d2b36SAndroid Build Coastguard Worker			proptools.Clear(&lib.Properties.Stubs)
487*333d2b36SAndroid Build Coastguard Worker		}
488*333d2b36SAndroid Build Coastguard Worker	}
489*333d2b36SAndroid Build Coastguard Worker}
490*333d2b36SAndroid Build Coastguard Worker
491*333d2b36SAndroid Build Coastguard Workerfunc squashRecoverySrcs(m *Module) {
492*333d2b36SAndroid Build Coastguard Worker	if lib, ok := m.compiler.(*libraryDecorator); ok {
493*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Recovery.Srcs)
494*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs)
495*333d2b36SAndroid Build Coastguard Worker
496*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
497*333d2b36SAndroid Build Coastguard Worker			lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...)
498*333d2b36SAndroid Build Coastguard Worker	}
499*333d2b36SAndroid Build Coastguard Worker}
500*333d2b36SAndroid Build Coastguard Worker
501*333d2b36SAndroid Build Coastguard Workerfunc squashVendorRamdiskSrcs(m *Module) {
502*333d2b36SAndroid Build Coastguard Worker	if lib, ok := m.compiler.(*libraryDecorator); ok {
503*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Vendor_ramdisk.Exclude_srcs)
504*333d2b36SAndroid Build Coastguard Worker	}
505*333d2b36SAndroid Build Coastguard Worker}
506*333d2b36SAndroid Build Coastguard Worker
507*333d2b36SAndroid Build Coastguard Workerfunc squashRamdiskSrcs(m *Module) {
508*333d2b36SAndroid Build Coastguard Worker	if lib, ok := m.compiler.(*libraryDecorator); ok {
509*333d2b36SAndroid Build Coastguard Worker		lib.baseCompiler.Properties.Exclude_srcs.AppendSimpleValue(lib.baseCompiler.Properties.Target.Ramdisk.Exclude_srcs)
510*333d2b36SAndroid Build Coastguard Worker	}
511*333d2b36SAndroid Build Coastguard Worker}
512*333d2b36SAndroid Build Coastguard Worker
513*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) SetImageVariation(ctx android.ImageInterfaceContext, variant string) {
514*333d2b36SAndroid Build Coastguard Worker	if variant == android.RamdiskVariation {
515*333d2b36SAndroid Build Coastguard Worker		c.MakeAsPlatform()
516*333d2b36SAndroid Build Coastguard Worker		squashRamdiskSrcs(c)
517*333d2b36SAndroid Build Coastguard Worker	} else if variant == android.VendorRamdiskVariation {
518*333d2b36SAndroid Build Coastguard Worker		c.MakeAsPlatform()
519*333d2b36SAndroid Build Coastguard Worker		squashVendorRamdiskSrcs(c)
520*333d2b36SAndroid Build Coastguard Worker	} else if variant == android.RecoveryVariation {
521*333d2b36SAndroid Build Coastguard Worker		c.MakeAsPlatform()
522*333d2b36SAndroid Build Coastguard Worker		squashRecoverySrcs(c)
523*333d2b36SAndroid Build Coastguard Worker	} else if strings.HasPrefix(variant, android.VendorVariation) {
524*333d2b36SAndroid Build Coastguard Worker		c.Properties.ImageVariation = android.VendorVariation
525*333d2b36SAndroid Build Coastguard Worker
526*333d2b36SAndroid Build Coastguard Worker		if strings.HasPrefix(variant, VendorVariationPrefix) {
527*333d2b36SAndroid Build Coastguard Worker			c.Properties.VndkVersion = strings.TrimPrefix(variant, VendorVariationPrefix)
528*333d2b36SAndroid Build Coastguard Worker		}
529*333d2b36SAndroid Build Coastguard Worker		squashVendorSrcs(c)
530*333d2b36SAndroid Build Coastguard Worker	} else if strings.HasPrefix(variant, android.ProductVariation) {
531*333d2b36SAndroid Build Coastguard Worker		c.Properties.ImageVariation = android.ProductVariation
532*333d2b36SAndroid Build Coastguard Worker		if strings.HasPrefix(variant, ProductVariationPrefix) {
533*333d2b36SAndroid Build Coastguard Worker			c.Properties.VndkVersion = strings.TrimPrefix(variant, ProductVariationPrefix)
534*333d2b36SAndroid Build Coastguard Worker		}
535*333d2b36SAndroid Build Coastguard Worker		squashProductSrcs(c)
536*333d2b36SAndroid Build Coastguard Worker	}
537*333d2b36SAndroid Build Coastguard Worker
538*333d2b36SAndroid Build Coastguard Worker	if c.NeedsVendorPublicLibraryVariants() &&
539*333d2b36SAndroid Build Coastguard Worker		(variant == android.CoreVariation || strings.HasPrefix(variant, ProductVariationPrefix)) {
540*333d2b36SAndroid Build Coastguard Worker		c.VendorProperties.IsVendorPublicLibrary = true
541*333d2b36SAndroid Build Coastguard Worker	}
542*333d2b36SAndroid Build Coastguard Worker}
543