From e7205829ef7ac7839e8a335a45701e7b96214e29 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 14 Sep 2023 20:15:52 +1000 Subject: [PATCH 1/7] Allow for specifying `all` for keyboard name. --- lib/python/qmk/cli/compile.py | 9 ++++++++- lib/python/qmk/keyboard.py | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index f43e5f32dea9..c7714fb00d7c 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -9,7 +9,7 @@ import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.keymap import keymap_completer, locate_keymap @@ -40,6 +40,13 @@ def compile(cli): If a keyboard and keymap are provided this command will build a firmware based on that. """ + if is_all_keyboards(cli.args.keyboard): + from qmk.cli.mass_compile import mass_compile + cli.args.builds = [] + cli.args.filter = [] + cli.args.no_temp = False + return mass_compile(cli) + # Build the environment vars envs = build_environment(cli.args.env) diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py index 235b62640c20..39ff3976a163 100644 --- a/lib/python/qmk/keyboard.py +++ b/lib/python/qmk/keyboard.py @@ -30,9 +30,29 @@ }, } + +class AllKeyboards: + """Represents all keyboards. + """ + def __str__(self): + return 'all' + + def __repr__(self): + return 'all' + + def __eq__(self, other): + return isinstance(other, AllKeyboards) + + base_path = os.path.join(os.getcwd(), "keyboards") + os.path.sep +def is_all_keyboards(keyboard): + """Returns True if the keyboard is an AllKeyboards object. + """ + return isinstance(keyboard, AllKeyboards) + + def find_keyboard_from_dir(): """Returns a keyboard name based on the user's current directory. """ @@ -68,7 +88,11 @@ def keyboard_folder(keyboard): """Returns the actual keyboard folder. This checks aliases and DEFAULT_FOLDER to resolve the actual path for a keyboard. + If the supplied argument is "all", it returns an AllKeyboards object. """ + if keyboard == 'all': + return AllKeyboards() + aliases = json_load(Path('data/mappings/keyboard_aliases.hjson')) if keyboard in aliases: From b7d04c2ffc3ac014687fbb560fc2d90e88fade43 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 14 Sep 2023 20:32:28 +1000 Subject: [PATCH 2/7] Errors for flash/info --- lib/python/qmk/cli/flash.py | 7 ++++++- lib/python/qmk/cli/info.py | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index 8724f26889b2..606c4692fd74 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -10,7 +10,7 @@ import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.keymap import keymap_completer, locate_keymap from qmk.flashers import flasher @@ -89,6 +89,11 @@ def flash(cli): If bootloader is omitted the make system will use the configured bootloader for that keyboard. """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('Mass flashing is not supported.') + cli.print_help() + return False + if cli.args.filename and cli.args.filename.suffix in ['.bin', '.hex', '.uf2']: return _flash_binary(cli.args.filename, cli.args.mcu) diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py index e662407474e9..692c73cb2b58 100755 --- a/lib/python/qmk/cli/info.py +++ b/lib/python/qmk/cli/info.py @@ -10,7 +10,7 @@ from qmk.json_encoders import InfoJSONEncoder from qmk.constants import COL_LETTERS, ROW_LETTERS from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.keyboard import keyboard_completer, keyboard_folder, render_layouts, render_layout, rules_mk +from qmk.keyboard import keyboard_completer, keyboard_folder, render_layouts, render_layout, rules_mk, is_all_keyboards from qmk.info import info_json, keymap_json from qmk.keymap import locate_keymap from qmk.path import is_keyboard @@ -174,6 +174,11 @@ def print_parsed_rules_mk(keyboard_name): def info(cli): """Compile an info.json for a particular keyboard and pretty-print it. """ + if is_all_keyboards(cli.config.info.keyboard): + cli.log.error('Mass info is not supported.') + cli.print_help() + return False + # Determine our keyboard(s) if not cli.config.info.keyboard: cli.log.error('Missing parameter: --keyboard') From 5c1eb97dd55bdc3e8fc9aa9f5e28f668efefa007 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 14 Sep 2023 20:38:01 +1000 Subject: [PATCH 3/7] More errors for more commands. --- lib/python/qmk/cli/generate/autocorrect_data.py | 6 +++++- lib/python/qmk/cli/generate/compilation_database.py | 6 +++++- lib/python/qmk/cli/generate/config_h.py | 6 +++++- lib/python/qmk/cli/generate/info_json.py | 6 +++++- lib/python/qmk/cli/generate/keyboard_c.py | 6 +++++- lib/python/qmk/cli/generate/keyboard_h.py | 6 +++++- lib/python/qmk/cli/generate/make_dependencies.py | 6 +++++- lib/python/qmk/cli/generate/rules_mk.py | 6 +++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/python/qmk/cli/generate/autocorrect_data.py b/lib/python/qmk/cli/generate/autocorrect_data.py index b11c66d95d21..445289a07446 100644 --- a/lib/python/qmk/cli/generate/autocorrect_data.py +++ b/lib/python/qmk/cli/generate/autocorrect_data.py @@ -35,7 +35,7 @@ from qmk.commands import dump_lines from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.keymap import keymap_completer, locate_keymap from qmk.path import normpath @@ -256,6 +256,10 @@ def to_hex(b: int) -> str: @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.subcommand('Generate the autocorrection data file from a dictionary file.') def generate_autocorrect_data(cli): + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + autocorrections = parse_file(cli.args.filename) trie = make_trie(autocorrections) data = serialize_trie(autocorrections, trie) diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py index 5e1a18a69b27..6ea623879c47 100755 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -15,7 +15,7 @@ from qmk.commands import create_make_command from qmk.constants import QMK_FIRMWARE from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.keymap import keymap_completer @@ -90,6 +90,10 @@ def generate_compilation_database(cli: MILC) -> Union[bool, int]: https://clang.llvm.org/docs/JSONCompilationDatabase.html """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + command = None # check both config domains: the magic decorator fills in `generate_compilation_database` but the user is # more likely to have set `compile` in their config file. diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 64d4db6ffe14..d9263a0ffa39 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -8,7 +8,7 @@ from qmk.info import info_json from qmk.json_schema import json_load -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.commands import dump_lines, parse_configurator_json from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -173,6 +173,10 @@ def generate_led_animations_config(led_feature_json, config_h_lines, prefix): def generate_config_h(cli): """Generates the info_config.h file. """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + # Determine our keyboard/keymap if cli.args.filename: user_keymap = parse_configurator_json(cli.args.filename) diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py index 08c294146bc4..d3bc29396c31 100755 --- a/lib/python/qmk/cli/generate/info_json.py +++ b/lib/python/qmk/cli/generate/info_json.py @@ -13,7 +13,7 @@ from qmk.info import info_json from qmk.json_encoders import InfoJSONEncoder from qmk.json_schema import compile_schema_store -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.path import is_keyboard, normpath @@ -55,6 +55,10 @@ def strip_info_json(kb_info_json): def generate_info_json(cli): """Generate an info.json file for a keyboard """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + # Determine our keyboard(s) if not cli.config.generate_info_json.keyboard: cli.log.error('Missing parameter: --keyboard') diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index 9004b41abb24..09d7151de8c1 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -4,7 +4,7 @@ from qmk.info import info_json from qmk.commands import dump_lines -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.path import normpath from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -64,6 +64,10 @@ def _gen_led_config(info_data): def generate_keyboard_c(cli): """Generates the keyboard.h file. """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + kb_info_json = info_json(cli.args.keyboard) # Build the layouts.h file. diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py index b9e89032b9e2..8b4692c3d63e 100755 --- a/lib/python/qmk/cli/generate/keyboard_h.py +++ b/lib/python/qmk/cli/generate/keyboard_h.py @@ -7,7 +7,7 @@ from qmk.path import normpath from qmk.info import info_json from qmk.commands import dump_lines -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.constants import COL_LETTERS, ROW_LETTERS, GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -101,6 +101,10 @@ def _generate_keycodes(kb_info_json): def generate_keyboard_h(cli): """Generates the keyboard.h file. """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + # Build the info.json file kb_info_json = info_json(cli.args.keyboard) diff --git a/lib/python/qmk/cli/generate/make_dependencies.py b/lib/python/qmk/cli/generate/make_dependencies.py index 9b695e907de5..904127b2ab75 100755 --- a/lib/python/qmk/cli/generate/make_dependencies.py +++ b/lib/python/qmk/cli/generate/make_dependencies.py @@ -6,7 +6,7 @@ from argcomplete.completers import FilesCompleter from qmk.commands import dump_lines -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.keymap import keymap_completer, locate_keymap from qmk.path import normpath, FileType @@ -20,6 +20,10 @@ def generate_make_dependencies(cli): """Generates the list of dependent info.json, rules.mk, and config.h files for a keyboard. """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + interesting_files = [ 'info.json', 'rules.mk', diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index fc272da6c6a3..299f1349a388 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -8,7 +8,7 @@ from qmk.info import info_json from qmk.json_schema import json_load -from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards from qmk.commands import dump_lines, parse_configurator_json from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE @@ -49,6 +49,10 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict): def generate_rules_mk(cli): """Generates a rules.mk file from info.json. """ + if is_all_keyboards(cli.args.keyboard): + cli.log.error('You must specify a single keyboard.') + return 1 + converter = None # Determine our keyboard/keymap if cli.args.filename: From 36f915b6d4d9b0aa852bc11b08faca7c6a46b4e5 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 14 Sep 2023 20:40:45 +1000 Subject: [PATCH 4/7] Consistency. --- lib/python/qmk/cli/flash.py | 2 +- lib/python/qmk/cli/generate/autocorrect_data.py | 3 ++- lib/python/qmk/cli/generate/compilation_database.py | 3 ++- lib/python/qmk/cli/generate/config_h.py | 3 ++- lib/python/qmk/cli/generate/info_json.py | 3 ++- lib/python/qmk/cli/generate/keyboard_c.py | 3 ++- lib/python/qmk/cli/generate/keyboard_h.py | 3 ++- lib/python/qmk/cli/generate/make_dependencies.py | 3 ++- lib/python/qmk/cli/generate/rules_mk.py | 3 ++- lib/python/qmk/cli/info.py | 2 +- 10 files changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index 606c4692fd74..b9297c5ec676 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -90,7 +90,7 @@ def flash(cli): If bootloader is omitted the make system will use the configured bootloader for that keyboard. """ if is_all_keyboards(cli.args.keyboard): - cli.log.error('Mass flashing is not supported.') + cli.log.error('You must specify a single keyboard.') cli.print_help() return False diff --git a/lib/python/qmk/cli/generate/autocorrect_data.py b/lib/python/qmk/cli/generate/autocorrect_data.py index 445289a07446..5f7dce211e43 100644 --- a/lib/python/qmk/cli/generate/autocorrect_data.py +++ b/lib/python/qmk/cli/generate/autocorrect_data.py @@ -258,7 +258,8 @@ def to_hex(b: int) -> str: def generate_autocorrect_data(cli): if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False autocorrections = parse_file(cli.args.filename) trie = make_trie(autocorrections) diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py index 6ea623879c47..e1c1407b066c 100755 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -92,7 +92,8 @@ def generate_compilation_database(cli: MILC) -> Union[bool, int]: """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False command = None # check both config domains: the magic decorator fills in `generate_compilation_database` but the user is diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index d9263a0ffa39..279398796f83 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -175,7 +175,8 @@ def generate_config_h(cli): """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False # Determine our keyboard/keymap if cli.args.filename: diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py index d3bc29396c31..4439e06a0732 100755 --- a/lib/python/qmk/cli/generate/info_json.py +++ b/lib/python/qmk/cli/generate/info_json.py @@ -57,7 +57,8 @@ def generate_info_json(cli): """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False # Determine our keyboard(s) if not cli.config.generate_info_json.keyboard: diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index 09d7151de8c1..e6ef85983bbb 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -66,7 +66,8 @@ def generate_keyboard_c(cli): """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False kb_info_json = info_json(cli.args.keyboard) diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py index 8b4692c3d63e..1f113ab344e8 100755 --- a/lib/python/qmk/cli/generate/keyboard_h.py +++ b/lib/python/qmk/cli/generate/keyboard_h.py @@ -103,7 +103,8 @@ def generate_keyboard_h(cli): """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False # Build the info.json file kb_info_json = info_json(cli.args.keyboard) diff --git a/lib/python/qmk/cli/generate/make_dependencies.py b/lib/python/qmk/cli/generate/make_dependencies.py index 904127b2ab75..9364d180efbc 100755 --- a/lib/python/qmk/cli/generate/make_dependencies.py +++ b/lib/python/qmk/cli/generate/make_dependencies.py @@ -22,7 +22,8 @@ def generate_make_dependencies(cli): """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False interesting_files = [ 'info.json', diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 299f1349a388..4b0123c60970 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -51,7 +51,8 @@ def generate_rules_mk(cli): """ if is_all_keyboards(cli.args.keyboard): cli.log.error('You must specify a single keyboard.') - return 1 + cli.print_help() + return False converter = None # Determine our keyboard/keymap diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py index 692c73cb2b58..1492c817fd7e 100755 --- a/lib/python/qmk/cli/info.py +++ b/lib/python/qmk/cli/info.py @@ -175,7 +175,7 @@ def info(cli): """Compile an info.json for a particular keyboard and pretty-print it. """ if is_all_keyboards(cli.config.info.keyboard): - cli.log.error('Mass info is not supported.') + cli.log.error('You must specify a single keyboard.') cli.print_help() return False From 90def82028bdb5eb4668c12fbf8a484271868278 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 15 Sep 2023 07:54:25 +1000 Subject: [PATCH 5/7] Review comments. --- lib/python/qmk/cli/compile.py | 4 ++-- lib/python/qmk/cli/flash.py | 7 +------ lib/python/qmk/cli/generate/autocorrect_data.py | 7 +------ .../qmk/cli/generate/compilation_database.py | 7 +------ lib/python/qmk/cli/generate/config_h.py | 7 +------ lib/python/qmk/cli/generate/info_json.py | 7 +------ lib/python/qmk/cli/generate/keyboard_c.py | 7 +------ lib/python/qmk/cli/generate/keyboard_h.py | 7 +------ lib/python/qmk/cli/generate/make_dependencies.py | 7 +------ lib/python/qmk/cli/generate/rules_mk.py | 7 +------ lib/python/qmk/cli/info.py | 7 +------ lib/python/qmk/keyboard.py | 16 ++++++++++++---- 12 files changed, 24 insertions(+), 66 deletions(-) diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index c7714fb00d7c..3ae565332359 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -9,7 +9,7 @@ import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder_or_all, is_all_keyboards from qmk.keymap import keymap_completer, locate_keymap @@ -24,7 +24,7 @@ def _is_keymap_target(keyboard, keymap): @cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), completer=FilesCompleter('.json'), help='The configurator export to compile') -@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') +@cli.argument('-kb', '--keyboard', type=keyboard_folder_or_all, completer=keyboard_completer, help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-km', '--keymap', completer=keymap_completer, help='The keymap to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the make command to be run.") @cli.argument('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.") diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index b9297c5ec676..8724f26889b2 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -10,7 +10,7 @@ import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer, locate_keymap from qmk.flashers import flasher @@ -89,11 +89,6 @@ def flash(cli): If bootloader is omitted the make system will use the configured bootloader for that keyboard. """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - if cli.args.filename and cli.args.filename.suffix in ['.bin', '.hex', '.uf2']: return _flash_binary(cli.args.filename, cli.args.mcu) diff --git a/lib/python/qmk/cli/generate/autocorrect_data.py b/lib/python/qmk/cli/generate/autocorrect_data.py index 5f7dce211e43..b11c66d95d21 100644 --- a/lib/python/qmk/cli/generate/autocorrect_data.py +++ b/lib/python/qmk/cli/generate/autocorrect_data.py @@ -35,7 +35,7 @@ from qmk.commands import dump_lines from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer, locate_keymap from qmk.path import normpath @@ -256,11 +256,6 @@ def to_hex(b: int) -> str: @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.subcommand('Generate the autocorrection data file from a dictionary file.') def generate_autocorrect_data(cli): - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - autocorrections = parse_file(cli.args.filename) trie = make_trie(autocorrections) data = serialize_trie(autocorrections, trie) diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py index e1c1407b066c..5e1a18a69b27 100755 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -15,7 +15,7 @@ from qmk.commands import create_make_command from qmk.constants import QMK_FIRMWARE from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer @@ -90,11 +90,6 @@ def generate_compilation_database(cli: MILC) -> Union[bool, int]: https://clang.llvm.org/docs/JSONCompilationDatabase.html """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - command = None # check both config domains: the magic decorator fills in `generate_compilation_database` but the user is # more likely to have set `compile` in their config file. diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 279398796f83..64d4db6ffe14 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -8,7 +8,7 @@ from qmk.info import info_json from qmk.json_schema import json_load -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.commands import dump_lines, parse_configurator_json from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -173,11 +173,6 @@ def generate_led_animations_config(led_feature_json, config_h_lines, prefix): def generate_config_h(cli): """Generates the info_config.h file. """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - # Determine our keyboard/keymap if cli.args.filename: user_keymap = parse_configurator_json(cli.args.filename) diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py index 4439e06a0732..08c294146bc4 100755 --- a/lib/python/qmk/cli/generate/info_json.py +++ b/lib/python/qmk/cli/generate/info_json.py @@ -13,7 +13,7 @@ from qmk.info import info_json from qmk.json_encoders import InfoJSONEncoder from qmk.json_schema import compile_schema_store -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.path import is_keyboard, normpath @@ -55,11 +55,6 @@ def strip_info_json(kb_info_json): def generate_info_json(cli): """Generate an info.json file for a keyboard """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - # Determine our keyboard(s) if not cli.config.generate_info_json.keyboard: cli.log.error('Missing parameter: --keyboard') diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index e6ef85983bbb..9004b41abb24 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -4,7 +4,7 @@ from qmk.info import info_json from qmk.commands import dump_lines -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.path import normpath from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -64,11 +64,6 @@ def _gen_led_config(info_data): def generate_keyboard_c(cli): """Generates the keyboard.h file. """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - kb_info_json = info_json(cli.args.keyboard) # Build the layouts.h file. diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py index 1f113ab344e8..b9e89032b9e2 100755 --- a/lib/python/qmk/cli/generate/keyboard_h.py +++ b/lib/python/qmk/cli/generate/keyboard_h.py @@ -7,7 +7,7 @@ from qmk.path import normpath from qmk.info import info_json from qmk.commands import dump_lines -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.constants import COL_LETTERS, ROW_LETTERS, GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -101,11 +101,6 @@ def _generate_keycodes(kb_info_json): def generate_keyboard_h(cli): """Generates the keyboard.h file. """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - # Build the info.json file kb_info_json = info_json(cli.args.keyboard) diff --git a/lib/python/qmk/cli/generate/make_dependencies.py b/lib/python/qmk/cli/generate/make_dependencies.py index 9364d180efbc..9b695e907de5 100755 --- a/lib/python/qmk/cli/generate/make_dependencies.py +++ b/lib/python/qmk/cli/generate/make_dependencies.py @@ -6,7 +6,7 @@ from argcomplete.completers import FilesCompleter from qmk.commands import dump_lines -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer, locate_keymap from qmk.path import normpath, FileType @@ -20,11 +20,6 @@ def generate_make_dependencies(cli): """Generates the list of dependent info.json, rules.mk, and config.h files for a keyboard. """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - interesting_files = [ 'info.json', 'rules.mk', diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 4b0123c60970..fc272da6c6a3 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -8,7 +8,7 @@ from qmk.info import info_json from qmk.json_schema import json_load -from qmk.keyboard import keyboard_completer, keyboard_folder, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.commands import dump_lines, parse_configurator_json from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE @@ -49,11 +49,6 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict): def generate_rules_mk(cli): """Generates a rules.mk file from info.json. """ - if is_all_keyboards(cli.args.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - converter = None # Determine our keyboard/keymap if cli.args.filename: diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py index 1492c817fd7e..e662407474e9 100755 --- a/lib/python/qmk/cli/info.py +++ b/lib/python/qmk/cli/info.py @@ -10,7 +10,7 @@ from qmk.json_encoders import InfoJSONEncoder from qmk.constants import COL_LETTERS, ROW_LETTERS from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.keyboard import keyboard_completer, keyboard_folder, render_layouts, render_layout, rules_mk, is_all_keyboards +from qmk.keyboard import keyboard_completer, keyboard_folder, render_layouts, render_layout, rules_mk from qmk.info import info_json, keymap_json from qmk.keymap import locate_keymap from qmk.path import is_keyboard @@ -174,11 +174,6 @@ def print_parsed_rules_mk(keyboard_name): def info(cli): """Compile an info.json for a particular keyboard and pretty-print it. """ - if is_all_keyboards(cli.config.info.keyboard): - cli.log.error('You must specify a single keyboard.') - cli.print_help() - return False - # Determine our keyboard(s) if not cli.config.info.keyboard: cli.log.error('Missing parameter: --keyboard') diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py index 39ff3976a163..3e5cae4b22ec 100644 --- a/lib/python/qmk/keyboard.py +++ b/lib/python/qmk/keyboard.py @@ -88,11 +88,7 @@ def keyboard_folder(keyboard): """Returns the actual keyboard folder. This checks aliases and DEFAULT_FOLDER to resolve the actual path for a keyboard. - If the supplied argument is "all", it returns an AllKeyboards object. """ - if keyboard == 'all': - return AllKeyboards() - aliases = json_load(Path('data/mappings/keyboard_aliases.hjson')) if keyboard in aliases: @@ -110,6 +106,18 @@ def keyboard_folder(keyboard): return keyboard +def keyboard_folder_or_all(keyboard): + """Returns the actual keyboard folder. + + This checks aliases and DEFAULT_FOLDER to resolve the actual path for a keyboard. + If the supplied argument is "all", it returns an AllKeyboards object. + """ + if keyboard == 'all': + return AllKeyboards() + + return keyboard_folder(keyboard) + + def _find_name(path): """Determine the keyboard name by stripping off the base_path and rules.mk. """ From aa8bbb8bdfd36ea5872ca1779db33a9454d827d8 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 15 Sep 2023 08:00:07 +1000 Subject: [PATCH 6/7] Consistency with other areas of the code. --- lib/python/qmk/cli/compile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index 3ae565332359..3d632e74a9b9 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -41,7 +41,7 @@ def compile(cli): If a keyboard and keymap are provided this command will build a firmware based on that. """ if is_all_keyboards(cli.args.keyboard): - from qmk.cli.mass_compile import mass_compile + from .mass_compile import mass_compile cli.args.builds = [] cli.args.filter = [] cli.args.no_temp = False From 28f19a63ae5b3c6391f5092955806d366d02502a Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 17 Sep 2023 14:55:35 +1000 Subject: [PATCH 7/7] Add dry-run support to `qmk mass-compile` for consistency with `qmk compile -kb all`. --- lib/python/qmk/cli/mass_compile.py | 78 ++++++++++++++++-------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/lib/python/qmk/cli/mass_compile.py b/lib/python/qmk/cli/mass_compile.py index ddd946a32bc6..bac80e974762 100755 --- a/lib/python/qmk/cli/mass_compile.py +++ b/lib/python/qmk/cli/mass_compile.py @@ -17,6 +17,7 @@ @cli.argument('-t', '--no-temp', arg_only=True, action='store_true', help="Remove temporary files during build.") @cli.argument('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.") @cli.argument('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.") +@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the commands to be run.") @cli.argument( '-f', '--filter', @@ -47,47 +48,52 @@ def mass_compile(cli): if len(targets) == 0: return - builddir.mkdir(parents=True, exist_ok=True) - with open(makefile, "w") as f: + if cli.args.dry_run: + cli.log.info('Compilation targets:') for target in sorted(targets): - keyboard_name = target[0] - keymap_name = target[1] - keyboard_safe = keyboard_name.replace('/', '_') - build_log = f"{QMK_FIRMWARE}/.build/build.log.{os.getpid()}.{keyboard_safe}.{keymap_name}" - failed_log = f"{QMK_FIRMWARE}/.build/failed.log.{os.getpid()}.{keyboard_safe}.{keymap_name}" - # yapf: disable - f.write( - f"""\ -all: {keyboard_safe}_{keymap_name}_binary -{keyboard_safe}_{keymap_name}_binary: - @rm -f "{build_log}" || true - @echo "Compiling QMK Firmware for target: '{keyboard_name}:{keymap_name}'..." >>"{build_log}" - +@$(MAKE) -C "{QMK_FIRMWARE}" -f "{QMK_FIRMWARE}/builddefs/build_keyboard.mk" KEYBOARD="{keyboard_name}" KEYMAP="{keymap_name}" COLOR=true SILENT=false {' '.join(cli.args.env)} \\ - >>"{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}" - @rm -f "{build_log}" || true -"""# noqa - ) - # yapf: enable - - if cli.args.no_temp: + cli.log.info(f"{{fg_cyan}}qmk compile -kb {target[0]} -km {target[1]}{{fg_reset}}") + else: + builddir.mkdir(parents=True, exist_ok=True) + with open(makefile, "w") as f: + for target in sorted(targets): + keyboard_name = target[0] + keymap_name = target[1] + keyboard_safe = keyboard_name.replace('/', '_') + build_log = f"{QMK_FIRMWARE}/.build/build.log.{os.getpid()}.{keyboard_safe}.{keymap_name}" + failed_log = f"{QMK_FIRMWARE}/.build/failed.log.{os.getpid()}.{keyboard_safe}.{keymap_name}" # yapf: disable f.write( f"""\ - @rm -rf "{QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.elf" 2>/dev/null || true - @rm -rf "{QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.map" 2>/dev/null || true - @rm -rf "{QMK_FIRMWARE}/.build/obj_{keyboard_safe}_{keymap_name}" || true -"""# noqa + all: {keyboard_safe}_{keymap_name}_binary + {keyboard_safe}_{keymap_name}_binary: + @rm -f "{build_log}" || true + @echo "Compiling QMK Firmware for target: '{keyboard_name}:{keymap_name}'..." >>"{build_log}" + +@$(MAKE) -C "{QMK_FIRMWARE}" -f "{QMK_FIRMWARE}/builddefs/build_keyboard.mk" KEYBOARD="{keyboard_name}" KEYMAP="{keymap_name}" COLOR=true SILENT=false {' '.join(cli.args.env)} \\ + >>"{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}" + @rm -f "{build_log}" || true + """# noqa ) # yapf: enable - f.write('\n') - cli.run([make_cmd, *get_make_parallel_args(cli.args.parallel), '-f', makefile.as_posix(), 'all'], capture_output=False, stdin=DEVNULL) + if cli.args.no_temp: + # yapf: disable + f.write( + f"""\ + @rm -rf "{QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.elf" 2>/dev/null || true + @rm -rf "{QMK_FIRMWARE}/.build/{keyboard_safe}_{keymap_name}.map" 2>/dev/null || true + @rm -rf "{QMK_FIRMWARE}/.build/obj_{keyboard_safe}_{keymap_name}" || true + """# noqa + ) + # yapf: enable + f.write('\n') + + cli.run([make_cmd, *get_make_parallel_args(cli.args.parallel), '-f', makefile.as_posix(), 'all'], capture_output=False, stdin=DEVNULL) - # Check for failures - failures = [f for f in builddir.glob(f'failed.log.{os.getpid()}.*')] - if len(failures) > 0: - return False + # Check for failures + failures = [f for f in builddir.glob(f'failed.log.{os.getpid()}.*')] + if len(failures) > 0: + return False