77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
#!/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()
|