]> begriffs open source - cmsis/blob - CMSIS/CoreValidation/Examples/MDK-FVP/build.py
Core: Fixed #pragma clang system_header to be used for all clang based compilers.
[cmsis] / CMSIS / CoreValidation / Examples / MDK-FVP / build.py
1 #! python
2
3 import sys
4 from argparse import ArgumentParser
5 from datetime import datetime
6
7 sys.path.append('../../../Utilities/buildutils') 
8
9 from uv4cmd import Uv4Cmd 
10 from fvpcmd import FvpCmd 
11 from testresult import TestResult
12
13 DEVICE_CM0  = 'Cortex-M0'
14 DEVICE_CM3  = 'Cortex-M3'
15 DEVICE_CM4f = 'Cortex-M4f'
16 DEVICE_CM7  = 'Cortex-M7'
17 DEVICE_CM23 = 'Cortex-M23'
18 DEVICE_CM33 = 'Cortex-M33'
19
20 CC_AC6 = 'AC6'
21 CC_AC5 = 'AC5'
22 CC_GCC = 'GCC'
23
24 TARGET_FVP = 'FVP'
25
26 DEVICES = [ DEVICE_CM0, DEVICE_CM3, DEVICE_CM4f, DEVICE_CM7 ]
27 COMPILERS = [ CC_AC5, CC_AC6, CC_GCC ]
28 TARGETS = [ TARGET_FVP ]
29
30 SKIP = [ 
31     [ DEVICE_CM23, CC_GCC, None ],
32     [ DEVICE_CM33, CC_GCC, None ]
33   ]
34
35 APP_FORMAT = {
36   CC_AC6: "axf",
37   CC_AC5: "axf",
38   CC_GCC: "elf"
39 }
40   
41 FVP_MODELS = { 
42     DEVICE_CM0  : { 'cmd': "fvp_mps2_cortex-m0.exe",  'args': { 'limit': "2000000" } },
43     DEVICE_CM3  : { 'cmd': "fvp_mps2_cortex-m3.exe",  'args': { 'limit': "2000000" } },
44     DEVICE_CM4f : { 'cmd': "fvp_mps2_cortex-m4.exe",  'args': { 'limit': "5000000" } },
45     DEVICE_CM7  : { 'cmd': "fvp_mps2_cortex-m7.exe",  'args': { 'limit': "5000000" } },
46     DEVICE_CM23 : { 'cmd': "fvp_mps2_cortex-m23.exe", 'args': { 'limit': "5000000", 'config': "ARMCM23_TZ_config.txt",        'target': "cpu0" } },
47     DEVICE_CM33 : { 'cmd': "fvp_mps2_cortex-m33.exe", 'args': { 'limit': "5000000", 'config': "ARMCM33_DSP_FP_TZ_config.txt", 'target': "cpu0" } }
48   }
49
50 def isSkipped(dev, cc, target):
51   for skip in SKIP:
52     skipDev = (skip[0] == None or skip[0] == dev)
53     skipCc = (skip[1] == None or skip[1] == cc)
54     skipTarget = (skip[2] == None or skip[2] == target)
55     if skipDev and skipCc and skipTarget:
56       return True
57   return False
58
59 def prepare(steps, args):
60   for dev in args.devices:
61     for cc in args.compilers:
62       for target in args.targets:
63         if not isSkipped(dev, cc, target):
64           config = "{dev} ({cc}, {target})".format(dev = dev, cc = cc, target = target)
65           prefix = "{dev}_{cc}_{target}".format(dev = dev, cc = cc, target = target)
66           if args.execute_only:
67             build = None
68           else:
69             build = Uv4Cmd("CMSIS_CV.uvprojx", config)
70           if args.build_only:
71             test = None
72           else:
73             test = FvpCmd(FVP_MODELS[dev]['cmd'], "Objects\CMSIS_CV."+APP_FORMAT[cc], **FVP_MODELS[dev]['args'])
74           steps += [ { 'name': config, 'prefix': prefix, 'build': build, 'test': test } ]
75
76 def execute(steps):
77   for step in steps:
78     print step['name']
79     if step['build']:
80       step['build'].run()
81     else:
82       print "Skipping build"
83       
84     if (not step['build']) or step['build'].isSuccess():
85       step['test'].run()
86       step['result'] = TestResult(step['test'].getOutput())
87       step['result'].saveXml("result_{0}_{1}.xml".format(step['prefix'], datetime.now().strftime("%Y%m%d%H%M%S")))
88     else:
89       print "Skipping test"
90       
91 def printSummary(steps):
92   print ""
93   print "Test Summary"
94   print "============"
95   print
96   print "Test run                       Total Exec  Pass  Fail  "
97   print "-------------------------------------------------------"
98   for step in steps:
99     try:
100       print "{0:30} {1:>4}  {2:>4}  {3:>4}  {4:>4}".format(step['name'], *step['result'].getSummary())
101     except:
102       print "{0:30} ------ NO RESULTS ------".format(step['name'])
103
104 def main(argv):
105   parser = ArgumentParser()
106   parser.add_argument('-b', '--build-only', action='store_true')
107   parser.add_argument('-e', '--execute-only', action='store_true')
108   parser.add_argument('-d', '--devices', nargs='*', choices=DEVICES, default=DEVICES, help = 'Devices to be considered.')
109   parser.add_argument('-c', '--compilers', nargs='*', choices=COMPILERS, default=COMPILERS, help = 'Compilers to be considered.')
110   parser.add_argument('-t', '--targets', nargs='*', choices=TARGETS, default=TARGETS, help = 'Targets to be considered.')
111   args = parser.parse_args()
112     
113   steps = []
114
115   prepare(steps, args)
116   
117   execute(steps)
118   
119   printSummary(steps)
120   
121 if __name__ == "__main__":
122   main(sys.argv[1:])