From 507e32b28c5067fb01cb85c3259a50bec7ec1907 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 15 May 2023 21:58:12 +1000 Subject: [PATCH] Generate `make` dependency file during build for info.json's etc. (#20451) --- builddefs/build_keyboard.mk | 9 +++ lib/python/qmk/cli/__init__.py | 1 + .../qmk/cli/generate/make_dependencies.py | 56 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100755 lib/python/qmk/cli/generate/make_dependencies.py diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index 5fd61a96ce7..53b3ef4a111 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -343,6 +343,15 @@ $(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES) generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h +generated-files: $(KEYMAP_OUTPUT)/src/info_deps.d + +$(KEYMAP_OUTPUT)/src/info_deps.d: + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-make-dependencies -kb $(KEYBOARD) -km $(KEYMAP) -o $(KEYMAP_OUTPUT)/src/info_deps.d) + @$(BUILD_CMD) + +-include $(KEYMAP_OUTPUT)/src/info_deps.d + .INTERMEDIATE : generated-files # Userspace setup and definitions diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index de7b0476a07..9c3decf4f76 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -57,6 +57,7 @@ subcommands = [ 'qmk.cli.generate.keyboard_h', 'qmk.cli.generate.keycodes', 'qmk.cli.generate.keycodes_tests', + 'qmk.cli.generate.make_dependencies', 'qmk.cli.generate.rgb_breathe_table', 'qmk.cli.generate.rules_mk', 'qmk.cli.generate.version_h', 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 00000000000..635c341897b --- /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])