ST / ST_Events-old

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Committer:
Brian Daniels
Date:
Tue Aug 16 12:34:18 2016 -0500
Revision:
7510:0446c506f41a
Parent:
7371:4c352cc17ba8
Child:
7514:a0c71f3f3d2f
Fixing issue where GCC fails to report compile errors when non-verbose

The output of the GCC compiler is such that the toolchain regex sometimes
got hung up on the ':' charcter being printed in front of the drive letter when
running on Windows. This PR changes the matching logic to be more flexible
by using 'search' to check the entire string for a match, not just the
beginning of the string.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mihail Stoyanov 6350:fd14088de4ac 1 """
Mihail Stoyanov 6350:fd14088de4ac 2 mbed SDK
Mihail Stoyanov 6350:fd14088de4ac 3 Copyright (c) 2011-2013 ARM Limited
Mihail Stoyanov 6350:fd14088de4ac 4
Mihail Stoyanov 6350:fd14088de4ac 5 Licensed under the Apache License, Version 2.0 (the "License");
Mihail Stoyanov 6350:fd14088de4ac 6 you may not use this file except in compliance with the License.
Mihail Stoyanov 6350:fd14088de4ac 7 You may obtain a copy of the License at
Mihail Stoyanov 6350:fd14088de4ac 8
Mihail Stoyanov 6350:fd14088de4ac 9 http://www.apache.org/licenses/LICENSE-2.0
Mihail Stoyanov 6350:fd14088de4ac 10
Mihail Stoyanov 6350:fd14088de4ac 11 Unless required by applicable law or agreed to in writing, software
Mihail Stoyanov 6350:fd14088de4ac 12 distributed under the License is distributed on an "AS IS" BASIS,
Mihail Stoyanov 6350:fd14088de4ac 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Mihail Stoyanov 6350:fd14088de4ac 14 See the License for the specific language governing permissions and
Mihail Stoyanov 6350:fd14088de4ac 15 limitations under the License.
Mihail Stoyanov 6350:fd14088de4ac 16 """
Mihail Stoyanov 6350:fd14088de4ac 17 import re
Mihail Stoyanov 6355:86cd49f38a3e 18 from os.path import join, basename, splitext, dirname, exists
Mihail Stoyanov 6350:fd14088de4ac 19
Mihail Stoyanov 6980:b26b840b75aa 20 from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
Mihail Stoyanov 6350:fd14088de4ac 21 from tools.hooks import hook_tool
Mihail Stoyanov 6350:fd14088de4ac 22
Mihail Stoyanov 6350:fd14088de4ac 23 class GCC(mbedToolchain):
Mihail Stoyanov 6350:fd14088de4ac 24 LINKER_EXT = '.ld'
Mihail Stoyanov 6350:fd14088de4ac 25 LIBRARY_EXT = '.a'
Mihail Stoyanov 6350:fd14088de4ac 26
Mihail Stoyanov 6350:fd14088de4ac 27 STD_LIB_NAME = "lib%s.a"
Mihail Stoyanov 6359:00ee81ac1c20 28 DIAGNOSTIC_PATTERN = re.compile('((?P<file>[^:]+):(?P<line>\d+):)(\d+:)? (?P<severity>warning|error): (?P<message>.+)')
Mihail Stoyanov 6980:b26b840b75aa 29 INDEX_PATTERN = re.compile('(?P<col>\s*)\^')
Mihail Stoyanov 6350:fd14088de4ac 30
Jimmy Brisson 6401:0edea5185bb1 31 DEFAULT_FLAGS = {
Jimmy Brisson 6401:0edea5185bb1 32 'common': ["-c", "-Wall", "-Wextra",
Jimmy Brisson 6401:0edea5185bb1 33 "-Wno-unused-parameter", "-Wno-missing-field-initializers",
Jimmy Brisson 6401:0edea5185bb1 34 "-fmessage-length=0", "-fno-exceptions", "-fno-builtin",
Jimmy Brisson 6403:ecff602aaa32 35 "-ffunction-sections", "-fdata-sections", "-funsigned-char",
Jimmy Brisson 6401:0edea5185bb1 36 "-MMD", "-fno-delete-null-pointer-checks", "-fomit-frame-pointer"
Jimmy Brisson 6401:0edea5185bb1 37 ],
Jimmy Brisson 6401:0edea5185bb1 38 'asm': ["-x", "assembler-with-cpp"],
Jimmy Brisson 6401:0edea5185bb1 39 'c': ["-std=gnu99"],
Kevin Bracey 6599:5bb9644532b8 40 'cxx': ["-std=gnu++98", "-fno-rtti", "-Wvla"],
Jimmy Brisson 6401:0edea5185bb1 41 'ld': ["-Wl,--gc-sections", "-Wl,--wrap,main",
Jimmy Brisson 6401:0edea5185bb1 42 "-Wl,--wrap,_malloc_r", "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r"],
Jimmy Brisson 6401:0edea5185bb1 43 }
Jimmy Brisson 6401:0edea5185bb1 44
Mihail Stoyanov 6350:fd14088de4ac 45 def __init__(self, target, options=None, notify=None, macros=None, silent=False, tool_path="", extra_verbose=False):
Mihail Stoyanov 6350:fd14088de4ac 46 mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)
Mihail Stoyanov 6350:fd14088de4ac 47
Mihail Stoyanov 6350:fd14088de4ac 48 if target.core == "Cortex-M0+":
Mihail Stoyanov 6350:fd14088de4ac 49 cpu = "cortex-m0plus"
0xc0170 6962:bf39d414c367 50 elif target.core == "Cortex-M4F":
0xc0170 6962:bf39d414c367 51 cpu = "cortex-m4"
0xc0170 6962:bf39d414c367 52 elif target.core == "Cortex-M7F":
0xc0170 6962:bf39d414c367 53 cpu = "cortex-m7"
0xc0170 6962:bf39d414c367 54 elif target.core == "Cortex-M7FD":
0xc0170 6962:bf39d414c367 55 cpu = "cortex-m7"
Mihail Stoyanov 6350:fd14088de4ac 56 else:
Mihail Stoyanov 6350:fd14088de4ac 57 cpu = target.core.lower()
Mihail Stoyanov 6350:fd14088de4ac 58
Mihail Stoyanov 6350:fd14088de4ac 59 self.cpu = ["-mcpu=%s" % cpu]
Mihail Stoyanov 6350:fd14088de4ac 60 if target.core.startswith("Cortex"):
Mihail Stoyanov 6350:fd14088de4ac 61 self.cpu.append("-mthumb")
Mihail Stoyanov 6350:fd14088de4ac 62
0xc0170 6962:bf39d414c367 63 # FPU handling, M7 possibly to have double FPU
0xc0170 6962:bf39d414c367 64 if target.core == "Cortex-M4F":
Mihail Stoyanov 6350:fd14088de4ac 65 self.cpu.append("-mfpu=fpv4-sp-d16")
Mihail Stoyanov 6350:fd14088de4ac 66 self.cpu.append("-mfloat-abi=softfp")
0xc0170 6962:bf39d414c367 67 elif target.core == "Cortex-M7F":
0xc0170 6962:bf39d414c367 68 self.cpu.append("-mfpu=fpv5-sp-d16")
0xc0170 6962:bf39d414c367 69 self.cpu.append("-mfloat-abi=softfp")
0xc0170 6962:bf39d414c367 70 elif target.core == "Cortex-M7FD":
0xc0170 6962:bf39d414c367 71 self.cpu.append("-mfpu=fpv5-d16")
0xc0170 6962:bf39d414c367 72 self.cpu.append("-mfloat-abi=softfp")
Olaf Hagendorf 6803:3ebc5419b948 73
Olaf Hagendorf 6803:3ebc5419b948 74
Mihail Stoyanov 6350:fd14088de4ac 75
Mihail Stoyanov 6350:fd14088de4ac 76 if target.core == "Cortex-A9":
Mihail Stoyanov 6350:fd14088de4ac 77 self.cpu.append("-mthumb-interwork")
Mihail Stoyanov 6350:fd14088de4ac 78 self.cpu.append("-marm")
Mihail Stoyanov 6350:fd14088de4ac 79 self.cpu.append("-march=armv7-a")
Mihail Stoyanov 6350:fd14088de4ac 80 self.cpu.append("-mfpu=vfpv3")
Mihail Stoyanov 6350:fd14088de4ac 81 self.cpu.append("-mfloat-abi=hard")
Mihail Stoyanov 6350:fd14088de4ac 82 self.cpu.append("-mno-unaligned-access")
Mihail Stoyanov 6350:fd14088de4ac 83
Mihail Stoyanov 6350:fd14088de4ac 84
Mihail Stoyanov 6350:fd14088de4ac 85 # Note: We are using "-O2" instead of "-Os" to avoid this known GCC bug:
Mihail Stoyanov 6350:fd14088de4ac 86 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46762
Jimmy Brisson 6401:0edea5185bb1 87 self.flags["common"] += self.cpu
Mihail Stoyanov 6350:fd14088de4ac 88
Mihail Stoyanov 6350:fd14088de4ac 89 if "save-asm" in self.options:
Jimmy Brisson 6401:0edea5185bb1 90 self.flags["common"].append("-save-temps")
Mihail Stoyanov 6350:fd14088de4ac 91
Mihail Stoyanov 6350:fd14088de4ac 92 if "debug-info" in self.options:
Jimmy Brisson 6401:0edea5185bb1 93 self.flags["common"].append("-g")
Jimmy Brisson 6401:0edea5185bb1 94 self.flags["common"].append("-O0")
Mihail Stoyanov 6350:fd14088de4ac 95 else:
Yogesh Pande 6967:012b075b6814 96 self.flags["common"].append("-Os")
Mihail Stoyanov 6350:fd14088de4ac 97
Mihail Stoyanov 6350:fd14088de4ac 98 main_cc = join(tool_path, "arm-none-eabi-gcc")
Mihail Stoyanov 6350:fd14088de4ac 99 main_cppc = join(tool_path, "arm-none-eabi-g++")
Jimmy Brisson 6401:0edea5185bb1 100 self.asm = [main_cc] + self.flags['asm'] + self.flags["common"]
Mihail Stoyanov 6980:b26b840b75aa 101 self.cc = [main_cc]
Mihail Stoyanov 6980:b26b840b75aa 102 self.cppc =[main_cppc]
Jimmy Brisson 6401:0edea5185bb1 103 self.cc += self.flags['c'] + self.flags['common']
Jimmy Brisson 6401:0edea5185bb1 104 self.cppc += self.flags['cxx'] + self.flags['common']
Mihail Stoyanov 6350:fd14088de4ac 105
Jimmy Brisson 6401:0edea5185bb1 106 self.flags['ld'] += self.cpu
Jimmy Brisson 6401:0edea5185bb1 107 self.ld = [join(tool_path, "arm-none-eabi-gcc")] + self.flags['ld']
Mihail Stoyanov 6350:fd14088de4ac 108 self.sys_libs = ["stdc++", "supc++", "m", "c", "gcc"]
Mihail Stoyanov 6350:fd14088de4ac 109
Mihail Stoyanov 6350:fd14088de4ac 110 self.ar = join(tool_path, "arm-none-eabi-ar")
Mihail Stoyanov 6350:fd14088de4ac 111 self.elf2bin = join(tool_path, "arm-none-eabi-objcopy")
Mihail Stoyanov 6350:fd14088de4ac 112
Mihail Stoyanov 6350:fd14088de4ac 113 def parse_dependencies(self, dep_path):
Mihail Stoyanov 6350:fd14088de4ac 114 dependencies = []
Mihail Stoyanov 6355:86cd49f38a3e 115 buff = open(dep_path).readlines()
Mihail Stoyanov 6355:86cd49f38a3e 116 buff[0] = re.sub('^(.*?)\: ', '', buff[0])
Mihail Stoyanov 6355:86cd49f38a3e 117 for line in buff:
Mihail Stoyanov 6350:fd14088de4ac 118 file = line.replace('\\\n', '').strip()
Mihail Stoyanov 6350:fd14088de4ac 119 if file:
Mihail Stoyanov 6350:fd14088de4ac 120 # GCC might list more than one dependency on a single line, in this case
Mihail Stoyanov 6350:fd14088de4ac 121 # the dependencies are separated by a space. However, a space might also
Mihail Stoyanov 6350:fd14088de4ac 122 # indicate an actual space character in a dependency path, but in this case
Mihail Stoyanov 6350:fd14088de4ac 123 # the space character is prefixed by a backslash.
Mihail Stoyanov 6350:fd14088de4ac 124 # Temporary replace all '\ ' with a special char that is not used (\a in this
Mihail Stoyanov 6350:fd14088de4ac 125 # case) to keep them from being interpreted by 'split' (they will be converted
Mihail Stoyanov 6350:fd14088de4ac 126 # back later to a space char)
Mihail Stoyanov 6350:fd14088de4ac 127 file = file.replace('\\ ', '\a')
Mihail Stoyanov 6350:fd14088de4ac 128 if file.find(" ") == -1:
Mihail Stoyanov 6980:b26b840b75aa 129 dependencies.append((self.CHROOT if self.CHROOT else '') + file.replace('\a', ' '))
Mihail Stoyanov 6350:fd14088de4ac 130 else:
Mihail Stoyanov 6980:b26b840b75aa 131 dependencies = dependencies + [(self.CHROOT if self.CHROOT else '') + f.replace('\a', ' ') for f in file.split(" ")]
Mihail Stoyanov 6350:fd14088de4ac 132 return dependencies
Mihail Stoyanov 6350:fd14088de4ac 133
Mihail Stoyanov 6350:fd14088de4ac 134 def is_not_supported_error(self, output):
Mihail Stoyanov 6350:fd14088de4ac 135 return "error: #error [NOT_SUPPORTED]" in output
Mihail Stoyanov 6350:fd14088de4ac 136
Mihail Stoyanov 6350:fd14088de4ac 137 def parse_output(self, output):
Mihail Stoyanov 6350:fd14088de4ac 138 # The warning/error notification is multiline
Mihail Stoyanov 6980:b26b840b75aa 139 msg = None
Mihail Stoyanov 6350:fd14088de4ac 140 for line in output.splitlines():
Brian Daniels 7510:0446c506f41a 141 match = GCC.DIAGNOSTIC_PATTERN.search(line)
Mihail Stoyanov 6359:00ee81ac1c20 142 if match is not None:
Mihail Stoyanov 6980:b26b840b75aa 143 if msg is not None:
Mihail Stoyanov 6980:b26b840b75aa 144 self.cc_info(msg)
Mihail Stoyanov 6980:b26b840b75aa 145 msg = {
Mihail Stoyanov 6980:b26b840b75aa 146 'severity': match.group('severity').lower(),
Mihail Stoyanov 6980:b26b840b75aa 147 'file': match.group('file'),
Mihail Stoyanov 6980:b26b840b75aa 148 'line': match.group('line'),
Mihail Stoyanov 6980:b26b840b75aa 149 'col': 0,
Mihail Stoyanov 6980:b26b840b75aa 150 'message': match.group('message'),
Mihail Stoyanov 6980:b26b840b75aa 151 'text': '',
Mihail Stoyanov 6980:b26b840b75aa 152 'target_name': self.target.name,
Mihail Stoyanov 6980:b26b840b75aa 153 'toolchain_name': self.name
Mihail Stoyanov 6980:b26b840b75aa 154 }
Mihail Stoyanov 6980:b26b840b75aa 155 elif msg is not None:
Mihail Stoyanov 6981:0381c344fb94 156 # Determine the warning/error column by calculating the ^ position
Mihail Stoyanov 6980:b26b840b75aa 157 match = GCC.INDEX_PATTERN.match(line)
Mihail Stoyanov 6980:b26b840b75aa 158 if match is not None:
Mihail Stoyanov 6980:b26b840b75aa 159 msg['col'] = len(match.group('col'))
Mihail Stoyanov 6980:b26b840b75aa 160 self.cc_info(msg)
Mihail Stoyanov 6980:b26b840b75aa 161 msg = None
Mihail Stoyanov 6980:b26b840b75aa 162 else:
Mihail Stoyanov 6980:b26b840b75aa 163 msg['text'] += line+"\n"
Mihail Stoyanov 6350:fd14088de4ac 164
Mihail Stoyanov 6355:86cd49f38a3e 165 def get_dep_option(self, object):
Mihail Stoyanov 6355:86cd49f38a3e 166 base, _ = splitext(object)
Mihail Stoyanov 6355:86cd49f38a3e 167 dep_path = base + '.d'
Mihail Stoyanov 6355:86cd49f38a3e 168 return ["-MD", "-MF", dep_path]
Mihail Stoyanov 6355:86cd49f38a3e 169
Jimmy Brisson 6639:7310555173f0 170 def get_config_option(self, config_header):
Jimmy Brisson 6639:7310555173f0 171 return ['-include', config_header]
Jimmy Brisson 6639:7310555173f0 172
Mihail Stoyanov 7371:4c352cc17ba8 173 def get_compile_options(self, defines, includes, for_asm=False):
Mihail Stoyanov 6980:b26b840b75aa 174 opts = ['-D%s' % d for d in defines]
Mihail Stoyanov 6980:b26b840b75aa 175 if self.RESPONSE_FILES:
Mihail Stoyanov 6980:b26b840b75aa 176 opts += ['@%s' % self.get_inc_file(includes)]
Mihail Stoyanov 6980:b26b840b75aa 177 else:
Mihail Stoyanov 6980:b26b840b75aa 178 opts += ["-I%s" % i for i in includes]
Mihail Stoyanov 6980:b26b840b75aa 179
Mihail Stoyanov 7371:4c352cc17ba8 180 if not for_asm:
Mihail Stoyanov 7371:4c352cc17ba8 181 config_header = self.get_config_header()
Mihail Stoyanov 7371:4c352cc17ba8 182 if config_header is not None:
Mihail Stoyanov 7371:4c352cc17ba8 183 opts = opts + self.get_config_option(config_header)
Bogdan Marinescu 6530:98ce08655513 184 return opts
Mihail Stoyanov 6355:86cd49f38a3e 185
Mihail Stoyanov 6355:86cd49f38a3e 186 @hook_tool
Mihail Stoyanov 6355:86cd49f38a3e 187 def assemble(self, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 188 # Build assemble command
Mihail Stoyanov 7371:4c352cc17ba8 189 cmd = self.asm + self.get_compile_options(self.get_symbols(True), includes) + ["-o", object, source]
Mihail Stoyanov 6355:86cd49f38a3e 190
Mihail Stoyanov 6355:86cd49f38a3e 191 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 192 cmd = self.hook.get_cmdline_assembler(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 193
Mihail Stoyanov 6355:86cd49f38a3e 194 # Return command array, don't execute
Mihail Stoyanov 6355:86cd49f38a3e 195 return [cmd]
Mihail Stoyanov 6350:fd14088de4ac 196
Mihail Stoyanov 6355:86cd49f38a3e 197 @hook_tool
Mihail Stoyanov 6355:86cd49f38a3e 198 def compile(self, cc, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 199 # Build compile command
Mihail Stoyanov 6355:86cd49f38a3e 200 cmd = cc + self.get_compile_options(self.get_symbols(), includes)
Mihail Stoyanov 6355:86cd49f38a3e 201
Mihail Stoyanov 6355:86cd49f38a3e 202 cmd.extend(self.get_dep_option(object))
Mihail Stoyanov 6355:86cd49f38a3e 203
Mihail Stoyanov 6355:86cd49f38a3e 204 cmd.extend(["-o", object, source])
Vincenzo Frascino 6393:b4fa50caddef 205
Mihail Stoyanov 6355:86cd49f38a3e 206 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 207 cmd = self.hook.get_cmdline_compiler(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 208
Mihail Stoyanov 6355:86cd49f38a3e 209 return [cmd]
Mihail Stoyanov 6355:86cd49f38a3e 210
Mihail Stoyanov 6355:86cd49f38a3e 211 def compile_c(self, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 212 return self.compile(self.cc, source, object, includes)
Mihail Stoyanov 6355:86cd49f38a3e 213
Mihail Stoyanov 6355:86cd49f38a3e 214 def compile_cpp(self, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 215 return self.compile(self.cppc, source, object, includes)
Mihail Stoyanov 6355:86cd49f38a3e 216
Mihail Stoyanov 6355:86cd49f38a3e 217 @hook_tool
Mihail Stoyanov 6350:fd14088de4ac 218 def link(self, output, objects, libraries, lib_dirs, mem_map):
Mihail Stoyanov 6350:fd14088de4ac 219 libs = []
Mihail Stoyanov 6350:fd14088de4ac 220 for l in libraries:
Mihail Stoyanov 6350:fd14088de4ac 221 name, _ = splitext(basename(l))
Mihail Stoyanov 6350:fd14088de4ac 222 libs.append("-l%s" % name[3:])
Mihail Stoyanov 6350:fd14088de4ac 223 libs.extend(["-l%s" % l for l in self.sys_libs])
Vincenzo Frascino 6393:b4fa50caddef 224
Mihail Stoyanov 6355:86cd49f38a3e 225 # Build linker command
Mihail Stoyanov 6355:86cd49f38a3e 226 map_file = splitext(output)[0] + ".map"
Mihail Stoyanov 6355:86cd49f38a3e 227 cmd = self.ld + ["-o", output, "-Wl,-Map=%s" % map_file] + objects + ["-Wl,--start-group"] + libs + ["-Wl,--end-group"]
Mihail Stoyanov 6355:86cd49f38a3e 228 if mem_map:
Mihail Stoyanov 6355:86cd49f38a3e 229 cmd.extend(['-T', mem_map])
Vincenzo Frascino 6393:b4fa50caddef 230
Mihail Stoyanov 6355:86cd49f38a3e 231 for L in lib_dirs:
Mihail Stoyanov 6355:86cd49f38a3e 232 cmd.extend(['-L', L])
Mihail Stoyanov 6355:86cd49f38a3e 233 cmd.extend(libs)
Mihail Stoyanov 6350:fd14088de4ac 234
Mihail Stoyanov 6355:86cd49f38a3e 235 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 236 cmd = self.hook.get_cmdline_linker(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 237
Mihail Stoyanov 6980:b26b840b75aa 238 if self.RESPONSE_FILES:
Mihail Stoyanov 6980:b26b840b75aa 239 # Split link command to linker executable + response file
Mihail Stoyanov 6355:86cd49f38a3e 240 cmd_linker = cmd[0]
Mihail Stoyanov 6980:b26b840b75aa 241 link_files = self.get_link_file(cmd[1:])
Mihail Stoyanov 6980:b26b840b75aa 242 cmd = [cmd_linker, "@%s" % link_files]
Mihail Stoyanov 6355:86cd49f38a3e 243
Mihail Stoyanov 6355:86cd49f38a3e 244 # Exec command
Mihail Stoyanov 6980:b26b840b75aa 245 self.cc_verbose("Link: %s" % ' '.join(cmd))
Mihail Stoyanov 6980:b26b840b75aa 246 self.default_cmd(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 247
Mihail Stoyanov 6355:86cd49f38a3e 248 @hook_tool
Mihail Stoyanov 6355:86cd49f38a3e 249 def archive(self, objects, lib_path):
Mihail Stoyanov 6980:b26b840b75aa 250 if self.RESPONSE_FILES:
Mihail Stoyanov 6980:b26b840b75aa 251 param = ["@%s" % self.get_arch_file(objects)]
Mihail Stoyanov 6980:b26b840b75aa 252 else:
Mihail Stoyanov 6980:b26b840b75aa 253 param = objects
Mihail Stoyanov 6355:86cd49f38a3e 254
Mihail Stoyanov 6355:86cd49f38a3e 255 # Exec command
Mihail Stoyanov 6980:b26b840b75aa 256 self.default_cmd([self.ar, 'rcs', lib_path] + param)
Mihail Stoyanov 6350:fd14088de4ac 257
Mihail Stoyanov 6350:fd14088de4ac 258 @hook_tool
Mihail Stoyanov 6350:fd14088de4ac 259 def binary(self, resources, elf, bin):
Mihail Stoyanov 6355:86cd49f38a3e 260 # Build binary command
Mihail Stoyanov 6355:86cd49f38a3e 261 cmd = [self.elf2bin, "-O", "binary", elf, bin]
Mihail Stoyanov 6355:86cd49f38a3e 262
Mihail Stoyanov 6355:86cd49f38a3e 263 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 264 cmd = self.hook.get_cmdline_binary(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 265
Mihail Stoyanov 6355:86cd49f38a3e 266 # Exec command
Mihail Stoyanov 6980:b26b840b75aa 267 self.cc_verbose("FromELF: %s" % ' '.join(cmd))
Mihail Stoyanov 6355:86cd49f38a3e 268 self.default_cmd(cmd)
Mihail Stoyanov 6350:fd14088de4ac 269
Mihail Stoyanov 6350:fd14088de4ac 270
Mihail Stoyanov 6350:fd14088de4ac 271 class GCC_ARM(GCC):
Mihail Stoyanov 6350:fd14088de4ac 272 def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
Mihail Stoyanov 6980:b26b840b75aa 273 GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_ARM'], extra_verbose=extra_verbose)
Mihail Stoyanov 6350:fd14088de4ac 274
Mihail Stoyanov 6350:fd14088de4ac 275 # Use latest gcc nanolib
Russ Butler 6386:292843bb388f 276 if "big-build" in self.options:
Russ Butler 6386:292843bb388f 277 use_nano = False
Russ Butler 6386:292843bb388f 278 elif "small-build" in self.options:
Russ Butler 6386:292843bb388f 279 use_nano = True
Russ Butler 6386:292843bb388f 280 elif target.default_build == "standard":
Russ Butler 6386:292843bb388f 281 use_nano = False
Russ Butler 6386:292843bb388f 282 elif target.default_build == "small":
Russ Butler 6386:292843bb388f 283 use_nano = True
Russ Butler 6386:292843bb388f 284 else:
Russ Butler 6386:292843bb388f 285 use_nano = False
Russ Butler 6386:292843bb388f 286
Russ Butler 6386:292843bb388f 287 if use_nano:
Mihail Stoyanov 6350:fd14088de4ac 288 self.ld.append("--specs=nano.specs")
Olaf Hagendorf 6826:e17692595e2b 289 self.flags['ld'].append("--specs=nano.specs")
Russ Butler 6386:292843bb388f 290 self.cc += ["-DMBED_RTOS_SINGLE_THREAD"]
Russ Butler 6386:292843bb388f 291 self.cppc += ["-DMBED_RTOS_SINGLE_THREAD"]
Olaf Hagendorf 6826:e17692595e2b 292 self.macros.extend(["MBED_RTOS_SINGLE_THREAD"])
Mihail Stoyanov 6350:fd14088de4ac 293 self.sys_libs.append("nosys")
Mihail Stoyanov 6350:fd14088de4ac 294
Mihail Stoyanov 6350:fd14088de4ac 295
Mihail Stoyanov 6350:fd14088de4ac 296 class GCC_CR(GCC):
Mihail Stoyanov 6350:fd14088de4ac 297 def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
Mihail Stoyanov 6980:b26b840b75aa 298 GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_CR'], extra_verbose=extra_verbose)
Mihail Stoyanov 6350:fd14088de4ac 299
Mihail Stoyanov 6350:fd14088de4ac 300 additional_compiler_flags = [
Mihail Stoyanov 6350:fd14088de4ac 301 "-D__NEWLIB__", "-D__CODE_RED", "-D__USE_CMSIS", "-DCPP_USE_HEAP",
Mihail Stoyanov 6350:fd14088de4ac 302 ]
Mihail Stoyanov 6350:fd14088de4ac 303 self.cc += additional_compiler_flags
Mihail Stoyanov 6350:fd14088de4ac 304 self.cppc += additional_compiler_flags
Mihail Stoyanov 6350:fd14088de4ac 305
Mihail Stoyanov 6350:fd14088de4ac 306 # Use latest gcc nanolib
Mihail Stoyanov 6350:fd14088de4ac 307 self.ld.append("--specs=nano.specs")
Mihail Stoyanov 6350:fd14088de4ac 308 if target.name in ["LPC1768", "LPC4088", "LPC4088_DM", "LPC4330", "UBLOX_C027", "LPC2368"]:
Mihail Stoyanov 6350:fd14088de4ac 309 self.ld.extend(["-u _printf_float", "-u _scanf_float"])
Mihail Stoyanov 6350:fd14088de4ac 310 self.ld += ["-nostdlib"]