From 507e32b28c5067fb01cb85c3259a50bec7ec1907 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 15 May 2023 21:58:12 +1000 Subject: Generate `make` dependency file during build for info.json's etc. (#20451) --- lib/python/qmk/cli/generate/make_dependencies.py | 56 ++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 lib/python/qmk/cli/generate/make_dependencies.py (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/make_dependencies.py b/lib/python/qmk/cli/generate/make_dependencies.py new file mode 100755 index 0000000000..635c341897 --- /dev/null +++ b/lib/python/qmk/cli/generate/make_dependencies.py @@ -0,0 +1,56 @@ +"""Used by the make system to generate dependency lists for each of the generated files. +""" +from pathlib import Path +from milc import cli + +from argcomplete.completers import FilesCompleter + +from qmk.commands import dump_lines +from qmk.constants import QMK_FIRMWARE +from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keymap import keymap_completer, locate_keymap +from qmk.path import normpath, FileType + + +@cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON.') +@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate dependency file for.') +@cli.argument('-km', '--keymap', completer=keymap_completer, help='The keymap to build a firmware for. Ignored when a configurator export is supplied.') +@cli.subcommand('Generates the list of dependencies associated with a keyboard build and its generated files.', hidden=True) +def generate_make_dependencies(cli): + """Generates the list of dependent info.json, rules.mk, and config.h files for a keyboard. + """ + interesting_files = [ + 'info.json', + 'keymap.json', + 'rules.mk', + 'post_rules.mk', + 'config.h', + 'post_config.h', + ] + + found_files = [] + + # Walk up the keyboard's directory tree looking for the files we're interested in + keyboards_root = Path('keyboards') + parent_path = Path('keyboards') / cli.args.keyboard + while parent_path != keyboards_root: + for file in interesting_files: + test_path = parent_path / file + if test_path.exists(): + found_files.append(test_path) + parent_path = parent_path.parent + + # Find the keymap and include any of the interesting files + if cli.args.keymap is not None: + km = locate_keymap(cli.args.keyboard, cli.args.keymap) + if km is not None: + for file in interesting_files: + found_files.extend(km.parent.glob(f'**/{file}')) + + # If we have a matching userspace, include those too + for file in interesting_files: + found_files.extend((QMK_FIRMWARE / 'users' / cli.args.keymap).glob(f'**/{file}')) + + dump_lines(cli.args.output, [f'generated-files: {found.resolve()}\n' for found in found_files]) -- cgit v1.2.3