2025-04-10 17:31:33 +08:00

267 lines
12 KiB
Python

import subprocess
import os
import glob
import datetime
import sys
import shutil
import time
from prettytable import PrettyTable
class BuildTools():
def __init__(self) -> None:
self.repo = "main"
self.board = "1h00"
self.build_bat = "ec718p_openbuild_ref_1h00.bat"
self.log_file = None
self.repo_dir_name = "ec718_716_sdk_main"
self.repo_url = "ssh://git@10.10.60.68:2222/open_eigencomm/ec718_716_sdk_main.git"
self.main_repo_url = "ssh://git@10.10.60.68:2222/open_eigencomm/ec718_716_sdk_main.git"
self.release_repo_url = "ssh://git@10.10.60.68:2222/open_eigencomm/ec718_716_sdk_release.git"
self.target_list = []
self.target_list_0h00 = ["driver_example_USART_EX", "driver_example_SPI_EX", "driver_example_I2C_EX", "driver_example_GPIO_EX", "driver_example_TIMER_EX",
"driver_example_WDT_EX", "driver_example_DMA_EX", "driver_example_ADC_EX", "driver_example_KPC_EX", "driver_example_AUDIO_EX", "driver_example_TLS_EX", "driver_example_CAMERA_EX", "driver_example_LCD_EX", "driver_example_ONEW_EX", "driver_example_PSRAM_EX"]
self.target_list_1h00 = ["speaker", "phone", "ref_app", "ref_min", "audio_demo", "camera_demo", "fs_demo", "socket_demo", "lcd_demo_lvgl", "lcd_demo_rgb", "slp_demo", "time_demo", "volte_demo", "driver_example_USART_EX", "driver_example_SPI_EX", "driver_example_I2C_EX", "driver_example_GPIO_EX", "driver_example_TIMER_EX",
"driver_example_WDT_EX", "driver_example_DMA_EX", "driver_example_ADC_EX", "driver_example_KPC_EX", "driver_example_AUDIO_EX", "driver_example_TLS_EX", "driver_example_CAMERA_EX", "driver_example_LCD_EX", "driver_example_ONEW_EX", "driver_example_PSRAM_EX"]
self.build_return_code = 0
self.zip_return_code = 0
self.build_dir = "C:\\build_collect"
self.commit_id = "latest"
self.collect_dir = "{}_{}_{}".format(
self.repo, self.board, self.commit_id)
self.build_res_dict = {}
self.build_res_table = None
def replace_text_in_file(self, file_path, old_text, new_text):
with open(file_path, 'r') as file:
file_content = file.read()
updated_content = file_content.replace(old_text, new_text)
with open(file_path, 'w') as file:
file.write(updated_content)
def find_binpkg_files(self):
binpkg_files = glob.glob(os.path.join(
self.build_dir, self.repo_dir_name, "PLAT/gccout", '**', '*.binpkg'), recursive=True)
res = []
for file_path in binpkg_files:
res.append(os.path.abspath(file_path))
return res
def find_comdb_files(self):
comdb_files = glob.glob(os.path.join(
self.build_dir, self.repo_dir_name, "PLAT/gccout", '**', 'comdb.txt'), recursive=True)
res = []
for file_path in comdb_files:
res.append(os.path.abspath(file_path))
return res
def find_elf_files(self):
elf_files = glob.glob(os.path.join(
self.build_dir, self.repo_dir_name, "PLAT/gccout", '**', '*.elf'), recursive=True)
res = []
for file_path in elf_files:
res.append(os.path.abspath(file_path))
return res
def find_collect_files(self):
collect_files = []
collect_files.extend(self.find_binpkg_files())
collect_files.extend(self.find_comdb_files())
collect_files.extend(self.find_elf_files())
return collect_files
def collect_build_out(self, target, case_name):
self.collect_dir = "{}_{}_{}".format(
self.repo, self.board, self.commit_id)
if self.build_return_code == 0:
os.makedirs(os.path.join(self.build_dir,
self.collect_dir), exist_ok=True)
collect_files = [
file for file in self.find_collect_files() if os.path.basename(file) != "ap_bootloader.elf"]
files_to_compress = ' '.join(collect_files)
p = subprocess.run("cd {build_dir}/{repo_dir_name}/PLAT && 7z.exe a -tzip {build_target}_{case_name}_{time}.zip {files_to_compress} && move {build_target}_{case_name}_{time}.zip ../../{collect_dir}".format(build_dir=self.build_dir, repo_dir_name=self.repo_dir_name, build_target=target, time=datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S"), files_to_compress=files_to_compress, collect_dir=self.collect_dir, case_name=case_name),
shell=True, stdout=self.log_file, stderr=self.log_file)
self.zip_return_code = p.returncode
print("zip_return_code = {}".format(self.zip_return_code))
def prepare_repo(self):
self.checkout()
if os.path.exists(os.path.join(self.build_dir, "{}_backup".format(self.repo_dir_name))):
rm_backup_dir_cmd = "rmdir /s /Q {}".format(os.path.join(self.build_dir,
"{}_backup".format(self.repo_dir_name)))
print("rm_backup_dir_cmd = {}".format(rm_backup_dir_cmd))
print("rm_backup_dir repo...")
p = subprocess.run(rm_backup_dir_cmd, shell=True,
stdout=self.log_file, stderr=self.log_file)
shutil.copytree(os.path.join(self.build_dir, self.repo_dir_name), os.path.join(
self.build_dir, "{}_backup".format(self.repo_dir_name)))
def get_new_repo(self):
rmdir_cmd = "rmdir /s /Q {}".format(os.path.join(self.build_dir,
self.repo_dir_name))
print("rmdir_cmd = {}".format(rmdir_cmd))
if os.path.exists(os.path.join(self.build_dir, self.repo_dir_name)):
print("rmdir repo...")
p = subprocess.run(rmdir_cmd, shell=True,
stdout=self.log_file, stderr=self.log_file)
shutil.copytree(os.path.join(
self.build_dir, "{}_backup".format(self.repo_dir_name)), os.path.join(self.build_dir, self.repo_dir_name))
def checkout(self):
print("build_dir = {}".format(self.build_dir))
os.makedirs(self.build_dir, exist_ok=True)
self.repo_dir_name = "ec718_716_sdk_{}".format(self.repo)
rmdir_cmd = "rmdir /s /Q {}".format(os.path.join(self.build_dir,
self.repo_dir_name))
if self.repo == "main":
self.repo_url = self.main_repo_url
elif self.repo == "release":
self.repo_url = self.release_repo_url
else:
print("Bad repo selected: {}".format(self.repo))
sys.exit(1)
if self.commit_id != None and self.commit_id != "latest":
clone_cmd = "cd {} && git clone {} && cd {} && git checkout {}".format(
self.build_dir, self.repo_url, self.repo_dir_name, self.commit_id)
else:
clone_cmd = "cd {} && git clone {}".format(
self.build_dir, self.repo_url)
print("rmdir_cmd = {}".format(rmdir_cmd))
print("clone_cmd = {}".format(clone_cmd))
if os.path.exists(os.path.join(self.build_dir, self.repo_dir_name)):
print("rmdir repo...")
p = subprocess.run(rmdir_cmd, shell=True,
stdout=self.log_file, stderr=self.log_file)
print("clone repo...")
p = subprocess.run(clone_cmd, shell=True,
stdout=self.log_file, stderr=self.log_file)
def build_target(self, target: str):
case_name = "default"
if self.board == "1h00":
self.build_bat = "ec718p_openbuild_ref_1h00.bat"
elif self.board == "0h00":
self.build_bat = "GccBuild_ec718p.bat"
else:
print("Bad board selected: {}".format(self.board))
sys.exit(1)
if target == "speaker":
print("build speaker...")
# build
p = subprocess.run("cd {}/{}/PLAT && ec718p_openbuild_speaker_1h00.bat clall && ec718p_openbuild_speaker_1h00.bat".format(self.build_dir, self.repo_dir_name),
shell=True, stdout=self.log_file, stderr=self.log_file)
self.build_return_code = p.returncode
print("build_return_code = {}".format(self.build_return_code))
elif "driver_example" in target:
case_name = target.replace("driver_example_", "")
print("build driver_example {}...".format(case_name))
if self.board == "1h00":
path = "{}/{}/PLAT/project/ec7xx_ref_1h00/ap/apps/driver_example/src/app.c".format(
self.build_dir, self.repo_dir_name)
self.replace_text_in_file(path, "static example_id_t exampleId = CAMERA_EX;",
"static example_id_t exampleId = {};".format(case_name))
elif self.board == "0h00":
path = "{}/{}/PLAT/project/ec7xx_0h00/ap/apps/driver_example/src/app.c".format(
self.build_dir, self.repo_dir_name)
self.replace_text_in_file(path, "static example_id_t exampleId = LCD_EX;",
"static example_id_t exampleId = {};".format(case_name))
# build
p = subprocess.run(
"cd {}/{}/PLAT && {} clall && {} driver_example-merge".format(self.build_dir, self.repo_dir_name, self.build_bat, self.build_bat), shell=True, stdout=self.log_file, stderr=self.log_file)
self.build_return_code = p.returncode
print("build_return_code = {}".format(self.build_return_code))
elif "lcd_demo" in target:
case_name = target.replace("lcd_demo_", "")
print("build lcd_demo {}...".format(case_name))
if case_name == "rgb":
path = "{}/{}/PLAT/project/ec7xx_ref_1h00/ap/apps/lcd_demo/GCC/Makefile".format(
self.build_dir, self.repo_dir_name)
self.replace_text_in_file(path, "# CFLAGS += -DFEATURE_LCD_TEST_RGB",
"CFLAGS += -DFEATURE_LCD_TEST_RGB")
# build
p = subprocess.run("cd {}/{}/PLAT && ec718p_openbuild_ref_1h00.bat clall && ec718p_openbuild_ref_1h00.bat lcd_demo".format(self.build_dir, self.repo_dir_name),
shell=True, stdout=self.log_file, stderr=self.log_file)
self.build_return_code = p.returncode
print("build_return_code = {}".format(self.build_return_code))
else:
print("build {}...".format(target))
# build
p = subprocess.run("cd {}/{}/PLAT && ec718p_openbuild_ref_1h00.bat clall && ec718p_openbuild_ref_1h00.bat {}".format(self.build_dir, self.repo_dir_name, target),
shell=True, stdout=self.log_file, stderr=self.log_file)
self.build_return_code = p.returncode
print("build_return_code = {}".format(self.build_return_code))
self.collect_build_out(target, case_name)
self.build_res_table.add_row(
[target, self.build_return_code, self.zip_return_code])
def build(self, commit_id: str):
self.build_res_table = PrettyTable(
['target', 'build_res', 'zip_res'])
self.commit_id = commit_id
if len(self.target_list) == 0:
if self.board == "0h00":
self.target_list = self.target_list_0h00
elif self.board == "1h00":
self.target_list = self.target_list_1h00
else:
print("Bad board selected: {}".format(self.board))
sys.exit(1)
start_time = int(time.time())
self.prepare_repo()
cost_time = int(time.time()) - start_time
print("prepare repo cost {}s".format(cost_time))
for index, target in enumerate(self.target_list):
if index != 0:
start_time = int(time.time())
self.get_new_repo()
cost_time = int(time.time()) - start_time
print("get new repo cost {}s".format(cost_time))
self.build_target(target)
print("REPO: {}".format(self.repo))
print("REPO_URL: {}".format(self.repo_url))
print("BOARD: {}".format(self.board))
print("COMMIT: {}".format(self.commit_id))
print(self.build_res_table)
if __name__ == "__main__":
build_tools = BuildTools()
commit_id = sys.argv[1]
if len(sys.argv) == 3:
target = sys.argv[2]
build_tools.target_list = [target,]
with open(os.path.join(build_tools.build_dir, "{}.txt".format(commit_id)), "w") as log_file:
build_tools.log_file = log_file
build_tools.build(commit_id)