androidbp: Refactor Target/Device duplication to mutation

This is just another mutation in soong, implement it as a mutation in
androidbp as well.

Change-Id: Id72cba58db8603cace9d8ae5d8fbbd08167867cd
This commit is contained in:
Dan Willemsen 2015-06-24 15:37:17 -07:00
parent 49f50454c1
commit 3a4045d3b1
2 changed files with 92 additions and 47 deletions

View file

@ -15,6 +15,39 @@ import (
var recursiveSubdirRegex *regexp.Regexp = regexp.MustCompile("(.+)/\\*\\*/(.+)")
type Module struct {
bpmod *bpparser.Module
bpname string
mkname string
isHostRule bool
}
func newModule(mod *bpparser.Module) *Module {
return &Module{
bpmod: mod,
bpname: mod.Type.Name,
}
}
func (m *Module) translateRuleName() {
name := fmt.Sprintf(m.bpname)
if translation, ok := moduleTypeToRule[m.bpname]; ok {
name = translation
}
if m.isHostRule {
if trans, ok := targetToHostModuleRule[name]; ok {
name = trans
} else {
name = "NO CORRESPONDING HOST RULE" + name
}
} else {
m.isHostRule = strings.Contains(name, "HOST")
}
m.mkname = name
}
type androidMkWriter struct {
*bufio.Writer
@ -182,6 +215,15 @@ func prependLocalModule(name string, prop *bpparser.Property, suffix *string) (c
}
}
func modulePropBool(module *bpparser.Module, name string) bool {
for _, prop := range module.Properties {
if name == prop.Name.Name {
return prop.Value.BoolValue
}
}
return false
}
func (w *androidMkWriter) lookupMap(parent bpparser.Value) (mapValue []*bpparser.Property) {
if parent.Variable != "" {
mapValue = w.mapScope[parent.Variable]
@ -215,10 +257,10 @@ func (w *androidMkWriter) writeModule(moduleRule string, props []string,
fmt.Fprintf(w, "include $(%s)\n\n", moduleRule)
}
func (w *androidMkWriter) parsePropsAndWriteModule(moduleRule string, isHostRule bool, module *bpparser.Module) (hostSupported bool) {
standardProps := make([]string, 0, len(module.Properties))
func (w *androidMkWriter) parsePropsAndWriteModule(module *Module) {
standardProps := make([]string, 0, len(module.bpmod.Properties))
disabledBuilds := make(map[string]bool)
for _, prop := range module.Properties {
for _, prop := range module.bpmod.Properties {
if mkProp, ok := standardProperties[prop.Name.Name]; ok {
standardProps = append(standardProps, fmt.Sprintf("%s := %s", mkProp.string, valueToString(prop.Value)))
} else if rwProp, ok := rewriteProperties[prop.Name.Name]; ok {
@ -228,67 +270,51 @@ func (w *androidMkWriter) parsePropsAndWriteModule(moduleRule string, isHostRule
standardProps = append(standardProps, translateSuffixProperties(suffixProps, suffixMap)...)
} else if "target" == prop.Name.Name {
props := w.lookupMap(prop.Value)
standardProps = append(standardProps, translateTargetConditionals(props, disabledBuilds, isHostRule)...)
standardProps = append(standardProps, translateTargetConditionals(props, disabledBuilds, module.isHostRule)...)
} else if "host_supported" == prop.Name.Name {
hostSupported = prop.Value.BoolValue
} else {
standardProps = append(standardProps, fmt.Sprintf("# ERROR: Unsupported property %s", prop.Name.Name))
}
}
// write out target build
w.writeModule(moduleRule, standardProps, disabledBuilds, isHostRule)
return
w.writeModule(module.mkname, standardProps, disabledBuilds, module.isHostRule)
}
func (w *androidMkWriter) mutateModule(module *bpparser.Module) (modules []*bpparser.Module) {
if module.Type.Name == "cc_library" {
modules = append(modules, &bpparser.Module{
Type: bpparser.Ident{
Name: "cc_library_shared",
Pos: module.Type.Pos,
},
Properties: module.Properties,
LbracePos: module.LbracePos,
RbracePos: module.RbracePos,
})
func (w *androidMkWriter) mutateModule(module *Module) (modules []*Module) {
modules = []*Module{module}
modules = append(modules, &bpparser.Module{
Type: bpparser.Ident{
Name: "cc_library_static",
Pos: module.Type.Pos,
},
Properties: module.Properties,
LbracePos: module.LbracePos,
RbracePos: module.RbracePos,
})
} else {
modules = []*bpparser.Module{module}
if module.bpname == "cc_library" {
modules = []*Module{
newModule(module.bpmod),
newModule(module.bpmod),
}
modules[0].bpname = "cc_library_shared"
modules[1].bpname = "cc_library_static"
}
for _, mod := range modules {
mod.translateRuleName()
if mod.isHostRule || !modulePropBool(mod.bpmod, "host_supported") {
continue
}
m := &Module{
bpmod: mod.bpmod,
bpname: mod.bpname,
isHostRule: true,
}
m.translateRuleName()
modules = append(modules, m)
}
return
}
func (w *androidMkWriter) handleModule(inputModule *bpparser.Module) {
modules := w.mutateModule(inputModule)
modules := w.mutateModule(newModule(inputModule))
for _, module := range modules {
moduleRule := fmt.Sprintf(module.Type.Name)
if translation, ok := moduleTypeToRule[module.Type.Name]; ok {
moduleRule = translation
}
isHostRule := strings.Contains(moduleRule, "HOST")
hostSupported := w.parsePropsAndWriteModule(moduleRule, isHostRule, module)
if !isHostRule && hostSupported {
hostModuleRule := "NO CORRESPONDING HOST RULE" + moduleRule
if trans, ok := targetToHostModuleRule[moduleRule]; ok {
hostModuleRule = trans
}
w.parsePropsAndWriteModule(hostModuleRule, true, module)
}
w.parsePropsAndWriteModule(module)
}
}

View file

@ -96,6 +96,25 @@ var moduleTestCases = []struct {
LOCAL_MODULE := test
include $(BUILD_STATIC_LIBRARY)`,
},
// Static and Shared / Target and Host
{
blueprint: `cc_library { name: "test", host_supported: true, }`,
androidmk: `include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_HOST_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_HOST_STATIC_LIBRARY)`,
},
}
func TestModules(t *testing.T) {