22import glob
33import sys
44import subprocess
5+ from subprocess import Popen , PIPE
56import time
67
8+ SUCCEEDED = "\033 [32msucceeded\033 [0m"
9+ FAILED = "\033 [31mfailed\033 [0m"
10+ SKIPPED = "\033 [33mskipped\033 [0m"
11+ WARNING = "\033 [31mwarnings\033 [0m"
12+
713all_warnings = False
814exit_status = 0
915success_count = 0
1016fail_count = 0
1117skip_count = 0
1218
13- build_format = '| {:20} | {:35} | {:9 } | {:6} |'
19+ build_format = '| {:20} | {:35} | {:18 } | {:6} |'
1420build_separator = '-' * 83
1521
1622default_boards = [ 'cluenrf52840' , 'cplaynrf52840' , 'feather52832' , 'feather52840' , 'feather52840sense' , 'itsybitsy52840' ]
17-
1823build_boards = []
1924
2025# build all variants if input not existed
2328else :
2429 build_boards = default_boards
2530
31+ all_examples = list (glob .iglob ('libraries/**/*.ino' , recursive = True ))
32+ all_examples .sort ()
33+
2634def errorOutputFilter (line ):
2735 if len (line ) == 0 :
2836 return False
@@ -39,29 +47,29 @@ def build_examples(variant):
3947 print (build_separator )
4048 print ('| {:^79} |' .format ('Board ' + variant ))
4149 print (build_separator )
42- print (build_format .format ('Library' , 'Example' , 'Result ' , 'Time' ))
50+ print (build_format .format ('Library' , 'Example' , '\033 [39mResult \033 [0m ' , 'Time' ))
4351 print (build_separator )
4452
4553 fqbn = "adafruit:nrf52:{}:softdevice={},debug=l0" .format (variant , 's140v6' if variant != 'feather52832' else 's132v6' )
4654
47- for sketch in glob . iglob ( 'libraries/**/*.ino' , recursive = True ) :
55+ for sketch in all_examples :
4856 start_time = time .monotonic ()
4957
5058 # Skip if contains: ".board.test.skip" or ".all.test.skip"
5159 # Skip if not contains: ".board.test.only" for a specific board
5260 sketchdir = os .path .dirname (sketch )
5361 if os .path .exists (sketchdir + '/.all.test.skip' ) or os .path .exists (sketchdir + '/.' + variant + '.test.skip' ):
54- success = " \033 [33mskipped \033 [0m "
62+ success = SKIPPED
5563 elif glob .glob (sketchdir + "/.*.test.only" ) and not os .path .exists (sketchdir + '/.' + variant + '.test.only' ):
56- success = " \033 [33mskipped \033 [0m "
64+ success = SKIPPED
5765 else :
5866 # TODO - preferably, would have STDERR show up in **both** STDOUT and STDERR.
5967 # preferably, would use Python logging handler to get both distinct outputs and one merged output
6068 # for now, split STDERR when building with all warnings enabled, so can detect warning/error output.
6169 if all_warnings :
62- build_result = subprocess .run ("arduino-cli compile --warnings all --fqbn {} {}" .format (fqbn , sketch ), shell = True , stdout = subprocess . PIPE , stderr = subprocess . PIPE )
70+ build_result = subprocess .run ("arduino-cli compile --warnings all --fqbn {} {}" .format (fqbn , sketch ), shell = True , stdout = PIPE , stderr = PIPE )
6371 else :
64- build_result = subprocess .run ("arduino-cli compile --warnings default --fqbn {} {}" .format (fqbn , sketch ), shell = True , stdout = subprocess . PIPE , stderr = subprocess . STDOUT )
72+ build_result = subprocess .run ("arduino-cli compile --warnings default --fqbn {} {}" .format (fqbn , sketch ), shell = True , stdout = PIPE , stderr = PIPE )
6573
6674 # get stderr into a form where len(warningLines) indicates a true warning was output to stderr
6775 warningLines = [];
@@ -71,21 +79,21 @@ def build_examples(variant):
7179
7280 if build_result .returncode != 0 :
7381 exit_status = build_result .returncode
74- success = " \033 [31mfailed \033 [0m "
82+ success = FAILED
7583 fail_count += 1
7684 elif len (warningLines ) != 0 :
7785 exit_status = - 1
78- success = " \033 [31mwarnings \033 [0m "
86+ success = WARNING
7987 fail_count += 1
8088 else :
81- success = " \033 [32msucceeded \033 [0m"
89+ success = SUCCEEDED
8290 success_count += 1
8391
8492 build_duration = time .monotonic () - start_time
8593
8694 print (build_format .format (sketch .split (os .path .sep )[1 ], os .path .basename (sketch ), success , '{:5.2f}s' .format (build_duration )))
8795
88- if success != " \033 [33mskipped \033 [0m " :
96+ if success != SKIPPED :
8997 if build_result .returncode != 0 :
9098 print (build_result .stdout .decode ("utf-8" ))
9199 if (build_result .stderr ):
@@ -96,15 +104,14 @@ def build_examples(variant):
96104 else :
97105 skip_count += 1
98106
99-
100107build_time = time .monotonic ()
101108
102109for board in build_boards :
103110 build_examples (board )
104111
105112print (build_separator )
106113build_time = time .monotonic () - build_time
107- print ("Build Summary: {} \033 [32msucceeded \033 [0m , {} \033 [31mfailed \033 [0m , {} \033 [33mskipped \033 [0m and took {:.2f}s" .format (success_count , fail_count , skip_count , build_time ))
114+ print ("Build Summary: {} {} , {} {} , {} {} and took {:.2f}s" .format (success_count , SUCCEEDED , fail_count , FAILED , skip_count , SKIPPED , build_time ))
108115print (build_separator )
109116
110117sys .exit (exit_status )
0 commit comments