summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.rst4
-rwxr-xr-xsetconfig.py85
-rw-r--r--setup.py2
3 files changed, 90 insertions, 1 deletions
diff --git a/README.rst b/README.rst
index e8091ea..03282a5 100644
--- a/README.rst
+++ b/README.rst
@@ -54,7 +54,7 @@ installed with e.g.
Microsoft Windows is supported.
The ``pip`` installation will give you both the base library and the following
-executables. All but one mirror functionality available in the C tools.
+executables. All but two mirror functionality available in the C tools.
- `menuconfig <https://github.com/ulfalizer/Kconfiglib/blob/master/menuconfig.py>`_
@@ -74,6 +74,8 @@ executables. All but one mirror functionality available in the C tools.
- `genconfig <https://github.com/ulfalizer/Kconfiglib/blob/master/genconfig.py>`_
+- `setconfig <https://github.com/ulfalizer/Kconfiglib/blob/master/setconfig.py>`_
+
``genconfig`` is intended to be run at build time. It generates a C header from
the configuration and (optionally) information that can be used to rebuild only
files that reference Kconfig symbols that have changed value.
diff --git a/setconfig.py b/setconfig.py
new file mode 100755
index 0000000..54f166b
--- /dev/null
+++ b/setconfig.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2019, Ulf Magnusson
+# SPDX-License-Identifier: ISC
+
+import argparse
+import sys
+
+import kconfiglib
+
+
+def main():
+ parser = argparse.ArgumentParser(description="""
+Simple utility for setting configuration values from the command line.
+
+Sample usage:
+
+ $ setconfig FOO_SUPPORT=y BAR_BITS=8
+
+Note: Symbol names should not be prefixed with 'CONFIG_'.
+
+The exit status on errors is 1.
+
+The default input/output configuration file is '.config'. A different filename
+can be passed in the KCONFIG_CONFIG environment variable.
+""")
+
+ parser.add_argument(
+ "--kconfig",
+ default="Kconfig",
+ help="Base Kconfig file (default: Kconfig)")
+
+ parser.add_argument(
+ "--no-check-exists",
+ dest='check_exists',
+ action='store_false',
+ help="Ignore assignments to non-existent symbols instead of erroring "
+ "out")
+
+ parser.add_argument(
+ "--no-check-value",
+ dest='check_value',
+ action='store_false',
+ help="Ignore assignments that didn't \"take\" (where the symbol got a "
+ "different value, e.g. due to unsatisfied dependencies) instead "
+ "of erroring out")
+
+ parser.add_argument(
+ "assignments",
+ metavar="ASSIGNMENT",
+ nargs="*",
+ help="A 'NAME=value' assignments")
+
+ args = parser.parse_args()
+
+ kconf = kconfiglib.Kconfig(args.kconfig)
+ kconf.load_config()
+
+ for arg in args.assignments:
+ if "=" not in arg:
+ sys.exit("error: no '=' in assignment: '{}'".format(arg))
+ name, value = arg.split("=", 1)
+
+ if name not in kconf.syms:
+ if not args.check_exists:
+ continue
+ sys.exit("error: no symbol '{}' in configuration".format(name))
+
+ sym = kconf.syms[name]
+
+ if not sym.set_value(value):
+ sys.exit("error: '{}' is an invalid value for the {} symbol {}"
+ .format(value, kconfiglib.TYPE_TO_STR[sym.type], name))
+
+ if args.check_value and sym.str_value != value:
+ sys.exit("error: {} was assigned the value '{}', but got the "
+ "value '{}'. Check the symbol's dependencies, and make "
+ "sure that it has a prompt."
+ .format(name, value, sym.str_value))
+
+ kconf.write_config()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/setup.py b/setup.py
index 442c9bc..ff090ec 100644
--- a/setup.py
+++ b/setup.py
@@ -34,6 +34,7 @@ setuptools.setup(
"allmodconfig",
"allyesconfig",
"listnewconfig",
+ "setconfig",
),
# TODO: Don't install the menuconfig on Python 2. It won't run there.
@@ -49,6 +50,7 @@ setuptools.setup(
"allmodconfig = allmodconfig:main",
"allyesconfig = allyesconfig:main",
"listnewconfig = listnewconfig:main",
+ "setconfig = setconfig:main",
)
},