1*c689edbbSJens Wiklander#!/usr/bin/env python3 2*c689edbbSJens Wiklander 3*c689edbbSJens Wiklander# Copyright (c) 2019, Ulf Magnusson 4*c689edbbSJens Wiklander# SPDX-License-Identifier: ISC 5*c689edbbSJens Wiklander 6*c689edbbSJens Wiklander""" 7*c689edbbSJens WiklanderSimple utility for setting configuration values from the command line. 8*c689edbbSJens Wiklander 9*c689edbbSJens WiklanderSample usage: 10*c689edbbSJens Wiklander 11*c689edbbSJens Wiklander $ setconfig FOO_SUPPORT=y BAR_BITS=8 12*c689edbbSJens Wiklander 13*c689edbbSJens WiklanderNote: Symbol names should not be prefixed with 'CONFIG_'. 14*c689edbbSJens Wiklander 15*c689edbbSJens WiklanderThe exit status on errors is 1. 16*c689edbbSJens Wiklander 17*c689edbbSJens WiklanderThe default input/output configuration file is '.config'. A different filename 18*c689edbbSJens Wiklandercan be passed in the KCONFIG_CONFIG environment variable. 19*c689edbbSJens Wiklander 20*c689edbbSJens WiklanderWhen overwriting a configuration file, the old version is saved to 21*c689edbbSJens Wiklander<filename>.old (e.g. .config.old). 22*c689edbbSJens Wiklander""" 23*c689edbbSJens Wiklanderimport argparse 24*c689edbbSJens Wiklanderimport sys 25*c689edbbSJens Wiklander 26*c689edbbSJens Wiklanderimport kconfiglib 27*c689edbbSJens Wiklander 28*c689edbbSJens Wiklander 29*c689edbbSJens Wiklanderdef main(): 30*c689edbbSJens Wiklander parser = argparse.ArgumentParser( 31*c689edbbSJens Wiklander formatter_class=argparse.RawDescriptionHelpFormatter, 32*c689edbbSJens Wiklander description=__doc__) 33*c689edbbSJens Wiklander 34*c689edbbSJens Wiklander parser.add_argument( 35*c689edbbSJens Wiklander "--kconfig", 36*c689edbbSJens Wiklander default="Kconfig", 37*c689edbbSJens Wiklander help="Top-level Kconfig file (default: Kconfig)") 38*c689edbbSJens Wiklander 39*c689edbbSJens Wiklander parser.add_argument( 40*c689edbbSJens Wiklander "--no-check-exists", 41*c689edbbSJens Wiklander dest="check_exists", 42*c689edbbSJens Wiklander action="store_false", 43*c689edbbSJens Wiklander help="Ignore assignments to non-existent symbols instead of erroring " 44*c689edbbSJens Wiklander "out") 45*c689edbbSJens Wiklander 46*c689edbbSJens Wiklander parser.add_argument( 47*c689edbbSJens Wiklander "--no-check-value", 48*c689edbbSJens Wiklander dest="check_value", 49*c689edbbSJens Wiklander action="store_false", 50*c689edbbSJens Wiklander help="Ignore assignments that didn't \"take\" (where the symbol got a " 51*c689edbbSJens Wiklander "different value, e.g. due to unsatisfied dependencies) instead " 52*c689edbbSJens Wiklander "of erroring out") 53*c689edbbSJens Wiklander 54*c689edbbSJens Wiklander parser.add_argument( 55*c689edbbSJens Wiklander "assignments", 56*c689edbbSJens Wiklander metavar="ASSIGNMENT", 57*c689edbbSJens Wiklander nargs="*", 58*c689edbbSJens Wiklander help="A 'NAME=value' assignment") 59*c689edbbSJens Wiklander 60*c689edbbSJens Wiklander args = parser.parse_args() 61*c689edbbSJens Wiklander 62*c689edbbSJens Wiklander kconf = kconfiglib.Kconfig(args.kconfig, suppress_traceback=True) 63*c689edbbSJens Wiklander print(kconf.load_config()) 64*c689edbbSJens Wiklander 65*c689edbbSJens Wiklander for arg in args.assignments: 66*c689edbbSJens Wiklander if "=" not in arg: 67*c689edbbSJens Wiklander sys.exit("error: no '=' in assignment: '{}'".format(arg)) 68*c689edbbSJens Wiklander name, value = arg.split("=", 1) 69*c689edbbSJens Wiklander 70*c689edbbSJens Wiklander if name not in kconf.syms: 71*c689edbbSJens Wiklander if not args.check_exists: 72*c689edbbSJens Wiklander continue 73*c689edbbSJens Wiklander sys.exit("error: no symbol '{}' in configuration".format(name)) 74*c689edbbSJens Wiklander 75*c689edbbSJens Wiklander sym = kconf.syms[name] 76*c689edbbSJens Wiklander 77*c689edbbSJens Wiklander if not sym.set_value(value): 78*c689edbbSJens Wiklander sys.exit("error: '{}' is an invalid value for the {} symbol {}" 79*c689edbbSJens Wiklander .format(value, kconfiglib.TYPE_TO_STR[sym.orig_type], 80*c689edbbSJens Wiklander name)) 81*c689edbbSJens Wiklander 82*c689edbbSJens Wiklander if args.check_value and sym.str_value != value: 83*c689edbbSJens Wiklander sys.exit("error: {} was assigned the value '{}', but got the " 84*c689edbbSJens Wiklander "value '{}'. Check the symbol's dependencies, and make " 85*c689edbbSJens Wiklander "sure that it has a prompt." 86*c689edbbSJens Wiklander .format(name, value, sym.str_value)) 87*c689edbbSJens Wiklander 88*c689edbbSJens Wiklander print(kconf.write_config()) 89*c689edbbSJens Wiklander 90*c689edbbSJens Wiklander 91*c689edbbSJens Wiklanderif __name__ == "__main__": 92*c689edbbSJens Wiklander main() 93