Clone of official tools
Diff: targets/__init__.py
- Revision:
- 38:399953da035d
- Parent:
- 36:96847d42f010
- Child:
- 40:7d3fa6b99b2b
--- a/targets/__init__.py Fri Jul 07 16:20:25 2017 -0500 +++ b/targets/__init__.py Thu Jul 13 15:26:26 2017 -0500 @@ -22,7 +22,7 @@ import inspect import sys from copy import copy -from collections import namedtuple +from collections import namedtuple, Mapping from tools.targets.LPC import patch from tools.paths import TOOLS_BOOTLOADERS from tools.utils import json_file_to_dict @@ -125,18 +125,38 @@ # Current/new location of the 'targets.json' file __targets_json_location = None + # Extra custom targets files + __extra_target_json_files = [] + @staticmethod @cached def get_json_target_data(): """Load the description of JSON target data""" - return json_file_to_dict(Target.__targets_json_location or - Target.__targets_json_location_default) + targets = json_file_to_dict(Target.__targets_json_location or + Target.__targets_json_location_default) + + for extra_target in Target.__extra_target_json_files: + for k, v in json_file_to_dict(extra_target).iteritems(): + if k in targets: + print 'WARNING: Custom target "%s" cannot replace existing target.' % k + else: + targets[k] = v + + return targets + + @staticmethod + def add_extra_targets(source_dir): + extra_targets_file = os.path.join(source_dir, "custom_targets.json") + if os.path.exists(extra_targets_file): + Target.__extra_target_json_files.append(extra_targets_file) + CACHES.clear() @staticmethod def set_targets_json_location(location=None): """Set the location of the targets.json file""" Target.__targets_json_location = (location or Target.__targets_json_location_default) + Target.__extra_target_json_files = [] # Invalidate caches, since the location of the JSON file changed CACHES.clear() @@ -507,14 +527,20 @@ ################################################################################ # Instantiate all public targets -TARGETS = [Target.get_target(name) for name, value - in Target.get_json_target_data().items() - if value.get("public", True)] +def update_target_data(): + TARGETS[:] = [Target.get_target(tgt) for tgt, obj + in Target.get_json_target_data().items() + if obj.get("public", True)] + # Map each target name to its unique instance + TARGET_MAP.clear() + TARGET_MAP.update(dict([(tgt.name, tgt) for tgt in TARGETS])) + TARGET_NAMES[:] = TARGET_MAP.keys() -# Map each target name to its unique instance -TARGET_MAP = dict([(t.name, t) for t in TARGETS]) +TARGETS = [] +TARGET_MAP = dict() +TARGET_NAMES = [] -TARGET_NAMES = TARGET_MAP.keys() +update_target_data() # Some targets with different name have the same exporters EXPORT_MAP = {} @@ -537,9 +563,5 @@ # re-initialization does not create new variables, it keeps the old ones # instead. This ensures compatibility with code that does # "from tools.targets import TARGET_NAMES" - TARGETS[:] = [Target.get_target(tgt) for tgt, obj - in Target.get_json_target_data().items() - if obj.get("public", True)] - TARGET_MAP.clear() - TARGET_MAP.update(dict([(tgt.name, tgt) for tgt in TARGETS])) - TARGET_NAMES[:] = TARGET_MAP.keys() + update_target_data() +