Browse Source

fix after rebase

qmk_compile_improvements
Zach White 2 years ago
parent
commit
81b17125eb
5 changed files with 37 additions and 31 deletions
  1. +0
    -3
      lib/python/qmk/cli/compile.py
  2. +1
    -3
      lib/python/qmk/cli/flash.py
  3. +1
    -1
      lib/python/qmk/commands.py
  4. +33
    -24
      lib/python/qmk/info.py
  5. +2
    -0
      lib/python/qmk/json_schema.py

+ 0
- 3
lib/python/qmk/cli/compile.py View File

@ -2,10 +2,7 @@
You can compile a keymap already in the repo or using a QMK Configurator export. You can compile a keymap already in the repo or using a QMK Configurator export.
""" """
from subprocess import DEVNULL
from argcomplete.completers import FilesCompleter from argcomplete.completers import FilesCompleter
from dotty_dict import dotty
from milc import cli from milc import cli
import qmk.path import qmk.path


+ 1
- 3
lib/python/qmk/cli/flash.py View File

@ -3,8 +3,6 @@
You can compile a keymap already in the repo or using a QMK Configurator export. You can compile a keymap already in the repo or using a QMK Configurator export.
A bootloader must be specified. A bootloader must be specified.
""" """
from subprocess import DEVNULL
from argcomplete.completers import FilesCompleter from argcomplete.completers import FilesCompleter
from milc import cli from milc import cli
@ -60,4 +58,4 @@ def flash(cli):
print_bootloader_help() print_bootloader_help()
return False return False
return do_compile(cli.config.flash.keyboard, cli.config.flash.keymap, cli.config.flash.parallel, cli.config.flash.bootloader)
return do_compile(cli.config.flash.keyboard, cli.config.flash.keymap, cli.config.flash.parallel, cli.config.flash.bootloader)

+ 1
- 1
lib/python/qmk/commands.py View File

