2020-04-07 16:49:17 +07:00
import os
import glob
import sys
import subprocess
import time
success_count = 0
fail_count = 0
skip_count = 0
exit_status = 0
total_time = time . monotonic ( )
build_format = ' | {:23} | {:30} | {:9} | {:7} | {:6} | {:6} | '
build_separator = ' - ' * 100
# 1st Argument is Example, build all examples if not existed
all_examples = [ ]
if len ( sys . argv ) > 1 :
all_examples . append ( sys . argv [ 1 ] )
else :
for entry in os . scandir ( " examples/device " ) :
# Only includes example with CMakeLists.txt for esp32s
if entry . is_dir ( ) and os . path . exists ( entry . path + " /CMakeLists.txt " ) :
all_examples . append ( entry . name )
all_examples . sort ( )
# 2nd Argument is Board, build all boards if not existed
all_boards = [ ]
if len ( sys . argv ) > 2 :
all_boards . append ( sys . argv [ 2 ] )
else :
for entry in os . scandir ( " hw/bsp " ) :
if entry . is_dir ( ) :
with open ( entry . path + ' /board.mk ' ) as mk :
# Only includes ESP32-S2 board
if ' CROSS_COMPILE = xtensa-esp32s2-elf- ' in mk . read ( ) :
all_boards . append ( entry . name )
all_boards . sort ( )
def build_example ( example , board ) :
subprocess . run ( " make -C examples/device/ {} BOARD= {} clean " . format ( example , board ) , shell = True ,
stdout = subprocess . PIPE , stderr = subprocess . STDOUT )
return subprocess . run ( " make -j 4 -C examples/device/ {} BOARD= {} all " . format ( example , board ) , shell = True ,
stdout = subprocess . PIPE , stderr = subprocess . STDOUT )
def build_size ( example , board ) :
#elf_file = 'examples/device/{}/_build/build-{}/{}-firmware.elf'.format(example, board, board)
elf_file = ' examples/device/ {} /_build/build- {} /*.elf ' . format ( example , board )
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 )
def skip_example ( example , board ) :
return 0
print ( build_separator )
print ( build_format . format ( ' Example ' , ' Board ' , ' Result ' , ' Time ' , ' Flash ' , ' SRAM ' ) )
2020-04-07 21:47:24 +07:00
print ( build_separator )
2020-04-07 16:49:17 +07:00
for example in all_examples :
for board in all_boards :
start_time = time . monotonic ( )
flash_size = " - "
sram_size = " - "
# Check if board is skipped
if skip_example ( example , board ) :
success = " \033 [33mskipped \033 [0m "
skip_count + = 1
print ( build_format . format ( example , board , success , ' - ' , flash_size , sram_size ) )
else :
build_result = build_example ( example , board )
if build_result . returncode == 0 :
success = " \033 [32msucceeded \033 [0m "
success_count + = 1
( flash_size , sram_size ) = build_size ( example , board )
else :
exit_status = build_result . returncode
success = " \033 [31mfailed \033 [0m "
fail_count + = 1
build_duration = time . monotonic ( ) - start_time
print ( build_format . format ( example , board , success , " {:.2f} s " . format ( build_duration ) , flash_size , sram_size ) )
if build_result . returncode != 0 :
print ( build_result . stdout . decode ( " utf-8 " ) )
total_time = time . monotonic ( ) - total_time
print ( build_separator )
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 ) )
print ( build_separator )
sys . exit ( exit_status )