Skip to content

Commit

Permalink
Simplification pass.
Browse files Browse the repository at this point in the history
  • Loading branch information
tzarc committed Apr 23, 2024
1 parent 05b1852 commit d51f58b
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 44 deletions.
16 changes: 3 additions & 13 deletions lib/python/qmk/build_targets.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@


class BuildTarget:
def __init__(self, keyboard: str, keymap: str, json: Union[dict, Dotty] = None, orig_keyboard: str = None, orig_keymap: str = None):
def __init__(self, keyboard: str, keymap: str, json: Union[dict, Dotty] = None):
self._keyboard = keyboard_folder(keyboard)
self._keyboard_safe = self._keyboard.replace('/', '_')
self._keymap = keymap
Expand All @@ -27,8 +27,6 @@ def __init__(self, keyboard: str, keymap: str, json: Union[dict, Dotty] = None,
self._compiledb = False
self._extra_args = {}
self._json = json.to_dict() if isinstance(json, Dotty) else json
self._orig_keyboard = orig_keyboard if orig_keyboard is not None else keyboard
self._orig_keymap = orig_keymap if orig_keymap is not None else keymap

def __str__(self):
return f'{self.keyboard}:{self.keymap}'
Expand Down Expand Up @@ -65,14 +63,6 @@ def keyboard(self) -> str:
def keymap(self) -> str:
return self._keymap

@property
def orig_keyboard(self) -> str:
return self._orig_keyboard

@property
def orig_keymap(self) -> str:
return self._orig_keymap

@property
def json(self) -> dict:
if not self._json:
Expand Down Expand Up @@ -189,8 +179,8 @@ def compile(self, build_target: str = None, dry_run: bool = False, **env_vars) -


class KeyboardKeymapBuildTarget(BuildTarget):
def __init__(self, keyboard: str, keymap: str, json: dict = None, orig_keyboard: str = None, orig_keymap: str = None):
super().__init__(keyboard=keyboard, keymap=keymap, json=json, orig_keyboard=orig_keyboard, orig_keymap=orig_keymap)
def __init__(self, keyboard: str, keymap: str, json: dict = None):
super().__init__(keyboard=keyboard, keymap=keymap, json=json)

def __repr__(self):
if len(self._extra_args.items()) > 0:
Expand Down
16 changes: 10 additions & 6 deletions lib/python/qmk/cli/userspace/compile.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Copyright 2023-2024 Nick Brassel (@tzarc)
# SPDX-License-Identifier: GPL-2.0-or-later
from pathlib import Path
from functools import partial
from milc import cli

from qmk.constants import QMK_USERSPACE, HAS_QMK_USERSPACE
Expand All @@ -11,6 +12,10 @@
from qmk.cli.mass_compile import mass_compile_targets


def _extra_arg_setter(target, extra_args):
target.extra_args = extra_args


@cli.argument('-t', '--no-temp', arg_only=True, action='store_true', help="Remove temporary files during build.")
@cli.argument('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.")
@cli.argument('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.")
Expand All @@ -25,15 +30,14 @@ def userspace_compile(cli):
userspace = UserspaceDefs(QMK_USERSPACE / 'qmk.json')

build_targets = []
keyboard_keymap_targets = []
for e in userspace.build_targets:
if isinstance(e, Path):
build_targets.append(JsonKeymapBuildTarget(e))
elif isinstance(e, dict):
this_build_targets = search_keymap_targets([(e['keyboard'], e['keymap'])])
if len(this_build_targets) > 0:
if 'env' in e:
for t in this_build_targets:
t.extra_args = e['env']
build_targets.extend(this_build_targets)
f = partial(_extra_arg_setter, extra_args=e['env']) if 'env' in e else None
keyboard_keymap_targets.append((e['keyboard'], e['keymap'], f))
if len(keyboard_keymap_targets) > 0:
build_targets.extend(search_keymap_targets(keyboard_keymap_targets))

mass_compile_targets(list(set(build_targets)), cli.args.clean, cli.args.dry_run, cli.config.userspace_compile.no_temp, cli.config.userspace_compile.parallel, **build_environment(cli.args.env))
16 changes: 10 additions & 6 deletions lib/python/qmk/cli/userspace/list.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Copyright 2023-2024 Nick Brassel (@tzarc)
# SPDX-License-Identifier: GPL-2.0-or-later
from functools import partial
from pathlib import Path
from dotty_dict import Dotty
from milc import cli
Expand All @@ -12,6 +13,10 @@
from qmk.search import search_keymap_targets


def _extra_arg_setter(target, extra_args):
target.extra_args = extra_args


@cli.argument('-e', '--expand', arg_only=True, action='store_true', help="Expands any use of `all` for either keyboard or keymap.")
@cli.subcommand('Lists the build targets specified in userspace `qmk.json`.')
def userspace_list(cli):
Expand All @@ -23,16 +28,15 @@ def userspace_list(cli):

if cli.args.expand:
build_targets = []
keyboard_keymap_targets = []
for e in userspace.build_targets:
if isinstance(e, Path):
build_targets.append(e)
elif isinstance(e, dict) or isinstance(e, Dotty):
this_build_targets = search_keymap_targets([(e['keyboard'], e['keymap'])])
if len(this_build_targets) > 0:
if 'env' in e:
for t in this_build_targets:
t.extra_args = e.get('env')
build_targets.extend(this_build_targets)
f = partial(_extra_arg_setter, extra_args=e['env']) if 'env' in e else None
keyboard_keymap_targets.append((e['keyboard'], e['keymap'], f))
if len(keyboard_keymap_targets) > 0:
build_targets.extend(search_keymap_targets(keyboard_keymap_targets))
else:
build_targets = userspace.build_targets

Expand Down
49 changes: 30 additions & 19 deletions lib/python/qmk/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import fnmatch
import logging
import re
from typing import Callable, List, Optional, Tuple
from typing import Callable, List, Optional, Tuple, Union
from dotty_dict import dotty, Dotty
from milc import cli

Expand All @@ -18,24 +18,23 @@

@functools.total_ordering
class KeyboardKeymapDesc:
def __init__(self, keyboard: str, keymap: str, data: dict = None, orig_keyboard: str = None, orig_keymap: str = None):
def __init__(self, keyboard: str, keymap: str, data: dict = None, construction_callback: Callable[[BuildTarget], None] = None):
self.keyboard = keyboard
self.keymap = keymap
self.data = data.to_dict() if isinstance(data, Dotty) else data
self.orig_keyboard = orig_keyboard if orig_keyboard is not None else keyboard
self.orig_keymap = orig_keymap if orig_keymap is not None else keymap
self.construction_callback = construction_callback

def __repr__(self):
return f'{self.keyboard}:{self.keymap}'

def __eq__(self, other):
return (self.keyboard, self.keymap, self.orig_keyboard, self.orig_keymap) == (other.keyboard, other.keymap, other.orig_keyboard, other.orig_keymap)
return (self.keyboard, self.keymap) == (other.keyboard, other.keymap)

def __lt__(self, other):
return (self.keyboard, self.keymap, self.orig_keyboard, self.orig_keymap) < (other.keyboard, other.keymap, other.orig_keyboard, other.orig_keymap)
return (self.keyboard, self.keymap) < (other.keyboard, other.keymap)

def __hash__(self):
return hash((self.keyboard, self.keymap, self.orig_keyboard, self.orig_keymap))
return hash((self.keyboard, self.keymap))

def load_data(self):
data = keymap_json(self.keyboard, self.keymap)
Expand All @@ -50,7 +49,10 @@ def json(self):
return self.data

def to_build_target(self):
return KeyboardKeymapBuildTarget(keyboard=self.keyboard, keymap=self.keymap, json=self.json, orig_keyboard=self.orig_keyboard, orig_keymap=self.orig_keymap)
target = KeyboardKeymapBuildTarget(keyboard=self.keyboard, keymap=self.keymap, json=self.json)
if self.construction_callback is not None:
self.construction_callback(target)
return target


# by using a class for filters, we dont need to worry about capturing values
Expand Down Expand Up @@ -163,18 +165,23 @@ def _load_keymap_info(target: KeyboardKeymapDesc) -> KeyboardKeymapDesc:
return target


def expand_make_targets(targets: List[str]) -> List[KeyboardKeymapDesc]:
def expand_make_targets(targets: List[Union[str, Tuple[str, Callable[[BuildTarget], None]]]]) -> List[KeyboardKeymapDesc]:
"""Expand a list of make targets into a list of KeyboardKeymapDesc.
Caters for 'all' in either keyboard or keymap, or both.
"""
split_targets = []
for target in targets:
split_target = target.split(':')
construction_callback = None
if isinstance(target, tuple):
split_target = target[0].split(':')
construction_callback = target[1]
else:
split_target = target.split(':')
if len(split_target) != 2:
cli.log.error(f"Invalid build target: {target}")
return []
split_targets.append(KeyboardKeymapDesc(split_target[0], split_target[1]))
split_targets.append(KeyboardKeymapDesc(split_target[0], split_target[1], construction_callback=construction_callback))
return expand_keymap_targets(split_targets)


Expand All @@ -193,20 +200,18 @@ def _expand_keymap_target(target: KeyboardKeymapDesc, all_keyboards: List[str] =
for kb in parallel_map(_all_keymaps, all_keyboards):
targets.extend(kb)
for t in targets:
t.orig_keyboard = target.keyboard
t.orig_keymap = target.keymap
t.construction_callback = target.construction_callback
return targets
else:
cli.log.info(f'Retrieving list of keyboards with keymap "{target.keymap}"...')
keyboard_filter = functools.partial(_keymap_exists, keymap=target.keymap)
return [KeyboardKeymapDesc(kb, target.keymap, orig_keyboard=target.keyboard, orig_keymap=target.keymap) for kb in filter(lambda e: e is not None, parallel_map(keyboard_filter, all_keyboards))]
return [KeyboardKeymapDesc(kb, target.keymap, construction_callback=target.construction_callback) for kb in filter(lambda e: e is not None, parallel_map(keyboard_filter, all_keyboards))]
else:
if target.keymap == 'all':
cli.log.info(f'Retrieving list of keymaps for keyboard "{target.keyboard}"...')
targets = _all_keymaps(target.keyboard)
for t in targets:
t.orig_keyboard = target.keyboard
t.orig_keymap = target.keymap
t.construction_callback = target.construction_callback
else:
return [target]

Expand Down Expand Up @@ -288,10 +293,16 @@ def f(e):
return targets


def search_keymap_targets(targets: List[Tuple[str, str]] = [('all', 'default')], filters: List[str] = []) -> List[BuildTarget]:
def search_keymap_targets(targets: List[Union[Tuple[str, str], Tuple[str, str, Callable[[BuildTarget], None]]]] = [('all', 'default')], filters: List[str] = []) -> List[BuildTarget]:
"""Search for build targets matching the supplied criteria.
"""
targets = [KeyboardKeymapDesc(k, m) for k, m in targets]
def _make_desc(e):
if len(e) == 3:
return KeyboardKeymapDesc(keyboard=e[0], keymap=e[1], construction_callback=e[2])
else:
return KeyboardKeymapDesc(keyboard=e[0], keymap=e[1])

targets = map(_make_desc, targets)
targets = _filter_keymap_targets(expand_keymap_targets(targets), filters)
map_func = parallel_map
if len(targets) == 1:
Expand All @@ -300,7 +311,7 @@ def search_keymap_targets(targets: List[Tuple[str, str]] = [('all', 'default')],
return targets


def search_make_targets(targets: List[str], filters: List[str] = []) -> List[BuildTarget]:
def search_make_targets(targets: List[Union[str, Tuple[str, Callable[[BuildTarget], None]]]], filters: List[str] = []) -> List[BuildTarget]:
"""Search for build targets matching the supplied criteria.
"""
targets = _filter_keymap_targets(expand_make_targets(targets), filters)
Expand Down

0 comments on commit d51f58b

Please sign in to comment.