@ -437,7 +437,7 @@ def do_compile(keyboard, keymap, parallel, target=None, filters=None, environmen
for i, returncode in enumerate(returncodes): for i, returncode in enumerate(returncodes):
if returncode != 0: if returncode != 0:
keyboard, keymap, command = commands[i]
keyboard, keymap, command = returncodes[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 command: elif command:


+ 33
- 24
lib/python/qmk/info.py View File

@ -1,15 +1,20 @@
"""Functions that help us generate and use info.json files. """Functions that help us generate and use info.json files.
""" """
from functools import lru_cache from functools import lru_cache
from glob import glob
from pathlib import Path from pathlib import Path
import jsonschema import jsonschema
from dotty_dict import dotty
from milc import cli from milc import cli
from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS
from qmk.json_schema import validate
from qmk.c_parse import find_layouts
from qmk.json_schema import deep_update, json_load, validate
from qmk.keyboard import config_h, rules_mk
from qmk.keymap import list_keymaps from qmk.keymap import list_keymaps
from qmk.metadata import basic_info_json, info_log_error
from qmk.math import compute
from qmk.metadata import basic_info_json, info_log_error, info_log_warning, true_values, false_values
@lru_cache(maxsize=None) @lru_cache(maxsize=None)
@ -111,7 +116,7 @@ def _extract_features(info_data, rules):
info_data['features'] = {} info_data['features'] = {}
if key in info_data['features']: if key in info_data['features']:
_log_warning(info_data, 'Feature %s is specified in both info.json and rules.mk, the rules.mk value wins.' % (key,))
info_log_warning(info_data, 'Feature %s is specified in both info.json and rules.mk, the rules.mk value wins.' % (key,))
info_data['features'][key] = value info_data['features'][key] = value
info_data['config_h_features'][key] = value info_data['config_h_features'][key] = value
@ -190,7 +195,7 @@ def _extract_split_main(info_data, config_c):
info_data['split'] = {} info_data['split'] = {}
if 'main' in info_data['split']: if 'main' in info_data['split']:
_log_warning(info_data, 'Split main hand is specified in both config.h (SPLIT_HAND_PIN) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_log_warning(info_data, 'Split main hand is specified in both config.h (SPLIT_HAND_PIN) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_data['split']['main'] = 'pin' info_data['split']['main'] = 'pin'
@ -199,7 +204,7 @@ def _extract_split_main(info_data, config_c):
info_data['split'] = {} info_data['split'] = {}
if 'main' in info_data['split']: if 'main' in info_data['split']:
_log_warning(info_data, 'Split main hand is specified in both config.h (SPLIT_HAND_MATRIX_GRID) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_log_warning(info_data, 'Split main hand is specified in both config.h (SPLIT_HAND_MATRIX_GRID) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_data['split']['main'] = 'matrix_grid' info_data['split']['main'] = 'matrix_grid'
info_data['split']['matrix_grid'] = _extract_pins(config_c['SPLIT_HAND_MATRIX_GRID']) info_data['split']['matrix_grid'] = _extract_pins(config_c['SPLIT_HAND_MATRIX_GRID'])
@ -209,7 +214,7 @@ def _extract_split_main(info_data, config_c):
info_data['split'] = {} info_data['split'] = {}
if 'main' in info_data['split']: if 'main' in info_data['split']:
_log_warning(info_data, 'Split main hand is specified in both config.h (EE_HANDS) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_log_warning(info_data, 'Split main hand is specified in both config.h (EE_HANDS) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_data['split']['main'] = 'eeprom' info_data['split']['main'] = 'eeprom'
@ -218,7 +223,7 @@ def _extract_split_main(info_data, config_c):
info_data['split'] = {} info_data['split'] = {}
if 'main' in info_data['split']: if 'main' in info_data['split']:
_log_warning(info_data, 'Split main hand is specified in both config.h (MASTER_RIGHT) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_log_warning(info_data, 'Split main hand is specified in both config.h (MASTER_RIGHT) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_data['split']['main'] = 'right' info_data['split']['main'] = 'right'
@ -227,7 +232,7 @@ def _extract_split_main(info_data, config_c):
info_data['split'] = {} info_data['split'] = {}
if 'main' in info_data['split']: if 'main' in info_data['split']:
_log_warning(info_data, 'Split main hand is specified in both config.h (MASTER_LEFT) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_log_warning(info_data, 'Split main hand is specified in both config.h (MASTER_LEFT) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
info_data['split']['main'] = 'left' info_data['split']['main'] = 'left'
@ -242,7 +247,7 @@ def _extract_split_transport(info_data, config_c):
info_data['split']['transport'] = {} info_data['split']['transport'] = {}
if 'protocol' in info_data['split']['transport']: if 'protocol' in info_data['split']['transport']:
_log_warning(info_data, 'Split transport is specified in both config.h (USE_I2C) and info.json (split.transport.protocol) (Value: %s), the config.h value wins.' % info_data['split']['transport'])
info_log_warning(info_data, 'Split transport is specified in both config.h (USE_I2C) and info.json (split.transport.protocol) (Value: %s), the config.h value wins.' % info_data['split']['transport'])
info_data['split']['transport']['protocol'] = 'i2c' info_data['split']['transport']['protocol'] = 'i2c'
@ -266,7 +271,7 @@ def _extract_split_right_pins(info_data, config_c):
if row_pins and col_pins: if row_pins and col_pins:
if info_data.get('split', {}).get('matrix_pins', {}).get('right') in info_data: if info_data.get('split', {}).get('matrix_pins', {}).get('right') in info_data:
_log_warning(info_data, 'Right hand matrix data is specified in both info.json and config.h, the config.h values win.')
info_log_warning(info_data, 'Right hand matrix data is specified in both info.json and config.h, the config.h values win.')
if 'split' not in info_data: if 'split' not in info_data:
info_data['split'] = {} info_data['split'] = {}
@ -284,7 +289,7 @@ def _extract_split_right_pins(info_data, config_c):
if direct_pins: if direct_pins:
if info_data.get('split', {}).get('matrix_pins', {}).get('right', {}): if info_data.get('split', {}).get('matrix_pins', {}).get('right', {}):
_log_warning(info_data, 'Right hand matrix data is specified in both info.json and config.h, the config.h values win.')
info_log_warning(info_data, 'Right hand matrix data is specified in both info.json and config.h, the config.h values win.')
if 'split' not in info_data: if 'split' not in info_data:
info_data['split'] = {} info_data['split'] = {}
@ -322,7 +327,7 @@ def _extract_matrix_info(info_data, config_c):
if 'MATRIX_ROWS' in config_c and 'MATRIX_COLS' in config_c: if 'MATRIX_ROWS' in config_c and 'MATRIX_COLS' in config_c:
if 'matrix_size' in info_data: if 'matrix_size' in info_data:
_log_warning(info_data, 'Matrix size is specified in both info.json and config.h, the config.h values win.')
info_log_warning(info_data, 'Matrix size is specified in both info.json and config.h, the config.h values win.')
info_data['matrix_size'] = { info_data['matrix_size'] = {
'cols': compute(config_c.get('MATRIX_COLS', '0')), 'cols': compute(config_c.get('MATRIX_COLS', '0')),
@ -331,14 +336,14 @@ def _extract_matrix_info(info_data, config_c):
if row_pins and col_pins: if row_pins and col_pins:
if 'matrix_pins' in info_data and 'cols' in info_data['matrix_pins'] and 'rows' in info_data['matrix_pins']: if 'matrix_pins' in info_data and 'cols' in info_data['matrix_pins'] and 'rows' in info_data['matrix_pins']:
_log_warning(info_data, 'Matrix pins are specified in both info.json and config.h, the config.h values win.')
info_log_warning(info_data, 'Matrix pins are specified in both info.json and config.h, the config.h values win.')
info_snippet['cols'] = _extract_pins(col_pins) info_snippet['cols'] = _extract_pins(col_pins)
info_snippet['rows'] = _extract_pins(row_pins) info_snippet['rows'] = _extract_pins(row_pins)
if direct_pins: if direct_pins:
if 'matrix_pins' in info_data and 'direct' in info_data['matrix_pins']: if 'matrix_pins' in info_data and 'direct' in info_data['matrix_pins']:
_log_warning(info_data, 'Direct pins are specified in both info.json and config.h, the config.h values win.')
info_log_warning(info_data, 'Direct pins are specified in both info.json and config.h, the config.h values win.')
info_snippet['direct'] = _extract_direct_matrix(direct_pins) info_snippet['direct'] = _extract_direct_matrix(direct_pins)
@ -350,7 +355,7 @@ def _extract_matrix_info(info_data, config_c):
if config_c.get('CUSTOM_MATRIX', 'no') != 'no': if config_c.get('CUSTOM_MATRIX', 'no') != 'no':
if 'matrix_pins' in info_data and 'custom' in info_data['matrix_pins']: if 'matrix_pins' in info_data and 'custom' in info_data['matrix_pins']:
_log_warning(info_data, 'Custom Matrix is specified in both info.json and config.h, the config.h values win.')
info_log_warning(info_data, 'Custom Matrix is specified in both info.json and config.h, the config.h values win.')
info_snippet['custom'] = True info_snippet['custom'] = True
@ -379,7 +384,7 @@ def _extract_config_h(info_data):
try: try:
if config_key in config_c and info_dict.get('to_json', True): if config_key in config_c and info_dict.get('to_json', True):
if dotty_info.get(info_key) and info_dict.get('warn_duplicate', True): if dotty_info.get(info_key) and info_dict.get('warn_duplicate', True):
_log_warning(info_data, '%s in config.h is overwriting %s in info.json' % (config_key, info_key))
info_log_warning(info_data, '%s in config.h is overwriting %s in info.json' % (config_key, info_key))
if key_type.startswith('array'): if key_type.startswith('array'):
if '.' in key_type: if '.' in key_type:
@ -410,7 +415,7 @@ def _extract_config_h(info_data):
dotty_info[info_key] = config_c[config_key] dotty_info[info_key] = config_c[config_key]
except Exception as e: except Exception as e:
_log_warning(info_data, f'{config_key}->{info_key}: {e}')
info_log_warning(info_data, f'{config_key}->{info_key}: {e}')
info_data.update(dotty_info) info_data.update(dotty_info)
@ -451,7 +456,7 @@ def _extract_rules_mk(info_data):
try: try:
if rules_key in rules and info_dict.get('to_json', True): if rules_key in rules and info_dict.get('to_json', True):
if dotty_info.get(info_key) and info_dict.get('warn_duplicate', True): if dotty_info.get(info_key) and info_dict.get('warn_duplicate', True):
_log_warning(info_data, '%s in rules.mk is overwriting %s in info.json' % (rules_key, info_key))
info_log_warning(info_data, '%s in rules.mk is overwriting %s in info.json' % (rules_key, info_key))
if key_type.startswith('array'): if key_type.startswith('array'):
if '.' in key_type: if '.' in key_type:
@ -482,7 +487,7 @@ def _extract_rules_mk(info_data):
dotty_info[info_key] = rules[rules_key] dotty_info[info_key] = rules[rules_key]
except Exception as e: except Exception as e:
_log_warning(info_data, f'{rules_key}->{info_key}: {e}')
info_log_warning(info_data, f'{rules_key}->{info_key}: {e}')
info_data.update(dotty_info) info_data.update(dotty_info)
@ -558,7 +563,7 @@ def _find_missing_layouts(info_data, keyboard):
If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above. If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above.
""" """
_log_warning(info_data, '%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
info_log_warning(info_data, '%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
for file in glob('keyboards/%s/*.h' % keyboard): for file in glob('keyboards/%s/*.h' % keyboard):
these_layouts, these_aliases = find_layouts(file) these_layouts, these_aliases = find_layouts(file)
@ -653,7 +658,7 @@ def merge_info_jsons(keyboard, info_data):
for layout_name, layout in new_info_data.get('layouts', {}).items(): for layout_name, layout in new_info_data.get('layouts', {}).items():
if layout_name in info_data.get('layout_aliases', {}): if layout_name in info_data.get('layout_aliases', {}):
_log_warning(info_data, f"info.json uses alias name {layout_name} instead of {info_data['layout_aliases'][layout_name]}")
info_log_warning(info_data, f"info.json uses alias name {layout_name} instead of {info_data['layout_aliases'][layout_name]}")
layout_name = info_data['layout_aliases'][layout_name] layout_name = info_data['layout_aliases'][layout_name]
if layout_name in info_data['layouts']: if layout_name in info_data['layouts']:
@ -687,14 +692,18 @@ def find_info_json(keyboard):
# Add DEFAULT_FOLDER before parents, if present # Add DEFAULT_FOLDER before parents, if present
rules = rules_mk(keyboard) rules = rules_mk(keyboard)
if 'DEFAULT_FOLDER' in rules: if 'DEFAULT_FOLDER' in rules:
info_jsons.append(Path(rules['DEFAULT_FOLDER']) / 'info.json') info_jsons.append(Path(rules['DEFAULT_FOLDER']) / 'info.json')
# Add in parent folders for least specific # Add in parent folders for least specific
for _ in range(5): for _ in range(5):
info_jsons.append(keyboard_parent / 'info.json')
this_info_json = keyboard_parent / 'info.json'
if this_info_json.exists():
yield this_info_json
if keyboard_parent.parent == base_path: if keyboard_parent.parent == base_path:
break break
keyboard_parent = keyboard_parent.parent
return info_data
keyboard_parent = keyboard_parent.parent

+ 2
- 0
lib/python/qmk/json_schema.py View File

@ -24,6 +24,8 @@ def json_load(json_file):
exit(1) exit(1)
except Exception as e: except Exception as e:
cli.log.error('Unknown error attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e) cli.log.error('Unknown error attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e)
if cli.args.verbose:
cli.log.exception(e)
exit(1) exit(1)


Loading…
Cancel
Save