summaryrefslogtreecommitdiff
path: root/lib/python/qmk/commands.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/commands.py')
-rw-r--r--lib/python/qmk/commands.py93
1 files changed, 81 insertions, 12 deletions
diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py
index 4ec7d2ea53..ba225bf558 100644
--- a/lib/python/qmk/commands.py
+++ b/lib/python/qmk/commands.py
@@ -6,11 +6,26 @@ import platform
import subprocess
import shlex
import shutil
+from pathlib import Path
+
+from milc import cli
import qmk.keymap
+from qmk.constants import KEYBOARD_OUTPUT_PREFIX
+
+
+def _find_make():
+ """Returns the correct make command for this environment.
+ """
+ make_cmd = os.environ.get('MAKE')
+
+ if not make_cmd:
+ make_cmd = 'gmake' if shutil.which('gmake') else 'make'
+ return make_cmd
-def create_make_command(keyboard, keymap, target=None):
+
+def create_make_command(keyboard, keymap, target=None, parallel=1, **env_vars):
"""Create a make compile command
Args:
@@ -24,41 +39,95 @@ def create_make_command(keyboard, keymap, target=None):
target
Usually a bootloader.
+ parallel
+ The number of make jobs to run in parallel
+
+ **env_vars
+ Environment variables to be passed to make.
+
Returns:
A command that can be run to make the specified keyboard and keymap
"""
+ env = []
make_args = [keyboard, keymap]
- make_cmd = 'gmake' if shutil.which('gmake') else 'make'
+ make_cmd = _find_make()
if target:
make_args.append(target)
- return [make_cmd, ':'.join(make_args)]
+ for key, value in env_vars.items():
+ env.append(f'{key}={value}')
+ return [make_cmd, '-j', str(parallel), *env, ':'.join(make_args)]
-def compile_configurator_json(user_keymap, bootloader=None):
- """Convert a configurator export JSON file into a C file
+
+def compile_configurator_json(user_keymap, parallel=1, **env_vars):
+ """Convert a configurator export JSON file into a C file and then compile it.
Args:
- configurator_filename
- The configurator JSON export file
+ user_keymap
+ A deserialized keymap export
bootloader
A bootloader to flash
+ parallel
+ The number of make jobs to run in parallel
+
Returns:
A command to run to compile and flash the C file.
"""
- # Write the keymap C file
- qmk.keymap.write(user_keymap['keyboard'], user_keymap['keymap'], user_keymap['layout'], user_keymap['layers'])
+ # Write the keymap.c file
+ keyboard_filesafe = user_keymap['keyboard'].replace('/', '_')
+ target = f'{keyboard_filesafe}_{user_keymap["keymap"]}'
+ keyboard_output = Path(f'{KEYBOARD_OUTPUT_PREFIX}{keyboard_filesafe}')
+ keymap_output = Path(f'{keyboard_output}_{user_keymap["keymap"]}')
+ c_text = qmk.keymap.generate_c(user_keymap['keyboard'], user_keymap['layout'], user_keymap['layers'])
+ keymap_dir = keymap_output / 'src'
+ keymap_c = keymap_dir / 'keymap.c'
+
+ keymap_dir.mkdir(exist_ok=True, parents=True)
+ keymap_c.write_text(c_text)
# Return a command that can be run to make the keymap and flash if given
- if bootloader is None:
- return create_make_command(user_keymap['keyboard'], user_keymap['keymap'])
- return create_make_command(user_keymap['keyboard'], user_keymap['keymap'], bootloader)
+ verbose = 'true' if cli.config.general.verbose else 'false'
+ color = 'true' if cli.config.general.color else 'false'
+ make_command = [
+ _find_make(),
+ '-j',
+ str(parallel),
+ '-r',
+ '-R',
+ '-f',
+ 'build_keyboard.mk',
+ ]
+
+ for key, value in env_vars.items():
+ make_command.append(f'{key}={value}')
+
+ make_command.extend([
+ f'KEYBOARD={user_keymap["keyboard"]}',
+ f'KEYMAP={user_keymap["keymap"]}',
+ f'KEYBOARD_FILESAFE={keyboard_filesafe}',
+ f'TARGET={target}',
+ f'KEYBOARD_OUTPUT={keyboard_output}',
+ f'KEYMAP_OUTPUT={keymap_output}',
+ f'MAIN_KEYMAP_PATH_1={keymap_output}',
+ f'MAIN_KEYMAP_PATH_2={keymap_output}',
+ f'MAIN_KEYMAP_PATH_3={keymap_output}',
+ f'MAIN_KEYMAP_PATH_4={keymap_output}',
+ f'MAIN_KEYMAP_PATH_5={keymap_output}',
+ f'KEYMAP_C={keymap_c}',
+ f'KEYMAP_PATH={keymap_dir}',
+ f'VERBOSE={verbose}',
+ f'COLOR={color}',
+ 'SILENT=false',
+ ])
+
+ return make_command
def parse_configurator_json(configurator_file):