Skip to content

Commit

Permalink
Generate make dependency file during build for info.json's etc. (qm…
Browse files Browse the repository at this point in the history
  • Loading branch information
tzarc authored and Daniel Shields committed May 18, 2023
1 parent cca0742 commit 35fecbd
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
9 changes: 9 additions & 0 deletions builddefs/build_keyboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions lib/python/qmk/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
'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',
Expand Down
56 changes: 56 additions & 0 deletions lib/python/qmk/cli/generate/make_dependencies.py
Original file line number Diff line number Diff line change
@@ -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])

0 comments on commit 35fecbd

Please sign in to comment.