Clone of official tools

Revision:
40:7d3fa6b99b2b
Parent:
36:96847d42f010
Child:
43:2a7da56ebd24
--- a/export/exporters.py	Wed Jul 19 16:44:30 2017 -0500
+++ b/export/exporters.py	Tue Oct 10 16:56:30 2017 -0500
@@ -25,6 +25,18 @@
     def __get__(self, inst, cls):
         return self.func(cls)
 
+def deprecated_exporter(CLS):
+    old_init = CLS.__init__
+    old_name = CLS.NAME
+    def __init__(*args, **kwargs):
+        print("==================== DEPRECATION NOTICE ====================")
+        print("The exporter %s is no longer maintained, and deprecated." % old_name)
+        print("%s will be removed from mbed OS for the mbed OS 5.6 release." % old_name)
+        old_init(*args, **kwargs)
+    CLS.__init__ = __init__
+    CLS.NAME = "%s (DEPRECATED)" % old_name
+    return CLS
+
 class Exporter(object):
     """Exporter base class
 
@@ -36,7 +48,7 @@
     TEMPLATE_DIR = dirname(__file__)
     DOT_IN_RELATIVE_PATH = False
     NAME = None
-    TARGETS = None
+    TARGETS = set()
     TOOLCHAIN = None
 
 
@@ -60,8 +72,11 @@
         jinja_loader = FileSystemLoader(os.path.dirname(os.path.abspath(__file__)))
         self.jinja_environment = Environment(loader=jinja_loader)
         self.resources = resources
-        self.generated_files = [join(self.TEMPLATE_DIR, "GettingStarted.html"),
-                                join(self.TEMPLATE_DIR, ".mbed")]
+        self.generated_files = []
+        self.static_files = (
+            join(self.TEMPLATE_DIR, "GettingStarted.html"),
+            join(self.TEMPLATE_DIR, ".mbed"),
+        )
         self.builder_files_dict = {}
         self.add_config()
 
@@ -90,7 +105,10 @@
         config_header = self.toolchain.get_config_header()
         flags = {key + "_flags": copy.deepcopy(value) for key, value
                  in self.toolchain.flags.iteritems()}
-        asm_defines = ["-D" + symbol for symbol in self.toolchain.get_symbols(True)]
+        asm_defines = self.toolchain.get_compile_options(
+            self.toolchain.get_symbols(for_asm=True),
+            filter(None, self.resources.inc_dirs),
+            for_asm=True)
         c_defines = ["-D" + symbol for symbol in self.toolchain.get_symbols()]
         flags['asm_flags'] += asm_defines
         flags['c_flags'] += c_defines
@@ -178,19 +196,33 @@
         """Generate an IDE/tool specific project file"""
         raise NotImplemented("Implement a generate function in Exporter child class")
 
+    @classmethod
+    def is_target_supported(cls, target_name):
+        """Query support for a particular target
 
-def filter_supported(compiler, whitelist):
+        NOTE: override this method if your exporter does not provide a static list of targets
+
+        Positional Arguments:
+        target_name - the name of the target.
+        """
+        target = TARGET_MAP[target_name]
+        return bool(set(target.resolution_order_names).intersection(set(cls.TARGETS))) \
+            and cls.TOOLCHAIN in target.supported_toolchains
+
+
+    @classmethod
+    def all_supported_targets(cls):
+        return [t for t in TARGET_MAP.keys() if cls.is_target_supported(t)]
+
+
+def apply_supported_whitelist(compiler, whitelist, target):
     """Generate a list of supported targets for a given compiler and post-binary hook
     white-list."""
-    def supported_p(obj):
-        """Internal inner function used for filtering"""
-        if compiler not in obj.supported_toolchains:
-            return False
-        if not hasattr(obj, "post_binary_hook"):
-            return True
-        if obj.post_binary_hook['function'] in whitelist:
-            return True
-        else:
-            return False
-    return list(target for target, obj in TARGET_MAP.iteritems()
-                if supported_p(obj))
+    if compiler not in target.supported_toolchains:
+        return False
+    if not hasattr(target, "post_binary_hook"):
+        return True
+    if target.post_binary_hook['function'] in whitelist:
+        return True
+    else:
+        return False