diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/python/qmk/cli/__init__.py | 1 | ||||
-rwxr-xr-x | lib/python/qmk/cli/generate/make_dependencies.py | 56 |
2 files changed, 57 insertions, 0 deletions
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index de7b0476a0..9c3decf4f7 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 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]) |