@samitouri / QOSamiQemu / commits / e07ed5548e

minikconf: move command-line assignment out of the parser

KconfigParser.do_assignment() only exists to handle CONFIG_FOO=y/n arguments from the command line; it is never invoked while parsing a Kconfig source file. Because main() called it on a parser that had never been through parse_file(), a failing CONFIG_ check would raise a KconfigParserError whose __init__ and location() touch fields of "self" that do not exist yet. The regex in main() currently shields this, but it is fragile. Move the prefix-stripping assignment to KconfigData as do_cmdline_assignment(), simplify KconfigParser.parse() to accept an existing KconfigData, and call it from main() so the parser is only used for actual file parsing. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo Bonzini committed Apr 24, 2026 at 10:08 UTC e07ed5548eeca30e5815256a5cc47ea50deaa666
1 file changed +9 -18
scripts/minikconf.py
+9 -18
@@ -278,6 +278,10 @@ class KconfigData:
278 def do_assignment(self, var, val):
279 self.clauses.append(KconfigData.AssignmentClause(var, val))
280
281 + def do_cmdline_assignment(self, var, val):
282 + assert var.startswith("CONFIG_")
283 + self.do_assignment(self.do_var(var[7:]), val)
284 +
285 def do_default(self, var, val, cond=None):
286 val = self.value_mangler(val)
287 self.clauses.append(KconfigData.DefaultClause(var, val, cond))
@@ -338,11 +342,8 @@ class KconfigParserError(Exception):
342 class KconfigParser:
343
344 @classmethod
341 - def parse(cls, fp, mode=None):
342 - data = KconfigData(mode or defconfig)
343 - parser = cls(data)
344 - parser.parse_file(fp)
345 - return data
345 + def parse(cls, fp, data):
346 + cls(data).parse_file(fp)
347
348 def __init__(self, data):
349 self.data = data
@@ -361,14 +362,6 @@ class KconfigParser:
362 self.get_token()
363 self.parse_config()
364
364 - def do_assignment(self, var, val):
365 - if not var.startswith("CONFIG_"):
366 - raise KconfigParserError(
367 - self, "assigned variable should start with CONFIG_"
368 - )
369 - var = self.data.do_var(var[7:])
370 - self.data.do_assignment(var, val)
371 -
365 # file management -----
366
367 def error_path(self):
@@ -688,18 +681,16 @@ if __name__ == '__main__':
681 sys.exit(1)
682
683 data = KconfigData(mode)
691 - parser = KconfigParser(data)
684 external_vars = set()
685 for arg in argv[3:]:
686 m = re.match(r'^(CONFIG_[A-Z0-9_]+)=([yn]?)$', arg)
687 if m is not None:
688 name, value = m.groups()
697 - parser.do_assignment(name, value == 'y')
689 + data.do_cmdline_assignment(name, value == 'y')
690 external_vars.add(name[7:])
691 else:
700 - fp = open(arg, 'rt', encoding='utf-8')
701 - parser.parse_file(fp)
702 - fp.close()
692 + with open(arg, 'rt', encoding='utf-8') as fp:
693 + KconfigParser.parse(fp, data)
694
695 config = data.compute_config()
696 for key in sorted(config.keys()):