aboutsummaryrefslogtreecommitdiff
path: root/lib/python/qmk/userspace.py
diff options
context:
space:
mode:
authorNick Brassel <[email protected]>2024-08-12 22:34:22 +1000
committerGitHub <[email protected]>2024-08-12 22:34:22 +1000
commit380e0c9cad72ac29f858bef85c8b8eb35b6931f0 (patch)
treee711c1d30cb02a931db0b2a91c075dd65a38cb9f /lib/python/qmk/userspace.py
parent158aaef78c26ea1ade9a5fbc0ee7fbe5b84a6fe9 (diff)
downloadqmk_firmware-380e0c9cad72ac29f858bef85c8b8eb35b6931f0.tar.gz
qmk_firmware-380e0c9cad72ac29f858bef85c8b8eb35b6931f0.zip
Userspace: add support for adding environment variables during build (#22887)
Diffstat (limited to 'lib/python/qmk/userspace.py')
-rw-r--r--lib/python/qmk/userspace.py66
1 files changed, 48 insertions, 18 deletions
diff --git a/lib/python/qmk/userspace.py b/lib/python/qmk/userspace.py
index 1e5823b229..1c2a97f9c1 100644
--- a/lib/python/qmk/userspace.py
+++ b/lib/python/qmk/userspace.py
@@ -1,4 +1,4 @@
-# Copyright 2023 Nick Brassel (@tzarc)
+# Copyright 2023-2024 Nick Brassel (@tzarc)
# SPDX-License-Identifier: GPL-2.0-or-later
from os import environ
from pathlib import Path
@@ -77,31 +77,43 @@ class UserspaceDefs:
raise exception
# Iterate through each version of the schema, starting with the latest and decreasing to v1
- try:
- validate(json, 'qmk.user_repo.v1')
- self.__load_v1(json)
- success = True
- except jsonschema.ValidationError as err:
- exception.add('qmk.user_repo.v1', err)
+ schema_versions = [
+ ('qmk.user_repo.v1_1', self.__load_v1_1), #
+ ('qmk.user_repo.v1', self.__load_v1) #
+ ]
+
+ for v in schema_versions:
+ schema = v[0]
+ loader = v[1]
+ try:
+ validate(json, schema)
+ loader(json)
+ success = True
+ break
+ except jsonschema.ValidationError as err:
+ exception.add(schema, err)
if not success:
raise exception
def save(self):
target_json = {
- "userspace_version": "1.0", # Needs to match latest version
+ "userspace_version": "1.1", # Needs to match latest version
"build_targets": []
}
for e in self.build_targets:
if isinstance(e, dict):
- target_json['build_targets'].append([e['keyboard'], e['keymap']])
+ entry = [e['keyboard'], e['keymap']]
+ if 'env' in e:
+ entry.append(e['env'])
+ target_json['build_targets'].append(entry)
elif isinstance(e, Path):
target_json['build_targets'].append(str(e.relative_to(self.path.parent)))
try:
# Ensure what we're writing validates against the latest version of the schema
- validate(target_json, 'qmk.user_repo.v1')
+ validate(target_json, 'qmk.user_repo.v1_1')
except jsonschema.ValidationError as err:
cli.log.error(f'Could not save userspace file: {err}')
return False
@@ -114,7 +126,7 @@ class UserspaceDefs:
cli.log.info(f'Saved userspace file to {self.path}.')
return True
- def add_target(self, keyboard=None, keymap=None, json_path=None, do_print=True):
+ def add_target(self, keyboard=None, keymap=None, build_env=None, json_path=None, do_print=True):
if json_path is not None:
# Assume we're adding a json filename/path
json_path = Path(json_path)
@@ -128,6 +140,8 @@ class UserspaceDefs:
elif keyboard is not None and keymap is not None:
# Both keyboard/keymap specified
e = {"keyboard": keyboard, "keymap": keymap}
+ if build_env is not None:
+ e['env'] = build_env
if e not in self.build_targets:
self.build_targets.append(e)
if do_print:
@@ -136,7 +150,7 @@ class UserspaceDefs:
if do_print:
cli.log.info(f'{keyboard}:{keymap} is already a userspace build target.')
- def remove_target(self, keyboard=None, keymap=None, json_path=None, do_print=True):
+ def remove_target(self, keyboard=None, keymap=None, build_env=None, json_path=None, do_print=True):
if json_path is not None:
# Assume we're removing a json filename/path
json_path = Path(json_path)
@@ -150,6 +164,8 @@ class UserspaceDefs:
elif keyboard is not None and keymap is not None:
# Both keyboard/keymap specified
e = {"keyboard": keyboard, "keymap": keymap}
+ if build_env is not None:
+ e['env'] = build_env
if e in self.build_targets:
self.build_targets.remove(e)
if do_print:
@@ -160,12 +176,26 @@ class UserspaceDefs:
def __load_v1(self, json):
for e in json['build_targets']:
- if isinstance(e, list) and len(e) == 2:
- self.add_target(keyboard=e[0], keymap=e[1], do_print=False)
- if isinstance(e, str):
- p = self.path.parent / e
- if p.exists() and p.suffix == '.json':
- self.add_target(json_path=p, do_print=False)
+ self.__load_v1_target(e)
+
+ def __load_v1_1(self, json):
+ for e in json['build_targets']:
+ self.__load_v1_1_target(e)
+
+ def __load_v1_target(self, e):
+ if isinstance(e, list) and len(e) == 2:
+ self.add_target(keyboard=e[0], keymap=e[1], do_print=False)
+ if isinstance(e, str):
+ p = self.path.parent / e
+ if p.exists() and p.suffix == '.json':
+ self.add_target(json_path=p, do_print=False)
+
+ def __load_v1_1_target(self, e):
+ # v1.1 adds support for a third item in the build target tuple; kvp's for environment
+ if isinstance(e, list) and len(e) == 3:
+ self.add_target(keyboard=e[0], keymap=e[1], build_env=e[2], do_print=False)
+ else:
+ self.__load_v1_target(e)
class UserspaceValidationError(Exception):