LPT26x-HSF-4MB-Hilink_14.2..../build/config/target_config/ws63/script/entry.py

270 lines
13 KiB
Python
Raw Permalink Normal View History

2025-05-13 22:00:58 +08:00
#!/usr/bin/env python3
# encoding=utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2022. All rights reserved.
import os
import json
import sys
import platform
import subprocess
import shutil
import re
from utils.build_utils import root_path, exec_shell, compare_bin, output_root
from utils.indie_upgrade_utils import make_indie_upg_src, dump_indie_upg_check_file
from typing import Dict, Any
SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
def do_cmd(target_name: str, hook_name: str, env: Dict[str, Any])->bool:
python_path = sys.executable
print("python path: ", python_path)
# 生成接口映射表
if hook_name == 'build_pre' and "CONFIG_SUPPORT_HILINK_INDIE_UPGRADE" in env.get("defines"):
if not make_indie_upg_src():
return False
# sdk中执行sample的编译守护
if hook_name == 'build_pre' and env.get('build_type', '') == 'GuardSDKSample':
print("==================env==================")
for k, v in env.items():
print(f"{k}:{v}")
print("==================env==================")
# 生成sdk
build_sdk()
# 切换当前工作目录
cwd = os.getcwd()
in_sdk_root = os.path.join(output_root,'package', 'ws63','sdk')
os.chdir(in_sdk_root)
# 在sdk中按设定的menuconfig配置编译
guard_sample(target_name, env)
os.chdir(cwd)
if target_name == "ws63-liteos-msmart" and hook_name == 'build_pre': # 源码编译
print("info: start build ws63-liteos-app for msmart in source.")
module_handle_script_path = os.path.join(root_path, "application", "samples", "custom", "ws63", "msmart", "build_module.py")
errcode = exec_shell([python_path, module_handle_script_path], None, True)
return True
if target_name == "ws63-liteos-app" and not config_check(root_path, "ws63-liteos-msmart") and os.path.isfile(os.path.join(root_path, "application", "samples", "custom", "ws63", "msmart", "build_module.py")) and hook_name == 'build_pre':
# SDK 编译 msmart
print("info: start build ws63-liteos-app for msmart in SDK.")
module_handle_script_path = os.path.join(root_path, "application", "samples", "custom", "ws63", "msmart", "build_module.py")
errcode = exec_shell([python_path, module_handle_script_path], None, True)
return True
target_array = ['ws63-flashboot', 'ws63-loaderboot']
if not os.path.isfile(os.path.join(root_path, "output", "ws63", "acore", "boot_bin", "flashboot.bin")) and target_name not in target_array and hook_name == 'build_pre':
print("flashboot start build .....")
errcode = exec_shell([python_path, 'build.py', 'ws63-flashboot'], None, True)
if not os.path.isfile(os.path.join(root_path, "output", "ws63", "acore", "boot_bin", "loaderboot.bin")) and target_name not in target_array and hook_name == 'build_pre':
print("loaderboot start build .....")
errcode = exec_shell([python_path, 'build.py', 'ws63-loaderboot'], None, True)
if hook_name == 'build_pre':
return True
if target_name == 'ws63-liteos-app' and root_path.endswith('output/sdk') and hook_name == 'build_post':
print("start build ws63-liteos-app-haier target")
# 海尔代码编译
build_haier_script = os.path.join(root_path, '../../application/samples/custom/ws63/haier/boards/HI3863/GCC/build.sh')
errcode = subprocess.run(['bash', build_haier_script])
if errcode.returncode != 0:
print("run build.sh failed!")
sys.exit(1)
# 拷贝海尔编译结果
src_folder = os.path.join(root_path, '../../application/samples/custom/ws63/haier/boards/HI3863/GCC/libs/libhrapplication.a')
dest_folder = os.path.join(root_path, '../../application/samples/custom/ws63/haier/boards/HI3863/sdk/application/ws63-liteos-app/libhrapplication.a')
shutil.copyfile(src_folder, dest_folder)
# 编译最终fwpkg
build_app_script = os.path.join(root_path, '../../application/samples/custom/ws63/haier/boards/HI3863/sdk/build.py')
errcode = exec_shell(['python3', build_app_script, "-c", "ws63-liteos-app"], None, True)
if errcode != 0:
print("build ws63-liteos-app-haier target failed!")
sys.exit(1)
# 拷贝最终编译结果到package目录
dest_folder = os.path.join(root_path, '../package/ws63/ws63_haier')
if os.path.exists(dest_folder):
print("ws63-liteos-app-haier exist")
return True
src_folder = os.path.join(root_path, '../../application/samples/custom/ws63/haier/boards/HI3863/sdk/output/ws63')
shutil.copytree(src_folder, dest_folder)
print("end build ws63-liteos-app-haier target")
return True
if target_name == 'ws63-liteos-mfg' and hook_name == 'build_post':
errcode = exec_shell([python_path, "build.py", "ws63-liteos-app"], None, True)
return True
if hook_name != 'build_post':
return True
if env.get('gen_mem_bin'):
script_path = os.path.join(SCRIPT_DIR, 'get_mem_bin.sh')
print("gen_mem_bin ing...")
errcode = exec_shell(['bash', script_path, root_path, target_name, env.get('bin_name')], None, True)
if errcode != 0:
print("gen_mem_bin failed!")
return False
print("gen_mem_bin done!")
if env.get('generate_efuse_bin'):
copy_py = os.path.join(SCRIPT_DIR, 'efuse_cfg_gen.py')
print("generate_efuse_bin ing...")
errcode = exec_shell([sys.executable, copy_py], None, True)
if errcode != 0:
print("generate_efuse_bin failed!")
return False
shutil.copy(os.path.join(root_path, 'output/ws63/acore/ws63-liteos-app/efuse_cfg.bin'), os.path.join(root_path, 'output/ws63/acore/boot_bin'))
print("generate_efuse_bin done!")
if env.get('copy_files_to_interim'):
# copy_files_to_interim
copy_py = os.path.join(SCRIPT_DIR, 'copy_files_to_interim.py')
print("copy_files_to_interim ing...")
errcode = exec_shell([sys.executable, copy_py, root_path], None, True)
if errcode != 0:
print("copy_files_to_interim failed!")
return False
print("copy_files_to_interim done!")
if "CONFIG_SUPPORT_HILINK_INDIE_UPGRADE" in env.get("defines"):
dump_indie_upg_check_file(os.path.join(root_path, "output", "ws63", "acore", target_name), target_name)
if env.get('pke_rom_bin'):
# gen pke_rom_bin
gen_pke_rom_bin_sh = os.path.join(SCRIPT_DIR, 'pke_rom.sh')
if os.path.exists(os.path.join(root_path, \
'drivers/chips/ws63/rom/rom_boot/drivers/drivers/hal/security_unified/hal_cipher/pke/rom_lib.c')):
print("generate pke_rom_bin ing...")
errcode = exec_shell(['sh', gen_pke_rom_bin_sh, root_path], None, True)
if errcode != 0:
print("generate pke_rom_bin failed!")
return False
print("generate pke_rom_bin done!")
# verify pke rom bin
if env.get('fixed_pke'):
bin1 = os.path.join(root_path, "output", env.get('chip'), env.get('core'), 'pke_rom', 'pke_rom.bin')
bin2 = env.get('fixed_pke_path', '').replace('<root>', root_path)
if not compare_bin(bin1, bin2):
print(f"Verify pke rom bin ERROR! :{bin1} is not same with {bin2}")
return False
if env.get('rom_in_one'):
# gen rom_in_one
if "windows" in platform.platform().lower():
rom_in_one = os.path.join(SCRIPT_DIR, 'rom_in_one.py')
print("generate rom_in_one ing...")
errcode = exec_shell([python_path, rom_in_one, root_path, env.get('bin_name')], None, True)
else:
rom_in_one = os.path.join(SCRIPT_DIR, 'rom_in_one.sh')
print("generate rom_in_one ing...")
errcode = exec_shell(['sh', rom_in_one, root_path, env.get('bin_name')], None, True)
if errcode != 0:
print("generate rom_in_one failed!")
return False
print("generate rom_in_one done!")
# verify codepoint bin
bin1 = os.path.join(root_path, "output", env.get('chip'), env.get('core'), \
target_name, env.get('bin_name')+'_rompack.bin')
if env.get('fixed_rom_in_one') and os.path.isfile(bin1):# only rompack bin exists
bin2 = env.get('fixed_rom_in_one_path', '').replace('<root>', root_path)
if not compare_bin(bin1, bin2):
print(f"Verify rom_in_one bin ERROR! :{bin1} is not same with {bin2}")
return False
if env.get('fixed_bin_name'):
bin1 = os.path.join(root_path, "output", env.get('chip'), env.get('core'), \
target_name, env.get('fixed_bin_name'))
bin2 = env.get('fixed_bin_path', '').replace('<root>', root_path)
if not compare_bin(bin1, bin2):
print(f"Verify bin ERROR! :{bin1} is not same with {bin2}")
return False
nv_handle = os.path.join(SCRIPT_DIR, 'nv_handle.py')
exec_shell([python_path, nv_handle], None, True)
return True
def config_check(root_path, target_name):
config_file_path = os.path.join(root_path, "build", "config", "target_config", "ws63", "config.py")
with open(config_file_path, "r", encoding="utf-8") as f:
for i in f:
if target_name in i:
print(target_name, " in config.py.")
return True
return False
def build_sdk():
if os.path.isdir(output_root):
shutil.rmtree(output_root)
errcode = exec_shell(["python3", "build.py", "pack_ws63_sdk"], None, True)
if errcode != 0:
print(f"build target pack_ws63_sdk failed!")
sys.exit(1)
else:
print(f"build target pack_ws63_sdk success!")
def guard_sample(target_name, env):
cfg_dir = os.path.dirname(SCRIPT_DIR)
build_target = env.get('build_target', '')
build_target_cop = build_target.replace('-', "_")
in_sdk_root = os.path.join(output_root, 'package', 'ws63','sdk')
in_sdk_menuconfig_dir = os.path.join(in_sdk_root, 'build', 'config','target_config', env.get('chip'), 'menuconfig', env.get('core'))
base_cfg_path = os.path.join(in_sdk_menuconfig_dir, f'{build_target_cop}.config')
base_cfg_path_bak = base_cfg_path + ".bak"
shutil.move(base_cfg_path, base_cfg_path_bak)
in_sdk_output_root = os.path.join(in_sdk_root, 'output')
source_fwpkg_dir = os.path.join(in_sdk_output_root, env.get('chip'), 'fwpkg', f'{build_target}')
dest_fwpkg_dir = os.path.join(in_sdk_output_root, env.get('chip'), 'GuardSample', target_name)
os.makedirs(dest_fwpkg_dir, exist_ok=True)
# 汇总结果编译sample是否成功
build_result_content = []
build_result_log_path = os.path.join(dest_fwpkg_dir, "build_result.log")
for cfg_path in env.get('menuconfigs', []):
cfg_base_name = os.path.splitext(os.path.basename(cfg_path))[0]
cfg_full_path = os.path.join(cfg_dir, cfg_path)
if not os.path.isfile(cfg_full_path):
continue
shutil.copyfile(cfg_full_path, base_cfg_path)
errcode = exec_shell(["python3", "build.py", "-c", build_target], None, True)
if errcode != 0:
print(f"build target:{target_name}\tusing menuconfig:{cfg_full_path} failed!")
build_result_content.append(f"[ERROR] build target:{target_name}\tusing menuconfig:{cfg_full_path} failed!")
else:
print(f"build target:{target_name}\tusing menuconfig:{cfg_full_path} success!")
build_result_content.append(f"[INFO] build target:{target_name}\tusing menuconfig:{cfg_full_path} success!")
all_in_one_fwpkg_path = os.path.join(source_fwpkg_dir, f'{build_target}_all.fwpkg')
if os.path.isfile(all_in_one_fwpkg_path):
dest_fwpkg = os.path.join(dest_fwpkg_dir, f'{cfg_base_name}_all.fwpkg')
shutil.copyfile(all_in_one_fwpkg_path, dest_fwpkg)
else:
print(f"not find {all_in_one_fwpkg_path}!")
build_result_content.append(f"[ERROR] not find {all_in_one_fwpkg_path}!")
continue
load_only_fwpkg_path = os.path.join(source_fwpkg_dir,f'{build_target}_load_only.fwpkg')
if os.path.isfile(load_only_fwpkg_path):
dest_fwpkg = os.path.join(dest_fwpkg_dir, f'{cfg_base_name}_load_only.fwpkg')
shutil.copyfile(load_only_fwpkg_path, dest_fwpkg)
else:
print(f"not find {load_only_fwpkg_path}!")
build_result_content.append(f"[ERROR] not find {load_only_fwpkg_path}!")
with open(build_result_log_path, 'w') as w_f:
w_f.write("\r\n".join(build_result_content))
shutil.move(base_cfg_path_bak, base_cfg_path)
print(f"fwpkg is created in :{dest_fwpkg_dir}")
os._exit(0)