blob: 648ff88d0b7d0a2f6a8a058c8e0f614872693b79 [file] [log] [blame]
package main
import (
"fmt"
"strings"
bpparser "github.com/google/blueprint/parser"
)
type Module struct {
bpmod *bpparser.Module
bpname string
mkname string
isHostRule bool
}
func newModule(mod *bpparser.Module) *Module {
return &Module{
bpmod: mod.Copy(),
bpname: mod.Type.Name,
}
}
func (m *Module) translateRuleName() error {
var name string
if translation, ok := moduleTypeToRule[m.bpname]; ok {
name = translation
} else {
return fmt.Errorf("Unknown module type %q", m.bpname)
}
if m.isHostRule {
if trans, ok := targetToHostModuleRule[name]; ok {
name = trans
} else {
return fmt.Errorf("No corresponding host rule for %q", name)
}
} else {
m.isHostRule = strings.Contains(name, "HOST")
}
m.mkname = name
return nil
}
func (m *Module) Properties() Properties {
return Properties{&m.bpmod.Properties}
}
func (m *Module) PropBool(name string) bool {
if prop, ok := m.Properties().Prop(name); ok {
return prop.Value.BoolValue
}
return false
}
func (m *Module) IterateArchPropertiesWithName(name string, f func(Properties, *bpparser.Property) error) error {
if p, ok := m.Properties().Prop(name); ok {
err := f(m.Properties(), p)
if err != nil {
return err
}
}
for _, prop := range m.bpmod.Properties {
switch prop.Name.Name {
case "arch", "multilib", "target":
for _, sub := range prop.Value.MapValue {
props := Properties{&sub.Value.MapValue}
if p, ok := props.Prop(name); ok {
err := f(props, p)
if err != nil {
return err
}
}
}
}
}
return nil
}
type Properties struct {
props *[]*bpparser.Property
}
func (p Properties) Prop(name string) (*bpparser.Property, bool) {
for _, prop := range *p.props {
if name == prop.Name.Name {
return prop, true
}
}
return nil, false
}
func (p Properties) AppendToProp(name string, src *bpparser.Property) error {
if d, ok := p.Prop(name); ok {
val, err := appendValueToValue(d.Value, src.Value)
if err != nil {
return err
}
d.Value = val
} else {
prop := src.Copy()
prop.Name.Name = name
*p.props = append(*p.props, prop)
}
return nil
}
func (p Properties) DeleteProp(name string) {
for i, prop := range *p.props {
if prop.Name.Name == name {
*p.props = append((*p.props)[0:i], (*p.props)[i+1:]...)
return
}
}
}