build_all.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import os
  2. import glob
  3. import sys
  4. import subprocess
  5. import time
  6. success_count = 0
  7. fail_count = 0
  8. skip_count = 0
  9. exit_status = 0
  10. total_time = time.monotonic()
  11. # 1st Argument is Example, build all examples if not existed
  12. all_examples = []
  13. if len(sys.argv) > 1:
  14. all_examples.append(sys.argv[1])
  15. else:
  16. for entry in os.scandir("examples/device"):
  17. if entry.is_dir():
  18. all_examples.append(entry.name)
  19. all_examples.sort()
  20. # 2nd Argument is Board, build all boards if not existed
  21. all_boards = []
  22. if len(sys.argv) > 2:
  23. all_boards.append(sys.argv[2])
  24. else:
  25. for entry in os.scandir("hw/bsp"):
  26. if entry.is_dir():
  27. all_boards.append(entry.name)
  28. all_boards.sort()
  29. def build_example(example, board):
  30. subprocess.run("make -C examples/device/{} BOARD={} clean".format(example, board), shell=True,
  31. stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  32. return subprocess.run("make -j 4 -C examples/device/{} BOARD={} all".format(example, board), shell=True,
  33. stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  34. def build_size(example, board):
  35. elf_file = 'examples/device/{}/_build/build-{}/{}-firmware.elf'.format(example, board, board)
  36. size_output = subprocess.run('size {}'.format(elf_file), shell=True, stdout=subprocess.PIPE).stdout.decode("utf-8")
  37. size_list = size_output.split('\n')[1].split('\t')
  38. flash_size = int(size_list[0])
  39. sram_size = int(size_list[1]) + int(size_list[2])
  40. return (flash_size, sram_size)
  41. def skip_example(example, board):
  42. ex_dir = 'examples/device/' + example
  43. board_mk = 'hw/bsp/{}/board.mk'.format(board)
  44. for skip_file in glob.iglob(ex_dir + '/.skip.MCU_*'):
  45. mcu_cflag = '-DCFG_TUSB_MCU=OPT_' + os.path.basename(skip_file).split('.')[2]
  46. with open(board_mk) as mk:
  47. if mcu_cflag in mk.read():
  48. return 1
  49. return 0
  50. build_format = '| {:20} | {:30} | {:9} | {:5} | {:6} | {:6} |'
  51. build_separator = '-' * 95
  52. print(build_separator)
  53. print(build_format.format('Example', 'Board', 'Result', 'Time', 'Flash', 'SRAM'))
  54. for example in all_examples:
  55. print(build_separator)
  56. for board in all_boards:
  57. start_time = time.monotonic()
  58. flash_size = "-"
  59. sram_size = "-"
  60. # Check if board is skipped
  61. if skip_example(example, board):
  62. success = "\033[33mskipped\033[0m "
  63. skip_count += 1
  64. print(build_format.format(example, board, success, '-', flash_size, sram_size))
  65. else:
  66. build_result = build_example(example, board)
  67. if build_result.returncode == 0:
  68. success = "\033[32msucceeded\033[0m"
  69. success_count += 1
  70. (flash_size, sram_size) = build_size(example, board)
  71. else:
  72. exit_status = build_result.returncode
  73. success = "\033[31mfailed\033[0m "
  74. fail_count += 1
  75. build_duration = time.monotonic() - start_time
  76. print(build_format.format(example, board, success, "{:.2f}".format(build_duration), flash_size, sram_size))
  77. if build_result.returncode != 0:
  78. print(build_result.stdout.decode("utf-8"))
  79. # FreeRTOS example
  80. # example = 'cdc_msc_hid_freertos'
  81. # board = 'pca10056'
  82. # build_example(example, board)
  83. total_time = time.monotonic() - total_time
  84. print(build_separator)
  85. print("Build Sumamary: {} \033[32msucceeded\033[0m, {} \033[31mfailed\033[0m, {} \033[33mskipped\033[0m and took {:.2f}s".format(success_count, fail_count, skip_count, total_time))
  86. print(build_separator)
  87. sys.exit(exit_status)