diff options
Diffstat (limited to 'lib/python/qmk/cli')
| -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]) | 
