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