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