Loading mk2rbc/mk2rbc.go +14 −12 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ var knownFunctions = map[string]struct { // TODO(asmundak): remove it once all calls are removed from configuration makefiles. see b/183161002 "shell": {baseName + ".shell", starlarkTypeString}, "strip": {baseName + ".mkstrip", starlarkTypeString}, "subst": {baseName + ".subst", starlarkTypeString}, "subst": {baseName + ".mksubst", starlarkTypeString}, "warning": {baseName + ".mkwarning", starlarkTypeVoid}, "word": {baseName + "!word", starlarkTypeString}, "wildcard": {baseName + ".expand_wildcard", starlarkTypeList}, Loading Loading @@ -509,13 +509,7 @@ func (ctx *parseContext) handleAssignment(a *mkparser.Assignment) { } inferred_type := asgn.value.typ() if inferred_type != starlarkTypeUnknown { if ogv, ok := lhs.(*otherGlobalVariable); ok { ogv.typ = inferred_type } else if pcv, ok := lhs.(*productConfigVariable); ok { pcv.typ = inferred_type } else { panic(fmt.Errorf("cannot assign new type to a variable %s, its flavor is %T", lhs.name(), lhs)) } lhs.setValueType(inferred_type) } } if lhs.valueType() == starlarkTypeList { Loading Loading @@ -1114,11 +1108,19 @@ func (ctx *parseContext) parseSubstFunc(node mkparser.Node, args *mkparser.MakeS words[2].TrimLeftSpaces() words[2].TrimRightSpaces() obj := ctx.parseMakeString(node, words[2]) typ := obj.typ() if typ == starlarkTypeString { return &callExpr{ object: obj, name: "replace", args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}}, returnType: starlarkTypeString, returnType: typ, } } return &callExpr{ name: "subst", args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}, obj}, returnType: obj.typ(), } } Loading mk2rbc/mk2rbc_test.go +16 −0 Original line number Diff line number Diff line Loading @@ -637,6 +637,22 @@ def init(g, handle): cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c") cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c") cfg["PRODUCT_NAME"] = ((g.get("TARGET_BOARD_PLATFORM", "")).replace(".", " ")).split()[0] `, }, { desc: "subst in list", mkname: "product.mk", in: ` files = $(call find-copy-subdir-files,*,from,to) PRODUCT_COPY_FILES += $(subst foo,bar,$(files)) `, expected: `load("//build/make/core:product_config.rbc", "rblf") def init(g, handle): cfg = rblf.cfg(handle) _files = rblf.find_and_copy("*", "from", "to") rblf.setdefault(handle, "PRODUCT_COPY_FILES") cfg["PRODUCT_COPY_FILES"] += rblf.mksubst("foo", "bar", _files) `, }, { Loading mk2rbc/variable.go +6 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ type variable interface { emitSet(gctx *generationContext, asgn *assignmentNode) emitDefined(gctx *generationContext) valueType() starlarkType setValueType(t starlarkType) defaultValueString() string isPreset() bool } Loading @@ -44,6 +45,10 @@ func (v baseVariable) valueType() starlarkType { return v.typ } func (v *baseVariable) setValueType(t starlarkType) { v.typ = t } func (v baseVariable) isPreset() bool { return v.preset } Loading Loading @@ -279,7 +284,7 @@ func (ctx *parseContext) addVariable(name string) variable { } else if name == strings.ToLower(name) { // Heuristics: if variable's name is all lowercase, consider it local // string variable. v = &localVariable{baseVariable{nam: name, typ: starlarkTypeString}} v = &localVariable{baseVariable{nam: name, typ: starlarkTypeUnknown}} } else { vt := starlarkTypeUnknown if strings.HasPrefix(name, "LOCAL_") { Loading Loading
mk2rbc/mk2rbc.go +14 −12 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ var knownFunctions = map[string]struct { // TODO(asmundak): remove it once all calls are removed from configuration makefiles. see b/183161002 "shell": {baseName + ".shell", starlarkTypeString}, "strip": {baseName + ".mkstrip", starlarkTypeString}, "subst": {baseName + ".subst", starlarkTypeString}, "subst": {baseName + ".mksubst", starlarkTypeString}, "warning": {baseName + ".mkwarning", starlarkTypeVoid}, "word": {baseName + "!word", starlarkTypeString}, "wildcard": {baseName + ".expand_wildcard", starlarkTypeList}, Loading Loading @@ -509,13 +509,7 @@ func (ctx *parseContext) handleAssignment(a *mkparser.Assignment) { } inferred_type := asgn.value.typ() if inferred_type != starlarkTypeUnknown { if ogv, ok := lhs.(*otherGlobalVariable); ok { ogv.typ = inferred_type } else if pcv, ok := lhs.(*productConfigVariable); ok { pcv.typ = inferred_type } else { panic(fmt.Errorf("cannot assign new type to a variable %s, its flavor is %T", lhs.name(), lhs)) } lhs.setValueType(inferred_type) } } if lhs.valueType() == starlarkTypeList { Loading Loading @@ -1114,11 +1108,19 @@ func (ctx *parseContext) parseSubstFunc(node mkparser.Node, args *mkparser.MakeS words[2].TrimLeftSpaces() words[2].TrimRightSpaces() obj := ctx.parseMakeString(node, words[2]) typ := obj.typ() if typ == starlarkTypeString { return &callExpr{ object: obj, name: "replace", args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}}, returnType: starlarkTypeString, returnType: typ, } } return &callExpr{ name: "subst", args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}, obj}, returnType: obj.typ(), } } Loading
mk2rbc/mk2rbc_test.go +16 −0 Original line number Diff line number Diff line Loading @@ -637,6 +637,22 @@ def init(g, handle): cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c") cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c") cfg["PRODUCT_NAME"] = ((g.get("TARGET_BOARD_PLATFORM", "")).replace(".", " ")).split()[0] `, }, { desc: "subst in list", mkname: "product.mk", in: ` files = $(call find-copy-subdir-files,*,from,to) PRODUCT_COPY_FILES += $(subst foo,bar,$(files)) `, expected: `load("//build/make/core:product_config.rbc", "rblf") def init(g, handle): cfg = rblf.cfg(handle) _files = rblf.find_and_copy("*", "from", "to") rblf.setdefault(handle, "PRODUCT_COPY_FILES") cfg["PRODUCT_COPY_FILES"] += rblf.mksubst("foo", "bar", _files) `, }, { Loading
mk2rbc/variable.go +6 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ type variable interface { emitSet(gctx *generationContext, asgn *assignmentNode) emitDefined(gctx *generationContext) valueType() starlarkType setValueType(t starlarkType) defaultValueString() string isPreset() bool } Loading @@ -44,6 +45,10 @@ func (v baseVariable) valueType() starlarkType { return v.typ } func (v *baseVariable) setValueType(t starlarkType) { v.typ = t } func (v baseVariable) isPreset() bool { return v.preset } Loading Loading @@ -279,7 +284,7 @@ func (ctx *parseContext) addVariable(name string) variable { } else if name == strings.ToLower(name) { // Heuristics: if variable's name is all lowercase, consider it local // string variable. v = &localVariable{baseVariable{nam: name, typ: starlarkTypeString}} v = &localVariable{baseVariable{nam: name, typ: starlarkTypeUnknown}} } else { vt := starlarkTypeUnknown if strings.HasPrefix(name, "LOCAL_") { Loading