diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go index 024311e0e..2a80e560e 100644 --- a/mk2rbc/mk2rbc.go +++ b/mk2rbc/mk2rbc.go @@ -1629,6 +1629,13 @@ func (ctx *parseContext) maybeHandleAnnotation(cnode *mkparser.Comment) { return } if p, ok := maybeTrim(annotation, "include_top"); ok { + // Don't allow duplicate include tops, because then we will generate + // invalid starlark code. (duplicate keys in the _entry dictionary) + for _, top := range ctx.includeTops { + if top == p { + return + } + } ctx.includeTops = append(ctx.includeTops, p) return } diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go index 94c4fe6fa..1e53c3071 100644 --- a/mk2rbc/mk2rbc_test.go +++ b/mk2rbc/mk2rbc_test.go @@ -1075,6 +1075,40 @@ def init(g, handle): if not _varmod_init: rblf.mkerror("cannot") rblf.inherit(handle, _varmod, _varmod_init) +`, + }, + { + desc: "Dynamic inherit with duplicated hint", + mkname: "product.mk", + in: ` +MY_PATH:=foo +#RBC# include_top vendor/foo1 +$(call inherit-product,$(MY_PATH)/cfg.mk) +#RBC# include_top vendor/foo1 +$(call inherit-product,$(MY_PATH)/cfg.mk) +`, + expected: `load("//build/make/core:product_config.rbc", "rblf") +load("//vendor/foo1:cfg.star|init", _cfg_init = "init") + +def init(g, handle): + cfg = rblf.cfg(handle) + g["MY_PATH"] = "foo" + #RBC# include_top vendor/foo1 + _entry = { + "vendor/foo1/cfg.mk": ("_cfg", _cfg_init), + }.get("%s/cfg.mk" % g["MY_PATH"]) + (_varmod, _varmod_init) = _entry if _entry else (None, None) + if not _varmod_init: + rblf.mkerror("cannot") + rblf.inherit(handle, _varmod, _varmod_init) + #RBC# include_top vendor/foo1 + _entry = { + "vendor/foo1/cfg.mk": ("_cfg", _cfg_init), + }.get("%s/cfg.mk" % g["MY_PATH"]) + (_varmod, _varmod_init) = _entry if _entry else (None, None) + if not _varmod_init: + rblf.mkerror("cannot") + rblf.inherit(handle, _varmod, _varmod_init) `, }, {