Gleb Klochkov / Mbed OS Climatcontroll_Main

Dependencies:   esp8266-driver

Committer:
glebiuskv
Date:
Fri Apr 13 08:53:46 2018 +0000
Revision:
0:2f0e1e23c242
initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
glebiuskv 0:2f0e1e23c242 1 """
glebiuskv 0:2f0e1e23c242 2 mbed SDK
glebiuskv 0:2f0e1e23c242 3 Copyright (c) 2011-2013 ARM Limited
glebiuskv 0:2f0e1e23c242 4
glebiuskv 0:2f0e1e23c242 5 Licensed under the Apache License, Version 2.0 (the "License");
glebiuskv 0:2f0e1e23c242 6 you may not use this file except in compliance with the License.
glebiuskv 0:2f0e1e23c242 7 You may obtain a copy of the License at
glebiuskv 0:2f0e1e23c242 8
glebiuskv 0:2f0e1e23c242 9 http://www.apache.org/licenses/LICENSE-2.0
glebiuskv 0:2f0e1e23c242 10
glebiuskv 0:2f0e1e23c242 11 Unless required by applicable law or agreed to in writing, software
glebiuskv 0:2f0e1e23c242 12 distributed under the License is distributed on an "AS IS" BASIS,
glebiuskv 0:2f0e1e23c242 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
glebiuskv 0:2f0e1e23c242 14 See the License for the specific language governing permissions and
glebiuskv 0:2f0e1e23c242 15 limitations under the License.
glebiuskv 0:2f0e1e23c242 16 """
glebiuskv 0:2f0e1e23c242 17 from __future__ import print_function, absolute_import
glebiuskv 0:2f0e1e23c242 18 from builtins import str
glebiuskv 0:2f0e1e23c242 19
glebiuskv 0:2f0e1e23c242 20 import re
glebiuskv 0:2f0e1e23c242 21 from copy import copy
glebiuskv 0:2f0e1e23c242 22 from os.path import join, dirname, splitext, basename, exists, relpath, isfile
glebiuskv 0:2f0e1e23c242 23 from os import makedirs, write, curdir, remove
glebiuskv 0:2f0e1e23c242 24 from tempfile import mkstemp
glebiuskv 0:2f0e1e23c242 25 from shutil import rmtree
glebiuskv 0:2f0e1e23c242 26
glebiuskv 0:2f0e1e23c242 27 from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
glebiuskv 0:2f0e1e23c242 28 from tools.hooks import hook_tool
glebiuskv 0:2f0e1e23c242 29 from tools.utils import mkdir, NotSupportedException
glebiuskv 0:2f0e1e23c242 30
glebiuskv 0:2f0e1e23c242 31 class ARM(mbedToolchain):
glebiuskv 0:2f0e1e23c242 32 LINKER_EXT = '.sct'
glebiuskv 0:2f0e1e23c242 33 LIBRARY_EXT = '.ar'
glebiuskv 0:2f0e1e23c242 34
glebiuskv 0:2f0e1e23c242 35 STD_LIB_NAME = "%s.ar"
glebiuskv 0:2f0e1e23c242 36 DIAGNOSTIC_PATTERN = re.compile('"(?P<file>[^"]+)", line (?P<line>\d+)( \(column (?P<column>\d+)\)|): (?P<severity>Warning|Error|Fatal error): (?P<message>.+)')
glebiuskv 0:2f0e1e23c242 37 INDEX_PATTERN = re.compile('(?P<col>\s*)\^')
glebiuskv 0:2f0e1e23c242 38 DEP_PATTERN = re.compile('\S+:\s(?P<file>.+)\n')
glebiuskv 0:2f0e1e23c242 39 SHEBANG = "#! armcc -E"
glebiuskv 0:2f0e1e23c242 40 SUPPORTED_CORES = ["Cortex-M0", "Cortex-M0+", "Cortex-M3", "Cortex-M4",
glebiuskv 0:2f0e1e23c242 41 "Cortex-M4F", "Cortex-M7", "Cortex-M7F", "Cortex-M7FD", "Cortex-A9"]
glebiuskv 0:2f0e1e23c242 42
glebiuskv 0:2f0e1e23c242 43 @staticmethod
glebiuskv 0:2f0e1e23c242 44 def check_executable():
glebiuskv 0:2f0e1e23c242 45 """Returns True if the executable (armcc) location specified by the
glebiuskv 0:2f0e1e23c242 46 user exists OR the executable can be found on the PATH.
glebiuskv 0:2f0e1e23c242 47 Returns False otherwise."""
glebiuskv 0:2f0e1e23c242 48 return mbedToolchain.generic_check_executable("ARM", 'armcc', 2, 'bin')
glebiuskv 0:2f0e1e23c242 49
glebiuskv 0:2f0e1e23c242 50 def __init__(self, target, notify=None, macros=None,
glebiuskv 0:2f0e1e23c242 51 silent=False, extra_verbose=False, build_profile=None,
glebiuskv 0:2f0e1e23c242 52 build_dir=None):
glebiuskv 0:2f0e1e23c242 53 mbedToolchain.__init__(self, target, notify, macros, silent,
glebiuskv 0:2f0e1e23c242 54 build_dir=build_dir,
glebiuskv 0:2f0e1e23c242 55 extra_verbose=extra_verbose,
glebiuskv 0:2f0e1e23c242 56 build_profile=build_profile)
glebiuskv 0:2f0e1e23c242 57 if target.core not in self.SUPPORTED_CORES:
glebiuskv 0:2f0e1e23c242 58 raise NotSupportedException(
glebiuskv 0:2f0e1e23c242 59 "this compiler does not support the core %s" % target.core)
glebiuskv 0:2f0e1e23c242 60
glebiuskv 0:2f0e1e23c242 61 if target.core == "Cortex-M0+":
glebiuskv 0:2f0e1e23c242 62 cpu = "Cortex-M0"
glebiuskv 0:2f0e1e23c242 63 elif target.core == "Cortex-M4F":
glebiuskv 0:2f0e1e23c242 64 cpu = "Cortex-M4.fp"
glebiuskv 0:2f0e1e23c242 65 elif target.core == "Cortex-M7FD":
glebiuskv 0:2f0e1e23c242 66 cpu = "Cortex-M7.fp.dp"
glebiuskv 0:2f0e1e23c242 67 elif target.core == "Cortex-M7F":
glebiuskv 0:2f0e1e23c242 68 cpu = "Cortex-M7.fp.sp"
glebiuskv 0:2f0e1e23c242 69 else:
glebiuskv 0:2f0e1e23c242 70 cpu = target.core
glebiuskv 0:2f0e1e23c242 71
glebiuskv 0:2f0e1e23c242 72 ARM_BIN = join(TOOLCHAIN_PATHS['ARM'], "bin")
glebiuskv 0:2f0e1e23c242 73 ARM_INC = join(TOOLCHAIN_PATHS['ARM'], "include")
glebiuskv 0:2f0e1e23c242 74
glebiuskv 0:2f0e1e23c242 75 main_cc = join(ARM_BIN, "armcc")
glebiuskv 0:2f0e1e23c242 76
glebiuskv 0:2f0e1e23c242 77 self.flags['common'] += ["--cpu=%s" % cpu]
glebiuskv 0:2f0e1e23c242 78
glebiuskv 0:2f0e1e23c242 79 self.asm = [main_cc] + self.flags['common'] + self.flags['asm']
glebiuskv 0:2f0e1e23c242 80 self.cc = [main_cc] + self.flags['common'] + self.flags['c']
glebiuskv 0:2f0e1e23c242 81 self.cppc = [main_cc] + self.flags['common'] + self.flags['c'] + self.flags['cxx']
glebiuskv 0:2f0e1e23c242 82
glebiuskv 0:2f0e1e23c242 83 self.ld = [join(ARM_BIN, "armlink")] + self.flags['ld']
glebiuskv 0:2f0e1e23c242 84
glebiuskv 0:2f0e1e23c242 85 self.ar = join(ARM_BIN, "armar")
glebiuskv 0:2f0e1e23c242 86 self.elf2bin = join(ARM_BIN, "fromelf")
glebiuskv 0:2f0e1e23c242 87
glebiuskv 0:2f0e1e23c242 88 self.SHEBANG += " --cpu=%s" % cpu
glebiuskv 0:2f0e1e23c242 89
glebiuskv 0:2f0e1e23c242 90 def parse_dependencies(self, dep_path):
glebiuskv 0:2f0e1e23c242 91 dependencies = []
glebiuskv 0:2f0e1e23c242 92 for line in open(dep_path).readlines():
glebiuskv 0:2f0e1e23c242 93 match = ARM.DEP_PATTERN.match(line)
glebiuskv 0:2f0e1e23c242 94 if match is not None:
glebiuskv 0:2f0e1e23c242 95 #we need to append chroot, because when the .d files are generated the compiler is chrooted
glebiuskv 0:2f0e1e23c242 96 dependencies.append((self.CHROOT if self.CHROOT else '') + match.group('file'))
glebiuskv 0:2f0e1e23c242 97 return dependencies
glebiuskv 0:2f0e1e23c242 98
glebiuskv 0:2f0e1e23c242 99 def parse_output(self, output):
glebiuskv 0:2f0e1e23c242 100 msg = None
glebiuskv 0:2f0e1e23c242 101 for line in output.splitlines():
glebiuskv 0:2f0e1e23c242 102 match = ARM.DIAGNOSTIC_PATTERN.match(line)
glebiuskv 0:2f0e1e23c242 103 if match is not None:
glebiuskv 0:2f0e1e23c242 104 if msg is not None:
glebiuskv 0:2f0e1e23c242 105 self.cc_info(msg)
glebiuskv 0:2f0e1e23c242 106 msg = None
glebiuskv 0:2f0e1e23c242 107 msg = {
glebiuskv 0:2f0e1e23c242 108 'severity': match.group('severity').lower(),
glebiuskv 0:2f0e1e23c242 109 'file': match.group('file'),
glebiuskv 0:2f0e1e23c242 110 'line': match.group('line'),
glebiuskv 0:2f0e1e23c242 111 'col': match.group('column') if match.group('column') else 0,
glebiuskv 0:2f0e1e23c242 112 'message': match.group('message'),
glebiuskv 0:2f0e1e23c242 113 'text': '',
glebiuskv 0:2f0e1e23c242 114 'target_name': self.target.name,
glebiuskv 0:2f0e1e23c242 115 'toolchain_name': self.name
glebiuskv 0:2f0e1e23c242 116 }
glebiuskv 0:2f0e1e23c242 117 elif msg is not None:
glebiuskv 0:2f0e1e23c242 118 # Determine the warning/error column by calculating the ^ position
glebiuskv 0:2f0e1e23c242 119 match = ARM.INDEX_PATTERN.match(line)
glebiuskv 0:2f0e1e23c242 120 if match is not None:
glebiuskv 0:2f0e1e23c242 121 msg['col'] = len(match.group('col'))
glebiuskv 0:2f0e1e23c242 122 self.cc_info(msg)
glebiuskv 0:2f0e1e23c242 123 msg = None
glebiuskv 0:2f0e1e23c242 124 else:
glebiuskv 0:2f0e1e23c242 125 msg['text'] += line+"\n"
glebiuskv 0:2f0e1e23c242 126
glebiuskv 0:2f0e1e23c242 127 if msg is not None:
glebiuskv 0:2f0e1e23c242 128 self.cc_info(msg)
glebiuskv 0:2f0e1e23c242 129
glebiuskv 0:2f0e1e23c242 130 def get_dep_option(self, object):
glebiuskv 0:2f0e1e23c242 131 base, _ = splitext(object)
glebiuskv 0:2f0e1e23c242 132 dep_path = base + '.d'
glebiuskv 0:2f0e1e23c242 133 return ["--depend", dep_path]
glebiuskv 0:2f0e1e23c242 134
glebiuskv 0:2f0e1e23c242 135 def get_config_option(self, config_header):
glebiuskv 0:2f0e1e23c242 136 return ['--preinclude=' + config_header]
glebiuskv 0:2f0e1e23c242 137
glebiuskv 0:2f0e1e23c242 138 def get_compile_options(self, defines, includes, for_asm=False):
glebiuskv 0:2f0e1e23c242 139 opts = ['-D%s' % d for d in defines]
glebiuskv 0:2f0e1e23c242 140 if self.RESPONSE_FILES:
glebiuskv 0:2f0e1e23c242 141 opts += ['--via', self.get_inc_file(includes)]
glebiuskv 0:2f0e1e23c242 142 else:
glebiuskv 0:2f0e1e23c242 143 opts += ["-I%s" % i for i in includes]
glebiuskv 0:2f0e1e23c242 144
glebiuskv 0:2f0e1e23c242 145 if not for_asm:
glebiuskv 0:2f0e1e23c242 146 config_header = self.get_config_header()
glebiuskv 0:2f0e1e23c242 147 if config_header is not None:
glebiuskv 0:2f0e1e23c242 148 opts = opts + self.get_config_option(config_header)
glebiuskv 0:2f0e1e23c242 149 return opts
glebiuskv 0:2f0e1e23c242 150
glebiuskv 0:2f0e1e23c242 151 @hook_tool
glebiuskv 0:2f0e1e23c242 152 def assemble(self, source, object, includes):
glebiuskv 0:2f0e1e23c242 153 # Preprocess first, then assemble
glebiuskv 0:2f0e1e23c242 154 dir = join(dirname(object), '.temp')
glebiuskv 0:2f0e1e23c242 155 mkdir(dir)
glebiuskv 0:2f0e1e23c242 156 tempfile = join(dir, basename(object) + '.E.s')
glebiuskv 0:2f0e1e23c242 157
glebiuskv 0:2f0e1e23c242 158 # Build preprocess assemble command
glebiuskv 0:2f0e1e23c242 159 cmd_pre = self.asm + self.get_compile_options(self.get_symbols(True), includes) + ["-E", "-o", tempfile, source]
glebiuskv 0:2f0e1e23c242 160
glebiuskv 0:2f0e1e23c242 161 # Build main assemble command
glebiuskv 0:2f0e1e23c242 162 cmd = self.asm + ["-o", object, tempfile]
glebiuskv 0:2f0e1e23c242 163
glebiuskv 0:2f0e1e23c242 164 # Call cmdline hook
glebiuskv 0:2f0e1e23c242 165 cmd_pre = self.hook.get_cmdline_assembler(cmd_pre)
glebiuskv 0:2f0e1e23c242 166 cmd = self.hook.get_cmdline_assembler(cmd)
glebiuskv 0:2f0e1e23c242 167
glebiuskv 0:2f0e1e23c242 168 # Return command array, don't execute
glebiuskv 0:2f0e1e23c242 169 return [cmd_pre, cmd]
glebiuskv 0:2f0e1e23c242 170
glebiuskv 0:2f0e1e23c242 171 @hook_tool
glebiuskv 0:2f0e1e23c242 172 def compile(self, cc, source, object, includes):
glebiuskv 0:2f0e1e23c242 173 # Build compile command
glebiuskv 0:2f0e1e23c242 174 cmd = cc + self.get_compile_options(self.get_symbols(), includes)
glebiuskv 0:2f0e1e23c242 175
glebiuskv 0:2f0e1e23c242 176 cmd.extend(self.get_dep_option(object))
glebiuskv 0:2f0e1e23c242 177
glebiuskv 0:2f0e1e23c242 178 cmd.extend(["-o", object, source])
glebiuskv 0:2f0e1e23c242 179
glebiuskv 0:2f0e1e23c242 180 # Call cmdline hook
glebiuskv 0:2f0e1e23c242 181 cmd = self.hook.get_cmdline_compiler(cmd)
glebiuskv 0:2f0e1e23c242 182
glebiuskv 0:2f0e1e23c242 183 return [cmd]
glebiuskv 0:2f0e1e23c242 184
glebiuskv 0:2f0e1e23c242 185 def compile_c(self, source, object, includes):
glebiuskv 0:2f0e1e23c242 186 return self.compile(self.cc, source, object, includes)
glebiuskv 0:2f0e1e23c242 187
glebiuskv 0:2f0e1e23c242 188 def compile_cpp(self, source, object, includes):
glebiuskv 0:2f0e1e23c242 189 return self.compile(self.cppc, source, object, includes)
glebiuskv 0:2f0e1e23c242 190
glebiuskv 0:2f0e1e23c242 191 def correct_scatter_shebang(self, scatter_file, base_path=curdir):
glebiuskv 0:2f0e1e23c242 192 """Correct the shebang at the top of a scatter file.
glebiuskv 0:2f0e1e23c242 193
glebiuskv 0:2f0e1e23c242 194 Positional arguments:
glebiuskv 0:2f0e1e23c242 195 scatter_file -- the scatter file to correct
glebiuskv 0:2f0e1e23c242 196
glebiuskv 0:2f0e1e23c242 197 Return:
glebiuskv 0:2f0e1e23c242 198 The location of the correct scatter file
glebiuskv 0:2f0e1e23c242 199
glebiuskv 0:2f0e1e23c242 200 Side Effects:
glebiuskv 0:2f0e1e23c242 201 This method MAY write a new scatter file to disk
glebiuskv 0:2f0e1e23c242 202 """
glebiuskv 0:2f0e1e23c242 203 with open(scatter_file, "r") as input:
glebiuskv 0:2f0e1e23c242 204 lines = input.readlines()
glebiuskv 0:2f0e1e23c242 205 if (lines[0].startswith(self.SHEBANG) or
glebiuskv 0:2f0e1e23c242 206 not lines[0].startswith("#!")):
glebiuskv 0:2f0e1e23c242 207 return scatter_file
glebiuskv 0:2f0e1e23c242 208 else:
glebiuskv 0:2f0e1e23c242 209 new_scatter = join(self.build_dir, ".link_script.sct")
glebiuskv 0:2f0e1e23c242 210 self.SHEBANG += " -I %s" % relpath(dirname(scatter_file),
glebiuskv 0:2f0e1e23c242 211 base_path)
glebiuskv 0:2f0e1e23c242 212 if self.need_update(new_scatter, [scatter_file]):
glebiuskv 0:2f0e1e23c242 213 with open(new_scatter, "w") as out:
glebiuskv 0:2f0e1e23c242 214 out.write(self.SHEBANG)
glebiuskv 0:2f0e1e23c242 215 out.write("\n")
glebiuskv 0:2f0e1e23c242 216 out.write("".join(lines[1:]))
glebiuskv 0:2f0e1e23c242 217
glebiuskv 0:2f0e1e23c242 218 return new_scatter
glebiuskv 0:2f0e1e23c242 219
glebiuskv 0:2f0e1e23c242 220 @hook_tool
glebiuskv 0:2f0e1e23c242 221 def link(self, output, objects, libraries, lib_dirs, scatter_file):
glebiuskv 0:2f0e1e23c242 222 base, _ = splitext(output)
glebiuskv 0:2f0e1e23c242 223 map_file = base + ".map"
glebiuskv 0:2f0e1e23c242 224 args = ["-o", output, "--info=totals", "--map", "--list=%s" % map_file]
glebiuskv 0:2f0e1e23c242 225 args.extend(objects)
glebiuskv 0:2f0e1e23c242 226 args.extend(libraries)
glebiuskv 0:2f0e1e23c242 227 if lib_dirs:
glebiuskv 0:2f0e1e23c242 228 args.extend(["--userlibpath", ",".join(lib_dirs)])
glebiuskv 0:2f0e1e23c242 229 if scatter_file:
glebiuskv 0:2f0e1e23c242 230 new_scatter = self.correct_scatter_shebang(scatter_file)
glebiuskv 0:2f0e1e23c242 231 args.extend(["--scatter", new_scatter])
glebiuskv 0:2f0e1e23c242 232
glebiuskv 0:2f0e1e23c242 233 cmd_pre = self.ld + args
glebiuskv 0:2f0e1e23c242 234 cmd = self.hook.get_cmdline_linker(cmd_pre)
glebiuskv 0:2f0e1e23c242 235
glebiuskv 0:2f0e1e23c242 236 if self.RESPONSE_FILES:
glebiuskv 0:2f0e1e23c242 237 cmd_linker = cmd[0]
glebiuskv 0:2f0e1e23c242 238 link_files = self.get_link_file(cmd[1:])
glebiuskv 0:2f0e1e23c242 239 cmd = [cmd_linker, '--via', link_files]
glebiuskv 0:2f0e1e23c242 240
glebiuskv 0:2f0e1e23c242 241 self.cc_verbose("Link: %s" % ' '.join(cmd))
glebiuskv 0:2f0e1e23c242 242 self.default_cmd(cmd)
glebiuskv 0:2f0e1e23c242 243
glebiuskv 0:2f0e1e23c242 244 @hook_tool
glebiuskv 0:2f0e1e23c242 245 def archive(self, objects, lib_path):
glebiuskv 0:2f0e1e23c242 246 if self.RESPONSE_FILES:
glebiuskv 0:2f0e1e23c242 247 param = ['--via', self.get_arch_file(objects)]
glebiuskv 0:2f0e1e23c242 248 else:
glebiuskv 0:2f0e1e23c242 249 param = objects
glebiuskv 0:2f0e1e23c242 250 self.default_cmd([self.ar, '-r', lib_path] + param)
glebiuskv 0:2f0e1e23c242 251
glebiuskv 0:2f0e1e23c242 252 @hook_tool
glebiuskv 0:2f0e1e23c242 253 def binary(self, resources, elf, bin):
glebiuskv 0:2f0e1e23c242 254 _, fmt = splitext(bin)
glebiuskv 0:2f0e1e23c242 255 bin_arg = {".bin": "--bin", ".hex": "--i32"}[fmt]
glebiuskv 0:2f0e1e23c242 256 cmd = [self.elf2bin, bin_arg, '-o', bin, elf]
glebiuskv 0:2f0e1e23c242 257 cmd = self.hook.get_cmdline_binary(cmd)
glebiuskv 0:2f0e1e23c242 258
glebiuskv 0:2f0e1e23c242 259 # remove target binary file/path
glebiuskv 0:2f0e1e23c242 260 if exists(bin):
glebiuskv 0:2f0e1e23c242 261 if isfile(bin):
glebiuskv 0:2f0e1e23c242 262 remove(bin)
glebiuskv 0:2f0e1e23c242 263 else:
glebiuskv 0:2f0e1e23c242 264 rmtree(bin)
glebiuskv 0:2f0e1e23c242 265
glebiuskv 0:2f0e1e23c242 266 self.cc_verbose("FromELF: %s" % ' '.join(cmd))
glebiuskv 0:2f0e1e23c242 267 self.default_cmd(cmd)
glebiuskv 0:2f0e1e23c242 268
glebiuskv 0:2f0e1e23c242 269 @staticmethod
glebiuskv 0:2f0e1e23c242 270 def name_mangle(name):
glebiuskv 0:2f0e1e23c242 271 return "_Z%i%sv" % (len(name), name)
glebiuskv 0:2f0e1e23c242 272
glebiuskv 0:2f0e1e23c242 273 @staticmethod
glebiuskv 0:2f0e1e23c242 274 def make_ld_define(name, value):
glebiuskv 0:2f0e1e23c242 275 return "--predefine=\"-D%s=0x%x\"" % (name, value)
glebiuskv 0:2f0e1e23c242 276
glebiuskv 0:2f0e1e23c242 277 @staticmethod
glebiuskv 0:2f0e1e23c242 278 def redirect_symbol(source, sync, build_dir):
glebiuskv 0:2f0e1e23c242 279 if not exists(build_dir):
glebiuskv 0:2f0e1e23c242 280 makedirs(build_dir)
glebiuskv 0:2f0e1e23c242 281 handle, filename = mkstemp(prefix=".redirect-symbol.", dir=build_dir)
glebiuskv 0:2f0e1e23c242 282 write(handle, "RESOLVE %s AS %s\n" % (source, sync))
glebiuskv 0:2f0e1e23c242 283 return "--edit=%s" % filename
glebiuskv 0:2f0e1e23c242 284
glebiuskv 0:2f0e1e23c242 285
glebiuskv 0:2f0e1e23c242 286 class ARM_STD(ARM):
glebiuskv 0:2f0e1e23c242 287 def __init__(self, target, notify=None, macros=None,
glebiuskv 0:2f0e1e23c242 288 silent=False, extra_verbose=False, build_profile=None,
glebiuskv 0:2f0e1e23c242 289 build_dir=None):
glebiuskv 0:2f0e1e23c242 290 ARM.__init__(self, target, notify, macros, silent,
glebiuskv 0:2f0e1e23c242 291 build_dir=build_dir, extra_verbose=extra_verbose,
glebiuskv 0:2f0e1e23c242 292 build_profile=build_profile)
glebiuskv 0:2f0e1e23c242 293 if "ARM" not in target.supported_toolchains:
glebiuskv 0:2f0e1e23c242 294 raise NotSupportedException("ARM compiler support is required for ARM build")
glebiuskv 0:2f0e1e23c242 295
glebiuskv 0:2f0e1e23c242 296
glebiuskv 0:2f0e1e23c242 297 class ARM_MICRO(ARM):
glebiuskv 0:2f0e1e23c242 298 PATCHED_LIBRARY = False
glebiuskv 0:2f0e1e23c242 299 def __init__(self, target, notify=None, macros=None,
glebiuskv 0:2f0e1e23c242 300 silent=False, extra_verbose=False, build_profile=None,
glebiuskv 0:2f0e1e23c242 301 build_dir=None):
glebiuskv 0:2f0e1e23c242 302 ARM.__init__(self, target, notify, macros, silent,
glebiuskv 0:2f0e1e23c242 303 build_dir=build_dir, extra_verbose=extra_verbose,
glebiuskv 0:2f0e1e23c242 304 build_profile=build_profile)
glebiuskv 0:2f0e1e23c242 305 if not set(("ARM", "uARM")).intersection(set(target.supported_toolchains)):
glebiuskv 0:2f0e1e23c242 306 raise NotSupportedException("ARM/uARM compiler support is required for ARM build")
glebiuskv 0:2f0e1e23c242 307
glebiuskv 0:2f0e1e23c242 308 class ARMC6(ARM_STD):
glebiuskv 0:2f0e1e23c242 309 SHEBANG = "#! armclang -E --target=arm-arm-none-eabi -x c"
glebiuskv 0:2f0e1e23c242 310 SUPPORTED_CORES = ["Cortex-M0", "Cortex-M0+", "Cortex-M3", "Cortex-M4",
glebiuskv 0:2f0e1e23c242 311 "Cortex-M4F", "Cortex-M7", "Cortex-M7F", "Cortex-M7FD",
glebiuskv 0:2f0e1e23c242 312 "Cortex-M23", "Cortex-M23-NS", "Cortex-M33",
glebiuskv 0:2f0e1e23c242 313 "CortexM33-NS", "Cortex-A9"]
glebiuskv 0:2f0e1e23c242 314 @staticmethod
glebiuskv 0:2f0e1e23c242 315 def check_executable():
glebiuskv 0:2f0e1e23c242 316 return mbedToolchain.generic_check_executable("ARMC6", "armclang", 1)
glebiuskv 0:2f0e1e23c242 317
glebiuskv 0:2f0e1e23c242 318 def __init__(self, target, *args, **kwargs):
glebiuskv 0:2f0e1e23c242 319 mbedToolchain.__init__(self, target, *args, **kwargs)
glebiuskv 0:2f0e1e23c242 320 if target.core not in self.SUPPORTED_CORES:
glebiuskv 0:2f0e1e23c242 321 raise NotSupportedException(
glebiuskv 0:2f0e1e23c242 322 "this compiler does not support the core %s" % target.core)
glebiuskv 0:2f0e1e23c242 323
glebiuskv 0:2f0e1e23c242 324 if not set(("ARM", "ARMC6")).intersection(set(target.supported_toolchains)):
glebiuskv 0:2f0e1e23c242 325 raise NotSupportedException("ARM/ARMC6 compiler support is required for ARMC6 build")
glebiuskv 0:2f0e1e23c242 326
glebiuskv 0:2f0e1e23c242 327 if target.core.lower().endswith("fd"):
glebiuskv 0:2f0e1e23c242 328 self.flags['common'].append("-mcpu=%s" % target.core.lower()[:-2])
glebiuskv 0:2f0e1e23c242 329 self.flags['ld'].append("--cpu=%s" % target.core.lower()[:-2])
glebiuskv 0:2f0e1e23c242 330 self.SHEBANG += " -mcpu=%s" % target.core.lower()[:-2]
glebiuskv 0:2f0e1e23c242 331 elif target.core.lower().endswith("f"):
glebiuskv 0:2f0e1e23c242 332 self.flags['common'].append("-mcpu=%s" % target.core.lower()[:-1])
glebiuskv 0:2f0e1e23c242 333 self.flags['ld'].append("--cpu=%s" % target.core.lower()[:-1])
glebiuskv 0:2f0e1e23c242 334 self.SHEBANG += " -mcpu=%s" % target.core.lower()[:-1]
glebiuskv 0:2f0e1e23c242 335 elif target.core.lower().endswith("ns"):
glebiuskv 0:2f0e1e23c242 336 self.flags['common'].append("-mcpu=%s" % target.core.lower()[:-3])
glebiuskv 0:2f0e1e23c242 337 self.flags['ld'].append("--cpu=%s" % target.core.lower()[:-3])
glebiuskv 0:2f0e1e23c242 338 self.SHEBANG += " -mcpu=%s" % target.core.lower()[:-3]
glebiuskv 0:2f0e1e23c242 339 else:
glebiuskv 0:2f0e1e23c242 340 self.flags['common'].append("-mcpu=%s" % target.core.lower())
glebiuskv 0:2f0e1e23c242 341 self.flags['ld'].append("--cpu=%s" % target.core.lower())
glebiuskv 0:2f0e1e23c242 342 self.SHEBANG += " -mcpu=%s" % target.core.lower()
glebiuskv 0:2f0e1e23c242 343
glebiuskv 0:2f0e1e23c242 344 if target.core == "Cortex-M4F":
glebiuskv 0:2f0e1e23c242 345 self.flags['common'].append("-mfpu=fpv4-sp-d16")
glebiuskv 0:2f0e1e23c242 346 self.flags['common'].append("-mfloat-abi=hard")
glebiuskv 0:2f0e1e23c242 347 elif target.core == "Cortex-M7F":
glebiuskv 0:2f0e1e23c242 348 self.flags['common'].append("-mfpu=fpv5-sp-d16")
glebiuskv 0:2f0e1e23c242 349 self.flags['common'].append("-mfloat-abi=softfp")
glebiuskv 0:2f0e1e23c242 350 elif target.core == "Cortex-M7FD":
glebiuskv 0:2f0e1e23c242 351 self.flags['common'].append("-mfpu=fpv5-d16")
glebiuskv 0:2f0e1e23c242 352 self.flags['common'].append("-mfloat-abi=softfp")
glebiuskv 0:2f0e1e23c242 353 elif target.core.startswith("Cortex-M23"):
glebiuskv 0:2f0e1e23c242 354 self.flags['common'].append("-march=armv8-m.base")
glebiuskv 0:2f0e1e23c242 355 elif target.core.startswith("Cortex-M33"):
glebiuskv 0:2f0e1e23c242 356 self.flags['common'].append("-march=armv8-m.main")
glebiuskv 0:2f0e1e23c242 357
glebiuskv 0:2f0e1e23c242 358 if target.core == "Cortex-M23" or target.core == "Cortex-M33":
glebiuskv 0:2f0e1e23c242 359 self.flags['common'].append("-mcmse")
glebiuskv 0:2f0e1e23c242 360
glebiuskv 0:2f0e1e23c242 361 # Create Secure library
glebiuskv 0:2f0e1e23c242 362 if target.core == "Cortex-M23" or self.target.core == "Cortex-M33":
glebiuskv 0:2f0e1e23c242 363 build_dir = kwargs['build_dir']
glebiuskv 0:2f0e1e23c242 364 secure_file = join(build_dir, "cmse_lib.o")
glebiuskv 0:2f0e1e23c242 365 self.flags["ld"] += ["--import_cmse_lib_out=%s" % secure_file]
glebiuskv 0:2f0e1e23c242 366
glebiuskv 0:2f0e1e23c242 367 asm_cpu = {
glebiuskv 0:2f0e1e23c242 368 "Cortex-M0+": "Cortex-M0",
glebiuskv 0:2f0e1e23c242 369 "Cortex-M4F": "Cortex-M4.fp",
glebiuskv 0:2f0e1e23c242 370 "Cortex-M7F": "Cortex-M7.fp.sp",
glebiuskv 0:2f0e1e23c242 371 "Cortex-M7FD": "Cortex-M7.fp.dp",
glebiuskv 0:2f0e1e23c242 372 "Cortex-M23-NS": "Cortex-M23",
glebiuskv 0:2f0e1e23c242 373 "Cortex-M33-NS": "Cortex-M33" }.get(target.core, target.core)
glebiuskv 0:2f0e1e23c242 374
glebiuskv 0:2f0e1e23c242 375 self.flags['asm'].append("--cpu=%s" % asm_cpu)
glebiuskv 0:2f0e1e23c242 376
glebiuskv 0:2f0e1e23c242 377 self.cc = ([join(TOOLCHAIN_PATHS["ARMC6"], "armclang")] +
glebiuskv 0:2f0e1e23c242 378 self.flags['common'] + self.flags['c'])
glebiuskv 0:2f0e1e23c242 379 self.cppc = ([join(TOOLCHAIN_PATHS["ARMC6"], "armclang")] +
glebiuskv 0:2f0e1e23c242 380 self.flags['common'] + self.flags['cxx'])
glebiuskv 0:2f0e1e23c242 381 self.asm = [join(TOOLCHAIN_PATHS["ARMC6"], "armasm")] + self.flags['asm']
glebiuskv 0:2f0e1e23c242 382 self.ld = [join(TOOLCHAIN_PATHS["ARMC6"], "armlink")] + self.flags['ld']
glebiuskv 0:2f0e1e23c242 383 self.ar = [join(TOOLCHAIN_PATHS["ARMC6"], "armar")]
glebiuskv 0:2f0e1e23c242 384 self.elf2bin = join(TOOLCHAIN_PATHS["ARMC6"], "fromelf")
glebiuskv 0:2f0e1e23c242 385
glebiuskv 0:2f0e1e23c242 386 def parse_dependencies(self, dep_path):
glebiuskv 0:2f0e1e23c242 387 return mbedToolchain.parse_dependencies(self, dep_path)
glebiuskv 0:2f0e1e23c242 388
glebiuskv 0:2f0e1e23c242 389 def is_not_supported_error(self, output):
glebiuskv 0:2f0e1e23c242 390 return "#error [NOT_SUPPORTED]" in output
glebiuskv 0:2f0e1e23c242 391
glebiuskv 0:2f0e1e23c242 392 def parse_output(self, output):
glebiuskv 0:2f0e1e23c242 393 pass
glebiuskv 0:2f0e1e23c242 394
glebiuskv 0:2f0e1e23c242 395 def get_config_option(self, config_header):
glebiuskv 0:2f0e1e23c242 396 return ["-include", config_header]
glebiuskv 0:2f0e1e23c242 397
glebiuskv 0:2f0e1e23c242 398 def get_compile_options(self, defines, includes, for_asm=False):
glebiuskv 0:2f0e1e23c242 399 opts = ['-D%s' % d for d in defines]
glebiuskv 0:2f0e1e23c242 400 opts.extend(["-I%s" % i for i in includes])
glebiuskv 0:2f0e1e23c242 401 if for_asm:
glebiuskv 0:2f0e1e23c242 402 return ["--cpreproc",
glebiuskv 0:2f0e1e23c242 403 "--cpreproc_opts=%s" % ",".join(self.flags['common'] + opts)]
glebiuskv 0:2f0e1e23c242 404 else:
glebiuskv 0:2f0e1e23c242 405 config_header = self.get_config_header()
glebiuskv 0:2f0e1e23c242 406 if config_header:
glebiuskv 0:2f0e1e23c242 407 opts.extend(self.get_config_option(config_header))
glebiuskv 0:2f0e1e23c242 408 return opts
glebiuskv 0:2f0e1e23c242 409
glebiuskv 0:2f0e1e23c242 410 @hook_tool
glebiuskv 0:2f0e1e23c242 411 def assemble(self, source, object, includes):
glebiuskv 0:2f0e1e23c242 412 cmd_pre = copy(self.asm)
glebiuskv 0:2f0e1e23c242 413 cmd_pre.extend(self.get_compile_options(
glebiuskv 0:2f0e1e23c242 414 self.get_symbols(True), includes, for_asm=True))
glebiuskv 0:2f0e1e23c242 415 cmd_pre.extend(["-o", object, source])
glebiuskv 0:2f0e1e23c242 416 return [self.hook.get_cmdline_assembler(cmd_pre)]
glebiuskv 0:2f0e1e23c242 417
glebiuskv 0:2f0e1e23c242 418 @hook_tool
glebiuskv 0:2f0e1e23c242 419 def compile(self, cc, source, object, includes):
glebiuskv 0:2f0e1e23c242 420 cmd = copy(cc)
glebiuskv 0:2f0e1e23c242 421 cmd.extend(self.get_compile_options(self.get_symbols(), includes))
glebiuskv 0:2f0e1e23c242 422 cmd.extend(["-o", object, source])
glebiuskv 0:2f0e1e23c242 423 cmd = self.hook.get_cmdline_compiler(cmd)
glebiuskv 0:2f0e1e23c242 424 return [cmd]