blob: 844b4d40804d96232fc7095bd786685d8b4086bf [file] [log] [blame]
Colin Crosscfad1192015-11-02 16:43:11 -08001// 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 Cross635c3b02016-05-18 15:37:25 -070015package android
Colin Crosscfad1192015-11-02 16:43:11 -080016
17import (
18 "github.com/google/blueprint"
19 "github.com/google/blueprint/proptools"
20)
21
Colin Crossc99deeb2016-04-11 15:06:20 -070022type defaultsDependencyTag struct {
23 blueprint.BaseDependencyTag
24}
25
26var DefaultsDepTag defaultsDependencyTag
27
Colin Crosscfad1192015-11-02 16:43:11 -080028type defaultsProperties struct {
29 Defaults []string
30}
31
Colin Cross1f44a3a2017-07-07 14:33:33 -070032type DefaultableModuleBase struct {
Colin Crosscfad1192015-11-02 16:43:11 -080033 defaultsProperties defaultsProperties
34 defaultableProperties []interface{}
35}
36
Colin Cross1f44a3a2017-07-07 14:33:33 -070037func (d *DefaultableModuleBase) defaults() *defaultsProperties {
Colin Crosscfad1192015-11-02 16:43:11 -080038 return &d.defaultsProperties
39}
40
Colin Cross1f44a3a2017-07-07 14:33:33 -070041func (d *DefaultableModuleBase) setProperties(props []interface{}) {
Colin Crosscfad1192015-11-02 16:43:11 -080042 d.defaultableProperties = props
43}
44
45type Defaultable interface {
46 defaults() *defaultsProperties
47 setProperties([]interface{})
Colin Cross13177012016-08-09 12:00:45 -070048 applyDefaults(TopDownMutatorContext, []Defaults)
Colin Crosscfad1192015-11-02 16:43:11 -080049}
50
Colin Cross1f44a3a2017-07-07 14:33:33 -070051type DefaultableModule interface {
52 Module
53 Defaultable
Colin Crosscfad1192015-11-02 16:43:11 -080054}
55
Colin Cross1f44a3a2017-07-07 14:33:33 -070056var _ Defaultable = (*DefaultableModuleBase)(nil)
57
58func InitDefaultableModule(module DefaultableModule) {
59 module.(Defaultable).setProperties(module.(Module).GetProperties())
60
61 module.AddProperties(module.defaults())
62}
63
64type DefaultsModuleBase struct {
65 DefaultableModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -080066 defaultProperties []interface{}
67}
68
69type Defaults interface {
Colin Crosse7b07132016-07-27 10:15:06 -070070 Defaultable
Colin Crosscfad1192015-11-02 16:43:11 -080071 isDefaults() bool
Colin Crosscfad1192015-11-02 16:43:11 -080072 properties() []interface{}
73}
74
Colin Cross1f44a3a2017-07-07 14:33:33 -070075func (d *DefaultsModuleBase) isDefaults() bool {
Colin Crosscfad1192015-11-02 16:43:11 -080076 return true
77}
78
Colin Cross1f44a3a2017-07-07 14:33:33 -070079func (d *DefaultsModuleBase) properties() []interface{} {
Colin Crosse7b07132016-07-27 10:15:06 -070080 return d.defaultableProperties
Colin Crosscfad1192015-11-02 16:43:11 -080081}
82
Colin Cross59037622019-06-10 13:12:56 -070083func (d *DefaultsModuleBase) GenerateAndroidBuildActions(ctx ModuleContext) {
84}
85
Colin Cross1f44a3a2017-07-07 14:33:33 -070086func InitDefaultsModule(module DefaultableModule) {
Colin Cross36242852017-06-23 15:06:31 -070087 module.AddProperties(
Colin Crossfc754582016-05-17 16:34:16 -070088 &hostAndDeviceProperties{},
89 &commonProperties{},
90 &variableProperties{})
91
Colin Cross36242852017-06-23 15:06:31 -070092 InitArchModule(module)
Colin Cross1f44a3a2017-07-07 14:33:33 -070093 InitDefaultableModule(module)
Colin Crossfc754582016-05-17 16:34:16 -070094
Colin Cross36242852017-06-23 15:06:31 -070095 module.AddProperties(&module.base().nameProperties)
Colin Crossfc754582016-05-17 16:34:16 -070096
97 module.base().module = module
Colin Crosscfad1192015-11-02 16:43:11 -080098}
99
Colin Cross1f44a3a2017-07-07 14:33:33 -0700100var _ Defaults = (*DefaultsModuleBase)(nil)
Colin Crosscfad1192015-11-02 16:43:11 -0800101
Colin Cross1f44a3a2017-07-07 14:33:33 -0700102func (defaultable *DefaultableModuleBase) applyDefaults(ctx TopDownMutatorContext,
Colin Cross13177012016-08-09 12:00:45 -0700103 defaultsList []Defaults) {
Colin Crosscfad1192015-11-02 16:43:11 -0800104
Colin Cross13177012016-08-09 12:00:45 -0700105 for _, defaults := range defaultsList {
106 for _, prop := range defaultable.defaultableProperties {
107 for _, def := range defaults.properties() {
108 if proptools.TypeEqual(prop, def) {
109 err := proptools.PrependProperties(prop, def, nil)
110 if err != nil {
111 if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
112 ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
113 } else {
114 panic(err)
115 }
Colin Crosscfad1192015-11-02 16:43:11 -0800116 }
117 }
118 }
119 }
120 }
121}
122
Colin Cross89536d42017-07-07 14:35:50 -0700123func RegisterDefaultsPreArchMutators(ctx RegisterMutatorsContext) {
Colin Crosscec81712017-07-13 14:43:27 -0700124 ctx.BottomUp("defaults_deps", defaultsDepsMutator).Parallel()
125 ctx.TopDown("defaults", defaultsMutator).Parallel()
126}
127
Colin Cross635c3b02016-05-18 15:37:25 -0700128func defaultsDepsMutator(ctx BottomUpMutatorContext) {
Colin Crosscfad1192015-11-02 16:43:11 -0800129 if defaultable, ok := ctx.Module().(Defaultable); ok {
Colin Crossc99deeb2016-04-11 15:06:20 -0700130 ctx.AddDependency(ctx.Module(), DefaultsDepTag, defaultable.defaults().Defaults...)
Colin Crosscfad1192015-11-02 16:43:11 -0800131 }
132}
133
Colin Cross13177012016-08-09 12:00:45 -0700134func defaultsMutator(ctx TopDownMutatorContext) {
135 if defaultable, ok := ctx.Module().(Defaultable); ok && len(defaultable.defaults().Defaults) > 0 {
136 var defaultsList []Defaults
Colin Crossa1ce2a02018-06-20 15:19:39 -0700137 seen := make(map[Defaults]bool)
138
Colin Crossd11fcda2017-10-23 17:59:01 -0700139 ctx.WalkDeps(func(module, parent Module) bool {
Colin Cross13177012016-08-09 12:00:45 -0700140 if ctx.OtherModuleDependencyTag(module) == DefaultsDepTag {
141 if defaults, ok := module.(Defaults); ok {
Colin Crossa1ce2a02018-06-20 15:19:39 -0700142 if !seen[defaults] {
143 seen[defaults] = true
144 defaultsList = append(defaultsList, defaults)
145 return len(defaults.defaults().Defaults) > 0
146 }
Colin Cross13177012016-08-09 12:00:45 -0700147 } else {
148 ctx.PropertyErrorf("defaults", "module %s is not an defaults module",
149 ctx.OtherModuleName(module))
Colin Crosscfad1192015-11-02 16:43:11 -0800150 }
Colin Cross13177012016-08-09 12:00:45 -0700151 }
152 return false
153 })
154 defaultable.applyDefaults(ctx, defaultsList)
Colin Crosscfad1192015-11-02 16:43:11 -0800155 }
156}