Loading mk2rbc/mk2rbc.go +18 −4 Original line number Diff line number Diff line Loading @@ -895,8 +895,9 @@ func (p *inheritProductCallParser) parse(ctx *parseContext, v mkparser.Node, arg }) } func (ctx *parseContext) handleInclude(v mkparser.Node, pathExpr starlarkExpr, loadAlways bool) []starlarkNode { return ctx.handleSubConfig(v, pathExpr, loadAlways, func(im inheritedModule) starlarkNode { func (ctx *parseContext) handleInclude(v *mkparser.Directive) []starlarkNode { loadAlways := v.Name[0] != '-' return ctx.handleSubConfig(v, ctx.parseMakeString(v, v.Args), loadAlways, func(im inheritedModule) starlarkNode { return &includeNode{im, loadAlways} }) } Loading Loading @@ -1759,10 +1760,23 @@ func (p *evalNodeParser) parse(ctx *parseContext, node mkparser.Node, args *mkpa } case *mkparser.Comment: return []starlarkNode{&commentNode{strings.TrimSpace("#" + n.Comment)}} case *mkparser.Directive: if n.Name == "include" || n.Name == "-include" { return ctx.handleInclude(n) } case *mkparser.Variable: // Technically inherit-product(-if-exists) don't need to be put inside // an eval, but some makefiles do it, presumably because they copy+pasted // from a $(eval include ...) if name, _, ok := ctx.maybeParseFunctionCall(n, n.Name); ok { if name == "inherit-product" || name == "inherit-product-if-exists" { return ctx.handleVariable(n) } } } } return []starlarkNode{ctx.newBadNode(node, "Eval expression too complex; only assignments and comments are supported")} return []starlarkNode{ctx.newBadNode(node, "Eval expression too complex; only assignments, comments, includes, and inherit-products are supported")} } func (ctx *parseContext) parseMakeString(node mkparser.Node, mk *mkparser.MakeString) starlarkExpr { Loading Loading @@ -1822,7 +1836,7 @@ func (ctx *parseContext) handleSimpleStatement(node mkparser.Node) []starlarkNod result = []starlarkNode{res} } case "include", "-include": result = ctx.handleInclude(node, ctx.parseMakeString(node, x.Args), x.Name[0] != '-') result = ctx.handleInclude(x) case "ifeq", "ifneq", "ifdef", "ifndef": result = []starlarkNode{ctx.handleIfBlock(x)} default: Loading mk2rbc/mk2rbc_test.go +19 −3 Original line number Diff line number Diff line Loading @@ -1515,24 +1515,40 @@ $(eval) $(eval MY_VAR := foo) $(eval # This is a test of eval functions) $(eval $(TOO_COMPLICATED) := bar) $(eval include foo/font.mk) $(eval $(call inherit-product,vendor/foo1/cfg.mk)) $(foreach x,$(MY_LIST_VAR), \ $(eval PRODUCT_COPY_FILES += foo/bar/$(x):$(TARGET_COPY_OUT_VENDOR)/etc/$(x)) \ $(if $(MY_OTHER_VAR),$(eval PRODUCT_COPY_FILES += $(MY_OTHER_VAR):foo/bar/$(x))) \ ) $(if $(MY_OTHER_VAR),$(eval PRODUCT_COPY_FILES += $(MY_OTHER_VAR):foo/bar/$(x)))) $(foreach x,$(MY_LIST_VAR), \ $(eval include foo/$(x).mk)) `, expected: `load("//build/make/core:product_config.rbc", "rblf") load("//foo:font.star", _font_init = "init") load("//vendor/foo1:cfg.star", _cfg_init = "init") def init(g, handle): cfg = rblf.cfg(handle) g["MY_VAR"] = "foo" # This is a test of eval functions rblf.mk2rbc_error("product.mk:5", "Eval expression too complex; only assignments and comments are supported") rblf.mk2rbc_error("product.mk:5", "Eval expression too complex; only assignments, comments, includes, and inherit-products are supported") _font_init(g, handle) rblf.inherit(handle, "vendor/foo1/cfg", _cfg_init) for x in rblf.words(g.get("MY_LIST_VAR", "")): rblf.setdefault(handle, "PRODUCT_COPY_FILES") cfg["PRODUCT_COPY_FILES"] += ("foo/bar/%s:%s/etc/%s" % (x, g.get("TARGET_COPY_OUT_VENDOR", ""), x)).split() if g.get("MY_OTHER_VAR", ""): cfg["PRODUCT_COPY_FILES"] += ("%s:foo/bar/%s" % (g.get("MY_OTHER_VAR", ""), x)).split() for x in rblf.words(g.get("MY_LIST_VAR", "")): _entry = { "foo/font.mk": ("foo/font", _font_init), }.get("foo/%s.mk" % _x) (_varmod, _varmod_init) = _entry if _entry else (None, None) if not _varmod_init: rblf.mkerror("product.mk", "Cannot find %s" % ("foo/%s.mk" % _x)) _varmod_init(g, handle) `, }, { Loading Loading
mk2rbc/mk2rbc.go +18 −4 Original line number Diff line number Diff line Loading @@ -895,8 +895,9 @@ func (p *inheritProductCallParser) parse(ctx *parseContext, v mkparser.Node, arg }) } func (ctx *parseContext) handleInclude(v mkparser.Node, pathExpr starlarkExpr, loadAlways bool) []starlarkNode { return ctx.handleSubConfig(v, pathExpr, loadAlways, func(im inheritedModule) starlarkNode { func (ctx *parseContext) handleInclude(v *mkparser.Directive) []starlarkNode { loadAlways := v.Name[0] != '-' return ctx.handleSubConfig(v, ctx.parseMakeString(v, v.Args), loadAlways, func(im inheritedModule) starlarkNode { return &includeNode{im, loadAlways} }) } Loading Loading @@ -1759,10 +1760,23 @@ func (p *evalNodeParser) parse(ctx *parseContext, node mkparser.Node, args *mkpa } case *mkparser.Comment: return []starlarkNode{&commentNode{strings.TrimSpace("#" + n.Comment)}} case *mkparser.Directive: if n.Name == "include" || n.Name == "-include" { return ctx.handleInclude(n) } case *mkparser.Variable: // Technically inherit-product(-if-exists) don't need to be put inside // an eval, but some makefiles do it, presumably because they copy+pasted // from a $(eval include ...) if name, _, ok := ctx.maybeParseFunctionCall(n, n.Name); ok { if name == "inherit-product" || name == "inherit-product-if-exists" { return ctx.handleVariable(n) } } } } return []starlarkNode{ctx.newBadNode(node, "Eval expression too complex; only assignments and comments are supported")} return []starlarkNode{ctx.newBadNode(node, "Eval expression too complex; only assignments, comments, includes, and inherit-products are supported")} } func (ctx *parseContext) parseMakeString(node mkparser.Node, mk *mkparser.MakeString) starlarkExpr { Loading Loading @@ -1822,7 +1836,7 @@ func (ctx *parseContext) handleSimpleStatement(node mkparser.Node) []starlarkNod result = []starlarkNode{res} } case "include", "-include": result = ctx.handleInclude(node, ctx.parseMakeString(node, x.Args), x.Name[0] != '-') result = ctx.handleInclude(x) case "ifeq", "ifneq", "ifdef", "ifndef": result = []starlarkNode{ctx.handleIfBlock(x)} default: Loading
mk2rbc/mk2rbc_test.go +19 −3 Original line number Diff line number Diff line Loading @@ -1515,24 +1515,40 @@ $(eval) $(eval MY_VAR := foo) $(eval # This is a test of eval functions) $(eval $(TOO_COMPLICATED) := bar) $(eval include foo/font.mk) $(eval $(call inherit-product,vendor/foo1/cfg.mk)) $(foreach x,$(MY_LIST_VAR), \ $(eval PRODUCT_COPY_FILES += foo/bar/$(x):$(TARGET_COPY_OUT_VENDOR)/etc/$(x)) \ $(if $(MY_OTHER_VAR),$(eval PRODUCT_COPY_FILES += $(MY_OTHER_VAR):foo/bar/$(x))) \ ) $(if $(MY_OTHER_VAR),$(eval PRODUCT_COPY_FILES += $(MY_OTHER_VAR):foo/bar/$(x)))) $(foreach x,$(MY_LIST_VAR), \ $(eval include foo/$(x).mk)) `, expected: `load("//build/make/core:product_config.rbc", "rblf") load("//foo:font.star", _font_init = "init") load("//vendor/foo1:cfg.star", _cfg_init = "init") def init(g, handle): cfg = rblf.cfg(handle) g["MY_VAR"] = "foo" # This is a test of eval functions rblf.mk2rbc_error("product.mk:5", "Eval expression too complex; only assignments and comments are supported") rblf.mk2rbc_error("product.mk:5", "Eval expression too complex; only assignments, comments, includes, and inherit-products are supported") _font_init(g, handle) rblf.inherit(handle, "vendor/foo1/cfg", _cfg_init) for x in rblf.words(g.get("MY_LIST_VAR", "")): rblf.setdefault(handle, "PRODUCT_COPY_FILES") cfg["PRODUCT_COPY_FILES"] += ("foo/bar/%s:%s/etc/%s" % (x, g.get("TARGET_COPY_OUT_VENDOR", ""), x)).split() if g.get("MY_OTHER_VAR", ""): cfg["PRODUCT_COPY_FILES"] += ("%s:foo/bar/%s" % (g.get("MY_OTHER_VAR", ""), x)).split() for x in rblf.words(g.get("MY_LIST_VAR", "")): _entry = { "foo/font.mk": ("foo/font", _font_init), }.get("foo/%s.mk" % _x) (_varmod, _varmod_init) = _entry if _entry else (None, None) if not _varmod_init: rblf.mkerror("product.mk", "Cannot find %s" % ("foo/%s.mk" % _x)) _varmod_init(g, handle) `, }, { Loading