summaryrefslogtreecommitdiff
path: root/util/kconfig_check.py
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /util/kconfig_check.py
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14395.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'util/kconfig_check.py')
-rwxr-xr-xutil/kconfig_check.py209
1 files changed, 0 insertions, 209 deletions
diff --git a/util/kconfig_check.py b/util/kconfig_check.py
deleted file mode 100755
index b6b9fda8de..0000000000
--- a/util/kconfig_check.py
+++ /dev/null
@@ -1,209 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2021 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Kconfig checker
-
-Checks that the .config file provided does not introduce any new ad-hoc CONFIG
-options
-"""
-
-import argparse
-import os
-import re
-import sys
-
-
-def parse_args(argv):
- """Parse the program arguments
-
- Args:
- argv: List of arguments to parse, excluding the program name
-
- Returns:
- argparse.Namespace object containing the results
- """
- epilog = """Checks that new ad-hoc CONFIG options are not introduced without
-a corresponding Kconfig option for Zephyr"""
-
- parser = argparse.ArgumentParser(epilog=epilog)
- parser.add_argument('-a', '--allowed', type=str,
- default='util/config_allowed.txt',
- help='File containing list of allowed ad-hoc CONFIGs')
- parser.add_argument('-c', '--configs', type=str, default='.config',
- help='File containing CONFIG options to check')
- parser.add_argument(
- '-D', '--debug', action='store_true',
- help='Enabling debugging (provides a full traceback on error)')
- parser.add_argument('-p', '--prefix', type=str, default='PLATFORM_EC_',
- help='Prefix to string from Kconfig options')
- parser.add_argument('-s', '--srctree', type=str, default='.',
- help='Path to source tree to look for Kconfigs')
-
- subparsers = parser.add_subparsers(dest='cmd', required=True)
- subparsers.add_parser('check', help='Check for new ad-hoc CONFIGs')
-
- return parser.parse_args(argv)
-
-
-class KconfigCheck:
- """Class for handling checking of CONFIG options against Kconfig options
-
- The goal is to make sure that CONFIG_xxx options used by a build have an
- equivalent Kconfig option defined as well.
-
- For example if a Kconfig file has:
-
- config PREFIX_MY_CONFIG
- ...
-
- and the CONFIG files has
-
- CONFIG_MY_CONFIG
-
- then we consider these equivalent (with the prefix 'PREFIX_') and thus
- CONFIG_MY_CONFIG is allowed to be used.
-
- If any CONFIG option is found that does not have an equivalent in the Kconfig,
- the user is exhorted to add a new Kconfig. This helps avoid adding new ad-hoc
- CONFIG options, eventually returning the number to zero.
- """
- @classmethod
- def find_new_adhoc(cls, configs, kconfigs, allowed):
- """Get a list of new ad-hoc CONFIG options
-
- Arguments and return value should omit the 'CONFIG_' prefix, so
- CONFIG_LTO should be provided as 'LTO'.
-
- Args:
- configs: List of existing CONFIG options
- kconfigs: List of existing Kconfig options
- allowed: List of allowed CONFIG options
-
- Returns:
- List of new CONFIG options, with the CONFIG_ prefix removed
- """
- return sorted(list(set(configs) - set(kconfigs) - set(allowed)))
-
- @classmethod
- def read_configs(cls, configs_file):
- """Read CONFIG options from a file
-
- Args:
- configs_file: Filename to read from
-
- Returns:
- List of CONFIG_xxx options found in the file, with the 'CONFIG_'
- prefixremoved
- """
- with open(configs_file, 'r') as inf:
- configs = re.findall('CONFIG_([A-Za-z0-9_]*)', inf.read())
- return configs
-
- @classmethod
- def find_kconfigs(cls, srcdir):
- """Find all the Kconfig files in a source directory, recursively
-
- Any subdirectory called 'Kconfig' is ignored, since Zephyr generates
- this in its build directory.
-
- Args:
- srcdir: Directory to scan
-
- Returns:
- List of pathnames found
- """
- kconfig_files = []
- for root, dirs, files in os.walk(srcdir):
- kconfig_files += [os.path.join(root, fname)
- for fname in files if fname.startswith('Kconfig')]
- if 'Kconfig' in dirs:
- dirs.remove('Kconfig')
- return kconfig_files
-
- def scan_kconfigs(self, srcdir, prefix=''):
- """Scan a source tree for Kconfig options
-
- Args:
- srcdir: Directory to scan
- prefix: Prefix to strip from the name (e.g. 'PLATFORM_EC_')
-
- Returns:
- List of config and menuconfig options found,
- """
- kconfigs = []
-
- # Remove the prefix if present
- expr = re.compile(r'(config|menuconfig) (%s)?([A-Za-z0-9_]*)\n' %
- prefix)
- for fname in self.find_kconfigs(srcdir):
- with open(fname) as inf:
- found = re.findall(expr, inf.read())
- kconfigs += [name for kctype, _, name in found]
- return kconfigs
-
- def find_new_adhoc_configs(self, configs_file, srcdir, allowed_file,
- prefix=''):
- """Find new ad-hoc configs in the configs_file
-
- Args:
- configs_file: Filename containing CONFIG options to check
- srcdir: Source directory to scan for Kconfig files
- allowed_file: File containing allowed CONFIG options
- prefix: Prefix to strip from the start of each Kconfig
- (e.g. 'PLATFORM_EC_')
- """
- configs = self.read_configs(configs_file)
- kconfigs = self.scan_kconfigs(srcdir, prefix)
- allowed = self.read_configs(allowed_file)
- new_adhoc = self.find_new_adhoc(configs, kconfigs, allowed)
- return new_adhoc
-
- def do_check(self, configs_file, srcdir, allowed_file, prefix):
- """Find new ad-hoc configs in the configs_file
-
- Args:
- configs_file: Filename containing CONFIG options to check
- srcdir: Source directory to scan for Kconfig files
- allowed_file: File containing allowed CONFIG options
- prefix: Prefix to strip from the start of each Kconfig
- (e.g. 'PLATFORM_EC_')
-
- Returns:
- Exit code: 0 if OK, 1 if a problem was found
- """
- new_adhoc = self.find_new_adhoc_configs(configs_file, srcdir,
- allowed_file, prefix)
- if new_adhoc:
- print("""Error:\tThe EC is in the process of migrating to Zephyr.
-\tZephyr uses Kconfig for configuration rather than ad-hoc #defines.
-\tAny new EC CONFIG options must ALSO be added to Zephyr so that new
-\tfunctionality is available in Zephyr also. The following new ad-hoc
-\tCONFIG options were detected:
-
-%s
-
-Please add these via Kconfig instead. Find a suitable Kconfig
-file in zephyr/ and add a 'config' or 'menuconfig' option.
-Also see details in http://issuetracker.google.com/181253613
-
-To temporarily disable this, use: ALLOW_CONFIG=1 make ...
-""" % '\n'.join(['CONFIG_%s' % name for name in new_adhoc]), file=sys.stderr)
- return 1
- return 0
-
-
-def main(argv):
- """Main function"""
- args = parse_args(argv)
- if not args.debug:
- sys.tracebacklimit = 0
- checker = KconfigCheck()
- if args.cmd == 'check':
- return checker.do_check(args.configs, args.srctree, args.allowed,
- args.prefix)
- return 2
-
-
-if __name__ == '__main__':
- sys.exit(main(sys.argv[1:]))