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