summaryrefslogtreecommitdiff
path: root/kconfiglib.py
diff options
context:
space:
mode:
Diffstat (limited to 'kconfiglib.py')
-rw-r--r--kconfiglib.py100
1 files changed, 15 insertions, 85 deletions
diff --git a/kconfiglib.py b/kconfiglib.py
index 05a2a45..f6b63f7 100644
--- a/kconfiglib.py
+++ b/kconfiglib.py
@@ -6,90 +6,18 @@ Overview
========
Kconfiglib is a Python 2/3 library for scripting and extracting information
-from Kconfig configuration systems. It can be used for the following, among
-other things:
-
- - Programmatically get and set symbol values
-
- allnoconfig.py and allyesconfig.py examples are provided, automatically
- verified to produce identical output to the standard 'make allnoconfig' and
- 'make allyesconfig'.
-
- - Read and write .config files
-
- The generated .config files are character-for-character identical to what
- the C implementation would generate (except for the header comment). The
- test suite relies on this, as it compares the generated files.
-
- - Inspect symbols
-
- Printing a symbol gives output which could be fed back into a Kconfig parser
- to redefine it***. The printing function (__str__()) is implemented with
- public APIs, meaning you can fetch just whatever information you need as
- well.
-
- A helpful __repr__() is implemented on all objects too, also implemented
- with public APIs.
-
- ***Choice symbols get their parent choice as a dependency, which shows up as
- e.g. 'prompt "choice symbol" if <choice>' when printing the symbol. This
- could easily be worked around if 100% reparsable output is needed.
-
- - Inspect expressions
-
- Expressions use a simple tuple-based format that can be processed manually
- if needed. Expression printing and evaluation functions are provided,
- implemented with public APIs.
-
- - Inspect the menu tree
-
- The underlying menu tree is exposed, including submenus created implicitly
- from symbols depending on preceding symbols. This can be used e.g. to
- implement menuconfig-like functionality. See the menuconfig.py example.
-
-
-Here are some other features:
-
- - Single-file implementation
-
- The entire library is contained in this file.
-
- - Runs unmodified under both Python 2 and Python 3
-
- The code mostly uses basic Python features and has no third-party
- dependencies. The most advanced things used are probably @property and
- __slots__.
-
- - Robust and highly compatible with the standard Kconfig C tools
-
- The test suite automatically compares output from Kconfiglib and the C tools
- by diffing the generated .config files for the real kernel Kconfig and
- defconfig files, for all ARCHes.
-
- This currently involves comparing the output for 36 ARCHes and 498 defconfig
- files (or over 18000 ARCH/defconfig combinations in "obsessive" test suite
- mode). All tests are expected to pass.
-
- - Not horribly slow despite being a pure Python implementation
-
- The allyesconfig.py example currently runs in about 1.6 seconds on a Core i7
- 2600K (with a warm file cache), where half a second is overhead from 'make
- scriptconfig' (see below).
-
- For long-running jobs, PyPy gives a big performance boost. CPython is faster
- for short-running jobs as PyPy needs some time to warm up.
-
- - Internals that (mostly) mirror the C implementation
-
- While being simpler to understand.
+from Kconfig (https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt)
+configuration systems.
+See the homepage at https://github.com/ulfalizer/Kconfiglib for a longer
+overview.
Using Kconfiglib on the Linux kernel with the Makefile targets
==============================================================
For the Linux kernel, a handy interface is provided by the
-scripts/kconfig/Makefile patch. Apply it with either 'git am' or the 'patch'
-utility:
+scripts/kconfig/Makefile patch, which can be applied with either 'git am' or
+the 'patch' utility:
$ wget -qO- https://raw.githubusercontent.com/ulfalizer/Kconfiglib/master/makefile.patch | git am
$ wget -qO- https://raw.githubusercontent.com/ulfalizer/Kconfiglib/master/makefile.patch | patch -p1
@@ -100,6 +28,9 @@ Please tell me if the patch does not apply. It should be trivial to apply
manually, as it's just a block of text that needs to be inserted near the other
*conf: targets in scripts/kconfig/Makefile.
+Look further down for a motivation for the Makefile patch and for instructions
+on how you can use Kconfiglib without it.
+
If you do not wish to install Kconfiglib via pip, the Makefile patch is set up
so that you can also just clone Kconfiglib into the kernel root:
@@ -109,10 +40,8 @@ so that you can also just clone Kconfiglib into the kernel root:
Warning: The directory name Kconfiglib/ is significant in this case, because
it's added to PYTHONPATH by the new targets in makefile.patch.
-Look further down for a motivation for the Makefile patch and for instructions
-on how you can use Kconfiglib without it.
-
-The Makefile patch adds the following targets:
+The targets added by the Makefile patch are described in the following
+sections.
make [ARCH=<arch>] iscriptconfig
@@ -127,9 +56,10 @@ kconf.defined_syms, and explore the MenuNode menu tree starting at
kconf.top_node by following 'next' and 'list' pointers.
The item contained in a menu node is found in MenuNode.item (note that this can
-be one of the constants MENU and COMMENT), and all symbols and choices have a
-'nodes' attribute containing their menu nodes (usually only one). Printing a
-menu node will print its item, in Kconfig format.
+be one of the constants kconfiglib.MENU and kconfiglib.COMMENT), and all
+symbols and choices have a 'nodes' attribute containing their menu nodes
+(usually only one). Printing a menu node will print its item, in Kconfig
+format.
If you want to look up a symbol by name, use the kconf.syms dictionary.