blob: 030946bbee50776828acf8e61408190fc2d45ec1 [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
15package common
16
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
32type DefaultableModule struct {
33 defaultsProperties defaultsProperties
34 defaultableProperties []interface{}
35}
36
37func (d *DefaultableModule) defaults() *defaultsProperties {
38 return &d.defaultsProperties
39}
40
41func (d *DefaultableModule) setProperties(props []interface{}) {
42 d.defaultableProperties = props
43}
44
45type Defaultable interface {
46 defaults() *defaultsProperties
47 setProperties([]interface{})
48 applyDefaults(AndroidTopDownMutatorContext, Defaults)
49}
50
51var _ Defaultable = (*DefaultableModule)(nil)
52
53func InitDefaultableModule(module AndroidModule, d Defaultable,
54 props ...interface{}) (blueprint.Module, []interface{}) {
55
56 d.setProperties(props)
57
58 props = append(props, d.defaults())
59
60 return module, props
61}
62
63type DefaultsModule struct {
64 defaultProperties []interface{}
65}
66
67type Defaults interface {
68 isDefaults() bool
69 setProperties([]interface{})
70 properties() []interface{}
71}
72
73func (d *DefaultsModule) isDefaults() bool {
74 return true
75}
76
77func (d *DefaultsModule) properties() []interface{} {
78 return d.defaultProperties
79}
80
81func (d *DefaultsModule) setProperties(props []interface{}) {
82 d.defaultProperties = props
83}
84
85func InitDefaultsModule(module AndroidModule, d Defaults, props ...interface{}) (blueprint.Module, []interface{}) {
86 d.setProperties(props)
87
88 return module, props
89}
90
91var _ Defaults = (*DefaultsModule)(nil)
92
93func (defaultable *DefaultableModule) applyDefaults(ctx AndroidTopDownMutatorContext,
94 defaults Defaults) {
95
96 for _, prop := range defaultable.defaultableProperties {
97 for _, def := range defaults.properties() {
98 if proptools.TypeEqual(prop, def) {
99 err := proptools.PrependProperties(prop, def, nil)
100 if err != nil {
101 if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
102 ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
103 } else {
104 panic(err)
105 }
106 }
107 }
108 }
109 }
110}
111
112func defaultsDepsMutator(ctx AndroidBottomUpMutatorContext) {
113 if defaultable, ok := ctx.Module().(Defaultable); ok {
Colin Crossc99deeb2016-04-11 15:06:20 -0700114 ctx.AddDependency(ctx.Module(), DefaultsDepTag, defaultable.defaults().Defaults...)
Colin Crosscfad1192015-11-02 16:43:11 -0800115 }
116}
117
118func defaultsMutator(ctx AndroidTopDownMutatorContext) {
119 if defaultable, ok := ctx.Module().(Defaultable); ok {
120 for _, defaultsDep := range defaultable.defaults().Defaults {
121 ctx.VisitDirectDeps(func(m blueprint.Module) {
122 if ctx.OtherModuleName(m) == defaultsDep {
123 if defaultsModule, ok := m.(Defaults); ok {
124 defaultable.applyDefaults(ctx, defaultsModule)
125 } else {
126 ctx.PropertyErrorf("defaults", "module %s is not an defaults module",
127 ctx.OtherModuleName(m))
128 }
129 }
130 })
131 }
132 }
133}