Browse Source

unify the compile and flash commands

Zach White 5 years ago
parent
commit
4f20c94b97
3 changed files with 49 additions and 79 deletions
  1. 29 1
      lib/python/qmk/cli/compile.py
  2. 3 48
      lib/python/qmk/cli/flash.py
  3. 17 30
      lib/python/qmk/commands.py

+ 29 - 1
lib/python/qmk/cli/compile.py

@@ -13,6 +13,7 @@ from qmk.decorators import automagic_keyboard, automagic_keymap
 from qmk.commands import do_compile
 from qmk.commands import do_compile
 from qmk.keyboard import keyboard_completer, is_keyboard_target
 from qmk.keyboard import keyboard_completer, is_keyboard_target
 from qmk.keymap import keymap_completer
 from qmk.keymap import keymap_completer
+from qmk.metadata import true_values, false_values
 
 
 
 
 @cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), completer=FilesCompleter('.json'), help='The configurator export to compile')
 @cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), completer=FilesCompleter('.json'), help='The configurator export to compile')
@@ -34,4 +35,31 @@ def compile(cli):
 
 
     If a keyboard and keymap are provided this command will build a firmware based on that.
     If a keyboard and keymap are provided this command will build a firmware based on that.
     """
     """
-    do_compile(cli.config.compile.keyboard, cli.config.compile.keymap, cli.config.compile.parallel, cli.config.compile.target)
+    # If -f has been specified without a keyboard target, assume -kb all
+    keyboard = cli.config.compile.keyboard or ''
+
+    if cli.args.filter and not cli.args.keyboard:
+        cli.log.debug('--filter supplied without --keyboard, assuming --keyboard all.')
+        keyboard = 'all'
+
+    if cli.args.filename and cli.args.filter:
+        cli.log.warning('Ignoring --filter because a keymap.json was provided.')
+
+    filters = {}
+
+    for filter in cli.args.filter:
+        if '=' in filter:
+            key, value = filter.split('=', 1)
+
+            if value in true_values:
+                value = True
+            elif value in false_values:
+                value = False
+            elif value.isdigit():
+                value = int(value)
+            elif '.' in value and value.replace('.').isdigit():
+                value = float(value)
+
+            filters[key] = value
+
+    return do_compile(keyboard, cli.config.compile.keymap, cli.config.compile.parallel, cli.config.compile.target, filters)

+ 3 - 48
lib/python/qmk/cli/flash.py

@@ -10,7 +10,7 @@ from milc import cli
 
 
 import qmk.path
 import qmk.path
 from qmk.decorators import automagic_keyboard, automagic_keymap
 from qmk.decorators import automagic_keyboard, automagic_keymap
-from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json
+from qmk.commands import do_compile
 from qmk.keyboard import keyboard_completer, is_keyboard_target
 from qmk.keyboard import keyboard_completer, is_keyboard_target
 
 
 
 
@@ -54,55 +54,10 @@ def flash(cli):
 
 
     If bootloader is omitted the make system will use the configured bootloader for that keyboard.
     If bootloader is omitted the make system will use the configured bootloader for that keyboard.
     """
     """
-    if cli.args.clean and not cli.args.filename and not cli.args.dry_run:
-        command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, 'clean')
-        cli.run(command, capture_output=False, stdin=DEVNULL)
-
-    # Build the environment vars
-    envs = {}
-    for env in cli.args.env:
-        if '=' in env:
-            key, value = env.split('=', 1)
-            envs[key] = value
-        else:
-            cli.log.warning('Invalid environment variable: %s', env)
-
-    # Determine the compile command
-    command = ''
-
     if cli.args.bootloaders:
     if cli.args.bootloaders:
         # Provide usage and list bootloaders
         # Provide usage and list bootloaders
-        cli.echo('usage: qmk flash [-h] [-b] [-n] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]')
+        cli.print_usage()
         print_bootloader_help()
         print_bootloader_help()
         return False
         return False
 
 
-    if cli.args.filename:
-        # Handle compiling a configurator JSON
-        user_keymap = parse_configurator_json(cli.args.filename)
-        keymap_path = qmk.path.keymap(user_keymap['keyboard'])
-        command = compile_configurator_json(user_keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, **envs)
-
-        cli.log.info('Wrote keymap to {fg_cyan}%s/%s/keymap.c', keymap_path, user_keymap['keymap'])
-
-    else:
-        if cli.config.flash.keyboard and cli.config.flash.keymap:
-            # Generate the make command for a specific keyboard/keymap.
-            command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, **envs)
-
-        elif not cli.config.flash.keyboard:
-            cli.log.error('Could not determine keyboard!')
-        elif not cli.config.flash.keymap:
-            cli.log.error('Could not determine keymap!')
-
-    # Compile the firmware, if we're able to
-    if command:
-        cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command))
-        if not cli.args.dry_run:
-            cli.echo('\n')
-            compile = cli.run(command, capture_output=False, stdin=DEVNULL)
-            return compile.returncode
-
-    else:
-        cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.')
-        cli.echo('usage: qmk flash [-h] [-b] [-n] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]')
-        return False
+    return do_compile(cli.config.flash.keyboard, cli.config.flash.keymap, cli.config.flash.parallel, cli.config.flash.bootloader)

+ 17 - 30
lib/python/qmk/commands.py

@@ -353,17 +353,20 @@ def in_virtualenv():
     return active_prefix != sys.prefix
     return active_prefix != sys.prefix
 
 
 
 
-def do_compile(keyboard, keymap, parallel, target=None):
+def do_compile(keyboard, keymap, parallel, target=None, filters=None, environment=None):
     """Shared code between `qmk compile` and `qmk flash`.
     """Shared code between `qmk compile` and `qmk flash`.
     """
     """
     if keyboard is None:
     if keyboard is None:
         keyboard = ''
         keyboard = ''
 
 
