blob: 51089f7ba5c4e6e22bac4226c248f3d953ccdbe5 [file] [log] [blame]
Colin Cross463a90e2015-06-17 14:20:06 -07001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross798bfce2016-10-12 14:28:16 -070015package android
Colin Cross463a90e2015-06-17 14:20:06 -070016
Colin Cross4498afc2016-10-13 14:18:27 -070017import (
Colin Cross4498afc2016-10-13 14:18:27 -070018 "github.com/google/blueprint"
19)
Colin Cross463a90e2015-06-17 14:20:06 -070020
21type moduleType struct {
22 name string
23 factory blueprint.ModuleFactory
24}
25
26var moduleTypes []moduleType
27
28type singleton struct {
29 name string
30 factory blueprint.SingletonFactory
31}
32
33var singletons []singleton
34
Colin Cross6362e272015-10-29 15:25:03 -070035type mutator struct {
36 name string
37 bottomUpMutator blueprint.BottomUpMutator
38 topDownMutator blueprint.TopDownMutator
Colin Crosse8a67a72016-08-07 21:17:54 -070039 parallel bool
Colin Cross463a90e2015-06-17 14:20:06 -070040}
41
Colin Crosse8a67a72016-08-07 21:17:54 -070042var mutators []*mutator
Colin Cross463a90e2015-06-17 14:20:06 -070043
Colin Cross36242852017-06-23 15:06:31 -070044type ModuleFactory func() Module
45
Steven Morelandb1448e42017-10-27 14:46:35 -070046// ModuleFactoryAdaptor Wraps a ModuleFactory into a blueprint.ModuleFactory by converting an Module
Colin Cross36242852017-06-23 15:06:31 -070047// into a blueprint.Module and a list of property structs
48func ModuleFactoryAdaptor(factory ModuleFactory) blueprint.ModuleFactory {
49 return func() (blueprint.Module, []interface{}) {
50 module := factory()
51 return module, module.GetProperties()
52 }
53}
54
55func RegisterModuleType(name string, factory ModuleFactory) {
56 moduleTypes = append(moduleTypes, moduleType{name, ModuleFactoryAdaptor(factory)})
Colin Cross463a90e2015-06-17 14:20:06 -070057}
58
59func RegisterSingletonType(name string, factory blueprint.SingletonFactory) {
60 singletons = append(singletons, singleton{name, factory})
61}
62
Colin Crosscec81712017-07-13 14:43:27 -070063type Context struct {
64 *blueprint.Context
65}
Colin Cross463a90e2015-06-17 14:20:06 -070066
Colin Crosscec81712017-07-13 14:43:27 -070067func NewContext() *Context {
68 return &Context{blueprint.NewContext()}
69}
70
71func (ctx *Context) Register() {
Colin Cross463a90e2015-06-17 14:20:06 -070072 for _, t := range moduleTypes {
73 ctx.RegisterModuleType(t.name, t.factory)
74 }
75
76 for _, t := range singletons {
77 ctx.RegisterSingletonType(t.name, t.factory)
78 }
79
Colin Crosscec81712017-07-13 14:43:27 -070080 registerMutators(ctx.Context, preArch, preDeps, postDeps)
Colin Cross1e676be2016-10-12 14:38:15 -070081
Fabien Sanglardd61f1f42017-01-10 16:21:22 -080082 ctx.RegisterSingletonType("env", EnvSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -070083}