2019-03-23 16:51:07 +07:00
import os
2020-03-09 15:51:29 +07:00
import glob
2019-03-23 16:51:07 +07:00
import sys
import subprocess
import time
2019-05-02 19:01:25 +07:00
success_count = 0
fail_count = 0
2020-03-09 17:42:57 +07:00
skip_count = 0
2019-05-02 19:01:25 +07:00
exit_status = 0
2019-08-08 12:20:41 +07:00
total_time = time . monotonic ( )
2020-03-09 15:51:29 +07:00
# 1st Argument is Example, build all examples if not existed
2019-08-08 12:20:41 +07:00
all_examples = [ ]
2019-11-21 16:37:34 +07:00
if len ( sys . argv ) > 1 :
all_examples . append ( sys . argv [ 1 ] )
else :
for entry in os . scandir ( " examples/device " ) :
if entry . is_dir ( ) :
all_examples . append ( entry . name )
2020-03-09 15:51:29 +07:00
all_examples . sort ( )
2019-05-15 18:11:08 +07:00
2020-03-09 15:51:29 +07:00
# 2nd Argument is Board, build all boards if not existed
2019-05-15 18:11:08 +07:00
all_boards = [ ]
2020-03-09 15:51:29 +07:00
if len ( sys . argv ) > 2 :
all_boards . append ( sys . argv [ 2 ] )
else :
for entry in os . scandir ( " hw/bsp " ) :
2020-04-03 12:08:06 +07:00
if entry . is_dir ( ) :
2020-03-09 15:51:29 +07:00
all_boards . append ( entry . name )
all_boards . sort ( )
2019-03-23 16:51:07 +07:00
2019-08-08 12:20:41 +07:00
2019-05-02 19:01:25 +07:00
def build_example ( example , board ) :
2019-08-08 12:20:41 +07:00
subprocess . run ( " make -C examples/device/ {} BOARD= {} clean " . format ( example , board ) , shell = True ,
stdout = subprocess . PIPE , stderr = subprocess . STDOUT )
2019-12-09 18:49:38 +07:00
return subprocess . run ( " make -j 4 -C examples/device/ {} BOARD= {} all " . format ( example , board ) , shell = True ,
2019-08-08 12:20:41 +07:00
stdout = subprocess . PIPE , stderr = subprocess . STDOUT )
2019-05-02 19:01:25 +07:00
2020-03-09 17:42:57 +07:00
def build_size ( example , board ) :
2020-04-03 12:08:06 +07:00
#elf_file = 'examples/device/{}/_build/build-{}/{}-firmware.elf'.format(example, board, board)
elf_file = ' examples/device/ {} /_build/build- {} /*.elf ' . format ( example , board )
2020-03-09 17:42:57 +07:00
size_output = subprocess . run ( ' size {} ' . format ( elf_file ) , shell = True , stdout = subprocess . PIPE ) . stdout . decode ( " utf-8 " )
size_list = size_output . split ( ' \n ' ) [ 1 ] . split ( ' \t ' )
flash_size = int ( size_list [ 0 ] )
sram_size = int ( size_list [ 1 ] ) + int ( size_list [ 2 ] )
return ( flash_size , sram_size )
2020-03-09 15:51:29 +07:00
def skip_example ( example , board ) :
ex_dir = ' examples/device/ ' + example
board_mk = ' hw/bsp/ {} /board.mk ' . format ( board )
2020-04-03 12:08:06 +07:00
with open ( board_mk ) as mk :
mk_contents = mk . read ( )
# Skip ESP32-S2 board if example is not FreeRTOS one
if ' freertos ' not in example and ' CROSS_COMPILE = xtensa-esp32-elf- ' in mk_contents :
return 1
# Skip if CFG_TUSB_MCU in board.mk to match skip file
for skip_file in glob . iglob ( ex_dir + ' /.skip.MCU_* ' ) :
mcu_cflag = ' -DCFG_TUSB_MCU=OPT_ ' + os . path . basename ( skip_file ) . split ( ' . ' ) [ 2 ]
if mcu_cflag in mk_contents :
2020-03-09 15:51:29 +07:00
return 1
return 0
2019-05-02 19:01:25 +07:00
2020-03-09 17:42:57 +07:00
build_format = ' | {:20} | {:30} | {:9} | {:5} | {:6} | {:6} | '
build_separator = ' - ' * 95
2019-08-08 12:20:41 +07:00
print ( build_separator )
2020-03-09 17:42:57 +07:00
print ( build_format . format ( ' Example ' , ' Board ' , ' Result ' , ' Time ' , ' Flash ' , ' SRAM ' ) )
2019-07-11 23:52:58 +07:00
for example in all_examples :
2019-08-08 12:20:41 +07:00
print ( build_separator )
2019-04-26 15:55:00 +07:00
for board in all_boards :
2019-05-02 19:01:25 +07:00
start_time = time . monotonic ( )
2020-03-09 17:42:57 +07:00
flash_size = " - "
sram_size = " - "
2020-03-09 15:51:29 +07:00
# Check if board is skipped
if skip_example ( example , board ) :
success = " \033 [33mskipped \033 [0m "
2020-03-09 17:42:57 +07:00
skip_count + = 1
2020-03-09 17:55:31 +07:00
print ( build_format . format ( example , board , success , ' - ' , flash_size , sram_size ) )
2019-09-27 00:15:43 +07:00
else :
2020-03-09 15:51:29 +07:00
build_result = build_example ( example , board )
if build_result . returncode == 0 :
success = " \033 [32msucceeded \033 [0m "
success_count + = 1
2020-03-09 17:42:57 +07:00
( flash_size , sram_size ) = build_size ( example , board )
2020-03-09 15:51:29 +07:00
else :
exit_status = build_result . returncode
success = " \033 [31mfailed \033 [0m "
fail_count + = 1
build_duration = time . monotonic ( ) - start_time
2020-03-25 14:06:51 +07:00
print ( build_format . format ( example , board , success , " {:.2f} s " . format ( build_duration ) , flash_size , sram_size ) )
2019-05-02 19:01:25 +07:00
2020-03-09 15:51:29 +07:00
if build_result . returncode != 0 :
print ( build_result . stdout . decode ( " utf-8 " ) )
2019-08-08 12:20:41 +07:00
2020-04-01 20:56:46 +07:00
2019-05-02 19:01:25 +07:00
total_time = time . monotonic ( ) - total_time
2019-08-08 12:20:41 +07:00
print ( build_separator )
2020-03-09 17:42:57 +07:00
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 ) )
2019-08-08 12:20:41 +07:00
print ( build_separator )
2019-05-03 14:02:22 +07:00
2019-05-02 19:01:25 +07:00
sys . exit ( exit_status )