]> begriffs open source - cmsis/blob - CMSIS/CoreValidation/Examples/DS-MDK/build.py
CoreValidation: Added test functions for MSPLIM and PSPLIM.
[cmsis] / CMSIS / CoreValidation / Examples / DS-MDK / 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 buildcmd import BuildCmd
10 from fvpcmd import FvpCmd 
11 from testresult import TestResult
12
13 DEVICE_A5  = 'Cortex-A5'
14 DEVICE_A7  = 'Cortex-A7'
15 DEVICE_A9  = 'Cortex-A9'
16
17 CC_AC6 = 'AC6'
18 CC_AC5 = 'AC5'
19 CC_GCC = 'GCC'
20
21 TARGET_FVP = 'FVP'
22
23 DEVICES = [ DEVICE_A5, DEVICE_A7, DEVICE_A9 ]
24 COMPILERS = [ CC_AC5, CC_AC6, CC_GCC ]
25 TARGETS = [ TARGET_FVP ]
26
27 SKIP = [ 
28   ]
29
30 DEVICE_ABREV = {
31   DEVICE_A5 : 'CA5',
32   DEVICE_A7 : 'CA7',
33   DEVICE_A9 : 'CA9'
34 }
35   
36 APP_FORMAT = {
37   CC_AC6: "axf",
38   CC_AC5: "axf",
39   CC_GCC: "elf"
40 }
41   
42 FVP_MODELS = { 
43     DEVICE_A5   : { 'cmd': "fvp_ve_cortex-a5x1.exe",  'args': { 'limit': "5000000", 'config': "ARMCA5_config.txt" } },
44     DEVICE_A7   : { 'cmd': "fvp_ve_cortex-a7x1.exe",  'args': { 'limit': "5000000", 'config': "ARMCA7_config.txt" } },
45     DEVICE_A9   : { 'cmd': "fvp_ve_cortex-a9x1.exe",  'args': { 'limit': "5000000", 'config': "ARMCA9_config.txt" } }
46   }
47   
48 class EclipseCmd(BuildCmd):
49
50   def __init__(self, path, project, **kwargs):
51     BuildCmd.__init__(self)
52     self._path = path
53     self._project = project
54     self._workspace = kwargs['workspace']
55     print self._workspace
56     
57   def getCommand(self):
58     return "eclipsec.exe"
59     
60   def getArguments(self):
61     args = [ "-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.cdt.managedbuilder.core.headlessbuild", "-import", self._path, "-cleanBuild", self._project ]
62     if self._workspace: args += [ "-data", self._workspace ]
63     return args
64     
65   
66   def isSuccess(self):
67     return self._result == 0
68
69 def isSkipped(dev, cc, target):
70   for skip in SKIP:
71     skipDev = (skip[0] == None or skip[0] == dev)
72     skipCc = (skip[1] == None or skip[1] == cc)
73     skipTarget = (skip[2] == None or skip[2] == target)
74     if skipDev and skipCc and skipTarget:
75       return True
76   return False
77
78 def prepare(steps, args):
79   for dev in args.devices:
80     for cc in args.compilers:
81       for target in args.targets:
82         if not isSkipped(dev, cc, target):
83           config = "{dev} ({cc}, {target})".format(dev = dev, cc = cc, target = target)
84           prefix = "{dev}_{cc}_{target}".format(dev = dev, cc = cc, target = target)
85           build = None
86           test = None
87           if not args.execute_only:
88             build = EclipseCmd("{dev}/{cc}".format(dev = dev, cc = cc), "CMSIS_CV_{abrev}_{cc}".format(abrev = DEVICE_ABREV[dev], cc = cc), workspace=args.workspace)
89           if not args.build_only:
90             binary = "{dev}/{cc}/Debug/CMSIS_CV_{abrev}_{cc}.{format}".format(dev = dev, abrev = DEVICE_ABREV[dev], cc = cc, format = APP_FORMAT[cc])
91             test = FvpCmd(FVP_MODELS[dev]['cmd'], binary, **FVP_MODELS[dev]['args'])
92           steps += [ { 'name': config, 'prefix': prefix, 'build': build, 'test': test } ]
93
94 def execute(steps):
95   for step in steps:
96     print step['name']
97     if step['build']:
98       step['build'].run()
99     else:
100       print "Skipping build"
101       
102     if step['test'] and ((not step['build']) or step['build'].isSuccess()):
103       step['test'].run()
104       step['result'] = TestResult(step['test'].getOutput())
105       step['result'].saveXml("result_{0}_{1}.xml".format(step['prefix'], datetime.now().strftime("%Y%m%d%H%M%S")))
106     else:
107       print "Skipping test"
108       
109 def printSummary(steps):
110   print ""
111   print "Test Summary"
112   print "============"
113   print
114   print "Test run                       Total Exec  Pass  Fail  "
115   print "-------------------------------------------------------"
116   for step in steps:
117     try:
118       print "{0:30} {1:>4}  {2:>4}  {3:>4}  {4:>4}".format(step['name'], *step['result'].getSummary())
119     except:
120       print "{0:30} ------ NO RESULTS ------".format(step['name'])
121
122 def main(argv):
123   parser = ArgumentParser()
124   parser.add_argument('-w', '--workspace', help = 'DS-MDK Workspace to be used.')
125   parser.add_argument('-b', '--build-only', action='store_true')
126   parser.add_argument('-e', '--execute-only', action='store_true')
127   parser.add_argument('-d', '--devices', nargs='*', choices=DEVICES, default=DEVICES, help = 'Devices to be considered.')
128   parser.add_argument('-c', '--compilers', nargs='*', choices=COMPILERS, default=COMPILERS, help = 'Compilers to be considered.')
129   parser.add_argument('-t', '--targets', nargs='*', choices=TARGETS, default=TARGETS, help = 'Targets to be considered.')
130   args = parser.parse_args()
131     
132   steps = []
133
134   prepare(steps, args)
135   
136   execute(steps)
137   
138   printSummary(steps)
139   
140 if __name__ == "__main__":
141   main(sys.argv[1:])