diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go index 8feea3d71..556dcaa0c 100644 --- a/mk2rbc/mk2rbc_test.go +++ b/mk2rbc/mk2rbc_test.go @@ -993,6 +993,7 @@ endif def init(g, handle): cfg = rblf.cfg(handle) if "hwaddress" not in cfg.get("PRODUCT_PACKAGES", []): + rblf.setdefault(handle, "PRODUCT_PACKAGES") cfg["PRODUCT_PACKAGES"] = (rblf.mkstrip("%s hwaddress" % " ".join(cfg.get("PRODUCT_PACKAGES", [])))).split() `, }, diff --git a/mk2rbc/variable.go b/mk2rbc/variable.go index d037481f5..6805744a7 100644 --- a/mk2rbc/variable.go +++ b/mk2rbc/variable.go @@ -88,20 +88,33 @@ func (pcv productConfigVariable) emitSet(gctx *generationContext, asgn *assignme } value.emit(gctx) } - - switch asgn.flavor { - case asgnSet: - emitAssignment() - case asgnAppend: - emitAppend() - case asgnMaybeAppend: - // If we are not sure variable has been assigned before, emit setdefault + emitSetDefault := func() { if pcv.typ == starlarkTypeList { gctx.writef("%s(handle, %q)", cfnSetListDefault, pcv.name()) } else { gctx.writef("cfg.setdefault(%q, %s)", pcv.name(), pcv.defaultValueString()) } gctx.newLine() + } + + switch asgn.flavor { + case asgnSet: + isSelfReferential := false + asgn.value.transform(func(expr starlarkExpr) starlarkExpr { + if ref, ok := expr.(*variableRefExpr); ok && ref.ref.name() == pcv.name() { + isSelfReferential = true + } + return nil + }) + if isSelfReferential { + emitSetDefault() + } + emitAssignment() + case asgnAppend: + emitAppend() + case asgnMaybeAppend: + // If we are not sure variable has been assigned before, emit setdefault + emitSetDefault() emitAppend() case asgnMaybeSet: gctx.writef("if cfg.get(%q) == None:", pcv.nam)