summaryrefslogtreecommitdiff
path: root/allyesconfig.py
diff options
context:
space:
mode:
authorUlf Magnusson <ulfalizer@gmail.com>2018-05-30 18:05:04 +0200
committerUlf Magnusson <ulfalizer@gmail.com>2018-05-30 19:10:58 +0200
commit38cca3bdeca7d91044e11ddf2193e07c5d223ad3 (patch)
treec282c982e1d7f45a1c29309beb124597dcf8875a /allyesconfig.py
parentb95477a82d0a5bc4218aa00c8a76edc3c95d8d4f (diff)
allyesconfig: Prepare for packaging
Move to the root, simplify a bit, provide an entry point function (for setuptools's entry_points).
Diffstat (limited to 'allyesconfig.py')
-rwxr-xr-xallyesconfig.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/allyesconfig.py b/allyesconfig.py
new file mode 100755
index 0000000..e405e3d
--- /dev/null
+++ b/allyesconfig.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+# Works like 'make allyesconfig'. Verified by the test suite to generate output
+# identical to 'make allyesconfig', for all ARCHES.
+#
+# In theory, we need to handle choices in two different modes:
+#
+# y: One symbol is y, the rest are n
+# m: Any number of symbols are m, the rest are n
+#
+# Only tristate choices can be in m mode.
+#
+# Here's a convoluted example of how you might get an m-mode choice even during
+# allyesconfig:
+#
+# choice
+# tristate "weird choice"
+# depends on m
+#
+# ...
+#
+# endchoice
+#
+#
+# Usage for the Linux kernel:
+#
+# $ make [ARCH=<arch>] scriptconfig SCRIPT=Kconfiglib/examples/allyesconfig.py
+
+import os
+import sys
+
+import kconfiglib
+
+def main():
+ if len(sys.argv) > 2:
+ sys.exit("usage: {} [Kconfig]".format(sys.argv[0]))
+
+ kconf = kconfiglib.Kconfig("Kconfig" if len(sys.argv) < 2 else sys.argv[1])
+
+ # Avoid warnings printed by Kconfiglib when assigning a value to a symbol that
+ # has no prompt. Such assignments never have an effect.
+ kconf.disable_warnings()
+
+ # Small optimization
+ BOOL_TRI = (kconfiglib.BOOL, kconfiglib.TRISTATE)
+
+ for sym in kconf.defined_syms:
+ if sym.orig_type in BOOL_TRI and not sym.choice:
+ sym.set_value(2)
+
+ # This might be slightly more robust than what the C tools do for choices,
+ # as raising one choice might allow other choices to be raised. It
+ # currently produces the same output for all ARCHes though.
+
+ while True:
+ changed = False
+
+ for choice in kconf.choices:
+ if choice.assignable and choice.tri_value < choice.assignable[-1]:
+ choice.set_value(choice.assignable[-1])
+
+ # For y-mode choices, we just let the choice get its default
+ # selection. For m-mode choices, we set all choice symbols to
+ # m.
+ if choice.tri_value == 1:
+ for sym in choice.syms:
+ sym.set_value(1)
+
+ changed = True
+
+ # Do multiple passes until we longer manage to raise any choices, like
+ # in allnoconfig_walk.py
+ if not changed:
+ break
+
+ kconf.write_config(".config")
+
+if __name__ == "__main__":
+ main()