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-2016 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 Title: MCUXpresso exporter.
be_bryan 0:b74591d5ab33 18
be_bryan 0:b74591d5ab33 19 Description: Creates a managed build project that can be imported by
be_bryan 0:b74591d5ab33 20 the MCUXpresso IDE from NXP
be_bryan 0:b74591d5ab33 21
be_bryan 0:b74591d5ab33 22 Based on GNU ARM Eclipse Exporter from Liviu Ionescu <ilg@livius.net>
be_bryan 0:b74591d5ab33 23 modified for MCUXpresso by Johannes Stratmann <jojos62@online.de>
be_bryan 0:b74591d5ab33 24 """
be_bryan 0:b74591d5ab33 25
be_bryan 0:b74591d5ab33 26 import copy
be_bryan 0:b74591d5ab33 27 import tempfile
be_bryan 0:b74591d5ab33 28 import shutil
be_bryan 0:b74591d5ab33 29
be_bryan 0:b74591d5ab33 30 from subprocess import Popen, PIPE
be_bryan 0:b74591d5ab33 31 from os import getcwd, remove
be_bryan 0:b74591d5ab33 32 from os.path import splitext, basename, exists
be_bryan 0:b74591d5ab33 33 from random import randint
be_bryan 0:b74591d5ab33 34
be_bryan 0:b74591d5ab33 35 from tools.export.gnuarmeclipse import GNUARMEclipse, UID
be_bryan 0:b74591d5ab33 36 from tools.export.exporters import apply_supported_whitelist
be_bryan 0:b74591d5ab33 37 from tools.targets import TARGET_MAP
be_bryan 0:b74591d5ab33 38 from tools.utils import NotSupportedException
be_bryan 0:b74591d5ab33 39 from tools.build_api import prepare_toolchain
be_bryan 0:b74591d5ab33 40
be_bryan 0:b74591d5ab33 41
be_bryan 0:b74591d5ab33 42 # =============================================================================
be_bryan 0:b74591d5ab33 43
be_bryan 0:b74591d5ab33 44
be_bryan 0:b74591d5ab33 45 POST_BINARY_WHITELIST = set([
be_bryan 0:b74591d5ab33 46 "TEENSY3_1Code.binary_hook",
be_bryan 0:b74591d5ab33 47 "MCU_NRF51Code.binary_hook",
be_bryan 0:b74591d5ab33 48 "LPCTargetCode.lpc_patch",
be_bryan 0:b74591d5ab33 49 "LPC4088Code.binary_hook"
be_bryan 0:b74591d5ab33 50 ])
be_bryan 0:b74591d5ab33 51
be_bryan 0:b74591d5ab33 52 class MCUXpresso(GNUARMEclipse):
be_bryan 0:b74591d5ab33 53 NAME = 'MCUXpresso'
be_bryan 0:b74591d5ab33 54 TOOLCHAIN = 'GCC_ARM'
be_bryan 0:b74591d5ab33 55
be_bryan 0:b74591d5ab33 56 MBED_CONFIG_HEADER_SUPPORTED = True
be_bryan 0:b74591d5ab33 57
be_bryan 0:b74591d5ab33 58 @classmethod
be_bryan 0:b74591d5ab33 59 def is_target_supported(cls, target_name):
be_bryan 0:b74591d5ab33 60 # targes suppoerted when .cproject templatefile exists
be_bryan 0:b74591d5ab33 61 if exists(cls.TEMPLATE_DIR + '/mcuxpresso/' + target_name + '_cproject.tmpl'):
be_bryan 0:b74591d5ab33 62 target = TARGET_MAP[target_name]
be_bryan 0:b74591d5ab33 63 return apply_supported_whitelist(
be_bryan 0:b74591d5ab33 64 cls.TOOLCHAIN, POST_BINARY_WHITELIST, target)
be_bryan 0:b74591d5ab33 65 else:
be_bryan 0:b74591d5ab33 66 return False
be_bryan 0:b74591d5ab33 67
be_bryan 0:b74591d5ab33 68 # override
be_bryan 0:b74591d5ab33 69 def generate(self):
be_bryan 0:b74591d5ab33 70 """
be_bryan 0:b74591d5ab33 71 Generate the .project and .cproject files.
be_bryan 0:b74591d5ab33 72 """
be_bryan 0:b74591d5ab33 73 if not self.resources.linker_script:
be_bryan 0:b74591d5ab33 74 raise NotSupportedException("No linker script found.")
be_bryan 0:b74591d5ab33 75
be_bryan 0:b74591d5ab33 76 print
be_bryan 0:b74591d5ab33 77 print 'Create a GNU ARM Eclipse C++ managed project'
be_bryan 0:b74591d5ab33 78 print 'Project name: {0}'.format(self.project_name)
be_bryan 0:b74591d5ab33 79 print 'Target: {0}'.format(self.toolchain.target.name)
be_bryan 0:b74591d5ab33 80 print 'Toolchain: {0}'.format(self.TOOLCHAIN)
be_bryan 0:b74591d5ab33 81
be_bryan 0:b74591d5ab33 82 self.resources.win_to_unix()
be_bryan 0:b74591d5ab33 83
be_bryan 0:b74591d5ab33 84 # TODO: use some logger to display additional info if verbose
be_bryan 0:b74591d5ab33 85
be_bryan 0:b74591d5ab33 86 self.libraries = []
be_bryan 0:b74591d5ab33 87 # print 'libraries'
be_bryan 0:b74591d5ab33 88 # print self.resources.libraries
be_bryan 0:b74591d5ab33 89 for lib in self.resources.libraries:
be_bryan 0:b74591d5ab33 90 l, _ = splitext(basename(lib))
be_bryan 0:b74591d5ab33 91 self.libraries.append(l[3:])
be_bryan 0:b74591d5ab33 92
be_bryan 0:b74591d5ab33 93 self.system_libraries = [
be_bryan 0:b74591d5ab33 94 'stdc++', 'supc++', 'm', 'c', 'gcc', 'nosys'
be_bryan 0:b74591d5ab33 95 ]
be_bryan 0:b74591d5ab33 96
be_bryan 0:b74591d5ab33 97 # Read in all profiles, we'll extract compiler options.
be_bryan 0:b74591d5ab33 98 profiles = self.get_all_profiles()
be_bryan 0:b74591d5ab33 99
be_bryan 0:b74591d5ab33 100 profile_ids = [s.lower() for s in profiles]
be_bryan 0:b74591d5ab33 101 profile_ids.sort()
be_bryan 0:b74591d5ab33 102
be_bryan 0:b74591d5ab33 103 # TODO: get the list from existing .cproject
be_bryan 0:b74591d5ab33 104 build_folders = [s.capitalize() for s in profile_ids]
be_bryan 0:b74591d5ab33 105 build_folders.append('BUILD')
be_bryan 0:b74591d5ab33 106 # print build_folders
be_bryan 0:b74591d5ab33 107
be_bryan 0:b74591d5ab33 108 objects = [self.filter_dot(s) for s in self.resources.objects]
be_bryan 0:b74591d5ab33 109 for bf in build_folders:
be_bryan 0:b74591d5ab33 110 objects = [o for o in objects if not o.startswith(bf + '/')]
be_bryan 0:b74591d5ab33 111 # print 'objects'
be_bryan 0:b74591d5ab33 112 # print objects
be_bryan 0:b74591d5ab33 113
be_bryan 0:b74591d5ab33 114 self.compute_exclusions()
be_bryan 0:b74591d5ab33 115
be_bryan 0:b74591d5ab33 116 self.include_path = [
be_bryan 0:b74591d5ab33 117 self.filter_dot(s) for s in self.resources.inc_dirs]
be_bryan 0:b74591d5ab33 118 print 'Include folders: {0}'.format(len(self.include_path))
be_bryan 0:b74591d5ab33 119
be_bryan 0:b74591d5ab33 120 self.as_defines = self.toolchain.get_symbols(True)
be_bryan 0:b74591d5ab33 121 self.c_defines = self.toolchain.get_symbols()
be_bryan 0:b74591d5ab33 122 self.cpp_defines = self.c_defines
be_bryan 0:b74591d5ab33 123 print 'Symbols: {0}'.format(len(self.c_defines))
be_bryan 0:b74591d5ab33 124
be_bryan 0:b74591d5ab33 125 self.ld_script = self.filter_dot(
be_bryan 0:b74591d5ab33 126 self.resources.linker_script)
be_bryan 0:b74591d5ab33 127 print 'Linker script: {0}'.format(self.ld_script)
be_bryan 0:b74591d5ab33 128
be_bryan 0:b74591d5ab33 129 self.options = {}
be_bryan 0:b74591d5ab33 130 profile_ids.remove('develop')
be_bryan 0:b74591d5ab33 131 for id in profile_ids:
be_bryan 0:b74591d5ab33 132
be_bryan 0:b74591d5ab33 133 # There are 4 categories of options, a category common too
be_bryan 0:b74591d5ab33 134 # all tools and a specific category for each of the tools.
be_bryan 0:b74591d5ab33 135 opts = {}
be_bryan 0:b74591d5ab33 136 opts['common'] = {}
be_bryan 0:b74591d5ab33 137 opts['as'] = {}
be_bryan 0:b74591d5ab33 138 opts['c'] = {}
be_bryan 0:b74591d5ab33 139 opts['cpp'] = {}
be_bryan 0:b74591d5ab33 140 opts['ld'] = {}
be_bryan 0:b74591d5ab33 141
be_bryan 0:b74591d5ab33 142 opts['id'] = id
be_bryan 0:b74591d5ab33 143 opts['name'] = opts['id'].capitalize()
be_bryan 0:b74591d5ab33 144
be_bryan 0:b74591d5ab33 145 print
be_bryan 0:b74591d5ab33 146 print 'Build configuration: {0}'.format(opts['name'])
be_bryan 0:b74591d5ab33 147
be_bryan 0:b74591d5ab33 148 profile = profiles[id]
be_bryan 0:b74591d5ab33 149
be_bryan 0:b74591d5ab33 150 # A small hack, do not bother with src_path again,
be_bryan 0:b74591d5ab33 151 # pass an empty string to avoid crashing.
be_bryan 0:b74591d5ab33 152 src_paths = ['']
be_bryan 0:b74591d5ab33 153 target_name = self.toolchain.target.name
be_bryan 0:b74591d5ab33 154 toolchain = prepare_toolchain(
be_bryan 0:b74591d5ab33 155 src_paths, "", target_name, self.TOOLCHAIN, build_profile=[profile])
be_bryan 0:b74591d5ab33 156
be_bryan 0:b74591d5ab33 157 # Hack to fill in build_dir
be_bryan 0:b74591d5ab33 158 toolchain.build_dir = self.toolchain.build_dir
be_bryan 0:b74591d5ab33 159
be_bryan 0:b74591d5ab33 160 flags = self.toolchain_flags(toolchain)
be_bryan 0:b74591d5ab33 161
be_bryan 0:b74591d5ab33 162 print 'Common flags:', ' '.join(flags['common_flags'])
be_bryan 0:b74591d5ab33 163 print 'C++ flags:', ' '.join(flags['cxx_flags'])
be_bryan 0:b74591d5ab33 164 print 'C flags:', ' '.join(flags['c_flags'])
be_bryan 0:b74591d5ab33 165 print 'ASM flags:', ' '.join(flags['asm_flags'])
be_bryan 0:b74591d5ab33 166 print 'Linker flags:', ' '.join(flags['ld_flags'])
be_bryan 0:b74591d5ab33 167
be_bryan 0:b74591d5ab33 168 # Most GNU ARM Eclipse options have a parent,
be_bryan 0:b74591d5ab33 169 # either debug or release.
be_bryan 0:b74591d5ab33 170 if '-O0' in flags['common_flags'] or '-Og' in flags['common_flags']:
be_bryan 0:b74591d5ab33 171 opts['parent_id'] = 'debug'
be_bryan 0:b74591d5ab33 172 else:
be_bryan 0:b74591d5ab33 173 opts['parent_id'] = 'release'
be_bryan 0:b74591d5ab33 174
be_bryan 0:b74591d5ab33 175 self.process_options(opts, flags)
be_bryan 0:b74591d5ab33 176
be_bryan 0:b74591d5ab33 177 opts['as']['defines'] = self.as_defines
be_bryan 0:b74591d5ab33 178 opts['c']['defines'] = self.c_defines
be_bryan 0:b74591d5ab33 179 opts['cpp']['defines'] = self.cpp_defines
be_bryan 0:b74591d5ab33 180
be_bryan 0:b74591d5ab33 181 opts['common']['include_paths'] = self.include_path
be_bryan 0:b74591d5ab33 182 opts['common']['excluded_folders'] = '|'.join(
be_bryan 0:b74591d5ab33 183 self.excluded_folders)
be_bryan 0:b74591d5ab33 184 self.excluded_folders = [item.replace("\\", "/") for item in self.excluded_folders]
be_bryan 0:b74591d5ab33 185
be_bryan 0:b74591d5ab33 186 opts['ld']['library_paths'] = [
be_bryan 0:b74591d5ab33 187 self.filter_dot(s) for s in self.resources.lib_dirs]
be_bryan 0:b74591d5ab33 188
be_bryan 0:b74591d5ab33 189 opts['ld']['object_files'] = objects
be_bryan 0:b74591d5ab33 190 opts['ld']['user_libraries'] = self.libraries
be_bryan 0:b74591d5ab33 191 opts['ld']['system_libraries'] = self.system_libraries
be_bryan 0:b74591d5ab33 192 opts['ld']['script'] = "linker-script-%s.ld" % id
be_bryan 0:b74591d5ab33 193 opts['cpp_cmd'] = " ".join(toolchain.preproc)
be_bryan 0:b74591d5ab33 194
be_bryan 0:b74591d5ab33 195 # Unique IDs used in multiple places.
be_bryan 0:b74591d5ab33 196 # Those used only once are implemented with {{u.id}}.
be_bryan 0:b74591d5ab33 197 u = UID()
be_bryan 0:b74591d5ab33 198 uid = {}
be_bryan 0:b74591d5ab33 199 uid['config'] = u.id
be_bryan 0:b74591d5ab33 200 uid['tool_c_compiler'] = u.id
be_bryan 0:b74591d5ab33 201 uid['tool_c_compiler_input'] = u.id
be_bryan 0:b74591d5ab33 202 uid['tool_cpp_compiler'] = u.id
be_bryan 0:b74591d5ab33 203 uid['tool_cpp_compiler_input'] = u.id
be_bryan 0:b74591d5ab33 204
be_bryan 0:b74591d5ab33 205 opts['uid'] = uid
be_bryan 0:b74591d5ab33 206
be_bryan 0:b74591d5ab33 207 self.options[id] = opts
be_bryan 0:b74591d5ab33 208
be_bryan 0:b74591d5ab33 209 jinja_ctx = {
be_bryan 0:b74591d5ab33 210 'name': self.project_name,
be_bryan 0:b74591d5ab33 211 'ld_script': self.ld_script,
be_bryan 0:b74591d5ab33 212
be_bryan 0:b74591d5ab33 213 # Compiler & linker command line options
be_bryan 0:b74591d5ab33 214 'options': self.options,
be_bryan 0:b74591d5ab33 215
be_bryan 0:b74591d5ab33 216 # Must be an object with an `id` property, which
be_bryan 0:b74591d5ab33 217 # will be called repeatedly, to generate multiple UIDs.
be_bryan 0:b74591d5ab33 218 'u': u,
be_bryan 0:b74591d5ab33 219 }
be_bryan 0:b74591d5ab33 220
be_bryan 0:b74591d5ab33 221 self.gen_file('mcuxpresso/.project.tmpl', jinja_ctx,
be_bryan 0:b74591d5ab33 222 '.project', trim_blocks=True, lstrip_blocks=True)
be_bryan 0:b74591d5ab33 223 self.gen_file('mcuxpresso/{0}_cproject.tmpl'.format(target_name), jinja_ctx,
be_bryan 0:b74591d5ab33 224 '.cproject', trim_blocks=True, lstrip_blocks=True)
be_bryan 0:b74591d5ab33 225 self.gen_file('mcuxpresso/makefile.targets.tmpl', jinja_ctx,
be_bryan 0:b74591d5ab33 226 'makefile.targets', trim_blocks=True, lstrip_blocks=True)
be_bryan 0:b74591d5ab33 227 self.gen_file('mcuxpresso/mbedignore.tmpl', jinja_ctx, '.mbedignore')
be_bryan 0:b74591d5ab33 228
be_bryan 0:b74591d5ab33 229 print
be_bryan 0:b74591d5ab33 230 print 'Done. Import the \'{0}\' project in Eclipse.'.format(self.project_name)
be_bryan 0:b74591d5ab33 231
be_bryan 0:b74591d5ab33 232 # override
be_bryan 0:b74591d5ab33 233 @staticmethod
be_bryan 0:b74591d5ab33 234 def build(project_name, log_name="build_log.txt", cleanup=True):
be_bryan 0:b74591d5ab33 235 """
be_bryan 0:b74591d5ab33 236 Headless build an Eclipse project.
be_bryan 0:b74591d5ab33 237
be_bryan 0:b74591d5ab33 238 The following steps are performed:
be_bryan 0:b74591d5ab33 239 - a temporary workspace is created,
be_bryan 0:b74591d5ab33 240 - the project is imported,
be_bryan 0:b74591d5ab33 241 - a clean build of all configurations is performed and
be_bryan 0:b74591d5ab33 242 - the temporary workspace is removed.
be_bryan 0:b74591d5ab33 243
be_bryan 0:b74591d5ab33 244 The build results are in the Debug & Release folders.
be_bryan 0:b74591d5ab33 245
be_bryan 0:b74591d5ab33 246 All executables (eclipse & toolchain) must be in the PATH.
be_bryan 0:b74591d5ab33 247
be_bryan 0:b74591d5ab33 248 The general method to start a headless Eclipse build is:
be_bryan 0:b74591d5ab33 249
be_bryan 0:b74591d5ab33 250 $ eclipse \
be_bryan 0:b74591d5ab33 251 --launcher.suppressErrors \
be_bryan 0:b74591d5ab33 252 -nosplash \
be_bryan 0:b74591d5ab33 253 -application org.eclipse.cdt.managedbuilder.core.headlessbuild \
be_bryan 0:b74591d5ab33 254 -data /path/to/workspace \
be_bryan 0:b74591d5ab33 255 -import /path/to/project \
be_bryan 0:b74591d5ab33 256 -cleanBuild "project[/configuration] | all"
be_bryan 0:b74591d5ab33 257 """
be_bryan 0:b74591d5ab33 258
be_bryan 0:b74591d5ab33 259 # TODO: possibly use the log file.
be_bryan 0:b74591d5ab33 260
be_bryan 0:b74591d5ab33 261 # Create a temporary folder for the workspace.
be_bryan 0:b74591d5ab33 262 tmp_folder = tempfile.mkdtemp()
be_bryan 0:b74591d5ab33 263
be_bryan 0:b74591d5ab33 264 cmd = [
be_bryan 0:b74591d5ab33 265 'mcuxpressoide',
be_bryan 0:b74591d5ab33 266 '--launcher.suppressErrors',
be_bryan 0:b74591d5ab33 267 '-nosplash',
be_bryan 0:b74591d5ab33 268 '-application org.eclipse.cdt.managedbuilder.core.headlessbuild',
be_bryan 0:b74591d5ab33 269 '-data', tmp_folder,
be_bryan 0:b74591d5ab33 270 '-import', getcwd(),
be_bryan 0:b74591d5ab33 271 '-cleanBuild', project_name
be_bryan 0:b74591d5ab33 272 ]
be_bryan 0:b74591d5ab33 273
be_bryan 0:b74591d5ab33 274 p = Popen(' '.join(cmd), shell=True, stdout=PIPE, stderr=PIPE)
be_bryan 0:b74591d5ab33 275 out, err = p.communicate()
be_bryan 0:b74591d5ab33 276 ret_code = p.returncode
be_bryan 0:b74591d5ab33 277 stdout_string = "=" * 10 + "STDOUT" + "=" * 10 + "\n"
be_bryan 0:b74591d5ab33 278 err_string = "=" * 10 + "STDERR" + "=" * 10 + "\n"
be_bryan 0:b74591d5ab33 279 err_string += err
be_bryan 0:b74591d5ab33 280 success = any(l.startswith("Finished building target:") for l in out.split("\n"))
be_bryan 0:b74591d5ab33 281
be_bryan 0:b74591d5ab33 282 if success:
be_bryan 0:b74591d5ab33 283 ret_string = "SUCCESS\n"
be_bryan 0:b74591d5ab33 284 else:
be_bryan 0:b74591d5ab33 285 ret_string = "FAILURE: build returned %s \n" % ret_code
be_bryan 0:b74591d5ab33 286
be_bryan 0:b74591d5ab33 287 print "%s\n%s\n%s\n%s" % (stdout_string, out, err_string, ret_string)
be_bryan 0:b74591d5ab33 288
be_bryan 0:b74591d5ab33 289 if log_name:
be_bryan 0:b74591d5ab33 290 # Write the output to the log file
be_bryan 0:b74591d5ab33 291 with open(log_name, 'w+') as f:
be_bryan 0:b74591d5ab33 292 f.write(stdout_string)
be_bryan 0:b74591d5ab33 293 f.write(out)
be_bryan 0:b74591d5ab33 294 f.write(err_string)
be_bryan 0:b74591d5ab33 295 f.write(ret_string)
be_bryan 0:b74591d5ab33 296
be_bryan 0:b74591d5ab33 297 # Cleanup the exported and built files
be_bryan 0:b74591d5ab33 298 if cleanup:
be_bryan 0:b74591d5ab33 299 if exists(log_name):
be_bryan 0:b74591d5ab33 300 remove(log_name)
be_bryan 0:b74591d5ab33 301 remove('.project')
be_bryan 0:b74591d5ab33 302 remove('.cproject')
be_bryan 0:b74591d5ab33 303 if exists('Debug'):
be_bryan 0:b74591d5ab33 304 shutil.rmtree('Debug')
be_bryan 0:b74591d5ab33 305 if exists('Release'):
be_bryan 0:b74591d5ab33 306 shutil.rmtree('Release')
be_bryan 0:b74591d5ab33 307 if exists('makefile.targets'):
be_bryan 0:b74591d5ab33 308 remove('makefile.targets')
be_bryan 0:b74591d5ab33 309
be_bryan 0:b74591d5ab33 310 # Always remove the temporary folder.
be_bryan 0:b74591d5ab33 311 if exists(tmp_folder):
be_bryan 0:b74591d5ab33 312 shutil.rmtree(tmp_folder)
be_bryan 0:b74591d5ab33 313
be_bryan 0:b74591d5ab33 314 return not(success)
be_bryan 0:b74591d5ab33 315
be_bryan 0:b74591d5ab33 316
be_bryan 0:b74591d5ab33 317 # -------------------------------------------------------------------------
be_bryan 0:b74591d5ab33 318
be_bryan 0:b74591d5ab33 319 def process_options(self, opts, flags_in):
be_bryan 0:b74591d5ab33 320 """
be_bryan 0:b74591d5ab33 321 CDT managed projects store lots of build options in separate
be_bryan 0:b74591d5ab33 322 variables, with separate IDs in the .cproject file.
be_bryan 0:b74591d5ab33 323 When the CDT build is started, all these options are brought
be_bryan 0:b74591d5ab33 324 together to compose the compiler and linker command lines.
be_bryan 0:b74591d5ab33 325
be_bryan 0:b74591d5ab33 326 Here the process is reversed, from the compiler and linker
be_bryan 0:b74591d5ab33 327 command lines, the options are identified and various flags are
be_bryan 0:b74591d5ab33 328 set to control the template generation process.
be_bryan 0:b74591d5ab33 329
be_bryan 0:b74591d5ab33 330 Once identified, the options are removed from the command lines.
be_bryan 0:b74591d5ab33 331
be_bryan 0:b74591d5ab33 332 The options that were not identified are options that do not
be_bryan 0:b74591d5ab33 333 have CDT equivalents and will be passed in the 'Other options'
be_bryan 0:b74591d5ab33 334 categories.
be_bryan 0:b74591d5ab33 335
be_bryan 0:b74591d5ab33 336 Although this process does not have a very complicated logic,
be_bryan 0:b74591d5ab33 337 given the large number of explicit configuration options
be_bryan 0:b74591d5ab33 338 used by the GNU ARM Eclipse managed build plug-in, it is tedious...
be_bryan 0:b74591d5ab33 339 """
be_bryan 0:b74591d5ab33 340
be_bryan 0:b74591d5ab33 341 # Make a copy of the flags, to be one by one removed after processing.
be_bryan 0:b74591d5ab33 342 flags = copy.deepcopy(flags_in)
be_bryan 0:b74591d5ab33 343
be_bryan 0:b74591d5ab33 344 if False:
be_bryan 0:b74591d5ab33 345 print
be_bryan 0:b74591d5ab33 346 print 'common_flags', flags['common_flags']
be_bryan 0:b74591d5ab33 347 print 'asm_flags', flags['asm_flags']
be_bryan 0:b74591d5ab33 348 print 'c_flags', flags['c_flags']
be_bryan 0:b74591d5ab33 349 print 'cxx_flags', flags['cxx_flags']
be_bryan 0:b74591d5ab33 350 print 'ld_flags', flags['ld_flags']
be_bryan 0:b74591d5ab33 351
be_bryan 0:b74591d5ab33 352 # Initialise the 'last resort' options where all unrecognised
be_bryan 0:b74591d5ab33 353 # options will be collected.
be_bryan 0:b74591d5ab33 354 opts['as']['other'] = ''
be_bryan 0:b74591d5ab33 355 opts['c']['other'] = ''
be_bryan 0:b74591d5ab33 356 opts['cpp']['other'] = ''
be_bryan 0:b74591d5ab33 357 opts['ld']['other'] = ''
be_bryan 0:b74591d5ab33 358
be_bryan 0:b74591d5ab33 359 MCPUS = {
be_bryan 0:b74591d5ab33 360 'Cortex-M0': {'mcpu': 'cortex-m0', 'fpu_unit': None},
be_bryan 0:b74591d5ab33 361 'Cortex-M0+': {'mcpu': 'cortex-m0plus', 'fpu_unit': None},
be_bryan 0:b74591d5ab33 362 'Cortex-M1': {'mcpu': 'cortex-m1', 'fpu_unit': None},
be_bryan 0:b74591d5ab33 363 'Cortex-M3': {'mcpu': 'cortex-m3', 'fpu_unit': None},
be_bryan 0:b74591d5ab33 364 'Cortex-M4': {'mcpu': 'cortex-m4', 'fpu_unit': None},
be_bryan 0:b74591d5ab33 365 'Cortex-M4F': {'mcpu': 'cortex-m4', 'fpu_unit': 'fpv4spd16'},
be_bryan 0:b74591d5ab33 366 'Cortex-M7': {'mcpu': 'cortex-m7', 'fpu_unit': None},
be_bryan 0:b74591d5ab33 367 'Cortex-M7F': {'mcpu': 'cortex-m7', 'fpu_unit': 'fpv4spd16'},
be_bryan 0:b74591d5ab33 368 'Cortex-M7FD': {'mcpu': 'cortex-m7', 'fpu_unit': 'fpv5d16'},
be_bryan 0:b74591d5ab33 369 'Cortex-A9': {'mcpu': 'cortex-a9', 'fpu_unit': 'vfpv3'}
be_bryan 0:b74591d5ab33 370 }
be_bryan 0:b74591d5ab33 371
be_bryan 0:b74591d5ab33 372 MCPU_NXP = {
be_bryan 0:b74591d5ab33 373 'cortex-m7' : 'cm7',
be_bryan 0:b74591d5ab33 374 'cortex-m4' : 'cm4',
be_bryan 0:b74591d5ab33 375 'cortex-m3' : 'cm3',
be_bryan 0:b74591d5ab33 376 'cortex-m1' : 'cm1',
be_bryan 0:b74591d5ab33 377 'cortex-m0' : 'cm0',
be_bryan 0:b74591d5ab33 378 'cortex-m0.small-multiply' : 'cm0.smallmul',
be_bryan 0:b74591d5ab33 379 'cortex-m0plus' : 'cm0plus',
be_bryan 0:b74591d5ab33 380 'cortex-m0plus.small-multiply' : 'cm0plus.smallmul'
be_bryan 0:b74591d5ab33 381 }
be_bryan 0:b74591d5ab33 382
be_bryan 0:b74591d5ab33 383 # Remove options that are supplied by CDT
be_bryan 0:b74591d5ab33 384 self.remove_option(flags['common_flags'], '-c')
be_bryan 0:b74591d5ab33 385 self.remove_option(flags['common_flags'], '-MMD')
be_bryan 0:b74591d5ab33 386
be_bryan 0:b74591d5ab33 387 # As 'plan B', get the CPU from the target definition.
be_bryan 0:b74591d5ab33 388 core = self.toolchain.target.core
be_bryan 0:b74591d5ab33 389
be_bryan 0:b74591d5ab33 390 opts['common']['arm.target.family'] = None
be_bryan 0:b74591d5ab33 391
be_bryan 0:b74591d5ab33 392 # cortex-m0, cortex-m0-small-multiply, cortex-m0plus,
be_bryan 0:b74591d5ab33 393 # cortex-m0plus-small-multiply, cortex-m1, cortex-m1-small-multiply,
be_bryan 0:b74591d5ab33 394 # cortex-m3, cortex-m4, cortex-m7.
be_bryan 0:b74591d5ab33 395 str = self.find_options(flags['common_flags'], '-mcpu=')
be_bryan 0:b74591d5ab33 396 if str != None:
be_bryan 0:b74591d5ab33 397 opts['common']['arm.target.family'] = str[len('-mcpu='):]
be_bryan 0:b74591d5ab33 398 opts['common']['arm.target.family_nxp'] = MCPU_NXP[str[len('-mcpu='):]]
be_bryan 0:b74591d5ab33 399 self.remove_option(flags['common_flags'], str)
be_bryan 0:b74591d5ab33 400 self.remove_option(flags['ld_flags'], str)
be_bryan 0:b74591d5ab33 401 else:
be_bryan 0:b74591d5ab33 402 if core not in MCPUS:
be_bryan 0:b74591d5ab33 403 raise NotSupportedException(
be_bryan 0:b74591d5ab33 404 'Target core {0} not supported.'.format(core))
be_bryan 0:b74591d5ab33 405 opts['common']['arm.target.family'] = MCPUS[core]['mcpu']
be_bryan 0:b74591d5ab33 406
be_bryan 0:b74591d5ab33 407 opts['common']['arm.target.arch'] = 'none'
be_bryan 0:b74591d5ab33 408 str = self.find_options(flags['common_flags'], '-march=')
be_bryan 0:b74591d5ab33 409 arch = str[len('-march='):]
be_bryan 0:b74591d5ab33 410 archs = {'armv6-m': 'armv6-m', 'armv7-m': 'armv7-m', 'armv7-a': 'armv7-a'}
be_bryan 0:b74591d5ab33 411 if arch in archs:
be_bryan 0:b74591d5ab33 412 opts['common']['arm.target.arch'] = archs[arch]
be_bryan 0:b74591d5ab33 413 self.remove_option(flags['common_flags'], str)
be_bryan 0:b74591d5ab33 414
be_bryan 0:b74591d5ab33 415 opts['common']['arm.target.instructionset'] = 'thumb'
be_bryan 0:b74591d5ab33 416 if '-mthumb' in flags['common_flags']:
be_bryan 0:b74591d5ab33 417 self.remove_option(flags['common_flags'], '-mthumb')
be_bryan 0:b74591d5ab33 418 self.remove_option(flags['ld_flags'], '-mthumb')
be_bryan 0:b74591d5ab33 419 elif '-marm' in flags['common_flags']:
be_bryan 0:b74591d5ab33 420 opts['common']['arm.target.instructionset'] = 'arm'
be_bryan 0:b74591d5ab33 421 self.remove_option(flags['common_flags'], '-marm')
be_bryan 0:b74591d5ab33 422 self.remove_option(flags['ld_flags'], '-marm')
be_bryan 0:b74591d5ab33 423
be_bryan 0:b74591d5ab33 424 opts['common']['arm.target.thumbinterwork'] = False
be_bryan 0:b74591d5ab33 425 if '-mthumb-interwork' in flags['common_flags']:
be_bryan 0:b74591d5ab33 426 opts['common']['arm.target.thumbinterwork'] = True
be_bryan 0:b74591d5ab33 427 self.remove_option(flags['common_flags'], '-mthumb-interwork')
be_bryan 0:b74591d5ab33 428
be_bryan 0:b74591d5ab33 429 opts['common']['arm.target.endianness'] = None
be_bryan 0:b74591d5ab33 430 if '-mlittle-endian' in flags['common_flags']:
be_bryan 0:b74591d5ab33 431 opts['common']['arm.target.endianness'] = 'little'
be_bryan 0:b74591d5ab33 432 self.remove_option(flags['common_flags'], '-mlittle-endian')
be_bryan 0:b74591d5ab33 433 elif '-mbig-endian' in flags['common_flags']:
be_bryan 0:b74591d5ab33 434 opts['common']['arm.target.endianness'] = 'big'
be_bryan 0:b74591d5ab33 435 self.remove_option(flags['common_flags'], '-mbig-endian')
be_bryan 0:b74591d5ab33 436
be_bryan 0:b74591d5ab33 437 opts['common']['arm.target.fpu.unit'] = None
be_bryan 0:b74591d5ab33 438 opts['common']['arm.target.fpu.unit_nxp'] = None
be_bryan 0:b74591d5ab33 439 # default, fpv4spd16, fpv5d16, fpv5spd16
be_bryan 0:b74591d5ab33 440 str = self.find_options(flags['common_flags'], '-mfpu=')
be_bryan 0:b74591d5ab33 441 if str != None:
be_bryan 0:b74591d5ab33 442 fpu = str[len('-mfpu='):]
be_bryan 0:b74591d5ab33 443 fpus = {
be_bryan 0:b74591d5ab33 444 'fpv4-sp-d16': 'fpv4spd16',
be_bryan 0:b74591d5ab33 445 'fpv5-d16': 'fpv5d16',
be_bryan 0:b74591d5ab33 446 'fpv5-sp-d16': 'fpv5spd16'
be_bryan 0:b74591d5ab33 447 }
be_bryan 0:b74591d5ab33 448 fpus_nxp = {
be_bryan 0:b74591d5ab33 449 'fpv4-sp-d16': 'fpv4',
be_bryan 0:b74591d5ab33 450 'fpv5-d16': 'fpv5dp',
be_bryan 0:b74591d5ab33 451 'fpv5-sp-d16': 'fpv5sp'
be_bryan 0:b74591d5ab33 452 }
be_bryan 0:b74591d5ab33 453 if fpu in fpus:
be_bryan 0:b74591d5ab33 454 opts['common']['arm.target.fpu.unit'] = fpus[fpu]
be_bryan 0:b74591d5ab33 455 opts['common']['arm.target.fpu.unit_nxp'] = fpus_nxp[fpu]
be_bryan 0:b74591d5ab33 456
be_bryan 0:b74591d5ab33 457 self.remove_option(flags['common_flags'], str)
be_bryan 0:b74591d5ab33 458 self.remove_option(flags['ld_flags'], str)
be_bryan 0:b74591d5ab33 459 if opts['common']['arm.target.fpu.unit'] == None:
be_bryan 0:b74591d5ab33 460 if core not in MCPUS:
be_bryan 0:b74591d5ab33 461 raise NotSupportedException(
be_bryan 0:b74591d5ab33 462 'Target core {0} not supported.'.format(core))
be_bryan 0:b74591d5ab33 463 if MCPUS[core]['fpu_unit']:
be_bryan 0:b74591d5ab33 464 opts['common'][
be_bryan 0:b74591d5ab33 465 'arm.target.fpu.unit'] = MCPUS[core]['fpu_unit']
be_bryan 0:b74591d5ab33 466
be_bryan 0:b74591d5ab33 467 # soft, softfp, hard.
be_bryan 0:b74591d5ab33 468 str = self.find_options(flags['common_flags'], '-mfloat-abi=')
be_bryan 0:b74591d5ab33 469 if str != None:
be_bryan 0:b74591d5ab33 470 opts['common']['arm.target.fpu.abi'] = str[
be_bryan 0:b74591d5ab33 471 len('-mfloat-abi='):]
be_bryan 0:b74591d5ab33 472 self.remove_option(flags['common_flags'], str)
be_bryan 0:b74591d5ab33 473 self.remove_option(flags['ld_flags'], str)
be_bryan 0:b74591d5ab33 474 if opts['common']['arm.target.fpu.abi'] == 'hard':
be_bryan 0:b74591d5ab33 475 opts['common']['arm.target.fpu.unit_nxp'] += '.hard'
be_bryan 0:b74591d5ab33 476
be_bryan 0:b74591d5ab33 477 # Default optimisation level for Release.
be_bryan 0:b74591d5ab33 478 opts['common']['optimization.level'] = '-Os'
be_bryan 0:b74591d5ab33 479
be_bryan 0:b74591d5ab33 480 # If the project defines an optimisation level, it is used
be_bryan 0:b74591d5ab33 481 # only for the Release configuration, the Debug one used '-Og'.
be_bryan 0:b74591d5ab33 482 str = self.find_options(flags['common_flags'], '-O')
be_bryan 0:b74591d5ab33 483 if str != None:
be_bryan 0:b74591d5ab33 484 levels = {
be_bryan 0:b74591d5ab33 485 '-O0': 'none', '-O1': 'optimize', '-O2': 'more',
be_bryan 0:b74591d5ab33 486 '-O3': 'most', '-Os': 'size', '-Og': 'debug'
be_bryan 0:b74591d5ab33 487 }
be_bryan 0:b74591d5ab33 488 if str in levels:
be_bryan 0:b74591d5ab33 489 opts['common']['optimization.level'] = levels[str]
be_bryan 0:b74591d5ab33 490 self.remove_option(flags['common_flags'], str)
be_bryan 0:b74591d5ab33 491
be_bryan 0:b74591d5ab33 492 include_files = []
be_bryan 0:b74591d5ab33 493 for all_flags in [flags['common_flags'], flags['c_flags'], flags['cxx_flags']]:
be_bryan 0:b74591d5ab33 494 while '-include' in all_flags:
be_bryan 0:b74591d5ab33 495 ix = all_flags.index('-include')
be_bryan 0:b74591d5ab33 496 str = all_flags[ix + 1]
be_bryan 0:b74591d5ab33 497 if str not in include_files:
be_bryan 0:b74591d5ab33 498 include_files.append(str)
be_bryan 0:b74591d5ab33 499 self.remove_option(all_flags, '-include')
be_bryan 0:b74591d5ab33 500 self.remove_option(all_flags, str)
be_bryan 0:b74591d5ab33 501
be_bryan 0:b74591d5ab33 502 opts['common']['include_files'] = include_files
be_bryan 0:b74591d5ab33 503
be_bryan 0:b74591d5ab33 504 if '-ansi' in flags['c_flags']:
be_bryan 0:b74591d5ab33 505 opts['c']['compiler.std'] = '-ansi'
be_bryan 0:b74591d5ab33 506 self.remove_option(flags['c_flags'], str)
be_bryan 0:b74591d5ab33 507 else:
be_bryan 0:b74591d5ab33 508 str = self.find_options(flags['c_flags'], '-std')
be_bryan 0:b74591d5ab33 509 std = str[len('-std='):]
be_bryan 0:b74591d5ab33 510 c_std = {
be_bryan 0:b74591d5ab33 511 'c90': 'c90', 'c89': 'c90', 'gnu90': 'gnu90', 'gnu89': 'gnu90',
be_bryan 0:b74591d5ab33 512 'c99': 'c99', 'c9x': 'c99', 'gnu99': 'gnu99', 'gnu9x': 'gnu98',
be_bryan 0:b74591d5ab33 513 'c11': 'c11', 'c1x': 'c11', 'gnu11': 'gnu11', 'gnu1x': 'gnu11'
be_bryan 0:b74591d5ab33 514 }
be_bryan 0:b74591d5ab33 515 if std in c_std:
be_bryan 0:b74591d5ab33 516 opts['c']['compiler.std'] = c_std[std]
be_bryan 0:b74591d5ab33 517 self.remove_option(flags['c_flags'], str)
be_bryan 0:b74591d5ab33 518
be_bryan 0:b74591d5ab33 519 if '-ansi' in flags['cxx_flags']:
be_bryan 0:b74591d5ab33 520 opts['cpp']['compiler.std'] = '-ansi'
be_bryan 0:b74591d5ab33 521 self.remove_option(flags['cxx_flags'], str)
be_bryan 0:b74591d5ab33 522 else:
be_bryan 0:b74591d5ab33 523 str = self.find_options(flags['cxx_flags'], '-std')
be_bryan 0:b74591d5ab33 524 std = str[len('-std='):]
be_bryan 0:b74591d5ab33 525 cpp_std = {
be_bryan 0:b74591d5ab33 526 'c++98': 'cpp98', 'c++03': 'cpp03',
be_bryan 0:b74591d5ab33 527 'gnu++98': 'gnupp98', 'gnu++03': 'gnupp03',
be_bryan 0:b74591d5ab33 528 'c++0x': 'cpp03', 'gnu++0x': 'gnupp03',
be_bryan 0:b74591d5ab33 529 'c++11': 'cpp11', 'gnu++11': 'gnupp11',
be_bryan 0:b74591d5ab33 530 'c++1y': 'cpp11', 'gnu++1y': 'gnupp11',
be_bryan 0:b74591d5ab33 531 'c++14': 'cpp14', 'gnu++14': 'gnupp14',
be_bryan 0:b74591d5ab33 532 'c++1z': 'cpp1z', 'gnu++1z': 'gnupp1z',
be_bryan 0:b74591d5ab33 533 }
be_bryan 0:b74591d5ab33 534 if std in cpp_std:
be_bryan 0:b74591d5ab33 535 opts['cpp']['compiler.std'] = cpp_std[std]
be_bryan 0:b74591d5ab33 536 self.remove_option(flags['cxx_flags'], str)
be_bryan 0:b74591d5ab33 537
be_bryan 0:b74591d5ab33 538 # Common optimisation options.
be_bryan 0:b74591d5ab33 539 optimization_options = {
be_bryan 0:b74591d5ab33 540 '-flto': 'optimization.lto',
be_bryan 0:b74591d5ab33 541 '--ffat-lto-objects': 'optimization.lto_objects'
be_bryan 0:b74591d5ab33 542 }
be_bryan 0:b74591d5ab33 543 for option in optimization_options:
be_bryan 0:b74591d5ab33 544 opts['common'][optimization_options[option]] = False
be_bryan 0:b74591d5ab33 545 if option in flags['common_flags']:
be_bryan 0:b74591d5ab33 546 opts['common'][optimization_options[option]] = True
be_bryan 0:b74591d5ab33 547 self.remove_option(flags['common_flags'], option)
be_bryan 0:b74591d5ab33 548
be_bryan 0:b74591d5ab33 549 # Common warning options.
be_bryan 0:b74591d5ab33 550 warning_options = {
be_bryan 0:b74591d5ab33 551 '-fsyntax-only': 'warnings.syntaxonly',
be_bryan 0:b74591d5ab33 552 '-pedantic': 'warnings.pedantic',
be_bryan 0:b74591d5ab33 553 '-pedantic-errors': 'warnings.pedanticerrors',
be_bryan 0:b74591d5ab33 554 '-w': 'warnings.nowarn',
be_bryan 0:b74591d5ab33 555 '-Wall': 'warnings.allwarn',
be_bryan 0:b74591d5ab33 556 '-Wextra': 'warnings.extrawarn',
be_bryan 0:b74591d5ab33 557 '-Wconversion': 'warnings.conversion',
be_bryan 0:b74591d5ab33 558 '-Werror': 'warnings.toerrors',
be_bryan 0:b74591d5ab33 559 }
be_bryan 0:b74591d5ab33 560
be_bryan 0:b74591d5ab33 561 for option in warning_options:
be_bryan 0:b74591d5ab33 562 opts['common'][warning_options[option]] = False
be_bryan 0:b74591d5ab33 563 if option in flags['common_flags']:
be_bryan 0:b74591d5ab33 564 opts['common'][warning_options[option]] = True
be_bryan 0:b74591d5ab33 565 self.remove_option(flags['common_flags'], option)
be_bryan 0:b74591d5ab33 566
be_bryan 0:b74591d5ab33 567 # Common debug options.
be_bryan 0:b74591d5ab33 568 debug_levels = {
be_bryan 0:b74591d5ab33 569 '-g': 'default',
be_bryan 0:b74591d5ab33 570 '-g1': 'minimal',
be_bryan 0:b74591d5ab33 571 '-g3': 'max',
be_bryan 0:b74591d5ab33 572 }
be_bryan 0:b74591d5ab33 573 opts['common']['debugging.level'] = 'none'
be_bryan 0:b74591d5ab33 574 for option in debug_levels:
be_bryan 0:b74591d5ab33 575 if option in flags['common_flags']:
be_bryan 0:b74591d5ab33 576 opts['common'][
be_bryan 0:b74591d5ab33 577 'debugging.level'] = debug_levels[option]
be_bryan 0:b74591d5ab33 578 self.remove_option(flags['common_flags'], option)
be_bryan 0:b74591d5ab33 579
be_bryan 0:b74591d5ab33 580
be_bryan 0:b74591d5ab33 581 opts['common']['debugging.prof'] = False
be_bryan 0:b74591d5ab33 582 if '-p' in flags['common_flags']:
be_bryan 0:b74591d5ab33 583 opts['common']['debugging.prof'] = True
be_bryan 0:b74591d5ab33 584 self.remove_option(flags['common_flags'], '-p')
be_bryan 0:b74591d5ab33 585
be_bryan 0:b74591d5ab33 586 opts['common']['debugging.gprof'] = False
be_bryan 0:b74591d5ab33 587 if '-pg' in flags['common_flags']:
be_bryan 0:b74591d5ab33 588 opts['common']['debugging.gprof'] = True
be_bryan 0:b74591d5ab33 589 self.remove_option(flags['common_flags'], '-gp')
be_bryan 0:b74591d5ab33 590
be_bryan 0:b74591d5ab33 591 # Assembler options.
be_bryan 0:b74591d5ab33 592 opts['as']['usepreprocessor'] = False
be_bryan 0:b74591d5ab33 593 while '-x' in flags['asm_flags']:
be_bryan 0:b74591d5ab33 594 ix = flags['asm_flags'].index('-x')
be_bryan 0:b74591d5ab33 595 str = flags['asm_flags'][ix + 1]
be_bryan 0:b74591d5ab33 596
be_bryan 0:b74591d5ab33 597 if str == 'assembler-with-cpp':
be_bryan 0:b74591d5ab33 598 opts['as']['usepreprocessor'] = True
be_bryan 0:b74591d5ab33 599 else:
be_bryan 0:b74591d5ab33 600 # Collect all other assembler options.
be_bryan 0:b74591d5ab33 601 opts['as']['other'] += ' -x ' + str
be_bryan 0:b74591d5ab33 602
be_bryan 0:b74591d5ab33 603 self.remove_option(flags['asm_flags'], '-x')
be_bryan 0:b74591d5ab33 604 self.remove_option(flags['asm_flags'], 'assembler-with-cpp')
be_bryan 0:b74591d5ab33 605
be_bryan 0:b74591d5ab33 606 opts['as']['nostdinc'] = False
be_bryan 0:b74591d5ab33 607 if '-nostdinc' in flags['asm_flags']:
be_bryan 0:b74591d5ab33 608 opts['as']['nostdinc'] = True
be_bryan 0:b74591d5ab33 609 self.remove_option(flags['asm_flags'], '-nostdinc')
be_bryan 0:b74591d5ab33 610
be_bryan 0:b74591d5ab33 611 opts['as']['verbose'] = False
be_bryan 0:b74591d5ab33 612 if '-v' in flags['asm_flags']:
be_bryan 0:b74591d5ab33 613 opts['as']['verbose'] = True
be_bryan 0:b74591d5ab33 614 self.remove_option(flags['asm_flags'], '-v')
be_bryan 0:b74591d5ab33 615
be_bryan 0:b74591d5ab33 616 # C options.
be_bryan 0:b74591d5ab33 617 opts['c']['nostdinc'] = False
be_bryan 0:b74591d5ab33 618 if '-nostdinc' in flags['c_flags']:
be_bryan 0:b74591d5ab33 619 opts['c']['nostdinc'] = True
be_bryan 0:b74591d5ab33 620 self.remove_option(flags['c_flags'], '-nostdinc')
be_bryan 0:b74591d5ab33 621
be_bryan 0:b74591d5ab33 622 opts['c']['verbose'] = False
be_bryan 0:b74591d5ab33 623 if '-v' in flags['c_flags']:
be_bryan 0:b74591d5ab33 624 opts['c']['verbose'] = True
be_bryan 0:b74591d5ab33 625 self.remove_option(flags['c_flags'], '-v')
be_bryan 0:b74591d5ab33 626
be_bryan 0:b74591d5ab33 627
be_bryan 0:b74591d5ab33 628 # C++ options.
be_bryan 0:b74591d5ab33 629 opts['cpp']['nostdinc'] = False
be_bryan 0:b74591d5ab33 630 if '-nostdinc' in flags['cxx_flags']:
be_bryan 0:b74591d5ab33 631 opts['cpp']['nostdinc'] = True
be_bryan 0:b74591d5ab33 632 self.remove_option(flags['cxx_flags'], '-nostdinc')
be_bryan 0:b74591d5ab33 633
be_bryan 0:b74591d5ab33 634 opts['cpp']['nostdincpp'] = False
be_bryan 0:b74591d5ab33 635 if '-nostdinc++' in flags['cxx_flags']:
be_bryan 0:b74591d5ab33 636 opts['cpp']['nostdincpp'] = True
be_bryan 0:b74591d5ab33 637 self.remove_option(flags['cxx_flags'], '-nostdinc++')
be_bryan 0:b74591d5ab33 638
be_bryan 0:b74591d5ab33 639 optimization_options = {
be_bryan 0:b74591d5ab33 640 '-fno-exceptions': 'optimization.noexceptions',
be_bryan 0:b74591d5ab33 641 '-fno-rtti': 'optimization.nortti',
be_bryan 0:b74591d5ab33 642 '-fno-use-cxa-atexit': 'optimization.nousecxaatexit',
be_bryan 0:b74591d5ab33 643 '-fno-threadsafe-statics': 'optimization.nothreadsafestatics',
be_bryan 0:b74591d5ab33 644 }
be_bryan 0:b74591d5ab33 645
be_bryan 0:b74591d5ab33 646 for option in optimization_options:
be_bryan 0:b74591d5ab33 647 opts['cpp'][optimization_options[option]] = False
be_bryan 0:b74591d5ab33 648 if option in flags['cxx_flags']:
be_bryan 0:b74591d5ab33 649 opts['cpp'][optimization_options[option]] = True
be_bryan 0:b74591d5ab33 650 if option in flags['common_flags']:
be_bryan 0:b74591d5ab33 651 opts['cpp'][optimization_options[option]] = True
be_bryan 0:b74591d5ab33 652
be_bryan 0:b74591d5ab33 653 opts['cpp']['verbose'] = False
be_bryan 0:b74591d5ab33 654 if '-v' in flags['cxx_flags']:
be_bryan 0:b74591d5ab33 655 opts['cpp']['verbose'] = True
be_bryan 0:b74591d5ab33 656 self.remove_option(flags['cxx_flags'], '-v')
be_bryan 0:b74591d5ab33 657
be_bryan 0:b74591d5ab33 658 # Linker options.
be_bryan 0:b74591d5ab33 659 linker_options = {
be_bryan 0:b74591d5ab33 660 '-nostartfiles': 'nostart',
be_bryan 0:b74591d5ab33 661 '-nodefaultlibs': 'nodeflibs',
be_bryan 0:b74591d5ab33 662 '-nostdlib': 'nostdlibs',
be_bryan 0:b74591d5ab33 663 }
be_bryan 0:b74591d5ab33 664
be_bryan 0:b74591d5ab33 665 for option in linker_options:
be_bryan 0:b74591d5ab33 666 opts['ld'][linker_options[option]] = False
be_bryan 0:b74591d5ab33 667 if option in flags['ld_flags']:
be_bryan 0:b74591d5ab33 668 opts['ld'][linker_options[option]] = True
be_bryan 0:b74591d5ab33 669 self.remove_option(flags['ld_flags'], option)
be_bryan 0:b74591d5ab33 670
be_bryan 0:b74591d5ab33 671 opts['ld']['gcsections'] = False
be_bryan 0:b74591d5ab33 672 if '-Wl,--gc-sections' in flags['ld_flags']:
be_bryan 0:b74591d5ab33 673 opts['ld']['gcsections'] = True
be_bryan 0:b74591d5ab33 674 self.remove_option(flags['ld_flags'], '-Wl,--gc-sections')
be_bryan 0:b74591d5ab33 675
be_bryan 0:b74591d5ab33 676 opts['ld']['flags'] = []
be_bryan 0:b74591d5ab33 677 to_remove = []
be_bryan 0:b74591d5ab33 678 for opt in flags['ld_flags']:
be_bryan 0:b74591d5ab33 679 if opt.startswith('-Wl,--wrap,'):
be_bryan 0:b74591d5ab33 680 opts['ld']['flags'].append(
be_bryan 0:b74591d5ab33 681 '--wrap=' + opt[len('-Wl,--wrap,'):])
be_bryan 0:b74591d5ab33 682 to_remove.append(opt)
be_bryan 0:b74591d5ab33 683 for opt in to_remove:
be_bryan 0:b74591d5ab33 684 self.remove_option(flags['ld_flags'], opt)
be_bryan 0:b74591d5ab33 685
be_bryan 0:b74591d5ab33 686 # Other tool remaining options are separated by category.
be_bryan 0:b74591d5ab33 687 opts['as']['otherwarnings'] = self.find_options(
be_bryan 0:b74591d5ab33 688 flags['asm_flags'], '-W')
be_bryan 0:b74591d5ab33 689
be_bryan 0:b74591d5ab33 690 opts['c']['otherwarnings'] = self.find_options(
be_bryan 0:b74591d5ab33 691 flags['c_flags'], '-W')
be_bryan 0:b74591d5ab33 692 opts['c']['otheroptimizations'] = self.find_options(flags[
be_bryan 0:b74591d5ab33 693 'c_flags'], '-f')
be_bryan 0:b74591d5ab33 694
be_bryan 0:b74591d5ab33 695 opts['cpp']['otherwarnings'] = self.find_options(
be_bryan 0:b74591d5ab33 696 flags['cxx_flags'], '-W')
be_bryan 0:b74591d5ab33 697 opts['cpp']['otheroptimizations'] = self.find_options(
be_bryan 0:b74591d5ab33 698 flags['cxx_flags'], '-f')
be_bryan 0:b74591d5ab33 699
be_bryan 0:b74591d5ab33 700 # Other common remaining options are separated by category.
be_bryan 0:b74591d5ab33 701 opts['common']['optimization.other'] = self.find_options(
be_bryan 0:b74591d5ab33 702 flags['common_flags'], '-f')
be_bryan 0:b74591d5ab33 703 opts['common']['warnings.other'] = self.find_options(
be_bryan 0:b74591d5ab33 704 flags['common_flags'], '-W')
be_bryan 0:b74591d5ab33 705
be_bryan 0:b74591d5ab33 706 # Remaining common flags are added to each tool.
be_bryan 0:b74591d5ab33 707 opts['as']['other'] += ' ' + \
be_bryan 0:b74591d5ab33 708 ' '.join(flags['common_flags']) + ' ' + \
be_bryan 0:b74591d5ab33 709 ' '.join(flags['asm_flags'])
be_bryan 0:b74591d5ab33 710 opts['c']['other'] += ' ' + \
be_bryan 0:b74591d5ab33 711 ' '.join(flags['common_flags']) + ' ' + ' '.join(flags['c_flags'])
be_bryan 0:b74591d5ab33 712 opts['cpp']['other'] += ' ' + \
be_bryan 0:b74591d5ab33 713 ' '.join(flags['common_flags']) + ' ' + \
be_bryan 0:b74591d5ab33 714 ' '.join(flags['cxx_flags'])
be_bryan 0:b74591d5ab33 715 opts['ld']['other'] += ' ' + \
be_bryan 0:b74591d5ab33 716 ' '.join(flags['common_flags']) + ' ' + ' '.join(flags['ld_flags'])
be_bryan 0:b74591d5ab33 717
be_bryan 0:b74591d5ab33 718 if len(self.system_libraries) > 0:
be_bryan 0:b74591d5ab33 719 opts['ld']['other'] += ' -Wl,--start-group '
be_bryan 0:b74591d5ab33 720 opts['ld'][
be_bryan 0:b74591d5ab33 721 'other'] += ' '.join('-l' + s for s in self.system_libraries) + ' '
be_bryan 0:b74591d5ab33 722 opts['ld'][
be_bryan 0:b74591d5ab33 723 'other'] += ' '.join('-l' + s for s in self.libraries)
be_bryan 0:b74591d5ab33 724 opts['ld']['other'] += ' -Wl,--end-group '
be_bryan 0:b74591d5ab33 725
be_bryan 0:b74591d5ab33 726 # Strip all 'other' flags, since they might have leading spaces.
be_bryan 0:b74591d5ab33 727 opts['as']['other'] = opts['as']['other'].strip()
be_bryan 0:b74591d5ab33 728 opts['c']['other'] = opts['c']['other'].strip()
be_bryan 0:b74591d5ab33 729 opts['cpp']['other'] = opts['cpp']['other'].strip()
be_bryan 0:b74591d5ab33 730 opts['ld']['other'] = opts['ld']['other'].strip()
be_bryan 0:b74591d5ab33 731
be_bryan 0:b74591d5ab33 732 if False:
be_bryan 0:b74591d5ab33 733 print
be_bryan 0:b74591d5ab33 734 print opts
be_bryan 0:b74591d5ab33 735
be_bryan 0:b74591d5ab33 736 print
be_bryan 0:b74591d5ab33 737 print 'common_flags', flags['common_flags']
be_bryan 0:b74591d5ab33 738 print 'asm_flags', flags['asm_flags']
be_bryan 0:b74591d5ab33 739 print 'c_flags', flags['c_flags']
be_bryan 0:b74591d5ab33 740 print 'cxx_flags', flags['cxx_flags']
be_bryan 0:b74591d5ab33 741 print 'ld_flags', flags['ld_flags']
be_bryan 0:b74591d5ab33 742