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