| 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 |
| } |
| } |
| } |