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@7510:0446c506f41a, 2016-08-16 (annotated)
- 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?
| 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 |
| 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"] |