xref: /optee_os/scripts/kconfig/kconfiglib/listnewconfig.py (revision c689edbb2550c76ae81dcecab717d82a564b2d7b)
1*c689edbbSJens Wiklander#!/usr/bin/env python3
2*c689edbbSJens Wiklander
3*c689edbbSJens Wiklander# Copyright (c) 2018-2019, Ulf Magnusson
4*c689edbbSJens Wiklander# SPDX-License-Identifier: ISC
5*c689edbbSJens Wiklander
6*c689edbbSJens Wiklander"""
7*c689edbbSJens WiklanderLists all user-modifiable symbols that are not given a value in the
8*c689edbbSJens Wiklanderconfiguration file. Usually, these are new symbols that have been added to the
9*c689edbbSJens WiklanderKconfig files.
10*c689edbbSJens Wiklander
11*c689edbbSJens WiklanderThe default configuration filename is '.config'. A different filename can be
12*c689edbbSJens Wiklanderpassed in the KCONFIG_CONFIG environment variable.
13*c689edbbSJens Wiklander"""
14*c689edbbSJens Wiklanderfrom __future__ import print_function
15*c689edbbSJens Wiklander
16*c689edbbSJens Wiklanderimport argparse
17*c689edbbSJens Wiklanderimport sys
18*c689edbbSJens Wiklander
19*c689edbbSJens Wiklanderfrom kconfiglib import Kconfig, BOOL, TRISTATE, INT, HEX, STRING, TRI_TO_STR
20*c689edbbSJens Wiklander
21*c689edbbSJens Wiklander
22*c689edbbSJens Wiklanderdef main():
23*c689edbbSJens Wiklander    parser = argparse.ArgumentParser(
24*c689edbbSJens Wiklander        formatter_class=argparse.RawDescriptionHelpFormatter,
25*c689edbbSJens Wiklander        description=__doc__)
26*c689edbbSJens Wiklander
27*c689edbbSJens Wiklander    parser.add_argument(
28*c689edbbSJens Wiklander        "--show-help", "-l",
29*c689edbbSJens Wiklander        action="store_true",
30*c689edbbSJens Wiklander        help="Show any help texts as well")
31*c689edbbSJens Wiklander
32*c689edbbSJens Wiklander    parser.add_argument(
33*c689edbbSJens Wiklander        "kconfig",
34*c689edbbSJens Wiklander        metavar="KCONFIG",
35*c689edbbSJens Wiklander        nargs="?",
36*c689edbbSJens Wiklander        default="Kconfig",
37*c689edbbSJens Wiklander        help="Top-level Kconfig file (default: Kconfig)")
38*c689edbbSJens Wiklander
39*c689edbbSJens Wiklander    args = parser.parse_args()
40*c689edbbSJens Wiklander
41*c689edbbSJens Wiklander    kconf = Kconfig(args.kconfig, suppress_traceback=True)
42*c689edbbSJens Wiklander    # Make it possible to filter this message out
43*c689edbbSJens Wiklander    print(kconf.load_config(), file=sys.stderr)
44*c689edbbSJens Wiklander
45*c689edbbSJens Wiklander    for sym in kconf.unique_defined_syms:
46*c689edbbSJens Wiklander        # Only show symbols that can be toggled. Choice symbols are a special
47*c689edbbSJens Wiklander        # case in that sym.assignable will be (2,) (length 1) for visible
48*c689edbbSJens Wiklander        # symbols in choices in y mode, but they can still be toggled by
49*c689edbbSJens Wiklander        # selecting some other symbol.
50*c689edbbSJens Wiklander        if sym.user_value is None and \
51*c689edbbSJens Wiklander           (len(sym.assignable) > 1 or
52*c689edbbSJens Wiklander            (sym.visibility and (sym.orig_type in (INT, HEX, STRING) or
53*c689edbbSJens Wiklander                                 sym.choice))):
54*c689edbbSJens Wiklander
55*c689edbbSJens Wiklander            # Don't reuse the 'config_string' format for bool/tristate symbols,
56*c689edbbSJens Wiklander            # to show n-valued symbols as 'CONFIG_FOO=n' instead of
57*c689edbbSJens Wiklander            # '# CONFIG_FOO is not set'. This matches the C tools.
58*c689edbbSJens Wiklander            if sym.orig_type in (BOOL, TRISTATE):
59*c689edbbSJens Wiklander                s = "{}{}={}\n".format(kconf.config_prefix, sym.name,
60*c689edbbSJens Wiklander                                       TRI_TO_STR[sym.tri_value])
61*c689edbbSJens Wiklander            else:
62*c689edbbSJens Wiklander                s = sym.config_string
63*c689edbbSJens Wiklander
64*c689edbbSJens Wiklander            print(s, end="")
65*c689edbbSJens Wiklander            if args.show_help:
66*c689edbbSJens Wiklander                for node in sym.nodes:
67*c689edbbSJens Wiklander                    if node.help is not None:
68*c689edbbSJens Wiklander                        # Indent by two spaces. textwrap.indent() is not
69*c689edbbSJens Wiklander                        # available in Python 2 (it's 3.3+).
70*c689edbbSJens Wiklander                        print("\n".join("  " + line
71*c689edbbSJens Wiklander                                        for line in node.help.split("\n")))
72*c689edbbSJens Wiklander                        break
73*c689edbbSJens Wiklander
74*c689edbbSJens Wiklander
75*c689edbbSJens Wiklanderif __name__ == "__main__":
76*c689edbbSJens Wiklander    main()
77