diff options
| author | skullydazed <skullydazed@users.noreply.github.com> | 2019-07-15 12:14:27 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-15 12:14:27 -0700 |
| commit | a25dd58bc56b0c4010673723ac44eaff914979bb (patch) | |
| tree | e4c08289df1b72db4ef8447ab7fdc13f604cffac /bin | |
| parent | 7ba82cb5b751d69dda6cc77ec8877c89defad3e4 (diff) | |
| download | qmk_firmware-a25dd58bc56b0c4010673723ac44eaff914979bb.tar.gz qmk_firmware-a25dd58bc56b0c4010673723ac44eaff914979bb.zip | |
QMK CLI and JSON keymap support (#6176)
* Script to generate keymap.c from JSON file.
* Support for keymap.json
* Add a warning about the keymap.c getting overwritten.
* Fix keymap generating
* Install the python deps
* Flesh out more of the python environment
* Remove defunct json2keymap
* Style everything with yapf
* Polish up python support
* Hide json keymap.c into the .build dir
* Polish up qmk-compile-json
* Make milc work with positional arguments
* Fix a couple small things
* Fix some errors and make the CLI more understandable
* Make the qmk wrapper more robust
* Add basic QMK Doctor
* Clean up docstrings and flesh them out as needed
* remove unused compile_firmware() function
Diffstat (limited to 'bin')
| -rwxr-xr-x | bin/qmk | 97 | ||||
| l--------- | bin/qmk-compile-json | 1 | ||||
| l--------- | bin/qmk-doctor | 1 | ||||
| l--------- | bin/qmk-hello | 1 | ||||
| l--------- | bin/qmk-json-keymap | 1 |
5 files changed, 101 insertions, 0 deletions
diff --git a/bin/qmk b/bin/qmk new file mode 100755 index 000000000..c34365bed --- /dev/null +++ b/bin/qmk | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | #!/usr/bin/env python3 | ||
| 2 | """CLI wrapper for running QMK commands. | ||
| 3 | """ | ||
| 4 | import os | ||
| 5 | import subprocess | ||
| 6 | import sys | ||
| 7 | from glob import glob | ||
| 8 | from time import strftime | ||
| 9 | from importlib import import_module | ||
| 10 | from importlib.util import find_spec | ||
| 11 | |||
| 12 | # Add the QMK python libs to our path | ||
| 13 | script_dir = os.path.dirname(os.path.realpath(__file__)) | ||
| 14 | qmk_dir = os.path.abspath(os.path.join(script_dir, '..')) | ||
| 15 | python_lib_dir = os.path.abspath(os.path.join(qmk_dir, 'lib', 'python')) | ||
| 16 | sys.path.append(python_lib_dir) | ||
| 17 | |||
| 18 | # Change to the root of our checkout | ||
| 19 | os.environ['ORIG_CWD'] = os.getcwd() | ||
| 20 | os.chdir(qmk_dir) | ||
| 21 | |||
| 22 | # Make sure our modules have been setup | ||
| 23 | with open('requirements.txt', 'r') as fd: | ||
| 24 | for line in fd.readlines(): | ||
| 25 | line = line.strip().replace('<', '=').replace('>', '=') | ||
| 26 | |||
| 27 | if line[0] == '#': | ||
| 28 | continue | ||
| 29 | |||
| 30 | if '#' in line: | ||
| 31 | line = line.split('#')[0] | ||
| 32 | |||
| 33 | module = line.split('=')[0] if '=' in line else line | ||
| 34 | if not find_spec(module): | ||
| 35 | print('Your QMK build environment is not fully setup!\n') | ||
| 36 | print('Please run `./util/qmk_install.sh` to setup QMK.') | ||
| 37 | exit(255) | ||
| 38 | |||
| 39 | # Figure out our version | ||
| 40 | command = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags'] | ||
| 41 | result = subprocess.run(command, text=True, capture_output=True) | ||
| 42 | |||
| 43 | if result.returncode == 0: | ||
| 44 | os.environ['QMK_VERSION'] = 'QMK ' + result.stdout.strip() | ||
| 45 | else: | ||
| 46 | os.environ['QMK_VERSION'] = 'QMK ' + strftime('%Y-%m-%d-%H:%M:%S') | ||
| 47 | |||
| 48 | # Setup the CLI | ||
| 49 | import milc | ||
| 50 | milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}ψ{style_reset_all}' | ||
| 51 | |||
| 52 | # If we were invoked as `qmk <cmd>` massage sys.argv into `qmk-<cmd>`. | ||
| 53 | # This means we can't accept arguments to the qmk script itself. | ||
| 54 | script_name = os.path.basename(sys.argv[0]) | ||
| 55 | if script_name == 'qmk': | ||
| 56 | if len(sys.argv) == 1: | ||
| 57 | milc.cli.log.error('No subcommand specified!\n') | ||
| 58 | |||
| 59 | if len(sys.argv) == 1 or sys.argv[1] in ['-h', '--help']: | ||
| 60 | milc.cli.echo('usage: qmk <subcommand> [...]') | ||
| 61 | milc.cli.echo('\nsubcommands:') | ||
| 62 | subcommands = glob(os.path.join(qmk_dir, 'bin', 'qmk-*')) | ||
| 63 | for subcommand in sorted(subcommands): | ||
| 64 | subcommand = os.path.basename(subcommand).split('-', 1)[1] | ||
| 65 | milc.cli.echo('\t%s', subcommand) | ||
| 66 | milc.cli.echo('\nqmk <subcommand> --help for more information') | ||
| 67 | exit(1) | ||
| 68 | |||
| 69 | if sys.argv[1] in ['-V', '--version']: | ||
| 70 | milc.cli.echo(os.environ['QMK_VERSION']) | ||
| 71 | exit(0) | ||
| 72 | |||
| 73 | sys.argv[0] = script_name = '-'.join((script_name, sys.argv[1])) | ||
| 74 | del sys.argv[1] | ||
| 75 | |||
| 76 | # Look for which module to import | ||
| 77 | if script_name == 'qmk': | ||
| 78 | milc.cli.print_help() | ||
| 79 | exit(0) | ||
| 80 | elif not script_name.startswith('qmk-'): | ||
| 81 | milc.cli.log.error('Invalid symlink, must start with "qmk-": %s', script_name) | ||
| 82 | else: | ||
| 83 | subcommand = script_name.replace('-', '.').replace('_', '.').split('.') | ||
| 84 | subcommand.insert(1, 'cli') | ||
| 85 | subcommand = '.'.join(subcommand) | ||
| 86 | |||
| 87 | try: | ||
| 88 | import_module(subcommand) | ||
| 89 | except ModuleNotFoundError as e: | ||
| 90 | if e.__class__.__name__ != subcommand: | ||
| 91 | raise | ||
| 92 | |||
| 93 | milc.cli.log.error('Invalid subcommand! Could not import %s.', subcommand) | ||
| 94 | exit(1) | ||
| 95 | |||
| 96 | if __name__ == '__main__': | ||
| 97 | milc.cli() | ||
diff --git a/bin/qmk-compile-json b/bin/qmk-compile-json new file mode 120000 index 000000000..c92dce8a1 --- /dev/null +++ b/bin/qmk-compile-json | |||
| @@ -0,0 +1 @@ | |||
| qmk \ No newline at end of file | |||
diff --git a/bin/qmk-doctor b/bin/qmk-doctor new file mode 120000 index 000000000..c92dce8a1 --- /dev/null +++ b/bin/qmk-doctor | |||
| @@ -0,0 +1 @@ | |||
| qmk \ No newline at end of file | |||
diff --git a/bin/qmk-hello b/bin/qmk-hello new file mode 120000 index 000000000..c92dce8a1 --- /dev/null +++ b/bin/qmk-hello | |||
| @@ -0,0 +1 @@ | |||
| qmk \ No newline at end of file | |||
diff --git a/bin/qmk-json-keymap b/bin/qmk-json-keymap new file mode 120000 index 000000000..c92dce8a1 --- /dev/null +++ b/bin/qmk-json-keymap | |||
| @@ -0,0 +1 @@ | |||
| qmk \ No newline at end of file | |||
