| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #!/usr/bin/env python3
- # Copyright (c) 2018-2019, Ulf Magnusson
- # SPDX-License-Identifier: ISC
- """
- Lists all user-modifiable symbols that are not given a value in the
- configuration file. Usually, these are new symbols that have been added to the
- Kconfig files.
- The default configuration filename is '.config'. A different filename can be
- passed in the KCONFIG_CONFIG environment variable.
- """
- from __future__ import print_function
- import argparse
- import sys
- from kconfiglib import Kconfig, BOOL, TRISTATE, INT, HEX, STRING, TRI_TO_STR
- def main():
- parser = argparse.ArgumentParser(
- formatter_class=argparse.RawDescriptionHelpFormatter,
- description=__doc__)
- parser.add_argument(
- "--show-help", "-l",
- action="store_true",
- help="Show any help texts as well")
- parser.add_argument(
- "kconfig",
- metavar="KCONFIG",
- nargs="?",
- default="Kconfig",
- help="Top-level Kconfig file (default: Kconfig)")
- args = parser.parse_args()
- kconf = Kconfig(args.kconfig, suppress_traceback=True)
- # Make it possible to filter this message out
- print(kconf.load_config(), file=sys.stderr)
- for sym in kconf.unique_defined_syms:
- # Only show symbols that can be toggled. Choice symbols are a special
- # case in that sym.assignable will be (2,) (length 1) for visible
- # symbols in choices in y mode, but they can still be toggled by
- # selecting some other symbol.
- if sym.user_value is None and \
- (len(sym.assignable) > 1 or
- (sym.visibility and (sym.orig_type in (INT, HEX, STRING) or
- sym.choice))):
- # Don't reuse the 'config_string' format for bool/tristate symbols,
- # to show n-valued symbols as 'CONFIG_FOO=n' instead of
- # '# CONFIG_FOO is not set'. This matches the C tools.
- if sym.orig_type in (BOOL, TRISTATE):
- s = "{}{}={}\n".format(kconf.config_prefix, sym.name,
- TRI_TO_STR[sym.tri_value])
- else:
- s = sym.config_string
- print(s, end="")
- if args.show_help:
- for node in sym.nodes:
- if node.help is not None:
- # Indent by two spaces. textwrap.indent() is not
- # available in Python 2 (it's 3.3+).
- print("\n".join(" " + line
- for line in node.help.split("\n")))
- break
- if __name__ == "__main__":
- main()
|