xref: /optee_os/scripts/kconfig/kconfiglib/setconfig.py (revision c689edbb2550c76ae81dcecab717d82a564b2d7b)
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