+    if environment is None:
+        environment = {}
+
     envs = {'REQUIRE_PLATFORM_KEY': ''}
     envs = {'REQUIRE_PLATFORM_KEY': ''}
     silent = keyboard == 'all' or keyboard.startswith('all-') or keymap == 'all'
     silent = keyboard == 'all' or keyboard.startswith('all-') or keymap == 'all'
 
 
     # Setup the environment
     # Setup the environment
-    for env in cli.args.env:
+    for env in environment:
         if '=' in env:
         if '=' in env:
             key, value = env.split('=', 1)
             key, value = env.split('=', 1)
             if key in envs:
             if key in envs:
@@ -382,18 +385,10 @@ def do_compile(keyboard, keymap, parallel, target=None):
             _, _, make_cmd = create_make_command(keyboard, keymap, 'clean', parallel, silent, **envs)
             _, _, make_cmd = create_make_command(keyboard, keymap, 'clean', parallel, silent, **envs)
             cli.run(make_cmd, capture_output=False, stdin=DEVNULL)
             cli.run(make_cmd, capture_output=False, stdin=DEVNULL)
 
 
-    # If -f has been specified without a keyboard target, assume -kb all
-    if cli.args.filter and not cli.args.keyboard:
-        cli.log.debug('--filter supplied without --keyboard, assuming --keyboard all.')
-        keyboard = 'all'
-
     # Determine the compile command(s)
     # Determine the compile command(s)
     commands = None
     commands = None
 
 
     if cli.args.filename:
     if cli.args.filename:
-        if cli.args.filter:
-            cli.log.warning('Ignoring --filter because a keymap.json was provided.')
-
         if cli.args.keyboard:
         if cli.args.keyboard:
             cli.log.warning('Ignoring --keyboard because a keymap.json was provided.')
             cli.log.warning('Ignoring --keyboard because a keymap.json was provided.')
 
 
@@ -405,10 +400,10 @@ def do_compile(keyboard, keymap, parallel, target=None):
         commands = [compile_configurator_json(user_keymap, parallel=parallel, **envs)]
         commands = [compile_configurator_json(user_keymap, parallel=parallel, **envs)]
 
 
     elif keyboard and keymap:
     elif keyboard and keymap:
-        if cli.args.filter:
+        if filters:
             cli.log.info('Generating the list of keyboards to compile, this may take some time.')
             cli.log.info('Generating the list of keyboards to compile, this may take some time.')
 
 
-        commands = [create_make_command(keyboard, keymap, target=target, parallel=parallel, silent=silent, **envs) for keyboard, keymap in keyboard_keymap_iter(keyboard, keymap)]
+        commands = [create_make_command(keyboard, keymap, target=target, parallel=parallel, silent=silent, **envs) for keyboard, keymap in keyboard_keymap_iter(keyboard, keymap, filters)]
 
 
     elif not keyboard:
     elif not keyboard:
         cli.log.error('Could not determine keyboard!')
         cli.log.error('Could not determine keyboard!')
@@ -448,7 +443,7 @@ def do_compile(keyboard, keymap, parallel, target=None):
                     keyboard, keymap, command = commands[i]
                     keyboard, keymap, command = commands[i]
                     cli.echo('\tkeyboard: {fg_cyan}%s{fg_reset} keymap: {fg_cyan}%s', keyboard, keymap)
                     cli.echo('\tkeyboard: {fg_cyan}%s{fg_reset} keymap: {fg_cyan}%s', keyboard, keymap)
 
 
-    elif cli.args.filter:
+    elif filters:
         cli.log.error('No keyboards found after applying filter(s)!')
         cli.log.error('No keyboards found after applying filter(s)!')
         return False
         return False
 
 
@@ -468,28 +463,19 @@ def _keyboard_list(keyboard):
     return [keyboard]
     return [keyboard]
 
 
 
 
-def keyboard_keymap_iter(cli_keyboard, cli_keymap):
+def keyboard_keymap_iter(cli_keyboard, cli_keymap, filters):
     """Iterates over the keyboard/keymap for this command and yields a pairing of each.
     """Iterates over the keyboard/keymap for this command and yields a pairing of each.
     """
     """
     for keyboard in _keyboard_list(cli_keyboard):
     for keyboard in _keyboard_list(cli_keyboard):
         continue_flag = False
         continue_flag = False
-        if cli.args.filter:
+
+        if filters:
             info_data = dotty(info_json(keyboard))
             info_data = dotty(info_json(keyboard))
-            for filter in cli.args.filter:
-                if '=' in filter:
-                    key, value = filter.split('=', 1)
-                    if value in true_values:
-                        value = True
-                    elif value in false_values:
-                        value = False
-                    elif value.isdigit():
-                        value = int(value)
-                    elif '.' in value and value.replace('.').isdigit():
-                        value = float(value)
-
-                    if info_data.get(key) != value:
-                        continue_flag = True
-                        break
+
+            for key, value in filters.items():
+                if info_data.get(key) != value:
+                    continue_flag = True
+                    break
 
 
             if continue_flag:
             if continue_flag:
                 continue
                 continue
@@ -497,5 +483,6 @@ def keyboard_keymap_iter(cli_keyboard, cli_keymap):
         if cli_keymap == 'all':
         if cli_keymap == 'all':
             for keymap in qmk.keymap.list_keymaps(keyboard):
             for keymap in qmk.keymap.list_keymaps(keyboard):
                 yield keyboard, keymap
                 yield keyboard, keymap
+
         else:
         else:
             yield keyboard, cli_keymap
             yield keyboard, cli_keymap