summaryrefslogtreecommitdiff
path: root/scripts/Kconfiglib/genconfig.py
diff options
context:
space:
mode:
authorAnup Patel <apatel@ventanamicro.com>2022-08-08 07:03:03 +0300
committerAnup Patel <anup@brainfault.org>2022-08-08 07:03:03 +0300
commit422f0e0486dd30196c11e43763510410c8632bcb (patch)
treeb01d5d29ef273035cc9b1004669c49adc52980ce /scripts/Kconfiglib/genconfig.py
parentb9edf49b67a1b5e47b1c35dcd7c75efccaf22ea3 (diff)
downloadopensbi-422f0e0486dd30196c11e43763510410c8632bcb.tar.xz
scripts: Add Kconfiglib v14.1.0 under scripts directory
We adopt Kconfiglib v14.1.0 sources under scripts directory so that top-level OpenSBI makefile can directly use Kconfiglib scripts without expecting users to install a particular version of Kconfiglib on their build system. Signed-off-by: Anup Patel <apatel@ventanamicro.com> Tested-by: Andrew Jones <ajones@ventanamicro.com> Acked-by: Atish Patra <atishp@rivosinc.com> Tested-by: Atish Patra <atishp@rivosinc.com>
Diffstat (limited to 'scripts/Kconfiglib/genconfig.py')
-rwxr-xr-xscripts/Kconfiglib/genconfig.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/scripts/Kconfiglib/genconfig.py b/scripts/Kconfiglib/genconfig.py
new file mode 100755
index 0000000..62f065b
--- /dev/null
+++ b/scripts/Kconfiglib/genconfig.py
@@ -0,0 +1,154 @@
+#!/usr/bin/env python3
+
+# Copyright (c) 2018-2019, Ulf Magnusson
+# SPDX-License-Identifier: ISC
+
+"""
+Generates a header file with #defines from the configuration, matching the
+format of include/generated/autoconf.h in the Linux kernel.
+
+Optionally, also writes the configuration output as a .config file. See
+--config-out.
+
+The --sync-deps, --file-list, and --env-list options generate information that
+can be used to avoid needless rebuilds/reconfigurations.
+
+Before writing a header or configuration file, Kconfiglib compares the old
+contents of the file against the new contents. If there's no change, the write
+is skipped. This avoids updating file metadata like the modification time, and
+might save work depending on your build setup.
+
+By default, the configuration is generated from '.config'. A different
+configuration file can be passed in the KCONFIG_CONFIG environment variable.
+
+A custom header string can be inserted at the beginning of generated
+configuration and header files by setting the KCONFIG_CONFIG_HEADER and
+KCONFIG_AUTOHEADER_HEADER environment variables, respectively (this also works
+for other scripts). The string is not automatically made a comment (this is by
+design, to allow anything to be added), and no trailing newline is added, so
+add '/* */', '#', and newlines as appropriate.
+
+See https://www.gnu.org/software/make/manual/make.html#Multi_002dLine for a
+handy way to define multi-line variables in makefiles, for use with custom
+headers. Remember to export the variable to the environment.
+"""
+import argparse
+import os
+import sys
+
+import kconfiglib
+
+
+DEFAULT_SYNC_DEPS_PATH = "deps/"
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description=__doc__)
+
+ parser.add_argument(
+ "--header-path",
+ metavar="HEADER_FILE",
+ help="""
+Path to write the generated header file to. If not specified, the path in the
+environment variable KCONFIG_AUTOHEADER is used if it is set, and 'config.h'
+otherwise.
+""")
+
+ parser.add_argument(
+ "--config-out",
+ metavar="CONFIG_FILE",
+ help="""
+Write the configuration to CONFIG_FILE. This is useful if you include .config
+files in Makefiles, as the generated configuration file will be a full .config
+file even if .config is outdated. The generated configuration matches what
+olddefconfig would produce. If you use sync-deps, you can include
+deps/auto.conf instead. --config-out is meant for cases where incremental build
+information isn't needed.
+""")
+
+ parser.add_argument(
+ "--sync-deps",
+ metavar="OUTPUT_DIR",
+ nargs="?",
+ const=DEFAULT_SYNC_DEPS_PATH,
+ help="""
+Enable generation of symbol dependency information for incremental builds,
+optionally specifying the output directory (default: {}). See the docstring of
+Kconfig.sync_deps() in Kconfiglib for more information.
+""".format(DEFAULT_SYNC_DEPS_PATH))
+
+ parser.add_argument(
+ "--file-list",
+ metavar="OUTPUT_FILE",
+ help="""
+Write a list of all Kconfig files to OUTPUT_FILE, with one file per line. The
+paths are relative to $srctree (or to the current directory if $srctree is
+unset). Files appear in the order they're 'source'd.
+""")
+
+ parser.add_argument(
+ "--env-list",
+ metavar="OUTPUT_FILE",
+ help="""
+Write a list of all environment variables referenced in Kconfig files to
+OUTPUT_FILE, with one variable per line. Each line has the format NAME=VALUE.
+Only environment variables referenced with the preprocessor $(VAR) syntax are
+included, and not variables referenced with the older $VAR syntax (which is
+only supported for backwards compatibility).
+""")
+
+ parser.add_argument(
+ "kconfig",
+ metavar="KCONFIG",
+ nargs="?",
+ default="Kconfig",
+ help="Top-level Kconfig file (default: Kconfig)")
+
+ args = parser.parse_args()
+
+
+ kconf = kconfiglib.Kconfig(args.kconfig, suppress_traceback=True)
+ kconf.load_config()
+
+ if args.header_path is None:
+ if "KCONFIG_AUTOHEADER" in os.environ:
+ kconf.write_autoconf()
+ else:
+ # Kconfiglib defaults to include/generated/autoconf.h to be
+ # compatible with the C tools. 'config.h' is used here instead for
+ # backwards compatibility. It's probably a saner default for tools
+ # as well.
+ kconf.write_autoconf("config.h")
+ else:
+ kconf.write_autoconf(args.header_path)
+
+ if args.config_out is not None:
+ kconf.write_config(args.config_out, save_old=False)
+
+ if args.sync_deps is not None:
+ kconf.sync_deps(args.sync_deps)
+
+ if args.file_list is not None:
+ with _open_write(args.file_list) as f:
+ for path in kconf.kconfig_filenames:
+ f.write(path + "\n")
+
+ if args.env_list is not None:
+ with _open_write(args.env_list) as f:
+ for env_var in kconf.env_vars:
+ f.write("{}={}\n".format(env_var, os.environ[env_var]))
+
+
+def _open_write(path):
+ # Python 2/3 compatibility. io.open() is available on both, but makes
+ # write() expect 'unicode' strings on Python 2.
+
+ if sys.version_info[0] < 3:
+ return open(path, "w")
+ return open(path, "w", encoding="utf-8")
+
+
+if __name__ == "__main__":
+ main()