xref: /aosp_15_r20/build/soong/android/override_module.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2019 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 Worker
15*333d2b36SAndroid Build Coastguard Workerpackage android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Worker// This file contains all the foundation components for override modules and their base module
18*333d2b36SAndroid Build Coastguard Worker// types. Override modules are a kind of opposite of default modules in that they override certain
19*333d2b36SAndroid Build Coastguard Worker// properties of an existing base module whereas default modules provide base module data to be
20*333d2b36SAndroid Build Coastguard Worker// overridden. However, unlike default and defaultable module pairs, both override and overridable
21*333d2b36SAndroid Build Coastguard Worker// modules generate and output build actions, and it is up to product make vars to decide which one
22*333d2b36SAndroid Build Coastguard Worker// to actually build and install in the end. In other words, default modules and defaultable modules
23*333d2b36SAndroid Build Coastguard Worker// can be compared to abstract classes and concrete classes in C++ and Java. By the same analogy,
24*333d2b36SAndroid Build Coastguard Worker// both override and overridable modules act like concrete classes.
25*333d2b36SAndroid Build Coastguard Worker//
26*333d2b36SAndroid Build Coastguard Worker// There is one more crucial difference from the logic perspective. Unlike default pairs, most Soong
27*333d2b36SAndroid Build Coastguard Worker// actions happen in the base (overridable) module by creating a local variant for each override
28*333d2b36SAndroid Build Coastguard Worker// module based on it.
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workerimport (
31*333d2b36SAndroid Build Coastguard Worker	"fmt"
32*333d2b36SAndroid Build Coastguard Worker	"sort"
33*333d2b36SAndroid Build Coastguard Worker	"sync"
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
36*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
37*333d2b36SAndroid Build Coastguard Worker)
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker// Interface for override module types, e.g. override_android_app, override_apex
40*333d2b36SAndroid Build Coastguard Workertype OverrideModule interface {
41*333d2b36SAndroid Build Coastguard Worker	Module
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker	getOverridingProperties() []interface{}
44*333d2b36SAndroid Build Coastguard Worker	setOverridingProperties(properties []interface{})
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	getOverrideModuleProperties() *OverrideModuleProperties
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// Internal funcs to handle interoperability between override modules and prebuilts.
49*333d2b36SAndroid Build Coastguard Worker	// i.e. cases where an overriding module, too, is overridden by a prebuilt module.
50*333d2b36SAndroid Build Coastguard Worker	setOverriddenByPrebuilt(prebuilt Module)
51*333d2b36SAndroid Build Coastguard Worker	getOverriddenByPrebuilt() Module
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker	// Directory containing the Blueprint definition of the overriding module
54*333d2b36SAndroid Build Coastguard Worker	setModuleDir(string)
55*333d2b36SAndroid Build Coastguard Worker	ModuleDir() string
56*333d2b36SAndroid Build Coastguard Worker}
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker// Base module struct for override module types
59*333d2b36SAndroid Build Coastguard Workertype OverrideModuleBase struct {
60*333d2b36SAndroid Build Coastguard Worker	moduleProperties OverrideModuleProperties
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker	overridingProperties []interface{}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	overriddenByPrebuilt Module
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	moduleDir string
67*333d2b36SAndroid Build Coastguard Worker}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Workertype OverrideModuleProperties struct {
70*333d2b36SAndroid Build Coastguard Worker	// Name of the base module to be overridden
71*333d2b36SAndroid Build Coastguard Worker	Base *string
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	// TODO(jungjw): Add an optional override_name bool flag.
74*333d2b36SAndroid Build Coastguard Worker}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) setModuleDir(d string) {
77*333d2b36SAndroid Build Coastguard Worker	o.moduleDir = d
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) ModuleDir() string {
81*333d2b36SAndroid Build Coastguard Worker	return o.moduleDir
82*333d2b36SAndroid Build Coastguard Worker}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) getOverridingProperties() []interface{} {
85*333d2b36SAndroid Build Coastguard Worker	return o.overridingProperties
86*333d2b36SAndroid Build Coastguard Worker}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) setOverridingProperties(properties []interface{}) {
89*333d2b36SAndroid Build Coastguard Worker	o.overridingProperties = properties
90*333d2b36SAndroid Build Coastguard Worker}
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) getOverrideModuleProperties() *OverrideModuleProperties {
93*333d2b36SAndroid Build Coastguard Worker	return &o.moduleProperties
94*333d2b36SAndroid Build Coastguard Worker}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) GetOverriddenModuleName() string {
97*333d2b36SAndroid Build Coastguard Worker	return proptools.String(o.moduleProperties.Base)
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) setOverriddenByPrebuilt(prebuilt Module) {
101*333d2b36SAndroid Build Coastguard Worker	o.overriddenByPrebuilt = prebuilt
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Workerfunc (o *OverrideModuleBase) getOverriddenByPrebuilt() Module {
105*333d2b36SAndroid Build Coastguard Worker	return o.overriddenByPrebuilt
106*333d2b36SAndroid Build Coastguard Worker}
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Workerfunc InitOverrideModule(m OverrideModule) {
109*333d2b36SAndroid Build Coastguard Worker	m.setOverridingProperties(m.GetProperties())
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(m.getOverrideModuleProperties())
112*333d2b36SAndroid Build Coastguard Worker}
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Worker// Interface for overridable module types, e.g. android_app, apex
115*333d2b36SAndroid Build Coastguard Workertype OverridableModule interface {
116*333d2b36SAndroid Build Coastguard Worker	Module
117*333d2b36SAndroid Build Coastguard Worker	moduleBase() *OverridableModuleBase
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	setOverridableProperties(prop []interface{})
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	addOverride(o OverrideModule)
122*333d2b36SAndroid Build Coastguard Worker	getOverrides() []OverrideModule
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	override(ctx BaseModuleContext, bm OverridableModule, o OverrideModule)
125*333d2b36SAndroid Build Coastguard Worker	GetOverriddenBy() string
126*333d2b36SAndroid Build Coastguard Worker	GetOverriddenByModuleDir() string
127*333d2b36SAndroid Build Coastguard Worker
128*333d2b36SAndroid Build Coastguard Worker	setOverridesProperty(overridesProperties *[]string)
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker	// Due to complications with incoming dependencies, overrides are processed after DepsMutator.
131*333d2b36SAndroid Build Coastguard Worker	// So, overridable properties need to be handled in a separate, dedicated deps mutator.
132*333d2b36SAndroid Build Coastguard Worker	OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext)
133*333d2b36SAndroid Build Coastguard Worker}
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Workertype overridableModuleProperties struct {
136*333d2b36SAndroid Build Coastguard Worker	OverriddenBy          string `blueprint:"mutated"`
137*333d2b36SAndroid Build Coastguard Worker	OverriddenByModuleDir string `blueprint:"mutated"`
138*333d2b36SAndroid Build Coastguard Worker}
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker// Base module struct for overridable module types
141*333d2b36SAndroid Build Coastguard Workertype OverridableModuleBase struct {
142*333d2b36SAndroid Build Coastguard Worker	// List of OverrideModules that override this base module
143*333d2b36SAndroid Build Coastguard Worker	overrides []OverrideModule
144*333d2b36SAndroid Build Coastguard Worker	// Used to parallelize registerOverrideMutator executions. Note that only addOverride locks this
145*333d2b36SAndroid Build Coastguard Worker	// mutex. It is because addOverride and getOverride are used in different mutators, and so are
146*333d2b36SAndroid Build Coastguard Worker	// guaranteed to be not mixed. (And, getOverride only reads from overrides, and so don't require
147*333d2b36SAndroid Build Coastguard Worker	// mutex locking.)
148*333d2b36SAndroid Build Coastguard Worker	overridesLock sync.Mutex
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	overridableProperties []interface{}
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker	// If an overridable module has a property to list other modules that itself overrides, it should
153*333d2b36SAndroid Build Coastguard Worker	// set this to a pointer to the property through the InitOverridableModule function, so that
154*333d2b36SAndroid Build Coastguard Worker	// override information is propagated and aggregated correctly.
155*333d2b36SAndroid Build Coastguard Worker	overridesProperty *[]string
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Worker	overridableModuleProperties overridableModuleProperties
158*333d2b36SAndroid Build Coastguard Worker}
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Workerfunc InitOverridableModule(m OverridableModule, overridesProperty *[]string) {
161*333d2b36SAndroid Build Coastguard Worker	m.setOverridableProperties(m.(Module).GetProperties())
162*333d2b36SAndroid Build Coastguard Worker	m.setOverridesProperty(overridesProperty)
163*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.moduleBase().overridableModuleProperties)
164*333d2b36SAndroid Build Coastguard Worker}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Workerfunc (o *OverridableModuleBase) moduleBase() *OverridableModuleBase {
167*333d2b36SAndroid Build Coastguard Worker	return o
168*333d2b36SAndroid Build Coastguard Worker}
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) setOverridableProperties(prop []interface{}) {
171*333d2b36SAndroid Build Coastguard Worker	b.overridableProperties = prop
172*333d2b36SAndroid Build Coastguard Worker}
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) addOverride(o OverrideModule) {
175*333d2b36SAndroid Build Coastguard Worker	b.overridesLock.Lock()
176*333d2b36SAndroid Build Coastguard Worker	b.overrides = append(b.overrides, o)
177*333d2b36SAndroid Build Coastguard Worker	b.overridesLock.Unlock()
178*333d2b36SAndroid Build Coastguard Worker}
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker// Should NOT be used in the same mutator as addOverride.
181*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) getOverrides() []OverrideModule {
182*333d2b36SAndroid Build Coastguard Worker	b.overridesLock.Lock()
183*333d2b36SAndroid Build Coastguard Worker	sort.Slice(b.overrides, func(i, j int) bool {
184*333d2b36SAndroid Build Coastguard Worker		return b.overrides[i].Name() < b.overrides[j].Name()
185*333d2b36SAndroid Build Coastguard Worker	})
186*333d2b36SAndroid Build Coastguard Worker	b.overridesLock.Unlock()
187*333d2b36SAndroid Build Coastguard Worker	return b.overrides
188*333d2b36SAndroid Build Coastguard Worker}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) setOverridesProperty(overridesProperty *[]string) {
191*333d2b36SAndroid Build Coastguard Worker	b.overridesProperty = overridesProperty
192*333d2b36SAndroid Build Coastguard Worker}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker// Overrides a base module with the given OverrideModule.
195*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) override(ctx BaseModuleContext, bm OverridableModule, o OverrideModule) {
196*333d2b36SAndroid Build Coastguard Worker	for _, p := range b.overridableProperties {
197*333d2b36SAndroid Build Coastguard Worker		for _, op := range o.getOverridingProperties() {
198*333d2b36SAndroid Build Coastguard Worker			if proptools.TypeEqual(p, op) {
199*333d2b36SAndroid Build Coastguard Worker				err := proptools.ExtendProperties(p, op, nil, proptools.OrderReplace)
200*333d2b36SAndroid Build Coastguard Worker				if err != nil {
201*333d2b36SAndroid Build Coastguard Worker					if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
202*333d2b36SAndroid Build Coastguard Worker						ctx.OtherModulePropertyErrorf(bm, propertyErr.Property, "%s", propertyErr.Err.Error())
203*333d2b36SAndroid Build Coastguard Worker					} else {
204*333d2b36SAndroid Build Coastguard Worker						panic(err)
205*333d2b36SAndroid Build Coastguard Worker					}
206*333d2b36SAndroid Build Coastguard Worker				}
207*333d2b36SAndroid Build Coastguard Worker			}
208*333d2b36SAndroid Build Coastguard Worker		}
209*333d2b36SAndroid Build Coastguard Worker	}
210*333d2b36SAndroid Build Coastguard Worker	// Adds the base module to the overrides property, if exists, of the overriding module. See the
211*333d2b36SAndroid Build Coastguard Worker	// comment on OverridableModuleBase.overridesProperty for details.
212*333d2b36SAndroid Build Coastguard Worker	if b.overridesProperty != nil {
213*333d2b36SAndroid Build Coastguard Worker		*b.overridesProperty = append(*b.overridesProperty, ctx.OtherModuleName(bm))
214*333d2b36SAndroid Build Coastguard Worker	}
215*333d2b36SAndroid Build Coastguard Worker	b.overridableModuleProperties.OverriddenBy = o.Name()
216*333d2b36SAndroid Build Coastguard Worker	b.overridableModuleProperties.OverriddenByModuleDir = o.ModuleDir()
217*333d2b36SAndroid Build Coastguard Worker}
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Worker// GetOverriddenBy returns the name of the override module that has overridden this module.
220*333d2b36SAndroid Build Coastguard Worker// For example, if an override module foo has its 'base' property set to bar, then another local variant
221*333d2b36SAndroid Build Coastguard Worker// of bar is created and its properties are overriden by foo. This method returns bar when called from
222*333d2b36SAndroid Build Coastguard Worker// the new local variant. It returns "" when called from the original variant of bar.
223*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) GetOverriddenBy() string {
224*333d2b36SAndroid Build Coastguard Worker	return b.overridableModuleProperties.OverriddenBy
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) GetOverriddenByModuleDir() string {
228*333d2b36SAndroid Build Coastguard Worker	return b.overridableModuleProperties.OverriddenByModuleDir
229*333d2b36SAndroid Build Coastguard Worker}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Workerfunc (b *OverridableModuleBase) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
232*333d2b36SAndroid Build Coastguard Worker}
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard Worker// Mutators for override/overridable modules. All the fun happens in these functions. It is critical
235*333d2b36SAndroid Build Coastguard Worker// to keep them in this order and not put any order mutators between them.
236*333d2b36SAndroid Build Coastguard Workerfunc RegisterOverridePostDepsMutators(ctx RegisterMutatorsContext) {
237*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("override_deps", overrideModuleDepsMutator).MutatesDependencies() // modifies deps via addOverride
238*333d2b36SAndroid Build Coastguard Worker	ctx.Transition("override", &overrideTransitionMutator{})
239*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("override_apply", overrideApplyMutator).MutatesDependencies()
240*333d2b36SAndroid Build Coastguard Worker	// overridableModuleDepsMutator calls OverridablePropertiesDepsMutator so that overridable modules can
241*333d2b36SAndroid Build Coastguard Worker	// add deps from overridable properties.
242*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("overridable_deps", overridableModuleDepsMutator)
243*333d2b36SAndroid Build Coastguard Worker	// Because overridableModuleDepsMutator is run after PrebuiltPostDepsMutator,
244*333d2b36SAndroid Build Coastguard Worker	// prebuilt's ReplaceDependencies doesn't affect to those deps added by overridable properties.
245*333d2b36SAndroid Build Coastguard Worker	// By running PrebuiltPostDepsMutator again after overridableModuleDepsMutator, deps via overridable properties
246*333d2b36SAndroid Build Coastguard Worker	// can be replaced with prebuilts.
247*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("replace_deps_on_prebuilts_for_overridable_deps_again", PrebuiltPostDepsMutator).UsesReplaceDependencies()
248*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("replace_deps_on_override", replaceDepsOnOverridingModuleMutator).UsesReplaceDependencies()
249*333d2b36SAndroid Build Coastguard Worker}
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Workertype overrideBaseDependencyTag struct {
252*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
253*333d2b36SAndroid Build Coastguard Worker}
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Workervar overrideBaseDepTag overrideBaseDependencyTag
256*333d2b36SAndroid Build Coastguard Worker
257*333d2b36SAndroid Build Coastguard Worker// Override module should always override the source module.
258*333d2b36SAndroid Build Coastguard Worker// Overrides are implemented as a variant of the overridden module, and the build actions are created in the
259*333d2b36SAndroid Build Coastguard Worker// module context of the overridden module.
260*333d2b36SAndroid Build Coastguard Worker// If we replace override module with the prebuilt of the overridden module, `GenerateAndroidBuildActions` for
261*333d2b36SAndroid Build Coastguard Worker// the override module will have a very different meaning.
262*333d2b36SAndroid Build Coastguard Workerfunc (tag overrideBaseDependencyTag) ReplaceSourceWithPrebuilt() bool {
263*333d2b36SAndroid Build Coastguard Worker	return false
264*333d2b36SAndroid Build Coastguard Worker}
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker// Adds dependency on the base module to the overriding module so that they can be visited in the
267*333d2b36SAndroid Build Coastguard Worker// next phase.
268*333d2b36SAndroid Build Coastguard Workerfunc overrideModuleDepsMutator(ctx BottomUpMutatorContext) {
269*333d2b36SAndroid Build Coastguard Worker	if module, ok := ctx.Module().(OverrideModule); ok {
270*333d2b36SAndroid Build Coastguard Worker		base := String(module.getOverrideModuleProperties().Base)
271*333d2b36SAndroid Build Coastguard Worker		if !ctx.OtherModuleExists(base) {
272*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("base", "%q is not a valid module name", base)
273*333d2b36SAndroid Build Coastguard Worker			return
274*333d2b36SAndroid Build Coastguard Worker		}
275*333d2b36SAndroid Build Coastguard Worker		baseModule := ctx.AddDependency(ctx.Module(), overrideBaseDepTag, *module.getOverrideModuleProperties().Base)[0]
276*333d2b36SAndroid Build Coastguard Worker		if o, ok := baseModule.(OverridableModule); ok {
277*333d2b36SAndroid Build Coastguard Worker			overrideModule := ctx.Module().(OverrideModule)
278*333d2b36SAndroid Build Coastguard Worker			overrideModule.setModuleDir(ctx.ModuleDir())
279*333d2b36SAndroid Build Coastguard Worker			o.addOverride(overrideModule)
280*333d2b36SAndroid Build Coastguard Worker		}
281*333d2b36SAndroid Build Coastguard Worker	}
282*333d2b36SAndroid Build Coastguard Worker}
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker// Now, goes through all overridable modules, finds all modules overriding them, creates a local
285*333d2b36SAndroid Build Coastguard Worker// variant for each of them, and performs the actual overriding operation by calling override().
286*333d2b36SAndroid Build Coastguard Workertype overrideTransitionMutator struct{}
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Workerfunc (overrideTransitionMutator) Split(ctx BaseModuleContext) []string {
289*333d2b36SAndroid Build Coastguard Worker	if b, ok := ctx.Module().(OverridableModule); ok {
290*333d2b36SAndroid Build Coastguard Worker		overrides := b.getOverrides()
291*333d2b36SAndroid Build Coastguard Worker		if len(overrides) == 0 {
292*333d2b36SAndroid Build Coastguard Worker			return []string{""}
293*333d2b36SAndroid Build Coastguard Worker		}
294*333d2b36SAndroid Build Coastguard Worker		variants := make([]string, len(overrides)+1)
295*333d2b36SAndroid Build Coastguard Worker		// The first variant is for the original, non-overridden, base module.
296*333d2b36SAndroid Build Coastguard Worker		variants[0] = ""
297*333d2b36SAndroid Build Coastguard Worker		for i, o := range overrides {
298*333d2b36SAndroid Build Coastguard Worker			variants[i+1] = o.(Module).Name()
299*333d2b36SAndroid Build Coastguard Worker		}
300*333d2b36SAndroid Build Coastguard Worker		return variants
301*333d2b36SAndroid Build Coastguard Worker	} else if o, ok := ctx.Module().(OverrideModule); ok {
302*333d2b36SAndroid Build Coastguard Worker		// Create a variant of the overriding module with its own name. This matches the above local
303*333d2b36SAndroid Build Coastguard Worker		// variant name rule for overridden modules, and thus allows ReplaceDependencies to match the
304*333d2b36SAndroid Build Coastguard Worker		// two.
305*333d2b36SAndroid Build Coastguard Worker		return []string{o.Name()}
306*333d2b36SAndroid Build Coastguard Worker	}
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker	return []string{""}
309*333d2b36SAndroid Build Coastguard Worker}
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Workerfunc (overrideTransitionMutator) OutgoingTransition(ctx OutgoingTransitionContext, sourceVariation string) string {
312*333d2b36SAndroid Build Coastguard Worker	if o, ok := ctx.Module().(OverrideModule); ok {
313*333d2b36SAndroid Build Coastguard Worker		if ctx.DepTag() == overrideBaseDepTag {
314*333d2b36SAndroid Build Coastguard Worker			return o.Name()
315*333d2b36SAndroid Build Coastguard Worker		}
316*333d2b36SAndroid Build Coastguard Worker	}
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Worker	// Variations are always local and shouldn't affect the variant used for dependencies
319*333d2b36SAndroid Build Coastguard Worker	return ""
320*333d2b36SAndroid Build Coastguard Worker}
321*333d2b36SAndroid Build Coastguard Worker
322*333d2b36SAndroid Build Coastguard Workerfunc (overrideTransitionMutator) IncomingTransition(ctx IncomingTransitionContext, incomingVariation string) string {
323*333d2b36SAndroid Build Coastguard Worker	if _, ok := ctx.Module().(OverridableModule); ok {
324*333d2b36SAndroid Build Coastguard Worker		return incomingVariation
325*333d2b36SAndroid Build Coastguard Worker	} else if o, ok := ctx.Module().(OverrideModule); ok {
326*333d2b36SAndroid Build Coastguard Worker		// To allow dependencies to be added without having to know the variation.
327*333d2b36SAndroid Build Coastguard Worker		return o.Name()
328*333d2b36SAndroid Build Coastguard Worker	}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Worker	return ""
331*333d2b36SAndroid Build Coastguard Worker}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Workerfunc (overrideTransitionMutator) Mutate(ctx BottomUpMutatorContext, variation string) {
334*333d2b36SAndroid Build Coastguard Worker}
335*333d2b36SAndroid Build Coastguard Worker
336*333d2b36SAndroid Build Coastguard Workerfunc overrideApplyMutator(ctx BottomUpMutatorContext) {
337*333d2b36SAndroid Build Coastguard Worker	if o, ok := ctx.Module().(OverrideModule); ok {
338*333d2b36SAndroid Build Coastguard Worker		overridableDeps := ctx.GetDirectDepsWithTag(overrideBaseDepTag)
339*333d2b36SAndroid Build Coastguard Worker		if len(overridableDeps) > 1 {
340*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Errorf("expected a single dependency with overrideBaseDepTag, found %q", overridableDeps))
341*333d2b36SAndroid Build Coastguard Worker		} else if len(overridableDeps) == 1 {
342*333d2b36SAndroid Build Coastguard Worker			b := overridableDeps[0].(OverridableModule)
343*333d2b36SAndroid Build Coastguard Worker			b.override(ctx, b, o)
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker			checkPrebuiltReplacesOverride(ctx, b)
346*333d2b36SAndroid Build Coastguard Worker		}
347*333d2b36SAndroid Build Coastguard Worker	}
348*333d2b36SAndroid Build Coastguard Worker}
349*333d2b36SAndroid Build Coastguard Worker
350*333d2b36SAndroid Build Coastguard Workerfunc checkPrebuiltReplacesOverride(ctx BottomUpMutatorContext, b OverridableModule) {
351*333d2b36SAndroid Build Coastguard Worker	// See if there's a prebuilt module that overrides this override module with prefer flag,
352*333d2b36SAndroid Build Coastguard Worker	// in which case we call HideFromMake on the corresponding variant later.
353*333d2b36SAndroid Build Coastguard Worker	prebuiltDeps := ctx.GetDirectDepsWithTag(PrebuiltDepTag)
354*333d2b36SAndroid Build Coastguard Worker	for _, prebuiltDep := range prebuiltDeps {
355*333d2b36SAndroid Build Coastguard Worker		prebuilt := GetEmbeddedPrebuilt(prebuiltDep)
356*333d2b36SAndroid Build Coastguard Worker		if prebuilt == nil {
357*333d2b36SAndroid Build Coastguard Worker			panic("PrebuiltDepTag leads to a non-prebuilt module " + prebuiltDep.Name())
358*333d2b36SAndroid Build Coastguard Worker		}
359*333d2b36SAndroid Build Coastguard Worker		if prebuilt.UsePrebuilt() {
360*333d2b36SAndroid Build Coastguard Worker			// The overriding module itself, too, is overridden by a prebuilt.
361*333d2b36SAndroid Build Coastguard Worker			// Perform the same check for replacement
362*333d2b36SAndroid Build Coastguard Worker			checkInvariantsForSourceAndPrebuilt(ctx, b, prebuiltDep)
363*333d2b36SAndroid Build Coastguard Worker			// Copy the flag and hide it in make
364*333d2b36SAndroid Build Coastguard Worker			b.ReplacedByPrebuilt()
365*333d2b36SAndroid Build Coastguard Worker		}
366*333d2b36SAndroid Build Coastguard Worker	}
367*333d2b36SAndroid Build Coastguard Worker}
368*333d2b36SAndroid Build Coastguard Worker
369*333d2b36SAndroid Build Coastguard Workerfunc overridableModuleDepsMutator(ctx BottomUpMutatorContext) {
370*333d2b36SAndroid Build Coastguard Worker	if b, ok := ctx.Module().(OverridableModule); ok && b.Enabled(ctx) {
371*333d2b36SAndroid Build Coastguard Worker		b.OverridablePropertiesDepsMutator(ctx)
372*333d2b36SAndroid Build Coastguard Worker	}
373*333d2b36SAndroid Build Coastguard Worker}
374*333d2b36SAndroid Build Coastguard Worker
375*333d2b36SAndroid Build Coastguard Workerfunc replaceDepsOnOverridingModuleMutator(ctx BottomUpMutatorContext) {
376*333d2b36SAndroid Build Coastguard Worker	if b, ok := ctx.Module().(OverridableModule); ok {
377*333d2b36SAndroid Build Coastguard Worker		if o := b.GetOverriddenBy(); o != "" {
378*333d2b36SAndroid Build Coastguard Worker			// Redirect dependencies on the overriding module to this overridden module. Overriding
379*333d2b36SAndroid Build Coastguard Worker			// modules are basically pseudo modules, and all build actions are associated to overridden
380*333d2b36SAndroid Build Coastguard Worker			// modules. Therefore, dependencies on overriding modules need to be forwarded there as well.
381*333d2b36SAndroid Build Coastguard Worker			ctx.ReplaceDependencies(o)
382*333d2b36SAndroid Build Coastguard Worker		}
383*333d2b36SAndroid Build Coastguard Worker	}
384*333d2b36SAndroid Build Coastguard Worker}
385