From: Julian Braha <julianbraha@gmail.com>
To: "Ahmed S. Darwish" <darwi@linutronix.de>,
Clark Williams <clrkwllms@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>,
Ingo Molnar <mingo@redhat.com>,
Nathan Chancellor <nathan@kernel.org>,
Nicolas Schier <nsc@kernel.org>
Cc: "Sebastian Andrzej Siewior" <bigeasy@linutronix.de>,
"Frederic Weisbecker" <frederic@kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"John Ogness" <john.ogness@linutronix.de>,
"Derek Barbosa" <debarbos@redhat.com>,
"Zbigniew Jędrzejewski-Szmek" <zbyszek@amutable.com>,
"Daan De Meyer" <daan.j.demeyer@gmail.com>,
"Luca Boccassi" <luca.boccassi@gmail.com>,
linux-rt-devel@lists.linux.dev, debian-kernel@lists.debian.org,
linux-kbuild@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, arighi@nvidia.com
Subject: Re: [PATCH v1 03/10] kconfig-checker: Add the configuration checker code
Date: Sun, 8 Nov 2026 18:59:41 +0000 [thread overview]
Message-ID: <9729a4c6-22f9-4102-b62f-c76a75488240@gmail.com> (raw)
In-Reply-To: <20261106091922.7560-4-darwi@linutronix.de>
[-- Attachment #1.1: Type: text/plain, Size: 4239 bytes --]
On 11/6/26 09:19, Ahmed S. Darwish wrote:
> Introduce a kernel configuration checker.
>
> Validate the passed kernel .config against a YAML rules file and report
> problematic configuration issues by severity.
>
> For correctness, readability, and long-term maintainability, type-annotate
> all the Python code and split the tool's logic into a clean set of classes.
>
> Create a proper Python objects data model for the kconfig checker to work
> with. Confine all direct YAML dictionary access to YAML files loading,
> validation, and data model construction.
>
> Document the tool's development rules on top.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> ---
> tools/kconfig-checker/check.py | 558 +++++++++++++++++++++++++++++++++
> 1 file changed, 558 insertions(+)
> create mode 100755 tools/kconfig-checker/check.py
>
> diff --git a/tools/kconfig-checker/check.py b/tools/kconfig-checker/check.py
> new file mode 100755
> index 000000000000..476cd13e59eb
> --- /dev/null
> +++ b/tools/kconfig-checker/check.py
> @@ -0,0 +1,558 @@
> +#!/usr/bin/env python3
> +#
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# Kernel .config checker
> +#
> +# Main usage:
> +#
> +# $ check.py list-rules
> +# $ check.py check -c path/to/linux/.config -r preempt_rt
> +#
> +# Notes:
> +#
> +# - All code is to be fully type-annotated. Before introducing changes,
> +# please verify type-safety using:
> +#
> +# $ mypy --strict --no-warn-return-any check.py
> +#
> +# - The minimum required Python version must not be newer than what is
> +# required by the kernel build at Documentation/process/changes.rst.
> +#
> +# - The tool must not depend on being run inside the kernel source tree.
> +# This simplifies invocation, testing and possible future packaging.
> +#
> +# - The YAML rule files are only treated as a serialization format. After
> +# loading and schema validation, such rules are parsed into an internal
> +# data model: Severity, Rule, SymbolRule, PatternRule, Rules, and other
> +# related python objects.
> +#
> +# All checker logic must operate on that typed model, and not on the raw
> +# YAML dictionaries.
> +#
> +# - Minimize external dependencies: this tool is also intended to be run
> +# from distribution kernel-package scripts in the future.
> +#
> +# Script exit codes:
> +#
> +# os.EX_CONFIG passed kernel .config does not match rules
> +# os.EX_NOINPUT input file(s) could not be opened
> +# os.EX_DATAERR YAML/schema/rule data is malformed
> +# os.EX_UNAVAILABLE Python version or dependency is unavailable
> +#
> +
> +from __future__ import annotations
> +
> +import argparse
> +import os
> +import re
> +import sys
> +import textwrap
> +
> +from dataclasses import dataclass
> +from enum import Enum, auto
> +from pathlib import Path
> +from typing import Any, NoReturn, Optional
> +
> +#
> +# Initial sanity checks:
> +#
> +
> +def error(message: str, code: int) -> NoReturn:
> + print(f'Error: {message}', file=sys.stderr)
> + sys.exit(code)
> +
> +if sys.version_info < (3, 9):
> + error('Python 3.9 or later is required', os.EX_UNAVAILABLE)
> +
> +try:
> + import jsonschema # type: ignore
> + import yaml as yaml_m # type: ignore
> +except ModuleNotFoundError as e:
> + error(f'Missing Python module: {e.name}', os.EX_UNAVAILABLE)
> +
> +#
> +# Actual script:
> +#
> +
> +class KernelConfig:
> + """.config file parser"""
> +
> + def __init__(self, file: Path):
> + try:
> + self.lines = file.read_text().splitlines()
> + except OSError as e:
> + error(f'Could not open {file}: {e.strerror}', os.EX_NOINPUT)
> +
> + self.symbols = self._parse_symbols()
> +
> + def _parse_symbols(self) -> dict[str, str]:
> + """Extract CONFIG_* symbol assignments from .config"""
> + symbol_set = re.compile(r'^(CONFIG_[A-Za-z0-9_]+)=([ym])$')
> + symbol_unset = re.compile(r'^# (CONFIG_[A-Za-z0-9_]+) is not set$')
What does this do for Kconfig's int, hex, and string options?
- Julian Braha
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
next prev parent reply other threads:[~2026-11-08 18:59 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 9:19 [PATCH v1 00/10] tools: Introduce a kernel configuration checker Ahmed S. Darwish
2026-11-06 9:19 ` [PATCH v1 01/10] kconfig-checker: Add schema for rule files Ahmed S. Darwish
2026-11-08 18:59 ` Julian Braha
2026-11-06 9:19 ` [PATCH v1 02/10] kconfig-checker: Introduce PREEMPT_RT configuration rules Ahmed S. Darwish
2026-11-07 9:20 ` sashiko-bot
2026-11-06 9:19 ` [PATCH v1 03/10] kconfig-checker: Add the configuration checker code Ahmed S. Darwish
2026-11-07 9:20 ` sashiko-bot
2026-11-08 18:59 ` Julian Braha [this message]
2026-11-06 9:19 ` [PATCH v1 04/10] kconfig: Introduce checkconfig target Ahmed S. Darwish
2026-11-07 9:20 ` sashiko-bot
2026-11-08 18:59 ` Julian Braha
2026-11-06 9:19 ` [PATCH v1 05/10] Documentation: Describe kconfig-checker usage and design Ahmed S. Darwish
2026-11-06 9:19 ` [PATCH v1 06/10] kconfig-checker: Split schema to support component reuse Ahmed S. Darwish
2026-11-07 9:20 ` sashiko-bot
2026-11-06 9:19 ` [PATCH v1 07/10] kconfig-checker: Introduce overlays schema Ahmed S. Darwish
2026-11-07 9:20 ` sashiko-bot
2026-11-06 9:19 ` [PATCH v1 08/10] kconfig-checker: Add support for rule overlays Ahmed S. Darwish
2026-11-06 9:19 ` [PATCH v1 09/10] Documentation: Describe kconfig-checker overlays Ahmed S. Darwish
2026-11-07 9:20 ` sashiko-bot
2026-11-06 9:19 ` [PATCH v1 10/10] kconfig: Introduce OVERLAY= for make checkconfig Ahmed S. Darwish
2026-11-08 18:59 ` [PATCH v1 00/10] tools: Introduce a kernel configuration checker Julian Braha
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9729a4c6-22f9-4102-b62f-c76a75488240@gmail.com \
--to=julianbraha@gmail.com \
--cc=arighi@nvidia.com \
--cc=bigeasy@linutronix.de \
--cc=clrkwllms@kernel.org \
--cc=corbet@lwn.net \
--cc=daan.j.demeyer@gmail.com \
--cc=darwi@linutronix.de \
--cc=debarbos@redhat.com \
--cc=debian-kernel@lists.debian.org \
--cc=frederic@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=john.ogness@linutronix.de \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-devel@lists.linux.dev \
--cc=luca.boccassi@gmail.com \
--cc=mingo@redhat.com \
--cc=nathan@kernel.org \
--cc=nsc@kernel.org \
--cc=rostedt@goodmis.org \
--cc=zbyszek@amutable.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®