|
@@ -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):
|