#===============================================================================
#  Copyright (c) 2011-2020 QUALCOMM Technologies Incorporated.
#  All Rights Reserved.
#  Qualcomm Confidential and Proprietary
#===============================================================================

#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------
import os
Import('env')
env = env.Clone()

if os.getenv('SUPPORT_NEW_TA_BUILD', 'false') == 'true':
  env.Append(LINKFLAGS=' -no-threads ')

if not hasattr(env, 'IMAGE_ALIASES'):
  aliases = []
  aliases = ['tz_iccc',]
  env.Replace(OUT_DIR = '${BUILD_ROOT}/ssg/bsp/trustzone/qsapps/tz_iccc/build')
  env.Replace(LIB_OUT_DIR = '${BUILD_ROOT}/ssg/bsp/trustzone/qsapps/tz_iccc/build/${SHORT_BUILDPATH}')

if env.has_key('USES_NO_CP'):
  env.Append(CCFLAGS = ' -DUSES_NO_CP ')

#------------------------------------------------------------------------------
# We need to specify "neon" to generate SIMD instructions in 32-bit mode
#------------------------------------------------------------------------------
if env['PROC'] == 'scorpion':
  env.Append(CCFLAGS = " -mfpu=neon ")

env.Append(CPPDEFINES = 'TZ_ICCC_APP=1')

includes = ['#../../core/api/services',                                 # comdef.h
            '#../../ssg/api/securemsm/trustzone/gp',                    # Global Platform API
            '#../../ssg/api/securemsm/trustzone/qsee',                  # QSEE API
            '#../../ssg/securemsm/trustzone/qsee/idl/public',           # .idl
            '#../../ssg/securemsm/trustzone/qsee/mink/include',         # object.h
            '#../../ssg/securemsm/uclib/usr/legacy/secmath/shared/inc', # secmath.h
            '#../../ssg/securemsm/uclib/usr/legacy/secrsa/shared/inc',  # secrsa_err.h
            '#../../ssg/securemsm/uclib/usr/legacy/secrsa/shared/src',  # secrsa_padding.h
            '#../../ssg/securemsm/tz_iccc_common/public',               # tz_iccc_comdef.h
            '#../../ssg/securemsm/trustzone/qsapps/tz_iccc/inc',        # ICCC internal
]

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------

sources = ['../../tz_iccc/src/app_service.c',
           '../../tz_iccc/src/app_core.c',
           '../../tz_iccc/src/app_allowlist.c',
           '../../tz_iccc/src/app_cipher.c',
           '../../tz_iccc/src/app_drk.c',
           '../../tz_iccc/src/app_json.c',
           '../../tz_iccc/src/app_initData.c',
           '../../tz_iccc/src/app_readData.c',
           '../../tz_iccc/src/app_saveData.c',
           '../../tz_iccc/src/app_getDeviceStatus.c',
           '../../tz_iccc/src/app_attestation.c',
           '../../tz_iccc/src/app_bootloader.c',
           '../../tz_iccc/src/app_main.c',
]

#-------------------------------------------------------------------------------
# Compile idl files
#-------------------------------------------------------------------------------
idl_files = env.Glob("../idl/*.idl")
env.LoadToolScript("${BUILD_ROOT}/ssg/bsp/build/scripts/idlcompiler.py")
idl_output_dir = "../../../../tz_iccc_common/public/"
for idl_file in idl_files:
  t = os.path.join(idl_output_dir, os.path.basename(os.path.splitext(str(idl_file))[0] + ".h"))
  env.MINKIDL(source=idl_file, target=t)

#-------------------------------------------------------------------------------
# Add Libraries to image
#-------------------------------------------------------------------------------

libs = []

if env['PROC'] == 'scorpion':
  libca = env.SubstRealPath('${MUSL32PATH}/lib/libc.a')
else:
  libca = env.SubstRealPath('${MUSLPATH}/lib/libc.a')

libs.append(env.File(libca))

#-------------------------------------------------------------------------------
# Add command to print elf size ($(find ${OUT_DIR} | grep "tz_iccc.elf"))
#-------------------------------------------------------------------------------
if os.path.exists(os.environ['TOPDIR']):
  if env['CHIPSET'] in ['lahaina', 'kodiak']: # lahaina(sm8350), kodiak(sm8350_la1.1)
    # .../nhlos/trustzone_images/ssg/bsp/trustzone/qsapps/tz_iccc/build/tz_iccc.elf
    elf_path = env.subst('${OUT_DIR}' + '/tz_iccc.elf')
  elif env['CHIPSET'] in ['sm8250']: # sm8250
    # .../nhlos/trustzone_images/ssg/bsp/trustzone/qsapps/tz_iccc/build/DARAANAA/tz_iccc.elf
    elf_path = env.subst('${OUT_DIR}' + '/${SHORT_BUILDPATH}' + '/tz_iccc.elf')
  else: # bitra(sm7225), saipan(sm7250)
    # .../nhlos/trustzone_images/ssg/bsp/trustzone/qsapps/tz_iccc/build/SAJAANAA/scorpion/tz_iccc.elf
    # .../nhlos/trustzone_images/ssg/bsp/trustzone/qsapps/tz_iccc/build/JAFAANAA/scorpion/tz_iccc.elf
    elf_path = env.subst('${OUT_DIR}' + '/${SHORT_BUILDPATH}' + '/${PROC}' + '/tz_iccc.elf')
  run_shell_size_command = "size " + elf_path + " > " + os.environ['TOPDIR'] + "/android/tz_iccc_elf.out"
  env.Append(LINKCOM = " && ")
  env.Append(LINKCOM = run_shell_size_command)

target_name = 'tz_iccc'
app_name = 'tz_iccc'
uuid_name = 'd206a4c8-d36a-433d-80fb-1c4cafaa6897'

#-------------------------------------------------------------------------------
# Add metadata to image
#-------------------------------------------------------------------------------
md = {
  'appName': app_name, # 'UUID': uuid_name, (Only for new chipset)
  'privileges': [
                 'default',
                 'WhitelistBypass',
                 'OEMUnwrapKeys',
                 'HwFuse',
                 'OEMBuf',
                 'System',
                ],
  'services': [
               'ICCCSaveData',
               'ICCCReadData',
               'ICCCGetDeviceStatus'
              ],
  'heapSize': 0x10000,
  'acceptBufSize': 8192,
}

deploy_header_files = env.Glob('../inc/*')

tz_iccc_units = env.SecureAppBuilder(
  sources = sources,
  includes = includes,
  metadata = md,
  image = target_name,
  user_libs = libs,
  deploy_sources = sources + ['SConscript'] + deploy_header_files
)

if hasattr(env, 'IMAGE_ALIASES'):
  for image in env['IMAGE_ALIASES']:
    env.Alias(image, tz_iccc_units)
else:
  env.Alias(aliases, tz_iccc_units)
