From d9785ec31339d7f80279fd3d1005f76689ed2f6a Mon Sep 17 00:00:00 2001 From: Zach White Date: Sat, 16 Jan 2021 15:13:04 -0800 Subject: Improve the compile and flash subcommands (#11334) * add support for --clean to compile and flash * compile standalone JSON keymaps without polluting the tree * Add support for passing environment vars to make * make flake8 happy * document changes to qmk compile and flash * add -e support to json export compiling * Fix python 3.6 * honor $MAKE * add support for parallel builds --- lib/python/qmk/cli/compile.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'lib/python/qmk/cli/compile.py') diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index daee597d8e..322ce6a257 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -2,7 +2,6 @@ You can compile a keymap already in the repo or using a QMK Configurator export. """ -import subprocess from argparse import FileType from milc import cli @@ -15,6 +14,9 @@ from qmk.commands import compile_configurator_json, create_make_command, parse_c @cli.argument('-kb', '--keyboard', help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-km', '--keymap', 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 to run.") +@cli.argument('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.") +@cli.argument('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.") @cli.subcommand('Compile a QMK Firmware.') @automagic_keyboard @automagic_keymap @@ -25,18 +27,32 @@ def compile(cli): If a keyboard and keymap are provided this command will build a firmware based on that. """ + if cli.args.clean and not cli.args.filename and not cli.args.dry_run: + command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, 'clean') + # FIXME(skullydazed/anyone): Remove text=False once milc 1.0.11 has had enough time to be installed everywhere. + cli.run(command, capture_output=False, text=False) + + # 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 = None if cli.args.filename: # If a configurator JSON was provided generate a keymap and compile it - # FIXME(skullydazed): add code to check and warn if the keymap already exists when compiling a json keymap. user_keymap = parse_configurator_json(cli.args.filename) - command = compile_configurator_json(user_keymap) + command = compile_configurator_json(user_keymap, parallel=cli.config.compile.parallel, **envs) else: if cli.config.compile.keyboard and cli.config.compile.keymap: # Generate the make command for a specific keyboard/keymap. - command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap) + command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, parallel=cli.config.compile.parallel, **envs) elif not cli.config.compile.keyboard: cli.log.error('Could not determine keyboard!') @@ -48,7 +64,8 @@ def compile(cli): cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) if not cli.args.dry_run: cli.echo('\n') - compile = subprocess.run(command) + # FIXME(skullydazed/anyone): Remove text=False once milc 1.0.11 has had enough time to be installed everywhere. + compile = cli.run(command, capture_output=False, text=False) return compile.returncode else: -- cgit v1.2.3