From 71257e21e68d350c1c789a79440be8266be19788 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 6 Jan 2024 13:16:23 +0000 Subject: Generate true/false for _DEFAULT_ON options (#22829) --- lib/python/qmk/cli/generate/config_h.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 00fb1d9585..fc681300a3 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -108,6 +108,8 @@ def generate_config_items(kb_info_json, config_h_lines): elif key_type.startswith('array'): config_h_lines.append(generate_define(config_key, f'{{ {", ".join(map(str, config_value))} }}')) elif key_type == 'bool': + config_h_lines.append(generate_define(config_key, 'true' if config_value else 'false')) + elif key_type == 'flag': if config_value: config_h_lines.append(generate_define(config_key)) elif key_type == 'mapping': -- cgit v1.2.3 From 455cd65e80563469712fe56de15666e06b945636 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 9 Jan 2024 09:59:36 +0000 Subject: Prevent `qmk migrate` processing unparsed info.json values (#22374) --- lib/python/qmk/cli/migrate.py | 5 ++++- lib/python/qmk/info.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/migrate.py b/lib/python/qmk/cli/migrate.py index c1b1ad1ea9..0bab5c1949 100644 --- a/lib/python/qmk/cli/migrate.py +++ b/lib/python/qmk/cli/migrate.py @@ -47,9 +47,12 @@ def migrate(cli): files = _candidate_files(cli.args.keyboard) # Filter down keys if requested - keys = info_map.keys() + keys = list(filter(lambda key: info_map[key].get("to_json", True), info_map.keys())) if cli.args.filter: keys = list(set(keys) & set(cli.args.filter)) + rejected = set(cli.args.filter) - set(keys) + for key in rejected: + cli.log.info(f'{{fg_yellow}}Skipping {key} as migration not possible...') cli.log.info(f'{{fg_green}}Migrating keyboard {{fg_cyan}}{cli.args.keyboard}{{fg_green}}.{{fg_reset}}') diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 5500ecdd19..b018ba96fd 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -501,6 +501,9 @@ def _config_to_json(key_type, config_value): """Convert config value using spec """ if key_type.startswith('array'): + if key_type.count('.') > 1: + raise Exception(f"Conversion of {key_type} not possible") + if '.' in key_type: key_type, array_type = key_type.split('.', 1) else: -- cgit v1.2.3 From 1bebaa310abb637cbca146b6d7859f3efe503cfd Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 14 Jan 2024 21:33:58 +1100 Subject: CLI: Allow generation of both LED and RGB Matrix config (#22896) --- lib/python/qmk/cli/generate/keyboard_c.py | 25 ++++++++++++-------- lib/python/qmk/info.py | 38 ++++++++++++++----------------- 2 files changed, 32 insertions(+), 31 deletions(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index f010341613..5a6c967486 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -9,21 +9,25 @@ from qmk.path import normpath from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE -def _gen_led_config(info_data): +def _gen_led_configs(info_data): + lines = [] + + if 'layout' in info_data.get('rgb_matrix', {}): + lines.extend(_gen_led_config(info_data, 'rgb_matrix')) + + if 'layout' in info_data.get('led_matrix', {}): + lines.extend(_gen_led_config(info_data, 'led_matrix')) + + return lines + + +def _gen_led_config(info_data, config_type): """Convert info.json content to g_led_config """ cols = info_data['matrix_size']['cols'] rows = info_data['matrix_size']['rows'] - config_type = None - if 'layout' in info_data.get('rgb_matrix', {}): - config_type = 'rgb_matrix' - elif 'layout' in info_data.get('led_matrix', {}): - config_type = 'led_matrix' - lines = [] - if not config_type: - return lines matrix = [['NO_LED'] * cols for _ in range(rows)] pos = [] @@ -53,6 +57,7 @@ def _gen_led_config(info_data): lines.append(f' {{ {", ".join(flags)} }},') lines.append('};') lines.append('#endif') + lines.append('') return lines @@ -98,7 +103,7 @@ def generate_keyboard_c(cli): # Build the layouts.h file. keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#include QMK_KEYBOARD_H', ''] - keyboard_h_lines.extend(_gen_led_config(kb_info_json)) + keyboard_h_lines.extend(_gen_led_configs(kb_info_json)) keyboard_h_lines.extend(_gen_matrix_mask(kb_info_json)) # Show the results diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index b018ba96fd..efe4dac34a 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -686,27 +686,23 @@ def _extract_led_config(info_data, keyboard): cols = info_data['matrix_size']['cols'] rows = info_data['matrix_size']['rows'] - # Determine what feature owns g_led_config - feature = None - for feat in ['rgb_matrix', 'led_matrix']: - if info_data.get('features', {}).get(feat, False) or feat in info_data: - feature = feat - - if feature: - # Only attempt search if dd led config is missing - if 'layout' not in info_data.get(feature, {}): - # Process - for file in find_keyboard_c(keyboard): - try: - ret = find_led_config(file, cols, rows) - if ret: - info_data[feature] = info_data.get(feature, {}) - info_data[feature]['layout'] = ret - except Exception as e: - _log_warning(info_data, f'led_config: {file.name}: {e}') - - if info_data[feature].get('layout', None) and not info_data[feature].get('led_count', None): - info_data[feature]['led_count'] = len(info_data[feature]['layout']) + for feature in ['rgb_matrix', 'led_matrix']: + if info_data.get('features', {}).get(feature, False) or feature in info_data: + + # Only attempt search if dd led config is missing + if 'layout' not in info_data.get(feature, {}): + # Process + for file in find_keyboard_c(keyboard): + try: + ret = find_led_config(file, cols, rows) + if ret: + info_data[feature] = info_data.get(feature, {}) + info_data[feature]['layout'] = ret + except Exception as e: + _log_warning(info_data, f'led_config: {file.name}: {e}') + + if info_data[feature].get('layout', None) and not info_data[feature].get('led_count', None): + info_data[feature]['led_count'] = len(info_data[feature]['layout']) return info_data -- cgit v1.2.3 From 2b0965944d9065daa65cd25540cf2dd007f23eda Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 16 Jan 2024 17:13:58 +1100 Subject: `qmk format-json`: Force Unix line endings and ensure LF at EOF (#22901) --- lib/python/qmk/cli/format/json.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/format/json.py b/lib/python/qmk/cli/format/json.py index 283513254c..87a3837d10 100755 --- a/lib/python/qmk/cli/format/json.py +++ b/lib/python/qmk/cli/format/json.py @@ -92,8 +92,8 @@ def format_json(cli): output = json.dumps(json_data, cls=json_encoder, sort_keys=True) if cli.args.inplace: - with open(cli.args.json_file, 'w+', encoding='utf-8') as outfile: - outfile.write(output) + with open(cli.args.json_file, 'w+', encoding='utf-8', newline='\n') as outfile: + outfile.write(output + '\n') # Display the results if print was set # We don't operate in-place by default, so also display to stdout -- cgit v1.2.3 From e7b84e1cf6d864b1df41e7a81c576baa9d7ca30a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 8 Feb 2024 06:34:48 +0000 Subject: Flag invalid keyboard features during lint (#22832) --- lib/python/qmk/cli/lint.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index a7c85b5643..7ebb0cf9c4 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -13,6 +13,7 @@ from qmk.git import git_get_ignored_files from qmk.c_parse import c_source_files CHIBIOS_CONF_CHECKS = ['chconf.h', 'halconf.h', 'mcuconf.h', 'board.h'] +INVALID_KB_FEATURES = set(['encoder_map', 'dip_switch_map', 'combo', 'tap_dance', 'via']) def _list_defaultish_keymaps(kb): @@ -69,6 +70,17 @@ def _handle_json_errors(kb, info): return ok +def _handle_invalid_features(kb, info): + """Check for features that should never be enabled at the keyboard level + """ + ok = True + features = set(info.get('features', [])) + for found in features & INVALID_KB_FEATURES: + ok = False + cli.log.error(f'{kb}: Invalid keyboard level feature detected - {found}') + return ok + + def _chibios_conf_includenext_check(target): """Check the ChibiOS conf.h for the correct inclusion of the next conf.h """ @@ -154,6 +166,9 @@ def keyboard_check(kb): ok = False # Additional checks + if not _handle_invalid_features(kb, kb_info): + ok = False + rules_mk_assignment_errors = _rules_mk_assignment_only(kb) if rules_mk_assignment_errors: ok = False -- cgit v1.2.3 From 98a68b68a400f7b3821db1d77375a592b34cc8d6 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 12 Feb 2024 10:02:44 +0000 Subject: Fix git-submodule running in wrong location (#23059) --- lib/python/qmk/cli/git/submodule.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/git/submodule.py b/lib/python/qmk/cli/git/submodule.py index ef116ea124..1cbfd74e88 100644 --- a/lib/python/qmk/cli/git/submodule.py +++ b/lib/python/qmk/cli/git/submodule.py @@ -1,8 +1,8 @@ import shutil +from pathlib import Path from milc import cli -from qmk.path import normpath from qmk import submodules REMOVE_DIRS = [ @@ -40,12 +40,12 @@ def git_submodule(cli): remove_dirs = REMOVE_DIRS if cli.config.git_submodule.force: # Also trash everything that isnt marked as "safe" - for path in normpath('lib').iterdir(): + for path in Path('lib').iterdir(): if not any(ignore in path.as_posix() for ignore in IGNORE_DIRS): remove_dirs.append(path) - for folder in map(normpath, remove_dirs): - if normpath(folder).is_dir(): + for folder in map(Path, remove_dirs): + if folder.is_dir(): print(f"Removing '{folder}'") shutil.rmtree(folder) -- cgit v1.2.3 From 9b0b3d7b25a845bd1af2152ab1259a6522d5590f Mon Sep 17 00:00:00 2001 From: Pablo Martínez Date: Fri, 16 Feb 2024 15:34:43 +0100 Subject: [Enhancement] Prepare for `SyntaxWarning` (#22562) --- lib/python/qmk/cli/bux.py | 4 ++-- lib/python/qmk/cli/mass_compile.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/bux.py b/lib/python/qmk/cli/bux.py index 8c7f172779..669521d08e 100755 --- a/lib/python/qmk/cli/bux.py +++ b/lib/python/qmk/cli/bux.py @@ -19,7 +19,7 @@ def bux(cli): config.set_config('user', 'bux', bux + 1) cli.save_config() - buck = """ + buck = r""" @@BBBBBBBBBBBBBBBBBBBBK `vP8#####BE2~ x###g_ `S###q n##} -j#Bl. vBBBBBBBBBBBBBBBBBBBB@@ @B `:!: ^#@#]- `!t@@&. 7@@B@#^ _Q@Q@@R y@@l:P@#1' `!!_ B@ @B r@@@B g@@| ` N@@u 7@@iv@@u *#@z"@@R y@@&@@Q- l@@@D B@ @@ -34,7 +34,7 @@ def bux(cli): @B _y ]# ,c vUWNWWPsfsssN9WyccnckAfUfWb0DR0&R5RRRddq2_ `@D`jr@2U@#c3@1@Qc- B@ @B !7! .r]` }AE0RdRqNd9dNR9fUIzzosPqqAddNNdER9EE9dPy! BQ!zy@iU@.Q@@y@8x- B@ @B :****>. '7adddDdR&gRNdRbd&dNNbbRdNdd5NdRRD0RSf}- .k0&EW`xR .8Q=NRRx B@ -@B =**-rx*r}r~}" ;n2jkzsf3N3zsKsP5dddRddddRddNNqPzy\\" '~****" B@ +@B =**-rx*r}r~}" ;n2jkzsf3N3zsKsP5dddRddddRddNNqPzy\" '~****" B@ @B :!!~!;=~r>:*_ `:^vxikylulKfHkyjzzozoIoklix|^!-` B@ @B ```'-_""::::!:_-.`` B@ @B `- .` B@ diff --git a/lib/python/qmk/cli/mass_compile.py b/lib/python/qmk/cli/mass_compile.py index 69b9103fdc..7db704d6c2 100755 --- a/lib/python/qmk/cli/mass_compile.py +++ b/lib/python/qmk/cli/mass_compile.py @@ -52,9 +52,9 @@ all: {keyboard_safe}_{keymap_name}_binary {' '.join(command)} \\ >>"{build_log}" 2>&1 \\ || cp "{build_log}" "{failed_log}" - @{{ grep '\[ERRORS\]' "{build_log}" >/dev/null 2>&1 && printf "Build %-64s \e[1;31m[ERRORS]\e[0m\\n" "{keyboard_name}:{keymap_name}" ; }} \\ - || {{ grep '\[WARNINGS\]' "{build_log}" >/dev/null 2>&1 && printf "Build %-64s \e[1;33m[WARNINGS]\e[0m\\n" "{keyboard_name}:{keymap_name}" ; }} \\ - || printf "Build %-64s \e[1;32m[OK]\e[0m\\n" "{keyboard_name}:{keymap_name}" + @{{ grep '\\[ERRORS\\]' "{build_log}" >/dev/null 2>&1 && printf "Build %-64s \\e[1;31m[ERRORS]\\e[0m\\n" "{keyboard_name}:{keymap_name}" ; }} \\ + || {{ grep '\\[WARNINGS\\]' "{build_log}" >/dev/null 2>&1 && printf "Build %-64s \\e[1;33m[WARNINGS]\\e[0m\\n" "{keyboard_name}:{keymap_name}" ; }} \\ + || printf "Build %-64s \\e[1;32m[OK]\\e[0m\\n" "{keyboard_name}:{keymap_name}" @rm -f "{build_log}" || true """# noqa ) -- cgit v1.2.3 From 6810aaf0130113e267e20fb506d874cc858f5f67 Mon Sep 17 00:00:00 2001 From: Pablo Martínez Date: Sat, 17 Feb 2024 13:28:40 +0100 Subject: [Refactor] `qmk find` (#21096) --- lib/python/qmk/cli/find.py | 4 +- lib/python/qmk/search.py | 111 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 90 insertions(+), 25 deletions(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/cli/find.py b/lib/python/qmk/cli/find.py index 55a0530092..8f3a29c90c 100644 --- a/lib/python/qmk/cli/find.py +++ b/lib/python/qmk/cli/find.py @@ -1,7 +1,7 @@ """Command to search through all keyboards and keymaps for a given search criteria. """ from milc import cli -from qmk.search import search_keymap_targets +from qmk.search import filter_help, search_keymap_targets @cli.argument( @@ -11,7 +11,7 @@ from qmk.search import search_keymap_targets action='append', default=[], help= # noqa: `format-python` and `pytest` don't agree here. - "Filter the list of keyboards based on their info.json data. Accepts the formats key=value, function(key), or function(key,value), eg. 'features.rgblight=true'. Valid functions are 'absent', 'contains', 'exists' and 'length'. May be passed multiple times; all filters need to match. Value may include wildcards such as '*' and '?'." # noqa: `format-python` and `pytest` don't agree here. + f"Filter the list of keyboards based on their info.json data. Accepts the formats key=value, function(key), or function(key,value), eg. 'features.rgblight=true'. Valid functions are {filter_help()}. May be passed multiple times; all filters need to match. Value may include wildcards such as '*' and '?'." # noqa: `format-python` and `pytest` don't agree here. ) @cli.argument('-p', '--print', arg_only=True, action='append', default=[], help="For each matched target, print the value of the supplied info.json key. May be passed multiple times.") @cli.argument('-km', '--keymap', type=str, default='default', help="The keymap name to build. Default is 'default'.") diff --git a/lib/python/qmk/search.py b/lib/python/qmk/search.py index 84cf6cbe32..33550a3db2 100644 --- a/lib/python/qmk/search.py +++ b/lib/python/qmk/search.py @@ -5,7 +5,7 @@ import functools import fnmatch import logging import re -from typing import List, Tuple +from typing import Callable, List, Optional, Tuple from dotty_dict import dotty, Dotty from milc import cli @@ -15,6 +15,82 @@ from qmk.keyboard import list_keyboards, keyboard_folder from qmk.keymap import list_keymaps, locate_keymap from qmk.build_targets import KeyboardKeymapBuildTarget, BuildTarget +TargetInfo = Tuple[str, str, dict] + + +# by using a class for filters, we dont need to worry about capturing values +# see details +class FilterFunction: + """Base class for filters. + It provides: + - __init__: capture key and value + + Each subclass should provide: + - func_name: how it will be specified on CLI + >>> qmk find -f ... + - apply: function that actually applies the filter + ie: return whether the input kb/km satisfies the condition + """ + + key: str + value: Optional[str] + + func_name: str + apply: Callable[[TargetInfo], bool] + + def __init__(self, key, value): + self.key = key + self.value = value + + +class Exists(FilterFunction): + func_name = "exists" + + def apply(self, target_info: TargetInfo) -> bool: + _kb, _km, info = target_info + return self.key in info + + +class Absent(FilterFunction): + func_name = "absent" + + def apply(self, target_info: TargetInfo) -> bool: + _kb, _km, info = target_info + return self.key not in info + + +class Length(FilterFunction): + func_name = "length" + + def apply(self, target_info: TargetInfo) -> bool: + _kb, _km, info = target_info + return (self.key in info and len(info[self.key]) == int(self.value)) + + +class Contains(FilterFunction): + func_name = "contains" + + def apply(self, target_info: TargetInfo) -> bool: + _kb, _km, info = target_info + return (self.key in info and self.value in info[self.key]) + + +def _get_filter_class(func_name: str, key: str, value: str) -> Optional[FilterFunction]: + """Initialize a filter subclass based on regex findings and return it. + None if no there's no filter with the name queried. + """ + + for subclass in FilterFunction.__subclasses__(): + if func_name == subclass.func_name: + return subclass(key, value) + + return None + + +def filter_help() -> str: + names = [f"'{f.func_name}'" for f in FilterFunction.__subclasses__()] + return ", ".join(names[:-1]) + f" and {names[-1]}" + def _set_log_level(level): cli.acquire_lock() @@ -48,11 +124,12 @@ def _keymap_exists(keyboard, keymap): return keyboard if locate_keymap(keyboard, keymap) is not None else None -def _load_keymap_info(kb_km): +def _load_keymap_info(target: Tuple[str, str]) -> TargetInfo: """Returns a tuple of (keyboard, keymap, info.json) for the given keyboard/keymap combination. """ + kb, km = target with ignore_logging(): - return (kb_km[0], kb_km[1], keymap_json(kb_km[0], kb_km[1])) + return (kb, km, keymap_json(kb, km)) def expand_make_targets(targets: List[str]) -> List[Tuple[str, str]]: @@ -139,26 +216,14 @@ def _filter_keymap_targets(target_list: List[Tuple[str, str]], filters: List[str key = function_match.group('key') value = function_match.group('value') - if value is not None: - if func_name == 'length': - valid_keymaps = filter(lambda e, key=key, value=value: key in e[2] and len(e[2].get(key)) == int(value), valid_keymaps) - elif func_name == 'contains': - valid_keymaps = filter(lambda e, key=key, value=value: key in e[2] and value in e[2].get(key), valid_keymaps) - else: - cli.log.warning(f'Unrecognized filter expression: {function_match.group(0)}') - continue - - cli.log.info(f'Filtering on condition: {{fg_green}}{func_name}{{fg_reset}}({{fg_cyan}}{key}{{fg_reset}}, {{fg_cyan}}{value}{{fg_reset}})...') - else: - if func_name == 'exists': - valid_keymaps = filter(lambda e, key=key: key in e[2], valid_keymaps) - elif func_name == 'absent': - valid_keymaps = filter(lambda e, key=key: key not in e[2], valid_keymaps) - else: - cli.log.warning(f'Unrecognized filter expression: {function_match.group(0)}') - continue - - cli.log.info(f'Filtering on condition: {{fg_green}}{func_name}{{fg_reset}}({{fg_cyan}}{key}{{fg_reset}})...') + filter_class = _get_filter_class(func_name, key, value) + if filter_class is None: + cli.log.warning(f'Unrecognized filter expression: {function_match.group(0)}') + continue + valid_keymaps = filter(filter_class.apply, valid_keymaps) + + value_str = f", {{fg_cyan}}{value}{{fg_reset}})" if value is not None else "" + cli.log.info(f'Filtering on condition: {{fg_green}}{func_name}{{fg_reset}}({{fg_cyan}}{key}{{fg_reset}}{value_str}...') elif equals_match is not None: key = equals_match.group('key') -- cgit v1.2.3 From 56802f506cee22730e004b0695d87e9e9c5983af Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 22 Feb 2024 23:47:42 +1100 Subject: Ensure `qmk generate-compilation-database` copies to userspace as well. (#23129) --- lib/python/qmk/build_targets.py | 5 +++-- lib/python/qmk/cli/generate/compilation_database.py | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) (limited to 'lib/python/qmk/cli') diff --git a/lib/python/qmk/build_targets.py b/lib/python/qmk/build_targets.py index 80f587bcc0..d974d04020 100644 --- a/lib/python/qmk/build_targets.py +++ b/lib/python/qmk/build_targets.py @@ -119,9 +119,10 @@ class BuildTarget: command = self.compile_command(build_target=build_target, dry_run=True, **env_vars) from qmk.cli.generate.compilation_database import write_compilation_database # Lazy load due to circular references output_path = QMK_FIRMWARE / 'compile_commands.json' - write_compilation_database(command=command, output_path=output_path, skip_clean=skip_clean, **env_vars) - if output_path.exists() and HAS_QMK_USERSPACE: + ret = write_compilation_database(command=command, output_path=output_path, skip_clean=skip_clean, **env_vars) + if ret and output_path.exists() and HAS_QMK_USERSPACE: shutil.copy(str(output_path), str(QMK_USERSPACE / 'compile_commands.json')) + return ret def compile(self, build_target: str = None, dry_run: bool = False, **env_vars) -> None: if self._clean or self._compiledb: diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py index 5100d2b6d2..a2190fee66 100755 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -17,6 +17,7 @@ from qmk.constants import QMK_FIRMWARE from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer +from qmk.build_targets import KeyboardKeymapBuildTarget @lru_cache(maxsize=10) @@ -138,4 +139,5 @@ def generate_compilation_database(cli: MILC) -> Union[bool, int]: elif not current_keymap: cli.log.error('Could not determine keymap!') - return write_compilation_database(current_keyboard, current_keymap, QMK_FIRMWARE / 'compile_commands.json') + target = KeyboardKeymapBuildTarget(current_keyboard, current_keymap) + return target.generate_compilation_database() -- cgit v1.2.3