mirror of
				https://github.com/Klipper3d/klipper.git
				synced 2025-10-31 02:15:52 +01:00 
			
		
		
		
	
		
			
	
	
		
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | #!/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() |