From 7ff80ece2159c1e73f11e1e1b9484e00d1dfeb76 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 18 Jul 2024 10:11:23 +0100 Subject: [PATCH] qconfig: Allow searching for CONFIG values Add basic support for searching for matching of non-matching values. Signed-off-by: Simon Glass Fixes: https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/20 --- doc/develop/qconfig.rst | 14 ++++++++++++++ tools/qconfig.py | 15 +++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/doc/develop/qconfig.rst b/doc/develop/qconfig.rst index 8efb1eb268..123779eab1 100644 --- a/doc/develop/qconfig.rst +++ b/doc/develop/qconfig.rst @@ -85,6 +85,20 @@ example, to find boards which enabled CONFIG_SCSI but not CONFIG_BLK:: 3 matches pg_wcom_seli8_defconfig highbank_defconfig pg_wcom_expu1_defconfig +It is also possible to search for particular values. For example, this finds all +boards with an empty string for `CONFIG_DEFAULT_FDT_FILE`:: + + ./tools/qconfig.py -f DEFAULT_FDT_FILE=\"\" + 1092 matches + ... + +This finds boards which have a value for SYS_MAXARGS other than 64:: + + ./tools/qconfig.py -f ~SYS_MAXARGS=64 + cfg CONFIG_SYS_MAXARGS + 281 matches + ... + Finding implied CONFIGs ----------------------- diff --git a/tools/qconfig.py b/tools/qconfig.py index 408807931f..71fe6fff29 100755 --- a/tools/qconfig.py +++ b/tools/qconfig.py @@ -1079,7 +1079,7 @@ def do_imply_config(config_list, add_imply, imply_flags, skip_added, for linenum in sorted(linenums, reverse=True): add_imply_rule(config[CONFIG_LEN:], fname, linenum) -def defconfig_matches(configs, re_match): +def defconfig_matches(configs, re_match, re_val): """Check if any CONFIG option matches a regex The match must be complete, i.e. from the start to end of the CONFIG option. @@ -1089,13 +1089,15 @@ def defconfig_matches(configs, re_match): key: CONFIG option value: Value of option re_match (re.Pattern): Match to check + re_val (re.Pattern): Regular expression to check against value (or None) Returns: bool: True if any CONFIG matches the regex """ - for cfg in configs: + for cfg, val in configs.items(): if re_match.fullmatch(cfg): - return True + if not re_val or re_val.fullmatch(val): + return True return False def do_find_config(config_list): @@ -1123,6 +1125,11 @@ def do_find_config(config_list): if cfg[0] == '~': want = False cfg = cfg[1:] + val = None + re_val = None + if '=' in cfg: + cfg, val = cfg.split('=', maxsplit=1) + re_val = re.compile(val) # Search everything that is still in the running. If it has a config # that we want, or doesn't have one that we don't, add it into the @@ -1131,7 +1138,7 @@ def do_find_config(config_list): out = set() re_match = re.compile(cfg) for defc in in_list: - has_cfg = defconfig_matches(config_db[defc], re_match) + has_cfg = defconfig_matches(config_db[defc], re_match, re_val) if has_cfg == want: out.add(defc) print(f'{len(out)} matches') -- 2.39.5