Skip to content

Commit 67499b2

Browse files
theotherjimmyDeepika
authored and
Deepika
committed
Enable export to uvision5 + armc6
1 parent 9162f40 commit 67499b2

File tree

3 files changed

+55
-27
lines changed

3 files changed

+55
-27
lines changed

tools/export/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@
3636
from tools.targets import TARGET_NAMES
3737

3838
EXPORTERS = {
39-
'uvision5': uvision.Uvision,
40-
'uvision': uvision.Uvision,
39+
'uvision5-armc6': uvision.UvisionArmc6,
40+
'uvision5-armc5': uvision.UvisionArmc5,
41+
'uvision5': uvision.UvisionArmc5,
42+
'uvision': uvision.UvisionArmc5,
4143
'lpcxpresso': lpcxpresso.LPCXpresso,
4244
'gcc_arm': makefile.GccArm,
4345
'make_gcc_arm': makefile.GccArm,

tools/export/uvision/__init__.py

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@ class Uvision(Exporter):
117117
project file (.uvprojx).
118118
The needed information can be viewed in uvision.tmpl
119119
"""
120-
NAME = 'uvision5'
121-
TOOLCHAIN = 'ARM'
122120

123121
POST_BINARY_WHITELIST = set([
124122
"MCU_NRF51Code.binary_hook",
@@ -130,12 +128,6 @@ class Uvision(Exporter):
130128
"NCS36510TargetCode.ncs36510_addfib"
131129
])
132130

133-
@classmethod
134-
def is_target_supported(cls, target_name):
135-
target = TARGET_MAP[target_name]
136-
return apply_supported_whitelist(
137-
cls.TOOLCHAIN, cls.POST_BINARY_WHITELIST, target) and\
138-
DeviceCMSIS.check_supported(target_name)
139131

140132
#File associations within .uvprojx file
141133
file_types = {'.cpp': 8, '.c': 1, '.s': 2,
@@ -166,22 +158,25 @@ def uv_files(self, files):
166158
def format_flags(self):
167159
"""Format toolchain flags for Uvision"""
168160
flags = copy.deepcopy(self.flags)
169-
# to be preprocessed with armcc
170161
asm_flag_string = (
171162
'--cpreproc --cpreproc_opts=-D__ASSERT_MSG,' +
172163
",".join(filter(lambda f: f.startswith("-D"), flags['asm_flags'])))
173164
flags['asm_flags'] = asm_flag_string
174-
# All non-asm flags are in one template field
175-
c_flags = list(set(flags['c_flags'] + flags['cxx_flags'] +flags['common_flags']))
176-
ld_flags = list(set(flags['ld_flags'] ))
177-
# These flags are in template to be set by user i n IDE
178-
template = ["--no_vla", "--cpp", "--c99"]
179-
# Flag is invalid if set in template
180-
# Optimizations are also set in the template
181-
invalid_flag = lambda x: x in template or re.match("-O(\d|time)", x)
182-
flags['c_flags'] = [flag.replace('"','\\"') for flag in c_flags if not invalid_flag(flag)]
183-
flags['c_flags'] = " ".join(flags['c_flags'])
184-
flags['ld_flags'] = " ".join(flags['ld_flags'])
165+
166+
c_flags = set(flags['c_flags'] + flags['cxx_flags'] +flags['common_flags'])
167+
in_template = set(["--no_vla", "--cpp", "--c99", "-std=gnu99",
168+
"-std=g++98"] + self.toolchain.get_config_option(
169+
self.toolchain.get_config_header()))
170+
171+
valid_flag = lambda x: x not in in_template or not x.startswith("-O")
172+
is_define = lambda s: s.startswith("-D")
173+
174+
flags['c_flags'] = " ".join(f.replace('"','\\"') for f in c_flags
175+
if (valid_flag(f) and not is_define(f)))
176+
flags['c_flags'] += " ".join(self.toolchain.get_config_option(
177+
self.toolchain.get_config_header()))
178+
flags['c_defines'] = " ".join(f[2:] for f in c_flags if is_define(f))
179+
flags['ld_flags'] = " ".join(set(flags['ld_flags']))
185180
return flags
186181

187182
def format_src(self, srcs):
@@ -232,6 +227,8 @@ def generate(self):
232227
else:
233228
ctx['fpu_setting'] = 1
234229
ctx['fputype'] = self.format_fpu(core)
230+
ctx['armc6'] = int(self.TOOLCHAIN is 'ARMC6')
231+
ctx['toolchain_name'] = self.TOOLCHAIN_NAME
235232
ctx.update(self.format_flags())
236233
self.gen_file('uvision/uvision.tmpl', ctx, self.project_name+".uvprojx")
237234
self.gen_file('uvision/uvision_debug.tmpl', ctx, self.project_name + ".uvoptx")
@@ -269,3 +266,29 @@ def build(project_name, log_name='build_log.txt', cleanup=True):
269266
return -1
270267
else:
271268
return 0
269+
270+
class UvisionArmc5(Uvision):
271+
NAME = 'uvision5-armc5'
272+
TOOLCHAIN = 'ARM'
273+
TOOLCHAIN_NAME = ''
274+
275+
@classmethod
276+
def is_target_supported(cls, target_name):
277+
target = TARGET_MAP[target_name]
278+
return apply_supported_whitelist(
279+
cls.TOOLCHAIN, cls.POST_BINARY_WHITELIST, target) and\
280+
DeviceCMSIS.check_supported(target_name)
281+
282+
class UvisionArmc6(Uvision):
283+
NAME = 'uvision5-armc6'
284+
TOOLCHAIN = 'ARMC6'
285+
TOOLCHAIN_NAME = '6070000::V6.7::.\ARMCLANG'
286+
287+
@classmethod
288+
def is_target_supported(cls, target_name):
289+
target = TARGET_MAP[target_name]
290+
return (apply_supported_whitelist(
291+
cls.TOOLCHAIN, cls.POST_BINARY_WHITELIST, target) or
292+
apply_supported_whitelist(
293+
'ARM', Uvision.POST_BINARY_WHITELIST, target)) and\
294+
DeviceCMSIS.check_supported(target_name)

tools/export/uvision/uvision.tmpl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
<TargetName>{{name}}</TargetName>
1111
<ToolsetNumber>0x4</ToolsetNumber>
1212
<ToolsetName>ARM-ADS</ToolsetName>
13+
{% if toolchain_name %}
14+
<pCCUsed>{{toolchain_name}}</pCCUsed>
15+
{% endif %}
16+
<uAC6>{{armc6}}</uAC6>
1317
<TargetOption>
1418
<TargetCommonOption>
1519
<Device>{{device.dname}}</Device>
@@ -354,7 +358,7 @@
354358
<Optim>1</Optim>
355359
<oTime>0</oTime>
356360
<SplitLS>0</SplitLS>
357-
<OneElfS>0</OneElfS>
361+
<OneElfS>1</OneElfS>
358362
<Strict>0</Strict>
359363
<EnumInt>0</EnumInt>
360364
<PlainCh>0</PlainCh>
@@ -365,16 +369,16 @@
365369
<uSurpInc>0</uSurpInc>
366370
<uC99>1</uC99>
367371
<useXO>0</useXO>
368-
<v6Lang>1</v6Lang>
369-
<v6LangP>1</v6LangP>
372+
<v6Lang>4</v6Lang>
373+
<v6LangP>2</v6LangP>
370374
<vShortEn>1</vShortEn>
371375
<vShortWch>1</vShortWch>
372376
<v6Lto>0</v6Lto>
373377
<v6WtE>0</v6WtE>
374378
<v6Rtti>0</v6Rtti>
375379
<VariousControls>
376380
<MiscControls>{{c_flags}}</MiscControls>
377-
<Define></Define>
381+
<Define>{{c_defines}}</Define>
378382
<Undefine></Undefine>
379383
<IncludePath>{{include_paths}}</IncludePath>
380384
</VariousControls>
@@ -434,5 +438,4 @@
434438
</Groups>
435439
</Target>
436440
</Targets>
437-
438441
</Project>

0 commit comments

Comments
 (0)