1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 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 Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "reflect" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker// A sortable component is one whose registration order affects the order in which it is executed 25*333d2b36SAndroid Build Coastguard Worker// and so affects the behavior of the build system. As a result it is important for the order in 26*333d2b36SAndroid Build Coastguard Worker// which they are registered during tests to match the order used at runtime and so the test 27*333d2b36SAndroid Build Coastguard Worker// infrastructure will sort them to match. 28*333d2b36SAndroid Build Coastguard Worker// 29*333d2b36SAndroid Build Coastguard Worker// The sortable components are mutators, singletons and pre-singletons. Module types are not 30*333d2b36SAndroid Build Coastguard Worker// sortable because their order of registration does not affect the runtime behavior. 31*333d2b36SAndroid Build Coastguard Workertype sortableComponent interface { 32*333d2b36SAndroid Build Coastguard Worker // componentName returns the name of the component. 33*333d2b36SAndroid Build Coastguard Worker // 34*333d2b36SAndroid Build Coastguard Worker // Uniquely identifies the components within the set of components used at runtime and during 35*333d2b36SAndroid Build Coastguard Worker // tests. 36*333d2b36SAndroid Build Coastguard Worker componentName() string 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker // registers this component in the supplied context. 39*333d2b36SAndroid Build Coastguard Worker register(ctx *Context) 40*333d2b36SAndroid Build Coastguard Worker} 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workertype sortableComponents []sortableComponent 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker// registerAll registers all components in this slice with the supplied context. 45*333d2b36SAndroid Build Coastguard Workerfunc (r sortableComponents) registerAll(ctx *Context) { 46*333d2b36SAndroid Build Coastguard Worker for _, c := range r { 47*333d2b36SAndroid Build Coastguard Worker c.register(ctx) 48*333d2b36SAndroid Build Coastguard Worker } 49*333d2b36SAndroid Build Coastguard Worker} 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Workertype moduleType struct { 52*333d2b36SAndroid Build Coastguard Worker name string 53*333d2b36SAndroid Build Coastguard Worker factory ModuleFactory 54*333d2b36SAndroid Build Coastguard Worker} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Workerfunc (t moduleType) register(ctx *Context) { 57*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType(t.name, ModuleFactoryAdaptor(t.factory)) 58*333d2b36SAndroid Build Coastguard Worker} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Workervar moduleTypes []moduleType 61*333d2b36SAndroid Build Coastguard Workervar moduleTypesForDocs = map[string]reflect.Value{} 62*333d2b36SAndroid Build Coastguard Workervar moduleTypeByFactory = map[reflect.Value]string{} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workertype singleton struct { 65*333d2b36SAndroid Build Coastguard Worker // True if this should be registered as a parallel singleton. 66*333d2b36SAndroid Build Coastguard Worker parallel bool 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker name string 69*333d2b36SAndroid Build Coastguard Worker factory SingletonFactory 70*333d2b36SAndroid Build Coastguard Worker} 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Workerfunc newSingleton(name string, factory SingletonFactory, parallel bool) singleton { 73*333d2b36SAndroid Build Coastguard Worker return singleton{parallel: parallel, name: name, factory: factory} 74*333d2b36SAndroid Build Coastguard Worker} 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Workerfunc (s singleton) componentName() string { 77*333d2b36SAndroid Build Coastguard Worker return s.name 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc (s singleton) register(ctx *Context) { 81*333d2b36SAndroid Build Coastguard Worker adaptor := SingletonFactoryAdaptor(ctx, s.factory) 82*333d2b36SAndroid Build Coastguard Worker ctx.RegisterSingletonType(s.name, adaptor, s.parallel) 83*333d2b36SAndroid Build Coastguard Worker} 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Workervar _ sortableComponent = singleton{} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Workervar singletons sortableComponents 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Workertype mutator struct { 90*333d2b36SAndroid Build Coastguard Worker name string 91*333d2b36SAndroid Build Coastguard Worker bottomUpMutator blueprint.BottomUpMutator 92*333d2b36SAndroid Build Coastguard Worker topDownMutator blueprint.TopDownMutator 93*333d2b36SAndroid Build Coastguard Worker transitionMutator blueprint.TransitionMutator 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker usesRename bool 96*333d2b36SAndroid Build Coastguard Worker usesReverseDependencies bool 97*333d2b36SAndroid Build Coastguard Worker usesReplaceDependencies bool 98*333d2b36SAndroid Build Coastguard Worker usesCreateModule bool 99*333d2b36SAndroid Build Coastguard Worker mutatesDependencies bool 100*333d2b36SAndroid Build Coastguard Worker mutatesGlobalState bool 101*333d2b36SAndroid Build Coastguard Worker neverFar bool 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Workervar _ sortableComponent = &mutator{} 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Workertype ModuleFactory func() Module 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Worker// ModuleFactoryAdaptor wraps a ModuleFactory into a blueprint.ModuleFactory by converting a Module 109*333d2b36SAndroid Build Coastguard Worker// into a blueprint.Module and a list of property structs 110*333d2b36SAndroid Build Coastguard Workerfunc ModuleFactoryAdaptor(factory ModuleFactory) blueprint.ModuleFactory { 111*333d2b36SAndroid Build Coastguard Worker return func() (blueprint.Module, []interface{}) { 112*333d2b36SAndroid Build Coastguard Worker module := factory() 113*333d2b36SAndroid Build Coastguard Worker return module, module.GetProperties() 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker} 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Workertype SingletonFactory func() Singleton 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker// SingletonFactoryAdaptor wraps a SingletonFactory into a blueprint.SingletonFactory by converting 120*333d2b36SAndroid Build Coastguard Worker// a Singleton into a blueprint.Singleton 121*333d2b36SAndroid Build Coastguard Workerfunc SingletonFactoryAdaptor(ctx *Context, factory SingletonFactory) blueprint.SingletonFactory { 122*333d2b36SAndroid Build Coastguard Worker return func() blueprint.Singleton { 123*333d2b36SAndroid Build Coastguard Worker singleton := factory() 124*333d2b36SAndroid Build Coastguard Worker if makevars, ok := singleton.(SingletonMakeVarsProvider); ok { 125*333d2b36SAndroid Build Coastguard Worker ctx.registerSingletonMakeVarsProvider(makevars) 126*333d2b36SAndroid Build Coastguard Worker } 127*333d2b36SAndroid Build Coastguard Worker return &singletonAdaptor{Singleton: singleton} 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Workerfunc RegisterModuleType(name string, factory ModuleFactory) { 132*333d2b36SAndroid Build Coastguard Worker moduleTypes = append(moduleTypes, moduleType{name, factory}) 133*333d2b36SAndroid Build Coastguard Worker RegisterModuleTypeForDocs(name, reflect.ValueOf(factory)) 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker// RegisterModuleTypeForDocs associates a module type name with a reflect.Value of the factory 137*333d2b36SAndroid Build Coastguard Worker// function that has documentation for the module type. It is normally called automatically 138*333d2b36SAndroid Build Coastguard Worker// by RegisterModuleType, but can be called manually after RegisterModuleType in order to 139*333d2b36SAndroid Build Coastguard Worker// override the factory method used for documentation, for example if the method passed to 140*333d2b36SAndroid Build Coastguard Worker// RegisterModuleType was a lambda. 141*333d2b36SAndroid Build Coastguard Workerfunc RegisterModuleTypeForDocs(name string, factory reflect.Value) { 142*333d2b36SAndroid Build Coastguard Worker moduleTypesForDocs[name] = factory 143*333d2b36SAndroid Build Coastguard Worker moduleTypeByFactory[factory] = name 144*333d2b36SAndroid Build Coastguard Worker} 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Workerfunc registerSingletonType(name string, factory SingletonFactory, parallel bool) { 147*333d2b36SAndroid Build Coastguard Worker singletons = append(singletons, newSingleton(name, factory, parallel)) 148*333d2b36SAndroid Build Coastguard Worker} 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Workerfunc RegisterSingletonType(name string, factory SingletonFactory) { 151*333d2b36SAndroid Build Coastguard Worker registerSingletonType(name, factory, false) 152*333d2b36SAndroid Build Coastguard Worker} 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Workerfunc RegisterParallelSingletonType(name string, factory SingletonFactory) { 155*333d2b36SAndroid Build Coastguard Worker registerSingletonType(name, factory, true) 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workertype Context struct { 159*333d2b36SAndroid Build Coastguard Worker *blueprint.Context 160*333d2b36SAndroid Build Coastguard Worker config Config 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Workerfunc NewContext(config Config) *Context { 164*333d2b36SAndroid Build Coastguard Worker ctx := &Context{blueprint.NewContext(), config} 165*333d2b36SAndroid Build Coastguard Worker ctx.SetSrcDir(absSrcDir) 166*333d2b36SAndroid Build Coastguard Worker ctx.AddSourceRootDirs(config.SourceRootDirs()...) 167*333d2b36SAndroid Build Coastguard Worker return ctx 168*333d2b36SAndroid Build Coastguard Worker} 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker// Register the pipeline of singletons, module types, and mutators for 171*333d2b36SAndroid Build Coastguard Worker// generating build.ninja and other files for Kati, from Android.bp files. 172*333d2b36SAndroid Build Coastguard Workerfunc (ctx *Context) Register() { 173*333d2b36SAndroid Build Coastguard Worker for _, t := range moduleTypes { 174*333d2b36SAndroid Build Coastguard Worker t.register(ctx) 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker mutators := collateGloballyRegisteredMutators() 178*333d2b36SAndroid Build Coastguard Worker mutators.registerAll(ctx) 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker singletons := collateGloballyRegisteredSingletons() 181*333d2b36SAndroid Build Coastguard Worker singletons.registerAll(ctx) 182*333d2b36SAndroid Build Coastguard Worker} 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Workerfunc (ctx *Context) Config() Config { 185*333d2b36SAndroid Build Coastguard Worker return ctx.config 186*333d2b36SAndroid Build Coastguard Worker} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Workerfunc (ctx *Context) registerSingletonMakeVarsProvider(makevars SingletonMakeVarsProvider) { 189*333d2b36SAndroid Build Coastguard Worker registerSingletonMakeVarsProvider(ctx.config, makevars) 190*333d2b36SAndroid Build Coastguard Worker} 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Workerfunc collateGloballyRegisteredSingletons() sortableComponents { 193*333d2b36SAndroid Build Coastguard Worker allSingletons := append(sortableComponents(nil), singletons...) 194*333d2b36SAndroid Build Coastguard Worker allSingletons = append(allSingletons, 195*333d2b36SAndroid Build Coastguard Worker // Register phony just before makevars so it can write out its phony rules as Make rules 196*333d2b36SAndroid Build Coastguard Worker singleton{parallel: false, name: "phony", factory: phonySingletonFactory}, 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker // Register makevars after other singletons so they can export values through makevars 199*333d2b36SAndroid Build Coastguard Worker singleton{parallel: false, name: "makevars", factory: makeVarsSingletonFunc}, 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Worker // Register rawfiles and ninjadeps last so that they can track all used environment variables and 202*333d2b36SAndroid Build Coastguard Worker // Ninja file dependencies stored in the config. 203*333d2b36SAndroid Build Coastguard Worker singleton{parallel: false, name: "rawfiles", factory: rawFilesSingletonFactory}, 204*333d2b36SAndroid Build Coastguard Worker singleton{parallel: false, name: "ninjadeps", factory: ninjaDepsSingletonFactory}, 205*333d2b36SAndroid Build Coastguard Worker ) 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Worker return allSingletons 208*333d2b36SAndroid Build Coastguard Worker} 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Workerfunc ModuleTypeFactories() map[string]ModuleFactory { 211*333d2b36SAndroid Build Coastguard Worker ret := make(map[string]ModuleFactory) 212*333d2b36SAndroid Build Coastguard Worker for _, t := range moduleTypes { 213*333d2b36SAndroid Build Coastguard Worker ret[t.name] = t.factory 214*333d2b36SAndroid Build Coastguard Worker } 215*333d2b36SAndroid Build Coastguard Worker return ret 216*333d2b36SAndroid Build Coastguard Worker} 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Workerfunc ModuleTypeFactoriesForDocs() map[string]reflect.Value { 219*333d2b36SAndroid Build Coastguard Worker return moduleTypesForDocs 220*333d2b36SAndroid Build Coastguard Worker} 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Workerfunc ModuleTypeByFactory() map[reflect.Value]string { 223*333d2b36SAndroid Build Coastguard Worker return moduleTypeByFactory 224*333d2b36SAndroid Build Coastguard Worker} 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Worker// Interface for registering build components. 227*333d2b36SAndroid Build Coastguard Worker// 228*333d2b36SAndroid Build Coastguard Worker// Provided to allow registration of build components to be shared between the runtime 229*333d2b36SAndroid Build Coastguard Worker// and test environments. 230*333d2b36SAndroid Build Coastguard Workertype RegistrationContext interface { 231*333d2b36SAndroid Build Coastguard Worker RegisterModuleType(name string, factory ModuleFactory) 232*333d2b36SAndroid Build Coastguard Worker RegisterSingletonModuleType(name string, factory SingletonModuleFactory) 233*333d2b36SAndroid Build Coastguard Worker RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory) 234*333d2b36SAndroid Build Coastguard Worker RegisterParallelSingletonType(name string, factory SingletonFactory) 235*333d2b36SAndroid Build Coastguard Worker RegisterSingletonType(name string, factory SingletonFactory) 236*333d2b36SAndroid Build Coastguard Worker PreArchMutators(f RegisterMutatorFunc) 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker // Register pre arch mutators that are hard coded into mutator.go. 239*333d2b36SAndroid Build Coastguard Worker // 240*333d2b36SAndroid Build Coastguard Worker // Only registers mutators for testing, is a noop on the InitRegistrationContext. 241*333d2b36SAndroid Build Coastguard Worker HardCodedPreArchMutators(f RegisterMutatorFunc) 242*333d2b36SAndroid Build Coastguard Worker 243*333d2b36SAndroid Build Coastguard Worker PreDepsMutators(f RegisterMutatorFunc) 244*333d2b36SAndroid Build Coastguard Worker PostDepsMutators(f RegisterMutatorFunc) 245*333d2b36SAndroid Build Coastguard Worker PostApexMutators(f RegisterMutatorFunc) 246*333d2b36SAndroid Build Coastguard Worker FinalDepsMutators(f RegisterMutatorFunc) 247*333d2b36SAndroid Build Coastguard Worker} 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker// Used to register build components from an init() method, e.g. 250*333d2b36SAndroid Build Coastguard Worker// 251*333d2b36SAndroid Build Coastguard Worker// init() { 252*333d2b36SAndroid Build Coastguard Worker// RegisterBuildComponents(android.InitRegistrationContext) 253*333d2b36SAndroid Build Coastguard Worker// } 254*333d2b36SAndroid Build Coastguard Worker// 255*333d2b36SAndroid Build Coastguard Worker// func RegisterBuildComponents(ctx android.RegistrationContext) { 256*333d2b36SAndroid Build Coastguard Worker// ctx.RegisterModuleType(...) 257*333d2b36SAndroid Build Coastguard Worker// ... 258*333d2b36SAndroid Build Coastguard Worker// } 259*333d2b36SAndroid Build Coastguard Worker// 260*333d2b36SAndroid Build Coastguard Worker// Extracting the actual registration into a separate RegisterBuildComponents(ctx) function 261*333d2b36SAndroid Build Coastguard Worker// allows it to be used to initialize test context, e.g. 262*333d2b36SAndroid Build Coastguard Worker// 263*333d2b36SAndroid Build Coastguard Worker// ctx := android.NewTestContext(config) 264*333d2b36SAndroid Build Coastguard Worker// RegisterBuildComponents(ctx) 265*333d2b36SAndroid Build Coastguard Workervar InitRegistrationContext RegistrationContext = &initRegistrationContext{ 266*333d2b36SAndroid Build Coastguard Worker moduleTypes: make(map[string]ModuleFactory), 267*333d2b36SAndroid Build Coastguard Worker singletonTypes: make(map[string]SingletonFactory), 268*333d2b36SAndroid Build Coastguard Worker} 269*333d2b36SAndroid Build Coastguard Worker 270*333d2b36SAndroid Build Coastguard Worker// Make sure the TestContext implements RegistrationContext. 271*333d2b36SAndroid Build Coastguard Workervar _ RegistrationContext = (*TestContext)(nil) 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Workertype initRegistrationContext struct { 274*333d2b36SAndroid Build Coastguard Worker moduleTypes map[string]ModuleFactory 275*333d2b36SAndroid Build Coastguard Worker singletonTypes map[string]SingletonFactory 276*333d2b36SAndroid Build Coastguard Worker moduleTypesForDocs map[string]reflect.Value 277*333d2b36SAndroid Build Coastguard Worker} 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterModuleType(name string, factory ModuleFactory) { 280*333d2b36SAndroid Build Coastguard Worker if _, present := ctx.moduleTypes[name]; present { 281*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("module type %q is already registered", name)) 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker ctx.moduleTypes[name] = factory 284*333d2b36SAndroid Build Coastguard Worker RegisterModuleType(name, factory) 285*333d2b36SAndroid Build Coastguard Worker RegisterModuleTypeForDocs(name, reflect.ValueOf(factory)) 286*333d2b36SAndroid Build Coastguard Worker} 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterSingletonModuleType(name string, factory SingletonModuleFactory) { 289*333d2b36SAndroid Build Coastguard Worker ctx.registerSingletonModuleType(name, factory, false) 290*333d2b36SAndroid Build Coastguard Worker} 291*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory) { 292*333d2b36SAndroid Build Coastguard Worker ctx.registerSingletonModuleType(name, factory, true) 293*333d2b36SAndroid Build Coastguard Worker} 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) registerSingletonModuleType(name string, factory SingletonModuleFactory, parallel bool) { 296*333d2b36SAndroid Build Coastguard Worker s, m := SingletonModuleFactoryAdaptor(name, factory) 297*333d2b36SAndroid Build Coastguard Worker ctx.registerSingletonType(name, s, parallel) 298*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType(name, m) 299*333d2b36SAndroid Build Coastguard Worker // Overwrite moduleTypesForDocs with the original factory instead of the lambda returned by 300*333d2b36SAndroid Build Coastguard Worker // SingletonModuleFactoryAdaptor so that docs can find the module type documentation on the 301*333d2b36SAndroid Build Coastguard Worker // factory method. 302*333d2b36SAndroid Build Coastguard Worker RegisterModuleTypeForDocs(name, reflect.ValueOf(factory)) 303*333d2b36SAndroid Build Coastguard Worker} 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) registerSingletonType(name string, factory SingletonFactory, parallel bool) { 306*333d2b36SAndroid Build Coastguard Worker if _, present := ctx.singletonTypes[name]; present { 307*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("singleton type %q is already registered", name)) 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker ctx.singletonTypes[name] = factory 310*333d2b36SAndroid Build Coastguard Worker registerSingletonType(name, factory, parallel) 311*333d2b36SAndroid Build Coastguard Worker} 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterSingletonType(name string, factory SingletonFactory) { 314*333d2b36SAndroid Build Coastguard Worker ctx.registerSingletonType(name, factory, false) 315*333d2b36SAndroid Build Coastguard Worker} 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterParallelSingletonType(name string, factory SingletonFactory) { 318*333d2b36SAndroid Build Coastguard Worker ctx.registerSingletonType(name, factory, true) 319*333d2b36SAndroid Build Coastguard Worker} 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PreArchMutators(f RegisterMutatorFunc) { 322*333d2b36SAndroid Build Coastguard Worker PreArchMutators(f) 323*333d2b36SAndroid Build Coastguard Worker} 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) HardCodedPreArchMutators(_ RegisterMutatorFunc) { 326*333d2b36SAndroid Build Coastguard Worker // Nothing to do as the mutators are hard code in preArch in mutator.go 327*333d2b36SAndroid Build Coastguard Worker} 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PreDepsMutators(f RegisterMutatorFunc) { 330*333d2b36SAndroid Build Coastguard Worker PreDepsMutators(f) 331*333d2b36SAndroid Build Coastguard Worker} 332*333d2b36SAndroid Build Coastguard Worker 333*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PostDepsMutators(f RegisterMutatorFunc) { 334*333d2b36SAndroid Build Coastguard Worker PostDepsMutators(f) 335*333d2b36SAndroid Build Coastguard Worker} 336*333d2b36SAndroid Build Coastguard Worker 337*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PostApexMutators(f RegisterMutatorFunc) { 338*333d2b36SAndroid Build Coastguard Worker PostApexMutators(f) 339*333d2b36SAndroid Build Coastguard Worker} 340*333d2b36SAndroid Build Coastguard Worker 341*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) FinalDepsMutators(f RegisterMutatorFunc) { 342*333d2b36SAndroid Build Coastguard Worker FinalDepsMutators(f) 343*333d2b36SAndroid Build Coastguard Worker} 344