| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | import subprocess | 
					
						
							| 
									
										
										
										
											2022-01-05 15:44:23 -08:00
										 |  |  | import pathlib | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | build_format = '| {:29} | {:30} | {:18} | {:7} | {:6} | {:6} |' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SUCCEEDED = "\033[32msucceeded\033[0m" | 
					
						
							|  |  |  | FAILED = "\033[31mfailed\033[0m" | 
					
						
							|  |  |  | SKIPPED = "\033[33mskipped\033[0m" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 15:44:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def skip_example(example, board): | 
					
						
							|  |  |  |     ex_dir = pathlib.Path('examples/') / example | 
					
						
							|  |  |  |     bsp = pathlib.Path("hw/bsp") | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 15:12:01 +07:00
										 |  |  |     if (bsp / board / "board.mk").exists(): | 
					
						
							|  |  |  |         # board without family | 
					
						
							|  |  |  |         board_dir = bsp / board | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         family = "" | 
					
						
							|  |  |  |         mk_contents = "" | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2022-06-29 15:12:01 +07:00
										 |  |  |         # board within family | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         board_dir = list(bsp.glob("*/boards/" + board)) | 
					
						
							|  |  |  |         if not board_dir: | 
					
						
							|  |  |  |             # Skip unknown boards | 
					
						
							|  |  |  |             return True | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         board_dir = list(board_dir)[0] | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         family_dir = board_dir.parent.parent | 
					
						
							|  |  |  |         family = family_dir.name | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         # family CMake | 
					
						
							|  |  |  |         family_mk = family_dir / "family.cmake" | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         # family.mk | 
					
						
							|  |  |  |         if not family_mk.exists(): | 
					
						
							|  |  |  |             family_mk = family_dir / "family.mk" | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |         mk_contents = family_mk.read_text() | 
					
						
							| 
									
										
										
										
											2022-01-05 15:44:23 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 14:06:44 +07:00
										 |  |  |     # Find the mcu, first in family mk then board mk | 
					
						
							| 
									
										
										
										
											2022-01-05 15:44:23 -08:00
										 |  |  |     if "CFG_TUSB_MCU=OPT_MCU_" not in mk_contents: | 
					
						
							|  |  |  |         board_mk = board_dir / "board.cmake" | 
					
						
							|  |  |  |         if not board_mk.exists(): | 
					
						
							|  |  |  |             board_mk = board_dir / "board.mk" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mk_contents = board_mk.read_text() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-02 16:21:49 +07:00
										 |  |  |     mcu = "NONE" | 
					
						
							| 
									
										
										
										
											2022-01-05 15:44:23 -08:00
										 |  |  |     for token in mk_contents.split(): | 
					
						
							|  |  |  |         if "CFG_TUSB_MCU=OPT_MCU_" in token: | 
					
						
							|  |  |  |             # Strip " because cmake files has them. | 
					
						
							|  |  |  |             token = token.strip("\"") | 
					
						
							|  |  |  |             _, opt_mcu = token.split("=") | 
					
						
							|  |  |  |             mcu = opt_mcu[len("OPT_MCU_"):] | 
					
						
							| 
									
										
										
										
											2023-04-03 17:44:05 +07:00
										 |  |  |             break | 
					
						
							|  |  |  |         if "esp32s2" in token: | 
					
						
							|  |  |  |             mcu = "ESP32S2" | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         if "esp32s3" in token: | 
					
						
							|  |  |  |             mcu = "ESP32S3" | 
					
						
							|  |  |  |             break | 
					
						
							| 
									
										
										
										
											2022-01-05 15:44:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Skip all OPT_MCU_NONE these are WIP port | 
					
						
							|  |  |  |     if mcu == "NONE": | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     skip_file = ex_dir / "skip.txt" | 
					
						
							|  |  |  |     only_file = ex_dir / "only.txt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if skip_file.exists() and only_file.exists(): | 
					
						
							|  |  |  |         raise RuntimeError("Only have a skip or only file. Not both.") | 
					
						
							|  |  |  |     elif skip_file.exists(): | 
					
						
							|  |  |  |         skips = skip_file.read_text().split() | 
					
						
							|  |  |  |         return ("mcu:" + mcu in skips or | 
					
						
							|  |  |  |                 "board:" + board in skips or | 
					
						
							|  |  |  |                 "family:" + family in skips) | 
					
						
							|  |  |  |     elif only_file.exists(): | 
					
						
							|  |  |  |         onlys = only_file.read_text().split() | 
					
						
							|  |  |  |         return not ("mcu:" + mcu in onlys or | 
					
						
							|  |  |  |                     "board:" + board in onlys or | 
					
						
							|  |  |  |                     "family:" + family in onlys) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return False | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-17 23:37:00 +07:00
										 |  |  | def build_example(example, board, make_option): | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  |     start_time = time.monotonic() | 
					
						
							|  |  |  |     flash_size = "-" | 
					
						
							|  |  |  |     sram_size = "-" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # succeeded, failed, skipped | 
					
						
							|  |  |  |     ret = [0, 0, 0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-08 12:15:39 +07:00
										 |  |  |     make_cmd = "make -j -C examples/{} BOARD={} {}".format(example, board, make_option) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  |     # Check if board is skipped | 
					
						
							|  |  |  |     if skip_example(example, board): | 
					
						
							|  |  |  |         status = SKIPPED | 
					
						
							|  |  |  |         ret[2] = 1 | 
					
						
							|  |  |  |         print(build_format.format(example, board, status, '-', flash_size, sram_size)) | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2023-03-24 14:02:09 +07:00
										 |  |  |         #subprocess.run(make_cmd + " clean", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | 
					
						
							| 
									
										
										
										
											2023-03-08 12:15:39 +07:00
										 |  |  |         build_result = subprocess.run(make_cmd + " all", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if build_result.returncode == 0: | 
					
						
							|  |  |  |             status = SUCCEEDED | 
					
						
							|  |  |  |             ret[0] = 1 | 
					
						
							| 
									
										
										
										
											2023-03-08 12:15:39 +07:00
										 |  |  |             (flash_size, sram_size) = build_size(make_cmd) | 
					
						
							|  |  |  |             #subprocess.run(make_cmd + " copy-artifact", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | 
					
						
							| 
									
										
										
										
											2022-06-29 21:06:02 +07:00
										 |  |  |         else: | 
					
						
							|  |  |  |             status = FAILED | 
					
						
							|  |  |  |             ret[1] = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         build_duration = time.monotonic() - start_time | 
					
						
							|  |  |  |         print(build_format.format(example, board, status, "{:.2f}s".format(build_duration), flash_size, sram_size)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if build_result.returncode != 0: | 
					
						
							|  |  |  |             print(build_result.stdout.decode("utf-8")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-08 12:15:39 +07:00
										 |  |  | def build_size(make_cmd): | 
					
						
							|  |  |  |     size_output = subprocess.run(make_cmd + ' size', shell=True, stdout=subprocess.PIPE).stdout.decode("utf-8").splitlines() | 
					
						
							| 
									
										
										
										
											2023-03-06 10:33:04 +07:00
										 |  |  |     for i, l in enumerate(size_output): | 
					
						
							|  |  |  |         text_title = 'text	   data	    bss	    dec' | 
					
						
							|  |  |  |         if text_title in l: | 
					
						
							|  |  |  |             size_list = size_output[i+1].split('\t') | 
					
						
							| 
									
										
										
										
											2023-03-06 12:45:47 +07:00
										 |  |  |             flash_size = int(size_list[0]) | 
					
						
							|  |  |  |             sram_size = int(size_list[1]) + int(size_list[2]) | 
					
						
							|  |  |  |             return (flash_size, sram_size) | 
					
						
							| 
									
										
										
										
											2023-03-06 10:33:04 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  |     return (0, 0) |