build_all.py 3.8 KB

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