builder.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #! python
  2. import os
  3. import shutil
  4. import sys
  5. from datetime import datetime
  6. from buildutils.builder import Device, Compiler, Axis, Step, BuildStep, RunModelStep, Builder, Filter
  7. TARGET_FVP = 'FVP'
  8. FVP_MODELS = {
  9. Device.CM0 : { 'cmd': "FVP_MPS2_Cortex-M0", 'args': { 'limit': "1000000000", 'config': "config/ARMCM0_config.txt" } },
  10. Device.CM0PLUS : { 'cmd': "FVP_MPS2_Cortex-M0plus", 'args': { 'limit': "1000000000", 'config': "config/ARMCM0plus_config.txt" } },
  11. Device.CM3 : { 'cmd': "FVP_MPS2_Cortex-M3", 'args': { 'limit': "1000000000", 'config': "config/ARMCM3_config.txt" } },
  12. Device.CM4 : { 'cmd': "FVP_MPS2_Cortex-M4", 'args': { 'limit': "1000000000", 'config': "config/ARMCM4_config.txt" } },
  13. Device.CM4FP : { 'cmd': "FVP_MPS2_Cortex-M4", 'args': { 'limit': "1000000000", 'config': "config/ARMCM4FP_config.txt" } },
  14. Device.CM7 : { 'cmd': "FVP_MPS2_Cortex-M7", 'args': { 'limit': "1000000000", 'config': "config/ARMCM7_config.txt" } },
  15. Device.CM7SP : { 'cmd': "FVP_MPS2_Cortex-M7", 'args': { 'limit': "1000000000", 'config': "config/ARMCM7SP_config.txt" } },
  16. Device.CM7DP : { 'cmd': "FVP_MPS2_Cortex-M7", 'args': { 'limit': "1000000000", 'config': "config/ARMCM7DP_config.txt" } },
  17. Device.CM23 : { 'cmd': "FVP_MPS2_Cortex-M23", 'args': { 'limit': "1000000000", 'config': "config/ARMCM23_config.txt", 'target': "cpu0" } },
  18. Device.CM33 : { 'cmd': "FVP_MPS2_Cortex-M33", 'args': { 'limit': "1000000000", 'config': "config/ARMCM33_config.txt", 'target': "cpu0" } },
  19. Device.CM23NS : { 'cmd': "FVP_MPS2_Cortex-M23", 'args': { 'limit': "1000000000", 'config': "config/ARMCM23_TZ_config.txt", 'target': "cpu0" } },
  20. Device.CM33NS : { 'cmd': "FVP_MPS2_Cortex-M33", 'args': { 'limit': "1000000000", 'config': "config/ARMCM33_DSP_FP_TZ_config.txt", 'target': "cpu0" } },
  21. Device.CM23S : { 'cmd': "FVP_MPS2_Cortex-M23", 'args': { 'limit': "1000000000", 'config': "config/ARMCM23_TZ_config.txt", 'target': "cpu0" } },
  22. Device.CM33S : { 'cmd': "FVP_MPS2_Cortex-M33", 'args': { 'limit': "1000000000", 'config': "config/ARMCM33_DSP_FP_TZ_config.txt", 'target': "cpu0" } },
  23. Device.CA5 : { 'cmd': "fvp_ve_cortex-a5x1.exe", 'args': { 'limit': "1000000000", 'config': "config/ARMCA5_config.txt" } },
  24. Device.CA7 : { 'cmd': "fvp_ve_cortex-a7x1.exe", 'args': { 'limit': "1000000000", 'config': "config/ARMCA7_config.txt" } },
  25. Device.CA9 : { 'cmd': "fvp_ve_cortex-a9x1.exe", 'args': { 'limit': "1000000000", 'config': "config/ARMCA9_config.txt" } },
  26. Device.CA5NEON : { 'cmd': "fvp_ve_cortex-a5x1.exe", 'args': { 'limit': "1000000000", 'config': "config/ARMCA5neon_config.txt" } },
  27. Device.CA7NEON : { 'cmd': "fvp_ve_cortex-a7x1.exe", 'args': { 'limit': "1000000000", 'config': "config/ARMCA7neon_config.txt" } },
  28. Device.CA9NEON : { 'cmd': "fvp_ve_cortex-a9x1.exe", 'args': { 'limit': "1000000000", 'config': "config/ARMCA9neon_config.txt" } }
  29. }
  30. def format(str, dev, cc, target = "FVP", **kwargs):
  31. return str.format(dev = dev.value[0], cc = cc.value, target = target, **kwargs)
  32. def testProject(dev, cc, target):
  33. rtebuild = format("{dev}/{cc}/default.rtebuild", dev = dev, cc = cc, target=target)
  34. if os.path.exists(rtebuild):
  35. return [
  36. rtebuild,
  37. format("{dev}/{cc}/build/{target}/{target}.elf", dev = dev, cc = cc, target=target)
  38. ]
  39. elif (cc == Compiler.AC5) or (cc == Compiler.AC6):
  40. return [
  41. format("{dev}/{cc}/CMSIS_CV.uvprojx", dev = dev, cc = cc),
  42. format("{dev}/{cc}/Objects/CMSIS_CV.axf", dev = dev, cc = cc)
  43. ]
  44. elif (cc == Compiler.AC6LTM):
  45. return [
  46. format("{dev}/{cc}/CMSIS_CV.uvprojx", dev = dev, cc = Compiler.AC6),
  47. format("{dev}/{cc}/Objects/CMSIS_CV.axf", dev = dev, cc = Compiler.AC6)
  48. ]
  49. elif (cc == Compiler.GCC):
  50. return [
  51. format("{dev}/{cc}/CMSIS_CV.uvprojx", dev = dev, cc = cc),
  52. format("{dev}/{cc}/Objects/CMSIS_CV.elf", dev = dev, cc = cc)
  53. ]
  54. elif (cc == Compiler.IAR):
  55. return [
  56. format("{dev}/{cc}/CMSIS_CV.ewp", dev = dev, cc = cc),
  57. format("{dev}/{cc}/{target}/Exe/CMSIS_CV.out", dev = dev, cc = cc, target = target)
  58. ]
  59. raise "Unknown compiler!"
  60. def bootloaderProject(dev, cc, target):
  61. rtebuild = format("{dev}/{cc}/Bootloader/default.rtebuild", dev = dev, cc = cc, target=target)
  62. if os.path.exists(rtebuild):
  63. return [
  64. rtebuild,
  65. format("{dev}/{cc}/Bootloader/build/{target}/{target}.elf", dev = dev, cc = cc, target=target)
  66. ]
  67. elif (cc == Compiler.AC5) or (cc == Compiler.AC6):
  68. return [
  69. format("{dev}/{cc}/Bootloader/Bootloader.uvprojx", dev = dev, cc = cc),
  70. format("{dev}/{cc}/Bootloader/Objects/Bootloader.axf", dev = dev, cc = cc)
  71. ]
  72. elif (cc == Compiler.AC6LTM):
  73. return [
  74. format("{dev}/{cc}/Bootloader/Bootloader.uvprojx", dev = dev, cc = Compiler.AC6),
  75. format("{dev}/{cc}/Bootloader/Objects/Bootloader.axf", dev = dev, cc = Compiler.AC6)
  76. ]
  77. elif (cc == Compiler.GCC):
  78. return [
  79. format("{dev}/{cc}/Bootloader/Bootloader.uvprojx", dev = dev, cc = cc),
  80. format("{dev}/{cc}/Bootloader/Objects/Bootloader.elf", dev = dev, cc = cc)
  81. ]
  82. elif (cc == Compiler.IAR):
  83. return [
  84. format("{dev}/{cc}/Bootloader/Bootloader.ewp", dev = dev, cc = cc),
  85. format("{dev}/{cc}/Bootloader/{target}/Exe/Bootloader.out", dev = dev, cc = cc, target = target)
  86. ]
  87. raise "Unknown compiler!"
  88. def projects(step, config):
  89. dev = config['device']
  90. cc = config['compiler']
  91. target = config['target']
  92. projects = []
  93. blPrj = bootloaderProject(dev, cc, target)
  94. if os.path.exists(blPrj[0]):
  95. projects += [ blPrj[0] ]
  96. projects += [ testProject(dev, cc, target)[0] ]
  97. return projects
  98. def images(step, config):
  99. dev = config['device']
  100. cc = config['compiler']
  101. target = config['target']
  102. images = []
  103. blPrj = bootloaderProject(dev, cc, target)
  104. if os.path.exists(blPrj[1]):
  105. images += [ blPrj[1] ]
  106. images += [ testProject(dev, cc, target)[1] ]
  107. return images
  108. def storeResult(step, config, cmd):
  109. result = format("result_{dev}_{cc}_{target}_{now}.xml", config['device'], config['compiler'], config['target'], now = datetime.now().strftime("%Y%m%d%H%M%S"))
  110. step.storeResult(cmd, result)
  111. def create():
  112. deviceAxis = Axis("device", abbrev="d", values=Device, desc="Device(s) to be considered.")
  113. compilerAxis = Axis("compiler", abbrev="c", values=Compiler, desc="Compiler(s) to be considered.")
  114. targetAxis = Axis("target", abbrev="t", values=[ TARGET_FVP ], desc="Target(s) to be considered.")
  115. buildStep = BuildStep("build", abbrev="b", desc="Build the selected configurations.")
  116. buildStep.projects = projects
  117. buildStep.target = lambda step, config: config['target']
  118. runStep = RunModelStep("run", abbrev="r", desc="Run the selected configurations.")
  119. runStep.images = images
  120. runStep.model = lambda step, config: FVP_MODELS[config['device']]
  121. runStep.post = storeResult
  122. filterAC5 = Filter().addAxis(compilerAxis, Compiler.AC5).addAxis(deviceAxis, "CM[23]3*")
  123. filterAC6LTM = Filter().addAxis(compilerAxis, Compiler.AC6LTM).addAxis(deviceAxis, "CM[23]3*").addAxis(deviceAxis, "CM0*")
  124. builder = Builder()
  125. builder.addAxis([ compilerAxis, deviceAxis, targetAxis ])
  126. builder.addStep([ buildStep, runStep ])
  127. builder.addFilter([ filterAC5, filterAC6LTM ])
  128. return builder
  129. def complete(builder, success):
  130. builder.saveJunitResult("build_{now}.xml".format(now = datetime.now().strftime("%Y%m%d%H%M%S")))