diff options
author | Colin Cross <ccross@android.com> | 2015-11-02 16:43:11 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2015-11-03 15:46:08 -0800 |
commit | cfad119eaf895cd0d9897f96af27ba7b2b0846a1 (patch) | |
tree | d74ccc4ae4eced25bda997eb96adb21c0940ddc0 /common/defaults.go | |
parent | 6362e278481ea0cb14d31cd7fd3760116b6d7643 (diff) | |
download | build_soong-cfad119eaf895cd0d9897f96af27ba7b2b0846a1.tar.gz build_soong-cfad119eaf895cd0d9897f96af27ba7b2b0846a1.tar.bz2 build_soong-cfad119eaf895cd0d9897f96af27ba7b2b0846a1.zip |
Add support for defaults modules
Add a cc_defaults module, which will prepend any matching properties to
modules that reference it with a "defaults" property.
Change-Id: I5908dd98d204f71b29ad95a4ab85403aa1621ca2
Diffstat (limited to 'common/defaults.go')
-rw-r--r-- | common/defaults.go | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/common/defaults.go b/common/defaults.go new file mode 100644 index 00000000..693d5109 --- /dev/null +++ b/common/defaults.go @@ -0,0 +1,127 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "github.com/google/blueprint" + "github.com/google/blueprint/proptools" +) + +type defaultsProperties struct { + Defaults []string +} + +type DefaultableModule struct { + defaultsProperties defaultsProperties + defaultableProperties []interface{} +} + +func (d *DefaultableModule) defaults() *defaultsProperties { + return &d.defaultsProperties +} + +func (d *DefaultableModule) setProperties(props []interface{}) { + d.defaultableProperties = props +} + +type Defaultable interface { + defaults() *defaultsProperties + setProperties([]interface{}) + applyDefaults(AndroidTopDownMutatorContext, Defaults) +} + +var _ Defaultable = (*DefaultableModule)(nil) + +func InitDefaultableModule(module AndroidModule, d Defaultable, + props ...interface{}) (blueprint.Module, []interface{}) { + + d.setProperties(props) + + props = append(props, d.defaults()) + + return module, props +} + +type DefaultsModule struct { + defaultProperties []interface{} +} + +type Defaults interface { + isDefaults() bool + setProperties([]interface{}) + properties() []interface{} +} + +func (d *DefaultsModule) isDefaults() bool { + return true +} + +func (d *DefaultsModule) properties() []interface{} { + return d.defaultProperties +} + +func (d *DefaultsModule) setProperties(props []interface{}) { + d.defaultProperties = props +} + +func InitDefaultsModule(module AndroidModule, d Defaults, props ...interface{}) (blueprint.Module, []interface{}) { + d.setProperties(props) + + return module, props +} + +var _ Defaults = (*DefaultsModule)(nil) + +func (defaultable *DefaultableModule) applyDefaults(ctx AndroidTopDownMutatorContext, + defaults Defaults) { + + for _, prop := range defaultable.defaultableProperties { + for _, def := range defaults.properties() { + if proptools.TypeEqual(prop, def) { + err := proptools.PrependProperties(prop, def, nil) + if err != nil { + if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { + ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) + } else { + panic(err) + } + } + } + } + } +} + +func defaultsDepsMutator(ctx AndroidBottomUpMutatorContext) { + if defaultable, ok := ctx.Module().(Defaultable); ok { + ctx.AddDependency(ctx.Module(), defaultable.defaults().Defaults...) + } +} + +func defaultsMutator(ctx AndroidTopDownMutatorContext) { + if defaultable, ok := ctx.Module().(Defaultable); ok { + for _, defaultsDep := range defaultable.defaults().Defaults { + ctx.VisitDirectDeps(func(m blueprint.Module) { + if ctx.OtherModuleName(m) == defaultsDep { + if defaultsModule, ok := m.(Defaults); ok { + defaultable.applyDefaults(ctx, defaultsModule) + } else { + ctx.PropertyErrorf("defaults", "module %s is not an defaults module", + ctx.OtherModuleName(m)) + } + } + }) + } + } +} |