takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 """Just a template for subclassing"""
kadonotakashi 0:8fdf9a60065b 2 import os
kadonotakashi 0:8fdf9a60065b 3 from abc import abstractmethod, ABCMeta
kadonotakashi 0:8fdf9a60065b 4 import logging
kadonotakashi 0:8fdf9a60065b 5 from os.path import join, dirname, relpath, basename, realpath, normpath, exists
kadonotakashi 0:8fdf9a60065b 6 from itertools import groupby
kadonotakashi 0:8fdf9a60065b 7 from jinja2 import FileSystemLoader, StrictUndefined
kadonotakashi 0:8fdf9a60065b 8 from jinja2.environment import Environment
kadonotakashi 0:8fdf9a60065b 9 import copy
kadonotakashi 0:8fdf9a60065b 10
kadonotakashi 0:8fdf9a60065b 11 from tools.targets import TARGET_MAP
kadonotakashi 0:8fdf9a60065b 12 from tools.utils import mkdir
kadonotakashi 0:8fdf9a60065b 13 from tools.resources import FileType
kadonotakashi 0:8fdf9a60065b 14
kadonotakashi 0:8fdf9a60065b 15
kadonotakashi 0:8fdf9a60065b 16 class TargetNotSupportedException(Exception):
kadonotakashi 0:8fdf9a60065b 17 """Indicates that an IDE does not support a particular MCU"""
kadonotakashi 0:8fdf9a60065b 18 pass
kadonotakashi 0:8fdf9a60065b 19
kadonotakashi 0:8fdf9a60065b 20 class ExporterTargetsProperty(object):
kadonotakashi 0:8fdf9a60065b 21 """ Exporter descriptor for TARGETS
kadonotakashi 0:8fdf9a60065b 22 TARGETS as class attribute for backward compatibility
kadonotakashi 0:8fdf9a60065b 23 (allows: if in Exporter.TARGETS)
kadonotakashi 0:8fdf9a60065b 24 """
kadonotakashi 0:8fdf9a60065b 25 def __init__(self, func):
kadonotakashi 0:8fdf9a60065b 26 self.func = func
kadonotakashi 0:8fdf9a60065b 27 def __get__(self, inst, cls):
kadonotakashi 0:8fdf9a60065b 28 return self.func(cls)
kadonotakashi 0:8fdf9a60065b 29
kadonotakashi 0:8fdf9a60065b 30 def deprecated_exporter(CLS):
kadonotakashi 0:8fdf9a60065b 31 old_init = CLS.__init__
kadonotakashi 0:8fdf9a60065b 32 old_name = CLS.NAME
kadonotakashi 0:8fdf9a60065b 33 def __init__(*args, **kwargs):
kadonotakashi 0:8fdf9a60065b 34 print("==================== DEPRECATION NOTICE ====================")
kadonotakashi 0:8fdf9a60065b 35 print("The exporter %s is no longer maintained, and deprecated." % old_name)
kadonotakashi 0:8fdf9a60065b 36 print("%s will be removed from mbed OS for the mbed OS 5.6 release." % old_name)
kadonotakashi 0:8fdf9a60065b 37 old_init(*args, **kwargs)
kadonotakashi 0:8fdf9a60065b 38 CLS.__init__ = __init__
kadonotakashi 0:8fdf9a60065b 39 CLS.NAME = "%s (DEPRECATED)" % old_name
kadonotakashi 0:8fdf9a60065b 40 return CLS
kadonotakashi 0:8fdf9a60065b 41
kadonotakashi 0:8fdf9a60065b 42 class Exporter(object):
kadonotakashi 0:8fdf9a60065b 43 """Exporter base class
kadonotakashi 0:8fdf9a60065b 44
kadonotakashi 0:8fdf9a60065b 45 This class is meant to be extended by individual exporters, and provides a
kadonotakashi 0:8fdf9a60065b 46 few helper methods for implementing an exporter with either jinja2 or
kadonotakashi 0:8fdf9a60065b 47 progen.
kadonotakashi 0:8fdf9a60065b 48 """
kadonotakashi 0:8fdf9a60065b 49 __metaclass__ = ABCMeta
kadonotakashi 0:8fdf9a60065b 50 TEMPLATE_DIR = dirname(__file__)
kadonotakashi 0:8fdf9a60065b 51 DOT_IN_RELATIVE_PATH = False
kadonotakashi 0:8fdf9a60065b 52 NAME = None
kadonotakashi 0:8fdf9a60065b 53 TARGETS = set()
kadonotakashi 0:8fdf9a60065b 54 TOOLCHAIN = None
kadonotakashi 0:8fdf9a60065b 55 CLEAN_FILES = ("GettingStarted.html",)
kadonotakashi 0:8fdf9a60065b 56
kadonotakashi 0:8fdf9a60065b 57
kadonotakashi 0:8fdf9a60065b 58 def __init__(self, target, export_dir, project_name, toolchain,
kadonotakashi 0:8fdf9a60065b 59 extra_symbols=None, resources=None):
kadonotakashi 0:8fdf9a60065b 60 """Initialize an instance of class exporter
kadonotakashi 0:8fdf9a60065b 61 Positional arguments:
kadonotakashi 0:8fdf9a60065b 62 target - the target mcu/board for this project
kadonotakashi 0:8fdf9a60065b 63 export_dir - the directory of the exported project files
kadonotakashi 0:8fdf9a60065b 64 project_name - the name of the project
kadonotakashi 0:8fdf9a60065b 65 toolchain - an instance of class toolchain
kadonotakashi 0:8fdf9a60065b 66
kadonotakashi 0:8fdf9a60065b 67 Keyword arguments:
kadonotakashi 0:8fdf9a60065b 68 extra_symbols - a list of extra macros for the toolchain
kadonotakashi 0:8fdf9a60065b 69 resources - an instance of class Resources
kadonotakashi 0:8fdf9a60065b 70 """
kadonotakashi 0:8fdf9a60065b 71 self.export_dir = export_dir
kadonotakashi 0:8fdf9a60065b 72 self.target = target
kadonotakashi 0:8fdf9a60065b 73 self.project_name = project_name
kadonotakashi 0:8fdf9a60065b 74 self.toolchain = toolchain
kadonotakashi 0:8fdf9a60065b 75 jinja_loader = FileSystemLoader(os.path.dirname(os.path.abspath(__file__)))
kadonotakashi 0:8fdf9a60065b 76 self.jinja_environment = Environment(loader=jinja_loader)
kadonotakashi 0:8fdf9a60065b 77 self.resources = resources
kadonotakashi 0:8fdf9a60065b 78 self.generated_files = []
kadonotakashi 0:8fdf9a60065b 79 self.static_files = (
kadonotakashi 0:8fdf9a60065b 80 join(self.TEMPLATE_DIR, "GettingStarted.html"),
kadonotakashi 0:8fdf9a60065b 81 join(self.TEMPLATE_DIR, ".mbed"),
kadonotakashi 0:8fdf9a60065b 82 )
kadonotakashi 0:8fdf9a60065b 83 self.builder_files_dict = {}
kadonotakashi 0:8fdf9a60065b 84 self.add_config()
kadonotakashi 0:8fdf9a60065b 85
kadonotakashi 0:8fdf9a60065b 86 def get_toolchain(self):
kadonotakashi 0:8fdf9a60065b 87 """A helper getter function that we should probably eliminate"""
kadonotakashi 0:8fdf9a60065b 88 return self.TOOLCHAIN
kadonotakashi 0:8fdf9a60065b 89
kadonotakashi 0:8fdf9a60065b 90 def add_config(self):
kadonotakashi 0:8fdf9a60065b 91 """Add the containing directory of mbed_config.h to include dirs"""
kadonotakashi 0:8fdf9a60065b 92 pass
kadonotakashi 0:8fdf9a60065b 93
kadonotakashi 0:8fdf9a60065b 94 @property
kadonotakashi 0:8fdf9a60065b 95 def flags(self):
kadonotakashi 0:8fdf9a60065b 96 """Returns a dictionary of toolchain flags.
kadonotakashi 0:8fdf9a60065b 97 Keys of the dictionary are:
kadonotakashi 0:8fdf9a60065b 98 cxx_flags - c++ flags
kadonotakashi 0:8fdf9a60065b 99 c_flags - c flags
kadonotakashi 0:8fdf9a60065b 100 ld_flags - linker flags
kadonotakashi 0:8fdf9a60065b 101 asm_flags - assembler flags
kadonotakashi 0:8fdf9a60065b 102 common_flags - common options
kadonotakashi 0:8fdf9a60065b 103 """
kadonotakashi 0:8fdf9a60065b 104 flags = self.toolchain_flags(self.toolchain)
kadonotakashi 0:8fdf9a60065b 105 asm_defines = self.toolchain.get_compile_options(
kadonotakashi 0:8fdf9a60065b 106 self.toolchain.get_symbols(for_asm=True),
kadonotakashi 0:8fdf9a60065b 107 filter(None, self.resources.inc_dirs),
kadonotakashi 0:8fdf9a60065b 108 for_asm=True)
kadonotakashi 0:8fdf9a60065b 109 c_defines = ["-D" + symbol for symbol in self.toolchain.get_symbols()]
kadonotakashi 0:8fdf9a60065b 110 flags['asm_flags'] += asm_defines
kadonotakashi 0:8fdf9a60065b 111 flags['c_flags'] += c_defines
kadonotakashi 0:8fdf9a60065b 112 flags['cxx_flags'] += c_defines
kadonotakashi 0:8fdf9a60065b 113 config_header = self.config_header_ref
kadonotakashi 0:8fdf9a60065b 114 if config_header:
kadonotakashi 0:8fdf9a60065b 115 config_option = self.toolchain.get_config_option(
kadonotakashi 0:8fdf9a60065b 116 config_header.name)
kadonotakashi 0:8fdf9a60065b 117 flags['c_flags'] += config_option
kadonotakashi 0:8fdf9a60065b 118 flags['cxx_flags'] += config_option
kadonotakashi 0:8fdf9a60065b 119 return flags
kadonotakashi 0:8fdf9a60065b 120
kadonotakashi 0:8fdf9a60065b 121 @property
kadonotakashi 0:8fdf9a60065b 122 def libraries(self):
kadonotakashi 0:8fdf9a60065b 123 return [l for l in self.resources.get_file_names(FileType.LIB)
kadonotakashi 0:8fdf9a60065b 124 if l.endswith(self.toolchain.LIBRARY_EXT)]
kadonotakashi 0:8fdf9a60065b 125
kadonotakashi 0:8fdf9a60065b 126 def toolchain_flags(self, toolchain):
kadonotakashi 0:8fdf9a60065b 127 """Returns a dictionary of toolchain flags.
kadonotakashi 0:8fdf9a60065b 128 Keys of the dictionary are:
kadonotakashi 0:8fdf9a60065b 129 cxx_flags - c++ flags
kadonotakashi 0:8fdf9a60065b 130 c_flags - c flags
kadonotakashi 0:8fdf9a60065b 131 ld_flags - linker flags
kadonotakashi 0:8fdf9a60065b 132 asm_flags - assembler flags
kadonotakashi 0:8fdf9a60065b 133 common_flags - common options
kadonotakashi 0:8fdf9a60065b 134
kadonotakashi 0:8fdf9a60065b 135 The difference from the above is that it takes a parameter.
kadonotakashi 0:8fdf9a60065b 136 """
kadonotakashi 0:8fdf9a60065b 137 flags = {key + "_flags": copy.deepcopy(value) for key, value
kadonotakashi 0:8fdf9a60065b 138 in toolchain.flags.items()}
kadonotakashi 0:8fdf9a60065b 139 config_header = self.config_header_ref
kadonotakashi 0:8fdf9a60065b 140 if config_header:
kadonotakashi 0:8fdf9a60065b 141 header_options = self.toolchain.get_config_option(
kadonotakashi 0:8fdf9a60065b 142 config_header.name)
kadonotakashi 0:8fdf9a60065b 143 flags['c_flags'] += header_options
kadonotakashi 0:8fdf9a60065b 144 flags['cxx_flags'] += header_options
kadonotakashi 0:8fdf9a60065b 145 return flags
kadonotakashi 0:8fdf9a60065b 146
kadonotakashi 0:8fdf9a60065b 147 @property
kadonotakashi 0:8fdf9a60065b 148 def config_header_ref(self):
kadonotakashi 0:8fdf9a60065b 149 config_header = self.toolchain.get_config_header()
kadonotakashi 0:8fdf9a60065b 150 if config_header:
kadonotakashi 0:8fdf9a60065b 151 def is_config_header(f):
kadonotakashi 0:8fdf9a60065b 152 return f.path == config_header
kadonotakashi 0:8fdf9a60065b 153 return list(filter(
kadonotakashi 0:8fdf9a60065b 154 is_config_header, self.resources.get_file_refs(FileType.HEADER)
kadonotakashi 0:8fdf9a60065b 155 ))[0]
kadonotakashi 0:8fdf9a60065b 156 else:
kadonotakashi 0:8fdf9a60065b 157 return None
kadonotakashi 0:8fdf9a60065b 158
kadonotakashi 0:8fdf9a60065b 159 def get_source_paths(self):
kadonotakashi 0:8fdf9a60065b 160 """Returns a list of the directories where source files are contained"""
kadonotakashi 0:8fdf9a60065b 161 source_keys = ['s_sources', 'c_sources', 'cpp_sources', 'hex_files',
kadonotakashi 0:8fdf9a60065b 162 'objects', 'libraries']
kadonotakashi 0:8fdf9a60065b 163 source_files = []
kadonotakashi 0:8fdf9a60065b 164 for key in source_keys:
kadonotakashi 0:8fdf9a60065b 165 source_files.extend(getattr(self.resources, key))
kadonotakashi 0:8fdf9a60065b 166 return list(set([os.path.dirname(src) for src in source_files]))
kadonotakashi 0:8fdf9a60065b 167
kadonotakashi 0:8fdf9a60065b 168 def gen_file_dest(self, target_file):
kadonotakashi 0:8fdf9a60065b 169 """Generate the project file location in an exported project"""
kadonotakashi 0:8fdf9a60065b 170 return join(self.export_dir, target_file)
kadonotakashi 0:8fdf9a60065b 171
kadonotakashi 0:8fdf9a60065b 172 def gen_file(self, template_file, data, target_file, **kwargs):
kadonotakashi 0:8fdf9a60065b 173 """Generates a project file from a template using jinja"""
kadonotakashi 0:8fdf9a60065b 174 target_text = self._gen_file_inner(template_file, data, target_file, **kwargs)
kadonotakashi 0:8fdf9a60065b 175 target_path = self.gen_file_dest(target_file)
kadonotakashi 0:8fdf9a60065b 176 mkdir(dirname(target_path))
kadonotakashi 0:8fdf9a60065b 177 logging.debug("Generating: %s", target_path)
kadonotakashi 0:8fdf9a60065b 178 open(target_path, "w").write(target_text)
kadonotakashi 0:8fdf9a60065b 179 self.generated_files += [target_path]
kadonotakashi 0:8fdf9a60065b 180
kadonotakashi 0:8fdf9a60065b 181 def gen_file_nonoverwrite(self, template_file, data, target_file, **kwargs):
kadonotakashi 0:8fdf9a60065b 182 """Generates a project file from a template using jinja"""
kadonotakashi 0:8fdf9a60065b 183 target_text = self._gen_file_inner(template_file, data, target_file, **kwargs)
kadonotakashi 0:8fdf9a60065b 184 target_path = self.gen_file_dest(target_file)
kadonotakashi 0:8fdf9a60065b 185 if exists(target_path):
kadonotakashi 0:8fdf9a60065b 186 with open(target_path) as fdin:
kadonotakashi 0:8fdf9a60065b 187 old_text = fdin.read()
kadonotakashi 0:8fdf9a60065b 188 if target_text not in old_text:
kadonotakashi 0:8fdf9a60065b 189 with open(target_path, "a") as fdout:
kadonotakashi 0:8fdf9a60065b 190 fdout.write(target_text)
kadonotakashi 0:8fdf9a60065b 191 else:
kadonotakashi 0:8fdf9a60065b 192 logging.debug("Generating: %s", target_path)
kadonotakashi 0:8fdf9a60065b 193 open(target_path, "w").write(target_text)
kadonotakashi 0:8fdf9a60065b 194 self.generated_files += [target_path]
kadonotakashi 0:8fdf9a60065b 195
kadonotakashi 0:8fdf9a60065b 196 def _gen_file_inner(self, template_file, data, target_file, **kwargs):
kadonotakashi 0:8fdf9a60065b 197 """Generates a project file from a template using jinja"""
kadonotakashi 0:8fdf9a60065b 198 jinja_loader = FileSystemLoader(
kadonotakashi 0:8fdf9a60065b 199 os.path.dirname(os.path.abspath(__file__)))
kadonotakashi 0:8fdf9a60065b 200 jinja_environment = Environment(loader=jinja_loader,
kadonotakashi 0:8fdf9a60065b 201 undefined=StrictUndefined, **kwargs)
kadonotakashi 0:8fdf9a60065b 202
kadonotakashi 0:8fdf9a60065b 203 template = jinja_environment.get_template(template_file)
kadonotakashi 0:8fdf9a60065b 204 target_text = template.render(data)
kadonotakashi 0:8fdf9a60065b 205 return target_text
kadonotakashi 0:8fdf9a60065b 206
kadonotakashi 0:8fdf9a60065b 207 target_path = join(self.export_dir, target_file)
kadonotakashi 0:8fdf9a60065b 208 logging.debug("Generating: %s", target_path)
kadonotakashi 0:8fdf9a60065b 209 open(target_path, "w").write(target_text)
kadonotakashi 0:8fdf9a60065b 210 self.generated_files += [target_path]
kadonotakashi 0:8fdf9a60065b 211
kadonotakashi 0:8fdf9a60065b 212 def make_key(self, src):
kadonotakashi 0:8fdf9a60065b 213 """From a source file, extract group name
kadonotakashi 0:8fdf9a60065b 214 Positional Arguments:
kadonotakashi 0:8fdf9a60065b 215 src - the src's location
kadonotakashi 0:8fdf9a60065b 216 """
kadonotakashi 0:8fdf9a60065b 217 path_list = os.path.normpath(src).split(os.sep)
kadonotakashi 0:8fdf9a60065b 218 assert len(path_list) >= 1
kadonotakashi 0:8fdf9a60065b 219 if len(path_list) == 1:
kadonotakashi 0:8fdf9a60065b 220 key = self.project_name
kadonotakashi 0:8fdf9a60065b 221 else:
kadonotakashi 0:8fdf9a60065b 222 key = path_list[0]
kadonotakashi 0:8fdf9a60065b 223 return key
kadonotakashi 0:8fdf9a60065b 224
kadonotakashi 0:8fdf9a60065b 225 def group_project_files(self, sources):
kadonotakashi 0:8fdf9a60065b 226 """Group the source files by their encompassing directory
kadonotakashi 0:8fdf9a60065b 227 Positional Arguments:
kadonotakashi 0:8fdf9a60065b 228 sources - array of source locations
kadonotakashi 0:8fdf9a60065b 229
kadonotakashi 0:8fdf9a60065b 230 Returns a dictionary of {group name: list of source locations}
kadonotakashi 0:8fdf9a60065b 231 """
kadonotakashi 0:8fdf9a60065b 232 data = sorted(sources, key=self.make_key)
kadonotakashi 0:8fdf9a60065b 233 return {k: list(g) for k,g in groupby(data, self.make_key)}
kadonotakashi 0:8fdf9a60065b 234
kadonotakashi 0:8fdf9a60065b 235 @staticmethod
kadonotakashi 0:8fdf9a60065b 236 def build(project_name, log_name='build_log.txt', cleanup=True):
kadonotakashi 0:8fdf9a60065b 237 """Invoke exporters build command within a subprocess.
kadonotakashi 0:8fdf9a60065b 238 This method is assumed to be executed at the same level as exporter
kadonotakashi 0:8fdf9a60065b 239 project files and project source code.
kadonotakashi 0:8fdf9a60065b 240 See uvision/__init__.py, iar/__init__.py, and makefile/__init__.py for
kadonotakashi 0:8fdf9a60065b 241 example implemenation.
kadonotakashi 0:8fdf9a60065b 242
kadonotakashi 0:8fdf9a60065b 243 Positional Arguments:
kadonotakashi 0:8fdf9a60065b 244 project_name - the name of the project to build; often required by
kadonotakashi 0:8fdf9a60065b 245 exporter's build command.
kadonotakashi 0:8fdf9a60065b 246
kadonotakashi 0:8fdf9a60065b 247 Keyword Args:
kadonotakashi 0:8fdf9a60065b 248 log_name - name of the build log to create. Written and printed out,
kadonotakashi 0:8fdf9a60065b 249 deleted if cleanup = True
kadonotakashi 0:8fdf9a60065b 250 cleanup - a boolean dictating whether exported project files and
kadonotakashi 0:8fdf9a60065b 251 build log are removed after build
kadonotakashi 0:8fdf9a60065b 252
kadonotakashi 0:8fdf9a60065b 253 Returns -1 on failure and 0 on success
kadonotakashi 0:8fdf9a60065b 254 """
kadonotakashi 0:8fdf9a60065b 255 raise NotImplementedError("Implement in derived Exporter class.")
kadonotakashi 0:8fdf9a60065b 256
kadonotakashi 0:8fdf9a60065b 257 @staticmethod
kadonotakashi 0:8fdf9a60065b 258 def clean(project_name):
kadonotakashi 0:8fdf9a60065b 259 """Clean a previously exported project
kadonotakashi 0:8fdf9a60065b 260 This method is assumed to be executed at the same level as exporter
kadonotakashi 0:8fdf9a60065b 261 project files and project source code.
kadonotakashi 0:8fdf9a60065b 262 See uvision/__init__.py, iar/__init__.py, and makefile/__init__.py for
kadonotakashi 0:8fdf9a60065b 263 example implemenation.
kadonotakashi 0:8fdf9a60065b 264
kadonotakashi 0:8fdf9a60065b 265 Positional Arguments:
kadonotakashi 0:8fdf9a60065b 266 project_name - the name of the project to build; often required by
kadonotakashi 0:8fdf9a60065b 267 exporter's build command.
kadonotakashi 0:8fdf9a60065b 268
kadonotakashi 0:8fdf9a60065b 269 Returns nothing. May raise exceptions
kadonotakashi 0:8fdf9a60065b 270 """
kadonotakashi 0:8fdf9a60065b 271 raise NotImplementedError("Implement in derived Exporter class.")
kadonotakashi 0:8fdf9a60065b 272
kadonotakashi 0:8fdf9a60065b 273 @abstractmethod
kadonotakashi 0:8fdf9a60065b 274 def generate(self):
kadonotakashi 0:8fdf9a60065b 275 """Generate an IDE/tool specific project file"""
kadonotakashi 0:8fdf9a60065b 276 raise NotImplementedError("Implement a generate function in Exporter child class")
kadonotakashi 0:8fdf9a60065b 277
kadonotakashi 0:8fdf9a60065b 278 @classmethod
kadonotakashi 0:8fdf9a60065b 279 def is_target_supported(cls, target_name):
kadonotakashi 0:8fdf9a60065b 280 """Query support for a particular target
kadonotakashi 0:8fdf9a60065b 281
kadonotakashi 0:8fdf9a60065b 282 NOTE: override this method if your exporter does not provide a static list of targets
kadonotakashi 0:8fdf9a60065b 283
kadonotakashi 0:8fdf9a60065b 284 Positional Arguments:
kadonotakashi 0:8fdf9a60065b 285 target_name - the name of the target.
kadonotakashi 0:8fdf9a60065b 286 """
kadonotakashi 0:8fdf9a60065b 287 target = TARGET_MAP[target_name]
kadonotakashi 0:8fdf9a60065b 288 return bool(set(target.resolution_order_names).intersection(set(cls.TARGETS))) \
kadonotakashi 0:8fdf9a60065b 289 and cls.TOOLCHAIN in target.supported_toolchains
kadonotakashi 0:8fdf9a60065b 290
kadonotakashi 0:8fdf9a60065b 291
kadonotakashi 0:8fdf9a60065b 292 @classmethod
kadonotakashi 0:8fdf9a60065b 293 def all_supported_targets(cls):
kadonotakashi 0:8fdf9a60065b 294 return [t for t in TARGET_MAP.keys() if cls.is_target_supported(t)]
kadonotakashi 0:8fdf9a60065b 295
kadonotakashi 0:8fdf9a60065b 296 @staticmethod
kadonotakashi 0:8fdf9a60065b 297 def filter_dot(str):
kadonotakashi 0:8fdf9a60065b 298 """
kadonotakashi 0:8fdf9a60065b 299 Remove the './' or '.\\' prefix, if present.
kadonotakashi 0:8fdf9a60065b 300 """
kadonotakashi 0:8fdf9a60065b 301 if str == None:
kadonotakashi 0:8fdf9a60065b 302 return None
kadonotakashi 0:8fdf9a60065b 303 if str[:2] == './':
kadonotakashi 0:8fdf9a60065b 304 return str[2:]
kadonotakashi 0:8fdf9a60065b 305 if str[:2] == '.\\':
kadonotakashi 0:8fdf9a60065b 306 return str[2:]
kadonotakashi 0:8fdf9a60065b 307 return str
kadonotakashi 0:8fdf9a60065b 308
kadonotakashi 0:8fdf9a60065b 309
kadonotakashi 0:8fdf9a60065b 310
kadonotakashi 0:8fdf9a60065b 311 def apply_supported_whitelist(compiler, whitelist, target):
kadonotakashi 0:8fdf9a60065b 312 """Generate a list of supported targets for a given compiler and post-binary hook
kadonotakashi 0:8fdf9a60065b 313 white-list."""
kadonotakashi 0:8fdf9a60065b 314 if compiler not in target.supported_toolchains:
kadonotakashi 0:8fdf9a60065b 315 return False
kadonotakashi 0:8fdf9a60065b 316 if not hasattr(target, "post_binary_hook"):
kadonotakashi 0:8fdf9a60065b 317 return True
kadonotakashi 0:8fdf9a60065b 318 if target.post_binary_hook['function'] in whitelist:
kadonotakashi 0:8fdf9a60065b 319 return True
kadonotakashi 0:8fdf9a60065b 320 else:
kadonotakashi 0:8fdf9a60065b 321 return False