11bd4fe43Sopenharmony_ci#!/usr/bin/env python3 21bd4fe43Sopenharmony_ci# coding=utf-8 31bd4fe43Sopenharmony_ci 41bd4fe43Sopenharmony_ci''' 51bd4fe43Sopenharmony_ci* Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 61bd4fe43Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License"); 71bd4fe43Sopenharmony_ci* you may not use this file except in compliance with the License. 81bd4fe43Sopenharmony_ci* You may obtain a copy of the License at 91bd4fe43Sopenharmony_ci* 101bd4fe43Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 111bd4fe43Sopenharmony_ci* 121bd4fe43Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software 131bd4fe43Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS, 141bd4fe43Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 151bd4fe43Sopenharmony_ci* See the License for the specific language governing permissions and 161bd4fe43Sopenharmony_ci* limitations under the License. 171bd4fe43Sopenharmony_ci* 181bd4fe43Sopenharmony_ci* Description: SCons build system entry. 191bd4fe43Sopenharmony_ci''' 201bd4fe43Sopenharmony_ci 211bd4fe43Sopenharmony_ciEnsureSConsVersion(3, 0, 1) 221bd4fe43Sopenharmony_ciEnsurePythonVersion(3, 7) 231bd4fe43Sopenharmony_ci 241bd4fe43Sopenharmony_ciimport os 251bd4fe43Sopenharmony_ciimport sys 261bd4fe43Sopenharmony_ciimport datetime 271bd4fe43Sopenharmony_ciimport atexit 281bd4fe43Sopenharmony_cifrom distutils import dir_util 291bd4fe43Sopenharmony_cisys.path.append(os.path.join(os.getcwd(), 'build')) 301bd4fe43Sopenharmony_cifrom scripts import common_env 311bd4fe43Sopenharmony_cifrom scripts import scons_utils 321bd4fe43Sopenharmony_cifrom scripts import scons_app 331bd4fe43Sopenharmony_cifrom scripts import scons_env_cfg 341bd4fe43Sopenharmony_cifrom scripts import pkt_builder 351bd4fe43Sopenharmony_cifrom scripts.packet_create import packet_bin 361bd4fe43Sopenharmony_cifrom tools.nvtool.build_nv import make_nv_bin 371bd4fe43Sopenharmony_ciimport shutil 381bd4fe43Sopenharmony_ci 391bd4fe43Sopenharmony_ci#Init compile parameters 401bd4fe43Sopenharmony_cienv_cfg = scons_env_cfg.SconsEnvCfg() 411bd4fe43Sopenharmony_ci 421bd4fe43Sopenharmony_ci#Accept APP parameter 431bd4fe43Sopenharmony_ciapp_name = ARGUMENTS.get('app', 'demo') 441bd4fe43Sopenharmony_cifactory_mode = ARGUMENTS.get('factory_mode', 'no') 451bd4fe43Sopenharmony_ciapp_builder = scons_app.AppTarget(app_name, factory_mode) 461bd4fe43Sopenharmony_cienv_cfg.set_app_builder(app_builder) 471bd4fe43Sopenharmony_ci 481bd4fe43Sopenharmony_ci#Compile message output control 491bd4fe43Sopenharmony_ciif common_env.log_output_flag == False: 501bd4fe43Sopenharmony_ci current = datetime.datetime.now() 511bd4fe43Sopenharmony_ci if not os.path.exists(os.path.dirname(env_cfg.log_path)) or not os.path.exists(env_cfg.log_path): 521bd4fe43Sopenharmony_ci os.makedirs(env_cfg.log_path) 531bd4fe43Sopenharmony_ci log_file = os.path.join(env_cfg.log_path,'scons_trace.log') 541bd4fe43Sopenharmony_ci old_stdout = sys.stdout 551bd4fe43Sopenharmony_ci file = open(log_file, 'w+') 561bd4fe43Sopenharmony_ci file.write("Building at %s %s\n" % (current.strftime('%Y/%m/%d'), current.strftime('%H:%M:%S'))) 571bd4fe43Sopenharmony_ci sys.stdout = file 581bd4fe43Sopenharmony_ci 591bd4fe43Sopenharmony_ci#Init environment 601bd4fe43Sopenharmony_cienv = Environment(ENV={'PATH':os.environ['PATH']}, 611bd4fe43Sopenharmony_ci TARGET_PREFIX = env_cfg.target_name, tools=['mingw']) 621bd4fe43Sopenharmony_ci 631bd4fe43Sopenharmony_cienv_cfg.set_tools(env) 641bd4fe43Sopenharmony_cienv_cfg.set_environs(env) 651bd4fe43Sopenharmony_ci 661bd4fe43Sopenharmony_ciprint('----------------------------top-----------------') 671bd4fe43Sopenharmony_ci#libraries to be built 681bd4fe43Sopenharmony_cilibs = [env.SConscript(os.path.join(env_cfg.get_module_dir(module), 'SConscript'), {'env':env, 'env_cfg':env_cfg, 'module':module}, 691bd4fe43Sopenharmony_ci variant_dir=os.path.join(env_cfg.lib_path, env_cfg.get_module_dir(module)), duplicate=0) for module in env_cfg.get_build_modules()] 701bd4fe43Sopenharmony_ci#Get settings 711bd4fe43Sopenharmony_cienv['LIBPATH'] = env_cfg.get_lib_path() 721bd4fe43Sopenharmony_ci 731bd4fe43Sopenharmony_ciif scons_utils.scons_usr_bool_option('CONFIG_TARGET_CHIP_HI3861') == 'y': 741bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_DIAG_SUPPORT') == 'y': 751bd4fe43Sopenharmony_ci if factory_mode == 'yes': 761bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'debug', 'factory')) 771bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_QUICK_SEND_MODE') == 'y': 781bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'debug', 'no_mesh_quick_start')) 791bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_MESH_SUPPORT') == 'y': 801bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'debug', 'mesh')) 811bd4fe43Sopenharmony_ci else: 821bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'debug', 'no_mesh')) 831bd4fe43Sopenharmony_ci else: 841bd4fe43Sopenharmony_ci if factory_mode == 'yes': 851bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'release', 'factory')) 861bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_QUICK_SEND_MODE') == 'y': 871bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'release', 'no_mesh_quick_start')) 881bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_MESH_SUPPORT') == 'y': 891bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'release', 'mesh')) 901bd4fe43Sopenharmony_ci else: 911bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861', 'release', 'no_mesh')) 921bd4fe43Sopenharmony_cielse: 931bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_DIAG_SUPPORT') == 'y': 941bd4fe43Sopenharmony_ci if factory_mode == 'yes': 951bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'debug', 'factory')) 961bd4fe43Sopenharmony_ci elif scons_utils.scons_get_cfg_val('CONFIG_CHIP_PKT_48K') == 'y': 971bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'debug', 'no_mesh_pkt_48k')) 981bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_MESH_SUPPORT') == 'y': 991bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'debug', 'mesh')) 1001bd4fe43Sopenharmony_ci else: 1011bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'debug', 'no_mesh')) 1021bd4fe43Sopenharmony_ci else: 1031bd4fe43Sopenharmony_ci if factory_mode == 'yes': 1041bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'release', 'factory')) 1051bd4fe43Sopenharmony_ci elif scons_utils.scons_get_cfg_val('CONFIG_CHIP_PKT_48K') == 'y': 1061bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'release', 'no_mesh_pkt_48k')) 1071bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_MESH_SUPPORT') == 'y': 1081bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'release', 'mesh')) 1091bd4fe43Sopenharmony_ci else: 1101bd4fe43Sopenharmony_ci env.Append(LIBPATH=os.path.join('-Lbuild', 'libs', 'hi3861l', 'release', 'no_mesh')) 1111bd4fe43Sopenharmony_ci 1121bd4fe43Sopenharmony_cienv.Append(LIBPATH=app_builder.get_app_lib_path()) 1131bd4fe43Sopenharmony_ci## wifiiot_app is the only one app for ohos 1141bd4fe43Sopenharmony_ciif app_name != "wifiiot_app": 1151bd4fe43Sopenharmony_ci env['LIBS'] = list(map(lambda x:'-l%s'%x, env_cfg.get_libs())) 1161bd4fe43Sopenharmony_cielse: 1171bd4fe43Sopenharmony_ci env['LIBS'] = list(map(lambda x:'-l%s'%x, env_cfg.get_libs())) + ['--whole-archive'] + list(map(lambda x:'-l%s'%x, env_cfg.get_ohos_libs())) + ['--no-whole-archive'] 1181bd4fe43Sopenharmony_cienv.Append(LIBS = app_builder.get_app_libs()) 1191bd4fe43Sopenharmony_cienv.Append(LIBS = '-lwifi_flash') 1201bd4fe43Sopenharmony_cienv.Append(LIBS = '-lwifi') 1211bd4fe43Sopenharmony_cienv.Append(LIBS = '-llitekernel_flash') 1221bd4fe43Sopenharmony_cienv.Append(LIBS = '-lsystem') 1231bd4fe43Sopenharmony_ciif scons_utils.scons_usr_bool_option('CONFIG_MESH_SUPPORT') == 'y': 1241bd4fe43Sopenharmony_ci if factory_mode != 'yes': 1251bd4fe43Sopenharmony_ci env.Append(LIBS = '-lmeshautolink') 1261bd4fe43Sopenharmony_cienv['LIBS'] = sorted(env["LIBS"]) 1271bd4fe43Sopenharmony_cienv['LIBPATH'] = sorted(env["LIBPATH"]) 1281bd4fe43Sopenharmony_cienv['LINKFILE'] = env_cfg.link_file 1291bd4fe43Sopenharmony_cienv['MAPFILE'] = env_cfg.map_file 1301bd4fe43Sopenharmony_ciprint('~~~~~~~~~~~~~~~~~~~~~~~~~~~~libpath:',env['LIBPATH']) 1311bd4fe43Sopenharmony_ciprint('~~~~~~~~~~~~~~~~~~~~~~~~~~~~libs:',env['LIBS']) 1321bd4fe43Sopenharmony_ci 1331bd4fe43Sopenharmony_ci####################################################### LINK by Command ####################################################### 1341bd4fe43Sopenharmony_ci 1351bd4fe43Sopenharmony_ci# config by menuconfig 1361bd4fe43Sopenharmony_cisignature = { 1371bd4fe43Sopenharmony_ci 'RSA':{ 1381bd4fe43Sopenharmony_ci 0:0x0054d3c0, # factory startup addr:0x1E3000(HILINK_ADDR - 600K) = 0x14D000 1391bd4fe43Sopenharmony_ci 'A':0x0040d3c0, 1401bd4fe43Sopenharmony_ci 'B':0x004f13c0, 1411bd4fe43Sopenharmony_ci }, 1421bd4fe43Sopenharmony_ci 'ECC':{ 1431bd4fe43Sopenharmony_ci 0:0x0054d3c0, # factory startup addr:0x1E3000(HILINK_ADDR - 600K) = 0x14D000 1441bd4fe43Sopenharmony_ci 'A':0x0040d3c0, 1451bd4fe43Sopenharmony_ci 'B':0x004f13c0, 1461bd4fe43Sopenharmony_ci } 1471bd4fe43Sopenharmony_ci} 1481bd4fe43Sopenharmony_ci 1491bd4fe43Sopenharmony_cilink_env = env.Clone() 1501bd4fe43Sopenharmony_ci 1511bd4fe43Sopenharmony_ci"""Build link script 1521bd4fe43Sopenharmony_ci""" 1531bd4fe43Sopenharmony_cilinker_builder = Builder( 1541bd4fe43Sopenharmony_ci action='$CC $LINK_SCRIPTS_FLAG -E $SOURCE -o $TARGET -P', 1551bd4fe43Sopenharmony_ci src_suffix='.ld.S' 1561bd4fe43Sopenharmony_ci) 1571bd4fe43Sopenharmony_ci 1581bd4fe43Sopenharmony_ci"""Build elf file 1591bd4fe43Sopenharmony_ci""" 1601bd4fe43Sopenharmony_cielf_builder = Builder( 1611bd4fe43Sopenharmony_ci action='$LINK $LINKFLAGS $LIBPATH -T$LINKFILE -Map=$MAPFILE -o $TARGET --start-group $LIBS --end-group',#--verbose 1621bd4fe43Sopenharmony_ci suffix='.out' 1631bd4fe43Sopenharmony_ci) 1641bd4fe43Sopenharmony_ci 1651bd4fe43Sopenharmony_ci"""Build binary from .out file 1661bd4fe43Sopenharmony_ci""" 1671bd4fe43Sopenharmony_cibinary_builder = Builder( 1681bd4fe43Sopenharmony_ci action='$OBJCOPY -O binary $SOURCE $TARGET', 1691bd4fe43Sopenharmony_ci suffix='.bin', 1701bd4fe43Sopenharmony_ci src_suffix='.out' 1711bd4fe43Sopenharmony_ci) 1721bd4fe43Sopenharmony_ci 1731bd4fe43Sopenharmony_ci"""Build asm file from binary 1741bd4fe43Sopenharmony_ci""" 1751bd4fe43Sopenharmony_ciasm_builder = Builder( 1761bd4fe43Sopenharmony_ci action='$OBJDUMP -d $SOURCE >$TARGET', 1771bd4fe43Sopenharmony_ci suffix='.asm', 1781bd4fe43Sopenharmony_ci src_suffix='.out' 1791bd4fe43Sopenharmony_ci) 1801bd4fe43Sopenharmony_ci 1811bd4fe43Sopenharmony_ci"""Base image builder 1821bd4fe43Sopenharmony_ci""" 1831bd4fe43Sopenharmony_cidef baseimg_builder(target, source, env): 1841bd4fe43Sopenharmony_ci base_bin_target = str(target[0]) 1851bd4fe43Sopenharmony_ci scons_utils.scons_bin_dd(str(source[0]), base_bin_target, seek=0, count=278) 1861bd4fe43Sopenharmony_ci env_cfg.base_bin_check(base_bin_target) 1871bd4fe43Sopenharmony_ci no_base_bin_target = str(target[1]) 1881bd4fe43Sopenharmony_ci scons_utils.scons_bin_dd(str(source[0]), no_base_bin_target, skip=278) 1891bd4fe43Sopenharmony_ci 1901bd4fe43Sopenharmony_ci"""NV image builder 1911bd4fe43Sopenharmony_ci""" 1921bd4fe43Sopenharmony_cidef nvimg_builder(target, source, env): 1931bd4fe43Sopenharmony_ci if os.path.exists(env_cfg.nv_path) is False: 1941bd4fe43Sopenharmony_ci os.makedirs(env_cfg.nv_path) 1951bd4fe43Sopenharmony_ci make_nv_bin(env_cfg.nv_path, env_cfg.target_name, env_cfg.nv_cfg_name) #genrate nv first 1961bd4fe43Sopenharmony_ci 1971bd4fe43Sopenharmony_ci"""Combine NV image and kernel 1981bd4fe43Sopenharmony_ci""" 1991bd4fe43Sopenharmony_cidef nvkernel_builder(target, source, env): 2001bd4fe43Sopenharmony_ci factory_nv = str(source[0]) 2011bd4fe43Sopenharmony_ci normal_nv = str(source[1]) 2021bd4fe43Sopenharmony_ci no_base_bin_target = str(source[2]) 2031bd4fe43Sopenharmony_ci nv_kernel_bin = str(target[0]) 2041bd4fe43Sopenharmony_ci scons_utils.scons_bin_dd(factory_nv, nv_kernel_bin, seek=0, bs=4096, count=1) 2051bd4fe43Sopenharmony_ci scons_utils.scons_bin_dd(normal_nv, nv_kernel_bin, seek=2, bs=4096, count=1) 2061bd4fe43Sopenharmony_ci scons_utils.scons_bin_dd(no_base_bin_target, nv_kernel_bin, seek=4, bs=4096) 2071bd4fe43Sopenharmony_ci 2081bd4fe43Sopenharmony_cifactory_nv = os.path.join(env_cfg.nv_path, env_cfg.nv_factory_name) 2091bd4fe43Sopenharmony_cinormal_nv = os.path.join(env_cfg.nv_path, env_cfg.nv_normal_name) 2101bd4fe43Sopenharmony_ci#Build flashboot 2111bd4fe43Sopenharmony_ciflash_boot_bin = env.SConscript(os.path.join('boot', 'flashboot', 'SConscript'), {'env':env, 'env_cfg':env_cfg, 'module':'boot'}, duplicate=0) 2121bd4fe43Sopenharmony_ci#Build loaderboot 2131bd4fe43Sopenharmony_ciloader_boot_bin = env.SConscript(os.path.join('boot', 'loaderboot', 'SConscript'), {'env':env, 'env_cfg':env_cfg, 'module':'loaderboot'}, duplicate=0) 2141bd4fe43Sopenharmony_ci#ota object 2151bd4fe43Sopenharmony_ciota_flag = 1 if scons_utils.scons_usr_bool_option('CONFIG_COMPRESSION_OTA_SUPPORT') != 'y' else 0 2161bd4fe43Sopenharmony_ciota_build_object = pkt_builder.ImageBuild(env_cfg.target_name, ota_mode=ota_flag) 2171bd4fe43Sopenharmony_cidef init_ota_build_object(ota_build_object): 2181bd4fe43Sopenharmony_ci ota_build_object.set_pkt_path(env_cfg.bin_path) 2191bd4fe43Sopenharmony_ci ota_build_object.set_src_path(boot_bin_path=str(flash_boot_bin[0]), normal_nv_path=normal_nv, factory_nv_path=factory_nv) 2201bd4fe43Sopenharmony_ci ota_build_object.set_chip_product_name(env.get("CHIP_TYPE")) 2211bd4fe43Sopenharmony_ci 2221bd4fe43Sopenharmony_cidef get_ota_object(): 2231bd4fe43Sopenharmony_ci return ota_build_object 2241bd4fe43Sopenharmony_ci 2251bd4fe43Sopenharmony_cidef get_secure_boot(): 2261bd4fe43Sopenharmony_ci if (scons_utils.scons_usr_bool_option('CONFIG_TARGET_SIG_SHA256') == 'y'): 2271bd4fe43Sopenharmony_ci return False 2281bd4fe43Sopenharmony_ci else: 2291bd4fe43Sopenharmony_ci return True; 2301bd4fe43Sopenharmony_ci 2311bd4fe43Sopenharmony_cidef get_hilink_enable(): 2321bd4fe43Sopenharmony_ci if (scons_utils.scons_usr_bool_option('CONFIG_HILINK') == 'y'): 2331bd4fe43Sopenharmony_ci return True 2341bd4fe43Sopenharmony_ci else: 2351bd4fe43Sopenharmony_ci return False; 2361bd4fe43Sopenharmony_ci 2371bd4fe43Sopenharmony_cidef get_sign_dict(): 2381bd4fe43Sopenharmony_ci sig = '' 2391bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_TARGET_SIG_RSA_V15') == 'y': 2401bd4fe43Sopenharmony_ci sig = 'RSA' 2411bd4fe43Sopenharmony_ci get_ota_object().set_sign_alg(0x0) 2421bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_TARGET_SIG_RSA_PSS') == 'y': 2431bd4fe43Sopenharmony_ci sig = 'RSA' 2441bd4fe43Sopenharmony_ci get_ota_object().set_sign_alg(0x1) 2451bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_TARGET_SIG_ECC') == 'y': 2461bd4fe43Sopenharmony_ci sig = 'ECC' 2471bd4fe43Sopenharmony_ci get_ota_object().set_sign_alg(0x10) 2481bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_TARGET_SIG_SHA256') == 'y': 2491bd4fe43Sopenharmony_ci sig = 'ECC' 2501bd4fe43Sopenharmony_ci get_ota_object().set_sign_alg(0x3F) 2511bd4fe43Sopenharmony_ci if sig not in signature: 2521bd4fe43Sopenharmony_ci raise scons_utils.SconsBuildError("%s============== <%s> SIGNATURE SETTING NULL =============%s"%(scons_utils.colors['red'], sig, scons_utils.colors['end'])) 2531bd4fe43Sopenharmony_ci return signature[sig] 2541bd4fe43Sopenharmony_ci 2551bd4fe43Sopenharmony_ciinit_ota_build_object(ota_build_object) 2561bd4fe43Sopenharmony_cisign_dict = get_sign_dict() #signature mode configuration 2571bd4fe43Sopenharmony_ci 2581bd4fe43Sopenharmony_cidef ota_builder(target, source, env): 2591bd4fe43Sopenharmony_ci """Build upg binary 2601bd4fe43Sopenharmony_ci """ 2611bd4fe43Sopenharmony_ci get_ota_object().set_encrypt_flag(0x42) 2621bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_FLASH_ENCRYPT_SUPPORT') == 'y': 2631bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x2) 2641bd4fe43Sopenharmony_ci else: 2651bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x1) 2661bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_COMPRESSION_OTA_SUPPORT') == 'y': 2671bd4fe43Sopenharmony_ci get_ota_object().set_kernel_file_attr_ota(0x4) 2681bd4fe43Sopenharmony_ci get_ota_object().set_kernel_max_size(0) #(912+972)KB 2691bd4fe43Sopenharmony_ci else: 2701bd4fe43Sopenharmony_ci get_ota_object().set_kernel_file_attr_ota(env['SIGN']) 2711bd4fe43Sopenharmony_ci get_ota_object().set_kernel_max_size(env['SIGN']) #912 or 972KB 2721bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_FLASH_ENCRYPT_SUPPORT') == 'y': 2731bd4fe43Sopenharmony_ci get_ota_object().set_encrypt_flag(0xFF) 2741bd4fe43Sopenharmony_ci get_ota_object().set_src_path(kernel_bin_path=str(source[1])) 2751bd4fe43Sopenharmony_ci get_ota_object().BuildUpgBin(str(target[0])) 2761bd4fe43Sopenharmony_ci 2771bd4fe43Sopenharmony_ci return 0 2781bd4fe43Sopenharmony_ci 2791bd4fe43Sopenharmony_cidef factory_builder(target, source, env): 2801bd4fe43Sopenharmony_ci """Build factory binary 2811bd4fe43Sopenharmony_ci """ 2821bd4fe43Sopenharmony_ci get_ota_object().set_encrypt_flag(0x42) 2831bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_FLASH_ENCRYPT_SUPPORT') == 'y': 2841bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x2) 2851bd4fe43Sopenharmony_ci else: 2861bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x1) 2871bd4fe43Sopenharmony_ci get_ota_object().set_kernel_file_attr_ota('A') # same as kernel A. 2881bd4fe43Sopenharmony_ci get_ota_object().set_kernel_max_size(0x4) #0x4 means __factory_bin_max_size:600K 2891bd4fe43Sopenharmony_ci get_ota_object().set_src_path(kernel_bin_path=str(source[1])) 2901bd4fe43Sopenharmony_ci get_ota_object().BuildUpgBurnBin(str(target[0])) 2911bd4fe43Sopenharmony_ci 2921bd4fe43Sopenharmony_ci factory_bin_path = os.path.join('build', 'libs', 'factory_bin') 2931bd4fe43Sopenharmony_ci if not os.path.exists(factory_bin_path): 2941bd4fe43Sopenharmony_ci os.makedirs(factory_bin_path) 2951bd4fe43Sopenharmony_ci shutil.rmtree(factory_bin_path) 2961bd4fe43Sopenharmony_ci shutil.copytree(env_cfg.bin_path, factory_bin_path, False) #copy factory bin output to build/libs temply. 2971bd4fe43Sopenharmony_ci 2981bd4fe43Sopenharmony_ci return 0 2991bd4fe43Sopenharmony_ci 3001bd4fe43Sopenharmony_cidef burn_bin_builder(target, source, env): 3011bd4fe43Sopenharmony_ci """Build binary 3021bd4fe43Sopenharmony_ci """ 3031bd4fe43Sopenharmony_ci get_ota_object().set_build_temp_path(build_temp_path = env_cfg.cache_path) 3041bd4fe43Sopenharmony_ci burn_bin = get_ota_object().BuildHiburnBin(str(target[0]), str(source[0])) 3051bd4fe43Sopenharmony_ci loader_bin = str(source[1]) 3061bd4fe43Sopenharmony_ci efuse_bin = str(source[2]) if len(source) == 3 else None 3071bd4fe43Sopenharmony_ci boot_b = os.path.join('output', 'bin', '%s_boot_signed_B.bin'%(env.get('CHIP_TYPE'))) 3081bd4fe43Sopenharmony_ci boot_b_size = os.path.getsize(boot_b) 3091bd4fe43Sopenharmony_ci factory_bin_path = os.path.join('build', 'libs', 'factory_bin') 3101bd4fe43Sopenharmony_ci factory_bin = os.path.join(factory_bin_path, '%s_factory.bin'%env_cfg.target_name) 3111bd4fe43Sopenharmony_ci burn_for_erase_bin = os.path.join('build', 'basebin', 'burn_for_erase_4k.bin') 3121bd4fe43Sopenharmony_ci #证书安全存储示例 3131bd4fe43Sopenharmony_ci tee_cert1_file = os.path.join('build', 'basebin', 'tee_cert1.bin'); 3141bd4fe43Sopenharmony_ci tee_cert2_file = os.path.join('build', 'basebin', 'tee_cert2.bin'); 3151bd4fe43Sopenharmony_ci tee_key_file = os.path.join('build', 'basebin', 'tee_key.bin'); 3161bd4fe43Sopenharmony_ci tee_cert_key_bin_max = 12*1024; #必须为4KB证书倍,需匹配分区表确定烧写地址和大小 3171bd4fe43Sopenharmony_ci tee_total_file_cnt = 3; #3个文件:2个证书,1个key。 3181bd4fe43Sopenharmony_ci burn_tee_cert = False 3191bd4fe43Sopenharmony_ci if ((os.path.exists(tee_cert1_file)) and (os.path.exists(tee_cert2_file)) and (os.path.exists(tee_key_file))): 3201bd4fe43Sopenharmony_ci burn_tee_cert = True 3211bd4fe43Sopenharmony_ci 3221bd4fe43Sopenharmony_ci version_bin = bytearray(8) 3231bd4fe43Sopenharmony_ci boot_ver = get_ota_object().get_flashboot_file_ver() 3241bd4fe43Sopenharmony_ci kernel_ver = get_ota_object().get_kernel_file_ver() 3251bd4fe43Sopenharmony_ci boot_ver_bytes = boot_ver.to_bytes(4, byteorder = 'little', signed = True) 3261bd4fe43Sopenharmony_ci kernel_ver_bytes = kernel_ver.to_bytes(4, byteorder = 'little', signed = True) 3271bd4fe43Sopenharmony_ci version_bin[0:4] = boot_ver_bytes 3281bd4fe43Sopenharmony_ci version_bin[4:8] = kernel_ver_bytes 3291bd4fe43Sopenharmony_ci version_file = os.path.join("output", "bin", '%s_vercfg.bin'%env_cfg.target_name) 3301bd4fe43Sopenharmony_ci with open(version_file, 'wb+') as fp: 3311bd4fe43Sopenharmony_ci fp.write(version_bin) 3321bd4fe43Sopenharmony_ci 3331bd4fe43Sopenharmony_ci burn_bin_ease_size = 0x200000; 3341bd4fe43Sopenharmony_ci #根据分区表适配烧写地址和大小 3351bd4fe43Sopenharmony_ci if (get_hilink_enable() == True): 3361bd4fe43Sopenharmony_ci burn_bin_ease_size = 0x200000 - 0x8000 - 0x1000 - 0x2000 3371bd4fe43Sopenharmony_ci if (burn_tee_cert == True): 3381bd4fe43Sopenharmony_ci burn_bin_ease_size = 0x200000 - 0x8000 - 0x1000 - 0x2000 - 0x5000 3391bd4fe43Sopenharmony_ci 3401bd4fe43Sopenharmony_ci if os.path.exists(factory_bin): 3411bd4fe43Sopenharmony_ci cmd_list = ['%s|0|0|0'%loader_bin, '%s|0|0|3'%efuse_bin, '%s|0|%d|1'%(burn_bin, burn_bin_ease_size), '%s|%d|%d|6'%(factory_bin, 0x14D000, 0x96000)] if efuse_bin!=None else ['%s|0|0|0'%loader_bin, '%s|0|%d|1'%(burn_bin, burn_bin_ease_size), '%s|%d|%d|6'%(factory_bin, 0x14D000, 0x96000),] 3421bd4fe43Sopenharmony_ci shutil.copytree(factory_bin_path, os.path.join(env_cfg.bin_path, 'factory_bin')) 3431bd4fe43Sopenharmony_ci else: 3441bd4fe43Sopenharmony_ci cmd_list = ['%s|0|0|0'%loader_bin, '%s|0|0|3'%efuse_bin, '%s|0|%d|1'%(burn_bin, burn_bin_ease_size)] if efuse_bin!=None else ['%s|0|0|0'%loader_bin, '%s|0|%d|1'%(burn_bin, burn_bin_ease_size)] 3451bd4fe43Sopenharmony_ci 3461bd4fe43Sopenharmony_ci if ((get_hilink_enable() == True) or (burn_tee_cert == True)): 3471bd4fe43Sopenharmony_ci cmd_list.append('%s|%d|%d|1'%(burn_for_erase_bin, 0x200000 - 0x8000 - 0x1000, 0x1000)) 3481bd4fe43Sopenharmony_ci 3491bd4fe43Sopenharmony_ci #cmd_list.append('%s|%d|%d|1'%(boot_b, 0x200000 - boot_b_size, boot_b_size)); 3501bd4fe43Sopenharmony_ci 3511bd4fe43Sopenharmony_ci if (burn_tee_cert == True): 3521bd4fe43Sopenharmony_ci cert_key_bin = bytearray(tee_cert_key_bin_max) 3531bd4fe43Sopenharmony_ci tee_cert1_size = os.path.getsize(tee_cert1_file) 3541bd4fe43Sopenharmony_ci tee_cert2_size = os.path.getsize(tee_cert2_file) 3551bd4fe43Sopenharmony_ci tee_key_size = os.path.getsize(tee_key_file) 3561bd4fe43Sopenharmony_ci total_cert_key_size = tee_cert1_size + tee_cert2_size + tee_key_size 3571bd4fe43Sopenharmony_ci if (total_cert_key_size > tee_cert_key_bin_max - 4 - 4 - 4*tee_total_file_cnt): 3581bd4fe43Sopenharmony_ci print ("%s============== cert total len bigger than %d=============%s"%(scons_utils.colors['red'], total_cert_key_size,scons_utils.colors['end'])) 3591bd4fe43Sopenharmony_ci return -1 3601bd4fe43Sopenharmony_ci else: 3611bd4fe43Sopenharmony_ci with open(tee_cert1_file, 'rb') as fp: 3621bd4fe43Sopenharmony_ci tee_cert1_bin = fp.read() 3631bd4fe43Sopenharmony_ci with open(tee_cert2_file, 'rb') as fp: 3641bd4fe43Sopenharmony_ci tee_cert2_bin = fp.read() 3651bd4fe43Sopenharmony_ci with open(tee_key_file, 'rb') as fp: 3661bd4fe43Sopenharmony_ci tee_key_bin = fp.read() 3671bd4fe43Sopenharmony_ci 3681bd4fe43Sopenharmony_ci #填充头部结构 3691bd4fe43Sopenharmony_ci start_flag = 0xDEADBEEF 3701bd4fe43Sopenharmony_ci start_flag_bytes = start_flag.to_bytes(4, byteorder = 'little', signed = False) 3711bd4fe43Sopenharmony_ci cert_key_bin[0:4] = start_flag_bytes #填充魔术字 3721bd4fe43Sopenharmony_ci tee_total_file_cnt_bytes = tee_total_file_cnt.to_bytes(4, byteorder = 'little', signed = True) 3731bd4fe43Sopenharmony_ci cert_key_bin[4:8] = tee_total_file_cnt_bytes #填充总的文件数 3741bd4fe43Sopenharmony_ci #填充各文件的大小 3751bd4fe43Sopenharmony_ci cert_key_bin[8:12] = tee_cert1_size.to_bytes(4, byteorder = 'little', signed = True) 3761bd4fe43Sopenharmony_ci cert_key_bin[12:16] = tee_cert2_size.to_bytes(4, byteorder = 'little', signed = True) 3771bd4fe43Sopenharmony_ci cert_key_bin[16:20] = tee_key_size.to_bytes(4, byteorder = 'little', signed = True) 3781bd4fe43Sopenharmony_ci #填充各文件 3791bd4fe43Sopenharmony_ci cert_key_bin[20:20 + tee_cert1_size] = tee_cert1_bin 3801bd4fe43Sopenharmony_ci cert_key_bin[20 + tee_cert1_size:20 + tee_cert1_size + tee_cert2_size] = tee_cert2_bin 3811bd4fe43Sopenharmony_ci cert_key_bin[20 + tee_cert1_size + tee_cert2_size:20 + tee_cert1_size + tee_cert2_size + tee_key_size] = tee_key_bin 3821bd4fe43Sopenharmony_ci #写文件 3831bd4fe43Sopenharmony_ci cert_bin_file = os.path.join("output", "bin", '%s_tee_cert_key.bin'%env_cfg.target_name) 3841bd4fe43Sopenharmony_ci with open(cert_bin_file, 'wb+') as fp: 3851bd4fe43Sopenharmony_ci fp.write(cert_key_bin) 3861bd4fe43Sopenharmony_ci cmd_list.append('%s|%d|%d|1'%(cert_bin_file, 0x200000 - 0x8000 - 0x1000 - 0x2000 - 0x5000, tee_cert_key_bin_max)) 3871bd4fe43Sopenharmony_ci 3881bd4fe43Sopenharmony_ci if (get_secure_boot() == True): #only need write ver file in secure boot mode. 3891bd4fe43Sopenharmony_ci cmd_list.append('%s|0|0|7'%version_file) 3901bd4fe43Sopenharmony_ci 3911bd4fe43Sopenharmony_ci packet_bin(str(target[1]), cmd_list) 3921bd4fe43Sopenharmony_ci if os.path.exists(factory_bin_path): 3931bd4fe43Sopenharmony_ci shutil.rmtree(factory_bin_path) 3941bd4fe43Sopenharmony_ci return 0 3951bd4fe43Sopenharmony_ci 3961bd4fe43Sopenharmony_cidef compress_ota_builder(target, source, env): 3971bd4fe43Sopenharmony_ci """Build compressed upgrade file 3981bd4fe43Sopenharmony_ci """ 3991bd4fe43Sopenharmony_ci get_ota_object().set_encrypt_flag(0x42) 4001bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_FLASH_ENCRYPT_SUPPORT') == 'y': 4011bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x2) 4021bd4fe43Sopenharmony_ci get_ota_object().set_encrypt_flag(0xFF) 4031bd4fe43Sopenharmony_ci else: 4041bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x1) 4051bd4fe43Sopenharmony_ci get_ota_object().set_kernel_file_attr_ota(0x4) 4061bd4fe43Sopenharmony_ci get_ota_object().set_build_temp_path(build_temp_path = env_cfg.cache_path) 4071bd4fe43Sopenharmony_ci compress_ota = get_ota_object().BuildCompressUpgBin(str(target[0]), str(source[0])) 4081bd4fe43Sopenharmony_ci return 0 4091bd4fe43Sopenharmony_ci 4101bd4fe43Sopenharmony_cidef boot_ota_builder(target, source, env): 4111bd4fe43Sopenharmony_ci """Build boot ota 4121bd4fe43Sopenharmony_ci """ 4131bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_FLASH_ENCRYPT_SUPPORT') == 'y': 4141bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x2) 4151bd4fe43Sopenharmony_ci else: 4161bd4fe43Sopenharmony_ci get_ota_object().set_file_attr_encrypt(0x1) 4171bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_COMPRESSION_OTA_SUPPORT') == 'y': 4181bd4fe43Sopenharmony_ci get_ota_object().set_flashboot_file_attr_ota(0x4) 4191bd4fe43Sopenharmony_ci else: 4201bd4fe43Sopenharmony_ci get_ota_object().set_flashboot_file_attr_ota(0x3) 4211bd4fe43Sopenharmony_ci get_ota_object().set_encrypt_flag(0x42) 4221bd4fe43Sopenharmony_ci boot_ota = get_ota_object().BuildUpgBoot(str(target[0])) 4231bd4fe43Sopenharmony_ci return 0 4241bd4fe43Sopenharmony_ci 4251bd4fe43Sopenharmony_ci#Builders 4261bd4fe43Sopenharmony_cilink_env.Append(BUILDERS={'LinkFile':linker_builder, 4271bd4fe43Sopenharmony_ci 'Elf':elf_builder, 4281bd4fe43Sopenharmony_ci 'Binary':binary_builder, 4291bd4fe43Sopenharmony_ci 'Asm':asm_builder, 4301bd4fe43Sopenharmony_ci 'BaseImg':Builder(action=baseimg_builder), 4311bd4fe43Sopenharmony_ci 'NVKernel':Builder(action=nvkernel_builder), 4321bd4fe43Sopenharmony_ci 'BootOta':Builder(action=boot_ota_builder), 4331bd4fe43Sopenharmony_ci 'OtaImg':Builder(action=ota_builder), 4341bd4fe43Sopenharmony_ci 'FactoryImg':Builder(action=factory_builder), 4351bd4fe43Sopenharmony_ci 'BurnImg':Builder(action=burn_bin_builder), 4361bd4fe43Sopenharmony_ci 'CompressOtaImg':Builder(action = compress_ota_builder), 4371bd4fe43Sopenharmony_ci}) 4381bd4fe43Sopenharmony_ci 4391bd4fe43Sopenharmony_cidef build_all(build_env, link_sys, flash_boot_bin, loader_boot_bin): 4401bd4fe43Sopenharmony_ci """Processing build 4411bd4fe43Sopenharmony_ci """ 4421bd4fe43Sopenharmony_ci 4431bd4fe43Sopenharmony_ci #kernel_ver 4441bd4fe43Sopenharmony_ci kernel_ver = scons_utils.scons_usr_int_option('CONFIG_TARGET_KERNEL_VER') 4451bd4fe43Sopenharmony_ci if (kernel_ver < 0 or kernel_ver > 48): 4461bd4fe43Sopenharmony_ci raise scons_utils.SconsBuildError("%s============== kernel_ver invalied, should be 0-48 =============%s"%(scons_utils.colors['red'], scons_utils.colors['end'])) 4471bd4fe43Sopenharmony_ci else: 4481bd4fe43Sopenharmony_ci get_ota_object().set_kernel_file_ver(kernel_ver) 4491bd4fe43Sopenharmony_ci 4501bd4fe43Sopenharmony_ci #boot_ver 4511bd4fe43Sopenharmony_ci boot_ver = scons_utils.scons_usr_int_option('CONFIG_TARGET_BOOT_VER') 4521bd4fe43Sopenharmony_ci if (boot_ver < 0 or boot_ver > 16): 4531bd4fe43Sopenharmony_ci raise scons_utils.SconsBuildError("%s============== boot_ver invalied, should be 0-16 =============%s"%(scons_utils.colors['red'], scons_utils.colors['end'])) 4541bd4fe43Sopenharmony_ci else: 4551bd4fe43Sopenharmony_ci get_ota_object().set_flashboot_file_ver(boot_ver) 4561bd4fe43Sopenharmony_ci 4571bd4fe43Sopenharmony_ci #images container, insert boot ota at first 4581bd4fe43Sopenharmony_ci imgs = [build_env.BootOta(target=os.path.join(env_cfg.bin_path, '%s_flash_boot_ota.bin'%env_cfg.target_name), source=flash_boot_bin)] 4591bd4fe43Sopenharmony_ci for sig_key in sign_dict: 4601bd4fe43Sopenharmony_ci if sig_key == 0 and factory_mode != 'yes': 4611bd4fe43Sopenharmony_ci continue 4621bd4fe43Sopenharmony_ci sign_build = build_env.Clone() 4631bd4fe43Sopenharmony_ci sign_build['SIGN'] = sig_key 4641bd4fe43Sopenharmony_ci name_suffix = '_%s'%sig_key 4651bd4fe43Sopenharmony_ci if sig_key == 0: 4661bd4fe43Sopenharmony_ci name_suffix = '_factory' 4671bd4fe43Sopenharmony_ci ota_file = os.path.join(env_cfg.bin_path, '%s%s.bin'%(env_cfg.target_name, name_suffix)) 4681bd4fe43Sopenharmony_ci elif scons_utils.scons_usr_bool_option('CONFIG_COMPRESSION_OTA_SUPPORT') == 'y': 4691bd4fe43Sopenharmony_ci name_suffix = '' 4701bd4fe43Sopenharmony_ci ota_file = os.path.join(env_cfg.cache_path, '%s_ota_%s.bin'%(env_cfg.target_name, 'temp')) #tmp file 4711bd4fe43Sopenharmony_ci else: 4721bd4fe43Sopenharmony_ci ota_file = os.path.join(env_cfg.bin_path, '%s_ota%s.bin'%(env_cfg.target_name, name_suffix)) 4731bd4fe43Sopenharmony_ci 4741bd4fe43Sopenharmony_ci sign_build['LINKFILE'] = os.path.join(env_cfg.link_path, 'link%s.lds'%name_suffix) 4751bd4fe43Sopenharmony_ci sign_build['MAPFILE'] = '%s%s.map'%(sign_build['MAPFILE'][:-len('.map')], name_suffix) 4761bd4fe43Sopenharmony_ci sign_build.Append(LINK_SCRIPTS_FLAG = '-DFLASH_FIRM_START=%s'%sign_dict[sig_key]) 4771bd4fe43Sopenharmony_ci 4781bd4fe43Sopenharmony_ci link_risc = sign_build.LinkFile(source=os.path.join('build', 'link', 'link'), 4791bd4fe43Sopenharmony_ci target='$LINKFILE') 4801bd4fe43Sopenharmony_ci sign_build.Depends(link_risc, link_sys) 4811bd4fe43Sopenharmony_ci #start 4821bd4fe43Sopenharmony_ci target_out = sign_build.Elf(source = libs, target = os.path.join(env_cfg.bin_path, '%s%s.out'%(env_cfg.target_name, name_suffix))) 4831bd4fe43Sopenharmony_ci sign_build.Depends(target_out, [link_risc, libs]) 4841bd4fe43Sopenharmony_ci target_out_bin = sign_build.Binary(source = target_out, target = os.path.join(env_cfg.cache_path, '%s%s'%(env_cfg.target_name, name_suffix))) 4851bd4fe43Sopenharmony_ci target_asm = sign_build.Asm(source = target_out, target=os.path.join(env_cfg.bin_path, '%s%s.asm'%(env_cfg.target_name, name_suffix))) 4861bd4fe43Sopenharmony_ci 4871bd4fe43Sopenharmony_ci base_bin_target = os.path.join(env_cfg.cache_path, '%s_base%s.bin'%(env_cfg.target_name, name_suffix)) 4881bd4fe43Sopenharmony_ci kernel_bin_target = os.path.join(env_cfg.cache_path, '%s_kernel%s.bin'%(env_cfg.target_name, name_suffix)) 4891bd4fe43Sopenharmony_ci 4901bd4fe43Sopenharmony_ci #Build kernel and ota 4911bd4fe43Sopenharmony_ci kernel = sign_build.BaseImg(source=target_out_bin, target=[base_bin_target, kernel_bin_target]) 4921bd4fe43Sopenharmony_ci if factory_mode == 'yes': 4931bd4fe43Sopenharmony_ci ota_bin = sign_build.FactoryImg(source=kernel, target=ota_file) 4941bd4fe43Sopenharmony_ci else: 4951bd4fe43Sopenharmony_ci ota_bin = sign_build.OtaImg(source=kernel, target=ota_file) 4961bd4fe43Sopenharmony_ci imgs.append(ota_bin) 4971bd4fe43Sopenharmony_ci sign_build.AddPostAction(kernel, scons_utils.cleanup) #hook clean 4981bd4fe43Sopenharmony_ci if sig_key == 'A': #need signature 4991bd4fe43Sopenharmony_ci loader_bin = os.path.join('#', env_cfg.bin_path, '%s_loader_signed.bin'%(env.get('CHIP_TYPE'))) 5001bd4fe43Sopenharmony_ci efuse_bin = os.path.join('build', 'basebin', 'efuse_cfg.bin') 5011bd4fe43Sopenharmony_ci burn_bin = os.path.join(env_cfg.bin_path, '%s_burn.bin'%env_cfg.target_name) 5021bd4fe43Sopenharmony_ci allinone_bin = os.path.join(env_cfg.bin_path, '%s_allinone.bin'%env_cfg.target_name) 5031bd4fe43Sopenharmony_ci burn_bins = sign_build.BurnImg(source=[ota_bin, loader_bin, efuse_bin] if os.path.exists(efuse_bin) else [ota_bin, loader_bin], 5041bd4fe43Sopenharmony_ci target=[burn_bin, allinone_bin]) 5051bd4fe43Sopenharmony_ci imgs.append(burn_bins) 5061bd4fe43Sopenharmony_ci #mark binaries to be built everytime 5071bd4fe43Sopenharmony_ci if sig_key in ['A', 'B']: 5081bd4fe43Sopenharmony_ci sign_build.AlwaysBuild([link_risc, target_out, target_out_bin, target_asm, kernel, ota_bin, burn_bins]) 5091bd4fe43Sopenharmony_ci if scons_utils.scons_usr_bool_option('CONFIG_COMPRESSION_OTA_SUPPORT') == 'y' and sig_key == 'A': 5101bd4fe43Sopenharmony_ci compress_ota_bin = os.path.join(env_cfg.bin_path, '%s_ota.bin'%env_cfg.target_name) 5111bd4fe43Sopenharmony_ci compress_ota_file = sign_build.CompressOtaImg(source = ota_bin, target = compress_ota_bin) 5121bd4fe43Sopenharmony_ci break 5131bd4fe43Sopenharmony_ci if sig_key == 0: 5141bd4fe43Sopenharmony_ci break 5151bd4fe43Sopenharmony_ci return imgs 5161bd4fe43Sopenharmony_ci 5171bd4fe43Sopenharmony_cilink_env.AddMethod(build_all, 'BUILD') 5181bd4fe43Sopenharmony_ci#prepare link script 5191bd4fe43Sopenharmony_cilink_sys = link_env.LinkFile(source=os.path.join('build', 'link', 'system_config'), 5201bd4fe43Sopenharmony_ci target=os.path.join(env_cfg.link_path, 'system_config.ld')) 5211bd4fe43Sopenharmony_cilink_env.Depends(link_sys, [flash_boot_bin, loader_boot_bin]) 5221bd4fe43Sopenharmony_cilink_env.AddPostAction(link_sys, nvimg_builder) #prepare nv image 5231bd4fe43Sopenharmony_ci 5241bd4fe43Sopenharmony_ci# START LINK 5251bd4fe43Sopenharmony_citarget_img = link_env.BUILD(link_sys, flash_boot_bin, loader_boot_bin) 5261bd4fe43Sopenharmony_cilink_env.AlwaysBuild([target_img, link_sys]) 5271bd4fe43Sopenharmony_ciClean(target_img, env_cfg.clean_list) 5281bd4fe43Sopenharmony_ci####################################################### LINK ####################################################### 5291bd4fe43Sopenharmony_ci 5301bd4fe43Sopenharmony_ci####################################################### BUILD CHECK ####################################################### 5311bd4fe43Sopenharmony_ci 5321bd4fe43Sopenharmony_cidef build_status(): 5331bd4fe43Sopenharmony_ci bf = GetBuildFailures() 5341bd4fe43Sopenharmony_ci status = 0 5351bd4fe43Sopenharmony_ci failures_message = '' 5361bd4fe43Sopenharmony_ci if bf: 5371bd4fe43Sopenharmony_ci status = -1 5381bd4fe43Sopenharmony_ci failures_message = "\n".join(["Failed building %s" % scons_utils.bf_to_str(x) for x in bf if x is not None]) 5391bd4fe43Sopenharmony_ci return (status, failures_message) 5401bd4fe43Sopenharmony_ci 5411bd4fe43Sopenharmony_cidef display_build_status(): 5421bd4fe43Sopenharmony_ci if env.GetOption("clean"): 5431bd4fe43Sopenharmony_ci return 5441bd4fe43Sopenharmony_ci status, failures_message = build_status() 5451bd4fe43Sopenharmony_ci if status == 0: 5461bd4fe43Sopenharmony_ci scons_utils.show_burn_tips() 5471bd4fe43Sopenharmony_ci else: 5481bd4fe43Sopenharmony_ci scons_utils.show_alert("BUILD FAILED!!!!") 5491bd4fe43Sopenharmony_ci scons_utils.show_alert(failures_message) 5501bd4fe43Sopenharmony_ci 5511bd4fe43Sopenharmony_ciatexit.register(display_build_status) 5521bd4fe43Sopenharmony_ci 5531bd4fe43Sopenharmony_ciif common_env.log_output_flag == False: 5541bd4fe43Sopenharmony_ci file.close() #close log file handler 5551bd4fe43Sopenharmony_ci sys.stdout = old_stdout 5561bd4fe43Sopenharmony_ci 557