Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8f19f3d authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Convert includes/inherits inside evals"

parents 4e3c2660 2005298b
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -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}
	})
}
@@ -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 {
@@ -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:
+19 −3
Original line number Diff line number Diff line
@@ -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)
`,
	},
	{