mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 """
be_bryan 0:b74591d5ab33 2 mbed SDK
be_bryan 0:b74591d5ab33 3 Copyright (c) 2011-2017 ARM Limited
be_bryan 0:b74591d5ab33 4
be_bryan 0:b74591d5ab33 5 Licensed under the Apache License, Version 2.0 (the "License");
be_bryan 0:b74591d5ab33 6 you may not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 7 You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 8
be_bryan 0:b74591d5ab33 9 http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 10
be_bryan 0:b74591d5ab33 11 Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 12 distributed under the License is distributed on an "AS IS" BASIS,
be_bryan 0:b74591d5ab33 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 14 See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 15 limitations under the License.
be_bryan 0:b74591d5ab33 16 """
be_bryan 0:b74591d5ab33 17
be_bryan 0:b74591d5ab33 18 from os.path import splitext, basename, join
be_bryan 0:b74591d5ab33 19 from tools.utils import mkdir
be_bryan 0:b74591d5ab33 20 from tools.export.gnuarmeclipse import GNUARMEclipse
be_bryan 0:b74591d5ab33 21 from tools.export.gnuarmeclipse import UID
be_bryan 0:b74591d5ab33 22 from tools.build_api import prepare_toolchain
be_bryan 0:b74591d5ab33 23 from sys import flags, platform
be_bryan 0:b74591d5ab33 24
be_bryan 0:b74591d5ab33 25 # Global random number generator instance.
be_bryan 0:b74591d5ab33 26 u = UID()
be_bryan 0:b74591d5ab33 27
be_bryan 0:b74591d5ab33 28
be_bryan 0:b74591d5ab33 29 class Sw4STM32(GNUARMEclipse):
be_bryan 0:b74591d5ab33 30 """
be_bryan 0:b74591d5ab33 31 Sw4STM32 class
be_bryan 0:b74591d5ab33 32 """
be_bryan 0:b74591d5ab33 33 NAME = 'Sw4STM32'
be_bryan 0:b74591d5ab33 34 TOOLCHAIN = 'GCC_ARM'
be_bryan 0:b74591d5ab33 35
be_bryan 0:b74591d5ab33 36 BOARDS = {
be_bryan 0:b74591d5ab33 37 'B96B_F446VE':
be_bryan 0:b74591d5ab33 38 {
be_bryan 0:b74591d5ab33 39 'name': 'B96B-F446VE',
be_bryan 0:b74591d5ab33 40 'mcuId': 'STM32F446VETx'
be_bryan 0:b74591d5ab33 41 },
be_bryan 0:b74591d5ab33 42 'DISCO_F051R8':
be_bryan 0:b74591d5ab33 43 {
be_bryan 0:b74591d5ab33 44 'name': 'STM32F0DISCOVERY',
be_bryan 0:b74591d5ab33 45 'mcuId': 'STM32F051R8Tx'
be_bryan 0:b74591d5ab33 46 },
be_bryan 0:b74591d5ab33 47 'DISCO_F303VC':
be_bryan 0:b74591d5ab33 48 {
be_bryan 0:b74591d5ab33 49 'name': 'STM32F3DISCOVERY',
be_bryan 0:b74591d5ab33 50 'mcuId': 'STM32F303VCTx'
be_bryan 0:b74591d5ab33 51 },
be_bryan 0:b74591d5ab33 52 'DISCO_F334C8':
be_bryan 0:b74591d5ab33 53 {
be_bryan 0:b74591d5ab33 54 'name': 'STM32F3348DISCOVERY',
be_bryan 0:b74591d5ab33 55 'mcuId': 'STM32F334C8Tx'
be_bryan 0:b74591d5ab33 56 },
be_bryan 0:b74591d5ab33 57 'DISCO_F401VC':
be_bryan 0:b74591d5ab33 58 {
be_bryan 0:b74591d5ab33 59 'name': 'STM32F401C-DISCO',
be_bryan 0:b74591d5ab33 60 'mcuId': 'STM32F401VCTx'
be_bryan 0:b74591d5ab33 61 },
be_bryan 0:b74591d5ab33 62 'DISCO_F407VG':
be_bryan 0:b74591d5ab33 63 {
be_bryan 0:b74591d5ab33 64 'name': 'STM32F4DISCOVERY',
be_bryan 0:b74591d5ab33 65 'mcuId': 'STM32F407VGTx'
be_bryan 0:b74591d5ab33 66 },
be_bryan 0:b74591d5ab33 67 'DISCO_F413ZH':
be_bryan 0:b74591d5ab33 68 {
be_bryan 0:b74591d5ab33 69 'name': 'DISCO_F413',
be_bryan 0:b74591d5ab33 70 'mcuId': 'STM32F413ZHTx'
be_bryan 0:b74591d5ab33 71 },
be_bryan 0:b74591d5ab33 72 'DISCO_F429ZI':
be_bryan 0:b74591d5ab33 73 {
be_bryan 0:b74591d5ab33 74 'name': 'STM32F429I-DISCO',
be_bryan 0:b74591d5ab33 75 'mcuId': 'STM32F429ZITx'
be_bryan 0:b74591d5ab33 76 },
be_bryan 0:b74591d5ab33 77 'DISCO_F469NI':
be_bryan 0:b74591d5ab33 78 {
be_bryan 0:b74591d5ab33 79 'name': 'DISCO-F469NI',
be_bryan 0:b74591d5ab33 80 'mcuId': 'STM32F469NIHx'
be_bryan 0:b74591d5ab33 81 },
be_bryan 0:b74591d5ab33 82 'DISCO_F746NG':
be_bryan 0:b74591d5ab33 83 {
be_bryan 0:b74591d5ab33 84 'name': 'STM32F746G-DISCO',
be_bryan 0:b74591d5ab33 85 'mcuId': 'STM32F746NGHx'
be_bryan 0:b74591d5ab33 86 },
be_bryan 0:b74591d5ab33 87 'DISCO_F769NI':
be_bryan 0:b74591d5ab33 88 {
be_bryan 0:b74591d5ab33 89 'name': 'DISCO-F769NI',
be_bryan 0:b74591d5ab33 90 'mcuId': 'STM32F769NIHx'
be_bryan 0:b74591d5ab33 91 },
be_bryan 0:b74591d5ab33 92 'DISCO_L053C8':
be_bryan 0:b74591d5ab33 93 {
be_bryan 0:b74591d5ab33 94 'name': 'STM32L0538DISCOVERY',
be_bryan 0:b74591d5ab33 95 'mcuId': 'STM32L053C8Tx'
be_bryan 0:b74591d5ab33 96 },
be_bryan 0:b74591d5ab33 97 'DISCO_L072CZ_LRWAN1':
be_bryan 0:b74591d5ab33 98 {
be_bryan 0:b74591d5ab33 99 'name': 'DISCO-L072CZ-LRWAN1',
be_bryan 0:b74591d5ab33 100 'mcuId': 'STM32L072CZTx'
be_bryan 0:b74591d5ab33 101 },
be_bryan 0:b74591d5ab33 102 'DISCO_L475VG_IOT01A':
be_bryan 0:b74591d5ab33 103 {
be_bryan 0:b74591d5ab33 104 'name': 'STM32L475G-DISCO',
be_bryan 0:b74591d5ab33 105 'mcuId': 'STM32L475VGTx'
be_bryan 0:b74591d5ab33 106 },
be_bryan 0:b74591d5ab33 107 'DISCO_L476VG':
be_bryan 0:b74591d5ab33 108 {
be_bryan 0:b74591d5ab33 109 'name': 'STM32L476G-DISCO',
be_bryan 0:b74591d5ab33 110 'mcuId': 'STM32L476VGTx'
be_bryan 0:b74591d5ab33 111 },
be_bryan 0:b74591d5ab33 112 'NUCLEO_F030R8':
be_bryan 0:b74591d5ab33 113 {
be_bryan 0:b74591d5ab33 114 'name': 'NUCLEO-F030R8',
be_bryan 0:b74591d5ab33 115 'mcuId': 'STM32F030R8Tx'
be_bryan 0:b74591d5ab33 116 },
be_bryan 0:b74591d5ab33 117 'NUCLEO_F031K6':
be_bryan 0:b74591d5ab33 118 {
be_bryan 0:b74591d5ab33 119 'name': 'NUCLEO-F031K6',
be_bryan 0:b74591d5ab33 120 'mcuId': 'STM32F031K6Tx'
be_bryan 0:b74591d5ab33 121 },
be_bryan 0:b74591d5ab33 122 'NUCLEO_F042K6':
be_bryan 0:b74591d5ab33 123 {
be_bryan 0:b74591d5ab33 124 'name': 'NUCLEO-F042K6',
be_bryan 0:b74591d5ab33 125 'mcuId': 'STM32F042K6Tx'
be_bryan 0:b74591d5ab33 126 },
be_bryan 0:b74591d5ab33 127 'NUCLEO_F070RB':
be_bryan 0:b74591d5ab33 128 {
be_bryan 0:b74591d5ab33 129 'name': 'NUCLEO-F070RB',
be_bryan 0:b74591d5ab33 130 'mcuId': 'STM32F070RBTx'
be_bryan 0:b74591d5ab33 131 },
be_bryan 0:b74591d5ab33 132 'NUCLEO_F072RB':
be_bryan 0:b74591d5ab33 133 {
be_bryan 0:b74591d5ab33 134 'name': 'NUCLEO-F072RB',
be_bryan 0:b74591d5ab33 135 'mcuId': 'STM32F072RBTx'
be_bryan 0:b74591d5ab33 136 },
be_bryan 0:b74591d5ab33 137 'NUCLEO_F091RC':
be_bryan 0:b74591d5ab33 138 {
be_bryan 0:b74591d5ab33 139 'name': 'NUCLEO-F091RC',
be_bryan 0:b74591d5ab33 140 'mcuId': 'STM32F091RCTx'
be_bryan 0:b74591d5ab33 141 },
be_bryan 0:b74591d5ab33 142 'NUCLEO_F103RB':
be_bryan 0:b74591d5ab33 143 {
be_bryan 0:b74591d5ab33 144 'name': 'NUCLEO-F103RB',
be_bryan 0:b74591d5ab33 145 'mcuId': 'STM32F103RBTx'
be_bryan 0:b74591d5ab33 146 },
be_bryan 0:b74591d5ab33 147 'NUCLEO_F207ZG':
be_bryan 0:b74591d5ab33 148 {
be_bryan 0:b74591d5ab33 149 'name': 'NUCLEO-F207ZG',
be_bryan 0:b74591d5ab33 150 'mcuId': 'STM32F207ZGTx'
be_bryan 0:b74591d5ab33 151 },
be_bryan 0:b74591d5ab33 152 'NUCLEO_F302R8':
be_bryan 0:b74591d5ab33 153 {
be_bryan 0:b74591d5ab33 154 'name': 'NUCLEO-F302R8',
be_bryan 0:b74591d5ab33 155 'mcuId': 'STM32F302R8Tx'
be_bryan 0:b74591d5ab33 156 },
be_bryan 0:b74591d5ab33 157 'NUCLEO_F303K8':
be_bryan 0:b74591d5ab33 158 {
be_bryan 0:b74591d5ab33 159 'name': 'NUCLEO-F303K8',
be_bryan 0:b74591d5ab33 160 'mcuId': 'STM32F303K8Tx'
be_bryan 0:b74591d5ab33 161 },
be_bryan 0:b74591d5ab33 162 'NUCLEO_F303RE':
be_bryan 0:b74591d5ab33 163 {
be_bryan 0:b74591d5ab33 164 'name': 'NUCLEO-F303RE',
be_bryan 0:b74591d5ab33 165 'mcuId': 'STM32F303RETx'
be_bryan 0:b74591d5ab33 166 },
be_bryan 0:b74591d5ab33 167 'NUCLEO_F303ZE':
be_bryan 0:b74591d5ab33 168 {
be_bryan 0:b74591d5ab33 169 'name': 'NUCLEO-F303ZE',
be_bryan 0:b74591d5ab33 170 'mcuId': 'STM32F303ZETx'
be_bryan 0:b74591d5ab33 171 },
be_bryan 0:b74591d5ab33 172 'NUCLEO_F334R8':
be_bryan 0:b74591d5ab33 173 {
be_bryan 0:b74591d5ab33 174 'name': 'NUCLEO-F334R8',
be_bryan 0:b74591d5ab33 175 'mcuId': 'STM32F334R8Tx'
be_bryan 0:b74591d5ab33 176 },
be_bryan 0:b74591d5ab33 177 'NUCLEO_F401RE':
be_bryan 0:b74591d5ab33 178 {
be_bryan 0:b74591d5ab33 179 'name': 'NUCLEO-F401RE',
be_bryan 0:b74591d5ab33 180 'mcuId': 'STM32F401RETx'
be_bryan 0:b74591d5ab33 181 },
be_bryan 0:b74591d5ab33 182 'NUCLEO_F410RB':
be_bryan 0:b74591d5ab33 183 {
be_bryan 0:b74591d5ab33 184 'name': 'NUCLEO-F410RB',
be_bryan 0:b74591d5ab33 185 'mcuId': 'STM32F410RBTx'
be_bryan 0:b74591d5ab33 186 },
be_bryan 0:b74591d5ab33 187 'NUCLEO_F411RE':
be_bryan 0:b74591d5ab33 188 {
be_bryan 0:b74591d5ab33 189 'name': 'NUCLEO-F411RE',
be_bryan 0:b74591d5ab33 190 'mcuId': 'STM32F411RETx'
be_bryan 0:b74591d5ab33 191 },
be_bryan 0:b74591d5ab33 192 'NUCLEO_F429ZI':
be_bryan 0:b74591d5ab33 193 {
be_bryan 0:b74591d5ab33 194 'name': 'NUCLEO-F429ZI',
be_bryan 0:b74591d5ab33 195 'mcuId': 'STM32F429ZITx'
be_bryan 0:b74591d5ab33 196 },
be_bryan 0:b74591d5ab33 197 'NUCLEO_F446RE':
be_bryan 0:b74591d5ab33 198 {
be_bryan 0:b74591d5ab33 199 'name': 'NUCLEO-F446RE',
be_bryan 0:b74591d5ab33 200 'mcuId': 'STM32F446RETx'
be_bryan 0:b74591d5ab33 201 },
be_bryan 0:b74591d5ab33 202 'NUCLEO_F446ZE':
be_bryan 0:b74591d5ab33 203 {
be_bryan 0:b74591d5ab33 204 'name': 'NUCLEO-F446ZE',
be_bryan 0:b74591d5ab33 205 'mcuId': 'STM32F446ZETx'
be_bryan 0:b74591d5ab33 206 },
be_bryan 0:b74591d5ab33 207 'NUCLEO_F746ZG':
be_bryan 0:b74591d5ab33 208 {
be_bryan 0:b74591d5ab33 209 'name': 'NUCLEO-F746ZG',
be_bryan 0:b74591d5ab33 210 'mcuId': 'STM32F746ZGTx'
be_bryan 0:b74591d5ab33 211 },
be_bryan 0:b74591d5ab33 212 'NUCLEO_F767ZI':
be_bryan 0:b74591d5ab33 213 {
be_bryan 0:b74591d5ab33 214 'name': 'NUCLEO-F767ZI',
be_bryan 0:b74591d5ab33 215 'mcuId': 'STM32F767ZITx'
be_bryan 0:b74591d5ab33 216 },
be_bryan 0:b74591d5ab33 217 'NUCLEO_L011K4':
be_bryan 0:b74591d5ab33 218 {
be_bryan 0:b74591d5ab33 219 'name': 'NUCLEO-L011K4',
be_bryan 0:b74591d5ab33 220 'mcuId': 'STM32L011K4Tx'
be_bryan 0:b74591d5ab33 221 },
be_bryan 0:b74591d5ab33 222 'NUCLEO_L031K6':
be_bryan 0:b74591d5ab33 223 {
be_bryan 0:b74591d5ab33 224 'name': 'NUCLEO-L031K6',
be_bryan 0:b74591d5ab33 225 'mcuId': 'STM32L031K6Tx'
be_bryan 0:b74591d5ab33 226 },
be_bryan 0:b74591d5ab33 227 'NUCLEO_L053R8':
be_bryan 0:b74591d5ab33 228 {
be_bryan 0:b74591d5ab33 229 'name': 'NUCLEO-L053R8',
be_bryan 0:b74591d5ab33 230 'mcuId': 'STM32L053R8Tx'
be_bryan 0:b74591d5ab33 231 },
be_bryan 0:b74591d5ab33 232 'NUCLEO_L073RZ':
be_bryan 0:b74591d5ab33 233 {
be_bryan 0:b74591d5ab33 234 'name': 'NUCLEO-L073RZ',
be_bryan 0:b74591d5ab33 235 'mcuId': 'STM32L073RZTx'
be_bryan 0:b74591d5ab33 236 },
be_bryan 0:b74591d5ab33 237 'NUCLEO_L152RE':
be_bryan 0:b74591d5ab33 238 {
be_bryan 0:b74591d5ab33 239 'name': 'NUCLEO-L152RE',
be_bryan 0:b74591d5ab33 240 'mcuId': 'STM32L152RETx'
be_bryan 0:b74591d5ab33 241 },
be_bryan 0:b74591d5ab33 242 'NUCLEO_L432KC':
be_bryan 0:b74591d5ab33 243 {
be_bryan 0:b74591d5ab33 244 'name': 'NUCLEO-L432KC',
be_bryan 0:b74591d5ab33 245 'mcuId': 'STM32L432KCUx'
be_bryan 0:b74591d5ab33 246 },
be_bryan 0:b74591d5ab33 247 'NUCLEO_L476RG':
be_bryan 0:b74591d5ab33 248 {
be_bryan 0:b74591d5ab33 249 'name': 'NUCLEO-L476RG',
be_bryan 0:b74591d5ab33 250 'mcuId': 'STM32L476RGTx'
be_bryan 0:b74591d5ab33 251 },
be_bryan 0:b74591d5ab33 252 'NUCLEO_L486RG':
be_bryan 0:b74591d5ab33 253 {
be_bryan 0:b74591d5ab33 254 'name': 'NUCLEO-L486RG',
be_bryan 0:b74591d5ab33 255 'mcuId': 'STM32L486RGTx'
be_bryan 0:b74591d5ab33 256 },
be_bryan 0:b74591d5ab33 257 'NUCLEO_L496ZG':
be_bryan 0:b74591d5ab33 258 {
be_bryan 0:b74591d5ab33 259 'name': 'NUCLEO-L496ZG',
be_bryan 0:b74591d5ab33 260 'mcuId': 'STM32L496ZGTx'
be_bryan 0:b74591d5ab33 261 },
be_bryan 0:b74591d5ab33 262 'NUCLEO_L496ZG_P':
be_bryan 0:b74591d5ab33 263 {
be_bryan 0:b74591d5ab33 264 'name': 'NUCLEO-L496ZG',
be_bryan 0:b74591d5ab33 265 'mcuId': 'STM32L496ZGTx'
be_bryan 0:b74591d5ab33 266 },
be_bryan 0:b74591d5ab33 267 }
be_bryan 0:b74591d5ab33 268
be_bryan 0:b74591d5ab33 269 TARGETS = BOARDS.keys()
be_bryan 0:b74591d5ab33 270
be_bryan 0:b74591d5ab33 271 def __gen_dir(self, dir_name):
be_bryan 0:b74591d5ab33 272 """
be_bryan 0:b74591d5ab33 273 Method that creates directory
be_bryan 0:b74591d5ab33 274 """
be_bryan 0:b74591d5ab33 275 settings = join(self.export_dir, dir_name)
be_bryan 0:b74591d5ab33 276 mkdir(settings)
be_bryan 0:b74591d5ab33 277
be_bryan 0:b74591d5ab33 278 def get_fpu_hardware(self, fpu_unit):
be_bryan 0:b74591d5ab33 279 """
be_bryan 0:b74591d5ab33 280 Convert fpu unit name into hardware name.
be_bryan 0:b74591d5ab33 281 """
be_bryan 0:b74591d5ab33 282 hw = ''
be_bryan 0:b74591d5ab33 283 fpus = {
be_bryan 0:b74591d5ab33 284 'fpv4spd16': 'fpv4-sp-d16',
be_bryan 0:b74591d5ab33 285 'fpv5d16': 'fpv5-d16',
be_bryan 0:b74591d5ab33 286 'fpv5spd16': 'fpv5-sp-d16'
be_bryan 0:b74591d5ab33 287 }
be_bryan 0:b74591d5ab33 288 if fpu_unit in fpus:
be_bryan 0:b74591d5ab33 289 hw = fpus[fpu_unit]
be_bryan 0:b74591d5ab33 290 return hw
be_bryan 0:b74591d5ab33 291
be_bryan 0:b74591d5ab33 292 def process_sw_options(self, opts, flags_in):
be_bryan 0:b74591d5ab33 293 """
be_bryan 0:b74591d5ab33 294 Process System Workbench specific options.
be_bryan 0:b74591d5ab33 295
be_bryan 0:b74591d5ab33 296 System Workbench for STM32 has some compile options, which are not recognized by the GNUARMEclipse exporter.
be_bryan 0:b74591d5ab33 297 Those are handled in this method.
be_bryan 0:b74591d5ab33 298 """
be_bryan 0:b74591d5ab33 299 opts['c']['preprocess'] = False
be_bryan 0:b74591d5ab33 300 if '-E' in flags_in['c_flags']:
be_bryan 0:b74591d5ab33 301 opts['c']['preprocess'] = True
be_bryan 0:b74591d5ab33 302 opts['cpp']['preprocess'] = False
be_bryan 0:b74591d5ab33 303 if '-E' in flags_in['cxx_flags']:
be_bryan 0:b74591d5ab33 304 opts['cpp']['preprocess'] = True
be_bryan 0:b74591d5ab33 305 opts['c']['slowflashdata'] = False
be_bryan 0:b74591d5ab33 306 if '-mslow-flash-data' in flags_in['c_flags']:
be_bryan 0:b74591d5ab33 307 opts['c']['slowflashdata'] = True
be_bryan 0:b74591d5ab33 308 opts['cpp']['slowflashdata'] = False
be_bryan 0:b74591d5ab33 309 if '-mslow-flash-data' in flags_in['cxx_flags']:
be_bryan 0:b74591d5ab33 310 opts['cpp']['slowflashdata'] = True
be_bryan 0:b74591d5ab33 311 if opts['common']['optimization.messagelength']:
be_bryan 0:b74591d5ab33 312 opts['common']['optimization.other'] += ' -fmessage-length=0'
be_bryan 0:b74591d5ab33 313 if opts['common']['optimization.signedchar']:
be_bryan 0:b74591d5ab33 314 opts['common']['optimization.other'] += ' -fsigned-char'
be_bryan 0:b74591d5ab33 315 if opts['common']['optimization.nocommon']:
be_bryan 0:b74591d5ab33 316 opts['common']['optimization.other'] += ' -fno-common'
be_bryan 0:b74591d5ab33 317 if opts['common']['optimization.noinlinefunctions']:
be_bryan 0:b74591d5ab33 318 opts['common']['optimization.other'] += ' -fno-inline-functions'
be_bryan 0:b74591d5ab33 319 if opts['common']['optimization.freestanding']:
be_bryan 0:b74591d5ab33 320 opts['common']['optimization.other'] += ' -ffreestanding'
be_bryan 0:b74591d5ab33 321 if opts['common']['optimization.nobuiltin']:
be_bryan 0:b74591d5ab33 322 opts['common']['optimization.other'] += ' -fno-builtin'
be_bryan 0:b74591d5ab33 323 if opts['common']['optimization.spconstant']:
be_bryan 0:b74591d5ab33 324 opts['common']['optimization.other'] += ' -fsingle-precision-constant'
be_bryan 0:b74591d5ab33 325 if opts['common']['optimization.nomoveloopinvariants']:
be_bryan 0:b74591d5ab33 326 opts['common']['optimization.other'] += ' -fno-move-loop-invariants'
be_bryan 0:b74591d5ab33 327 if opts['common']['warnings.unused']:
be_bryan 0:b74591d5ab33 328 opts['common']['warnings.other'] += ' -Wunused'
be_bryan 0:b74591d5ab33 329 if opts['common']['warnings.uninitialized']:
be_bryan 0:b74591d5ab33 330 opts['common']['warnings.other'] += ' -Wuninitialized'
be_bryan 0:b74591d5ab33 331 if opts['common']['warnings.missingdeclaration']:
be_bryan 0:b74591d5ab33 332 opts['common']['warnings.other'] += ' -Wmissing-declarations'
be_bryan 0:b74591d5ab33 333 if opts['common']['warnings.pointerarith']:
be_bryan 0:b74591d5ab33 334 opts['common']['warnings.other'] += ' -Wpointer-arith'
be_bryan 0:b74591d5ab33 335 if opts['common']['warnings.padded']:
be_bryan 0:b74591d5ab33 336 opts['common']['warnings.other'] += ' -Wpadded'
be_bryan 0:b74591d5ab33 337 if opts['common']['warnings.shadow']:
be_bryan 0:b74591d5ab33 338 opts['common']['warnings.other'] += ' -Wshadow'
be_bryan 0:b74591d5ab33 339 if opts['common']['warnings.logicalop']:
be_bryan 0:b74591d5ab33 340 opts['common']['warnings.other'] += ' -Wlogical-op'
be_bryan 0:b74591d5ab33 341 if opts['common']['warnings.agreggatereturn']:
be_bryan 0:b74591d5ab33 342 opts['common']['warnings.other'] += ' -Waggregate-return'
be_bryan 0:b74591d5ab33 343 if opts['common']['warnings.floatequal']:
be_bryan 0:b74591d5ab33 344 opts['common']['warnings.other'] += ' -Wfloat-equal'
be_bryan 0:b74591d5ab33 345 opts['ld']['strip'] = False
be_bryan 0:b74591d5ab33 346 if '-s' in flags_in['ld_flags']:
be_bryan 0:b74591d5ab33 347 opts['ld']['strip'] = True
be_bryan 0:b74591d5ab33 348 opts['ld']['shared'] = False
be_bryan 0:b74591d5ab33 349 if '-shared' in flags_in['ld_flags']:
be_bryan 0:b74591d5ab33 350 opts['ld']['shared'] = True
be_bryan 0:b74591d5ab33 351 opts['ld']['soname'] = ''
be_bryan 0:b74591d5ab33 352 opts['ld']['implname'] = ''
be_bryan 0:b74591d5ab33 353 opts['ld']['defname'] = ''
be_bryan 0:b74591d5ab33 354 for item in flags_in['ld_flags']:
be_bryan 0:b74591d5ab33 355 if item.startswith('-Wl,-soname='):
be_bryan 0:b74591d5ab33 356 opts['ld']['soname'] = item[len('-Wl,-soname='):]
be_bryan 0:b74591d5ab33 357 if item.startswith('-Wl,--out-implib='):
be_bryan 0:b74591d5ab33 358 opts['ld']['implname'] = item[len('-Wl,--out-implib='):]
be_bryan 0:b74591d5ab33 359 if item.startswith('-Wl,--output-def='):
be_bryan 0:b74591d5ab33 360 opts['ld']['defname'] = item[len('-Wl,--output-def='):]
be_bryan 0:b74591d5ab33 361 opts['common']['arm.target.fpu.hardware'] = self.get_fpu_hardware(
be_bryan 0:b74591d5ab33 362 opts['common']['arm.target.fpu.unit'])
be_bryan 0:b74591d5ab33 363 opts['common']['debugging.codecov'] = False
be_bryan 0:b74591d5ab33 364 if '-fprofile-arcs' in flags_in['common_flags'] and '-ftest-coverage' in flags_in['common_flags']:
be_bryan 0:b74591d5ab33 365 opts['common']['debugging.codecov'] = True
be_bryan 0:b74591d5ab33 366 # Passing linker options to linker with '-Wl,'-prefix.
be_bryan 0:b74591d5ab33 367 for index in range(len(opts['ld']['flags'])):
be_bryan 0:b74591d5ab33 368 item = opts['ld']['flags'][index]
be_bryan 0:b74591d5ab33 369 if not item.startswith('-Wl,'):
be_bryan 0:b74591d5ab33 370 opts['ld']['flags'][index] = '-Wl,' + item
be_bryan 0:b74591d5ab33 371 # Strange System Workbench feature: If first parameter in Other flags is a
be_bryan 0:b74591d5ab33 372 # define (-D...), Other flags will be replaced by defines and other flags
be_bryan 0:b74591d5ab33 373 # are completely ignored. Moving -D parameters to defines.
be_bryan 0:b74591d5ab33 374 for compiler in ['c', 'cpp', 'as']:
be_bryan 0:b74591d5ab33 375 tmpList = opts[compiler]['other'].split(' ')
be_bryan 0:b74591d5ab33 376 otherList = []
be_bryan 0:b74591d5ab33 377 for item in tmpList:
be_bryan 0:b74591d5ab33 378 if item.startswith('-D'):
be_bryan 0:b74591d5ab33 379 opts[compiler]['defines'].append(str(item[2:]))
be_bryan 0:b74591d5ab33 380 else:
be_bryan 0:b74591d5ab33 381 otherList.append(item)
be_bryan 0:b74591d5ab33 382 opts[compiler]['other'] = ' '.join(otherList)
be_bryan 0:b74591d5ab33 383 # Assembler options
be_bryan 0:b74591d5ab33 384 for as_def in opts['as']['defines']:
be_bryan 0:b74591d5ab33 385 if '=' in as_def:
be_bryan 0:b74591d5ab33 386 opts['as']['other'] += ' --defsym ' + as_def
be_bryan 0:b74591d5ab33 387 else:
be_bryan 0:b74591d5ab33 388 opts['as']['other'] += ' --defsym ' + as_def + '=1'
be_bryan 0:b74591d5ab33 389
be_bryan 0:b74591d5ab33 390 def generate(self):
be_bryan 0:b74591d5ab33 391 """
be_bryan 0:b74591d5ab33 392 Generate the .project and .cproject files.
be_bryan 0:b74591d5ab33 393 """
be_bryan 0:b74591d5ab33 394 options = {}
be_bryan 0:b74591d5ab33 395
be_bryan 0:b74591d5ab33 396 if not self.resources.linker_script:
be_bryan 0:b74591d5ab33 397 raise NotSupportedException("No linker script found.")
be_bryan 0:b74591d5ab33 398
be_bryan 0:b74591d5ab33 399 print ('\nCreate a System Workbench for STM32 managed project')
be_bryan 0:b74591d5ab33 400 print ('Project name: {0}'.format(self.project_name))
be_bryan 0:b74591d5ab33 401 print ('Target: {0}'.format(self.toolchain.target.name))
be_bryan 0:b74591d5ab33 402 print ('Toolchain: {0}'.format(self.TOOLCHAIN) + '\n')
be_bryan 0:b74591d5ab33 403
be_bryan 0:b74591d5ab33 404 self.resources.win_to_unix()
be_bryan 0:b74591d5ab33 405
be_bryan 0:b74591d5ab33 406 config_header = self.filter_dot(self.toolchain.get_config_header())
be_bryan 0:b74591d5ab33 407
be_bryan 0:b74591d5ab33 408 libraries = []
be_bryan 0:b74591d5ab33 409 for lib in self.resources.libraries:
be_bryan 0:b74591d5ab33 410 library, _ = splitext(basename(lib))
be_bryan 0:b74591d5ab33 411 libraries.append(library[3:])
be_bryan 0:b74591d5ab33 412
be_bryan 0:b74591d5ab33 413 self.system_libraries = [
be_bryan 0:b74591d5ab33 414 'stdc++', 'supc++', 'm', 'c', 'gcc', 'nosys'
be_bryan 0:b74591d5ab33 415 ]
be_bryan 0:b74591d5ab33 416
be_bryan 0:b74591d5ab33 417 profiles = self.get_all_profiles()
be_bryan 0:b74591d5ab33 418 self.as_defines = [s.replace('"', '"')
be_bryan 0:b74591d5ab33 419 for s in self.toolchain.get_symbols(True)]
be_bryan 0:b74591d5ab33 420 self.c_defines = [s.replace('"', '"')
be_bryan 0:b74591d5ab33 421 for s in self.toolchain.get_symbols()]
be_bryan 0:b74591d5ab33 422 self.cpp_defines = self.c_defines
be_bryan 0:b74591d5ab33 423 print 'Symbols: {0}'.format(len(self.c_defines))
be_bryan 0:b74591d5ab33 424
be_bryan 0:b74591d5ab33 425 self.include_path = []
be_bryan 0:b74591d5ab33 426 for s in self.resources.inc_dirs:
be_bryan 0:b74591d5ab33 427 self.include_path.append("../" + self.filter_dot(s))
be_bryan 0:b74591d5ab33 428 print ('Include folders: {0}'.format(len(self.include_path)))
be_bryan 0:b74591d5ab33 429
be_bryan 0:b74591d5ab33 430 self.compute_exclusions()
be_bryan 0:b74591d5ab33 431
be_bryan 0:b74591d5ab33 432 print ('Exclude folders: {0}'.format(len(self.excluded_folders)))
be_bryan 0:b74591d5ab33 433
be_bryan 0:b74591d5ab33 434 ld_script = self.filter_dot(self.resources.linker_script)
be_bryan 0:b74591d5ab33 435 print ('Linker script: {0}'.format(ld_script))
be_bryan 0:b74591d5ab33 436
be_bryan 0:b74591d5ab33 437 lib_dirs = [self.filter_dot(s) for s in self.resources.lib_dirs]
be_bryan 0:b74591d5ab33 438
be_bryan 0:b74591d5ab33 439 preproc_cmd = basename(self.toolchain.preproc[0]) + " " + " ".join(self.toolchain.preproc[1:])
be_bryan 0:b74591d5ab33 440
be_bryan 0:b74591d5ab33 441 for id in ['debug', 'release']:
be_bryan 0:b74591d5ab33 442 opts = {}
be_bryan 0:b74591d5ab33 443 opts['common'] = {}
be_bryan 0:b74591d5ab33 444 opts['as'] = {}
be_bryan 0:b74591d5ab33 445 opts['c'] = {}
be_bryan 0:b74591d5ab33 446 opts['cpp'] = {}
be_bryan 0:b74591d5ab33 447 opts['ld'] = {}
be_bryan 0:b74591d5ab33 448
be_bryan 0:b74591d5ab33 449 opts['id'] = id
be_bryan 0:b74591d5ab33 450 opts['name'] = opts['id'].capitalize()
be_bryan 0:b74591d5ab33 451
be_bryan 0:b74591d5ab33 452 # TODO: Add prints to log or console in verbose mode.
be_bryan 0:b74591d5ab33 453 #print ('\nBuild configuration: {0}'.format(opts['name']))
be_bryan 0:b74591d5ab33 454
be_bryan 0:b74591d5ab33 455 profile = profiles[id]
be_bryan 0:b74591d5ab33 456
be_bryan 0:b74591d5ab33 457 # A small hack, do not bother with src_path again,
be_bryan 0:b74591d5ab33 458 # pass an empty string to avoid crashing.
be_bryan 0:b74591d5ab33 459 src_paths = ['']
be_bryan 0:b74591d5ab33 460 toolchain = prepare_toolchain(
be_bryan 0:b74591d5ab33 461 src_paths, "", self.toolchain.target.name, self.TOOLCHAIN, build_profile=[profile])
be_bryan 0:b74591d5ab33 462
be_bryan 0:b74591d5ab33 463 # Hack to fill in build_dir
be_bryan 0:b74591d5ab33 464 toolchain.build_dir = self.toolchain.build_dir
be_bryan 0:b74591d5ab33 465
be_bryan 0:b74591d5ab33 466 flags = self.toolchain_flags(toolchain)
be_bryan 0:b74591d5ab33 467
be_bryan 0:b74591d5ab33 468 # TODO: Add prints to log or console in verbose mode.
be_bryan 0:b74591d5ab33 469 # print 'Common flags:', ' '.join(flags['common_flags'])
be_bryan 0:b74591d5ab33 470 # print 'C++ flags:', ' '.join(flags['cxx_flags'])
be_bryan 0:b74591d5ab33 471 # print 'C flags:', ' '.join(flags['c_flags'])
be_bryan 0:b74591d5ab33 472 # print 'ASM flags:', ' '.join(flags['asm_flags'])
be_bryan 0:b74591d5ab33 473 # print 'Linker flags:', ' '.join(flags['ld_flags'])
be_bryan 0:b74591d5ab33 474
be_bryan 0:b74591d5ab33 475 # Most GNU ARM Eclipse options have a parent,
be_bryan 0:b74591d5ab33 476 # either debug or release.
be_bryan 0:b74591d5ab33 477 if '-O0' in flags['common_flags'] or '-Og' in flags['common_flags']:
be_bryan 0:b74591d5ab33 478 opts['parent_id'] = 'debug'
be_bryan 0:b74591d5ab33 479 else:
be_bryan 0:b74591d5ab33 480 opts['parent_id'] = 'release'
be_bryan 0:b74591d5ab33 481
be_bryan 0:b74591d5ab33 482 self.process_options(opts, flags)
be_bryan 0:b74591d5ab33 483
be_bryan 0:b74591d5ab33 484 opts['c']['defines'] = self.c_defines
be_bryan 0:b74591d5ab33 485 opts['cpp']['defines'] = self.cpp_defines
be_bryan 0:b74591d5ab33 486 opts['as']['defines'] = self.as_defines
be_bryan 0:b74591d5ab33 487
be_bryan 0:b74591d5ab33 488 self.process_sw_options(opts, flags)
be_bryan 0:b74591d5ab33 489
be_bryan 0:b74591d5ab33 490 opts['ld']['library_paths'] = [
be_bryan 0:b74591d5ab33 491 self.filter_dot(s) for s in self.resources.lib_dirs]
be_bryan 0:b74591d5ab33 492
be_bryan 0:b74591d5ab33 493 opts['ld']['user_libraries'] = libraries
be_bryan 0:b74591d5ab33 494 opts['ld']['system_libraries'] = self.system_libraries
be_bryan 0:b74591d5ab33 495 opts['ld']['script'] = "linker-script-" + id + ".ld"
be_bryan 0:b74591d5ab33 496
be_bryan 0:b74591d5ab33 497 # Unique IDs used in multiple places.
be_bryan 0:b74591d5ab33 498 uid = {}
be_bryan 0:b74591d5ab33 499 uid['config'] = u.id
be_bryan 0:b74591d5ab33 500 uid['tool_c_compiler'] = u.id
be_bryan 0:b74591d5ab33 501 uid['tool_c_compiler_input'] = u.id
be_bryan 0:b74591d5ab33 502 uid['tool_cpp_compiler'] = u.id
be_bryan 0:b74591d5ab33 503 uid['tool_cpp_compiler_input'] = u.id
be_bryan 0:b74591d5ab33 504
be_bryan 0:b74591d5ab33 505 opts['uid'] = uid
be_bryan 0:b74591d5ab33 506
be_bryan 0:b74591d5ab33 507 options[id] = opts
be_bryan 0:b74591d5ab33 508
be_bryan 0:b74591d5ab33 509 ctx = {
be_bryan 0:b74591d5ab33 510 'name': self.project_name,
be_bryan 0:b74591d5ab33 511 'platform': platform,
be_bryan 0:b74591d5ab33 512 'include_paths': self.include_path,
be_bryan 0:b74591d5ab33 513 'config_header': config_header,
be_bryan 0:b74591d5ab33 514 'exclude_paths': '|'.join(self.excluded_folders),
be_bryan 0:b74591d5ab33 515 'ld_script': ld_script,
be_bryan 0:b74591d5ab33 516 'library_paths': lib_dirs,
be_bryan 0:b74591d5ab33 517 'object_files': self.resources.objects,
be_bryan 0:b74591d5ab33 518 'libraries': libraries,
be_bryan 0:b74591d5ab33 519 'board_name': self.BOARDS[self.target.upper()]['name'],
be_bryan 0:b74591d5ab33 520 'mcu_name': self.BOARDS[self.target.upper()]['mcuId'],
be_bryan 0:b74591d5ab33 521 'cpp_cmd': preproc_cmd,
be_bryan 0:b74591d5ab33 522 'options': options,
be_bryan 0:b74591d5ab33 523 # id property of 'u' will generate new random identifier every time
be_bryan 0:b74591d5ab33 524 # when called.
be_bryan 0:b74591d5ab33 525 'u': u
be_bryan 0:b74591d5ab33 526 }
be_bryan 0:b74591d5ab33 527
be_bryan 0:b74591d5ab33 528 self.__gen_dir('.settings')
be_bryan 0:b74591d5ab33 529 self.gen_file('sw4stm32/language_settings_commom.tmpl',
be_bryan 0:b74591d5ab33 530 ctx, '.settings/language.settings.xml')
be_bryan 0:b74591d5ab33 531 self.gen_file('sw4stm32/project_common.tmpl', ctx, '.project')
be_bryan 0:b74591d5ab33 532 self.gen_file('sw4stm32/cproject_common.tmpl', ctx, '.cproject')
be_bryan 0:b74591d5ab33 533 self.gen_file('sw4stm32/makefile.targets.tmpl', ctx,
be_bryan 0:b74591d5ab33 534 'makefile.targets', trim_blocks=True, lstrip_blocks=True)
be_bryan 0:b74591d5ab33 535 self.gen_file('sw4stm32/launch.tmpl', ctx, self.project_name +
be_bryan 0:b74591d5ab33 536 ' ' + options['debug']['name'] + '.launch')