mirror of
				https://github.com/riscv-software-src/opensbi
				synced 2025-11-04 05:50:22 +00:00 
			
		
		
		
	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>
		
			
				
	
	
		
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/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()
 |