# This is tree-walking version of allnoconfig.py, for demonstration purposes. # Verified by the test suite to generate identical output to 'make allnoconfig' # for all ARCHes. # # Note: A more practical version would use Kconfig.node_iter(). The manual tree # walking is for demonstration purposes. # # Usage for the Linux kernel: # # $ make [ARCH=] scriptconfig SCRIPT=Kconfiglib/examples/allnoconfig_walk.py import sys from kconfiglib import Kconfig, Symbol def do_allnoconfig(node): global changed # Walk the tree of menu nodes. You can imagine this as going down/into menu # entries in the menuconfig interface, setting each to n (or the lowest # assignable value). while node: if isinstance(node.item, Symbol): sym = node.item # Is the symbol a non-allnoconfig_y symbol that can be set to a # lower value than its current value? if (not sym.is_allnoconfig_y and sym.assignable and sym.assignable[0] < sym.tri_value): # Yup, lower it sym.set_value(sym.assignable[0]) changed = True # Recursively lower children if node.list: do_allnoconfig(node.list) node = node.next # Parse the Kconfig files kconf = Kconfig(sys.argv[1]) # Do an initial pass to set 'option allnoconfig_y' symbols to y for sym in kconf.unique_defined_syms: if sym.is_allnoconfig_y: sym.set_value(2) while True: # Changing later symbols in the configuration can sometimes allow earlier # symbols to be lowered, e.g. if a later symbol 'select's an earlier # symbol. To handle such situations, we do additional passes over the tree # until we're no longer able to change the value of any symbol in a pass. changed = False do_allnoconfig(kconf.top_node) # Did the pass change any symbols? if not changed: break print(kconf.write_config())