#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------
import os
Import('env')
env = env.Clone()

#------------------------------------------------------------------------------
# Pebble FUNC
#------------------------------------------------------------------------------
def PEBBLE_LOGD(str):
  print("\n\033[0;33;40m" +  "[PEBBLE_DBG] " + str + "\033[0;m\n")

env.Replace(LIB_OUT_DIR = '${BUILD_ROOT}/ssg/bsp/trustzone/qsapps/pebble/build/${SHORT_BUILDPATH}')

if env.has_key('USES_NO_CP'):
  env.Append(CCFLAGS = ' -DUSES_NO_CP ')

target_name = 'pebble'
app_name = 'pebble'

CHIPSET = env['RAW_CHIPSET']
if env['CHIPSET'] == 'sm8250':
  SCRYPTO_VER = 'SCryptolib_v2_5'
  SCRYPTO_PATH = env['BUILD_ROOT'] + "/ssg/securemsm/trustzone/qsapps/pebble/lib/Qualcomm/" + SCRYPTO_VER
  SCRYPTO_LIB = SCRYPTO_PATH + "/libs/scrypto_v2.5_x32_qsee_release.a"
else:
  SCRYPTO_VER = 'SCryptolib_v2_4'
  SCRYPTO_PATH = env['BUILD_ROOT'] + "/ssg/securemsm/trustzone/qsapps/pebble/lib/Qualcomm/" + SCRYPTO_VER
  SCRYPTO_LIB = SCRYPTO_PATH + "/" + CHIPSET + "/scrypto_v2.4_x32_qsee_release.a"

#------------------------------------------------------------------------------
# We need to specify "neon" to generate SIMD instructions in 32-bit mode
#------------------------------------------------------------------------------
if env['PROC'] == 'scorpion':
  env.Append(CCFLAGS = " -mfpu=neon ")

env.Append(CCFLAGS = " -DCONFIG_QSEE")

env.RequirePrivateApi('SECUREMSM')

includes = [
          '#../../core/api/services',
          '#../../core/api/boot/qfprom',
          '#../../ssg/api/securemsm/trustzone/qsee',
          '#../../ssg/api/securemsm/trustzone/gp',
          '#../../ssg/securemsm/trustzone/qsapps/pebble/inc',
          '#../../ssg/securemsm/trustzone/qsapps/pebble/inc/shared',
          '#../../ssg/securemsm/trustzone/qsapps/pebble/inc/public',
          '#../../ssg/securemsm/trustzone/qsapps/pebble/lib/Qualcomm/SCryptolib_v2_5/include',
          '#../../ssg/securemsm/tz_common/public',
          '#../../ssg/securemsm/tz_platform/public/tl',
          '#../../ssg/securemsm/tz_platform/vendor/QSEE/tl',
          '#../../ssg/securemsm/tz_iccc_common/public',
          '#../../ssg/securemsm/uclib/usr/legacy/secrsa/shared/src',
          '#../../ssg/securemsm/uclib/usr/legacy/secrsa/shared/inc',
          '#../../ssg/securemsm/uclib/usr/legacy/secmath/shared/inc',
           ]

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------
sources = [
        'app_main.c',
        'pebble_core.c',
        'pebble_utils.c',
        'pebble_x509.c',
        'process_cmd.c',
        'shared/base64.c',
        'shared/aes_hsha2_aead.c',
        'shared/jwe.c',
        'shared/jws.c',
        'shared/cipher.c',
        'shared/parson.c',
        'pebble_platform_interface.c',
        'pebble_drk.c',
        'pebble_hash.c',
        'pebble_sss.c',
        '../../../../tz_iccc_common/tl/tz_iccc_common_tl.c',
        '../../../../tz_platform/vendor/QSEE/tl/QSEE_TZ_Vendor.c'
]

#If not sm8250 need to add other files for ICCC build
if env['CHIPSET'] != 'sm8250':
  print 'sidi'
  iccc_sources = [
               '../../../../tz_common/tl/init_tl.c',
               '../../../../tz_common/tl/process_msr.c',
               '../../../../tz_common/tl/buffer_utils.c'
  ]
  sources.append(iccc_sources)

#-------------------------------------------------------------------------------
# Add Libraries to image
#-------------------------------------------------------------------------------
libs = env.File(SCRYPTO_LIB.split())

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 Imprint HMAC
#------------------------------------------------------------------------------
PEBBLE_TOOLS_DIR = env['BUILD_ROOT'] + "/ssg/securemsm/trustzone/qsapps/pebble/lib/Qualcomm/" + SCRYPTO_VER + "/tools"
PEBBLE_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/' + "pebble.elf")
PEBBLE_RUN_FIPS_TOOLS_COMMAND = PEBBLE_TOOLS_DIR + "/run_fips_tools.sh " + PEBBLE_ELF_PATH + " " + PEBBLE_TOOLS_DIR
PEBBLE_LOGD("PEBBLE_RUN_FIPS_TOOLS_COMMAND:" + PEBBLE_RUN_FIPS_TOOLS_COMMAND)
env.Append(LINKCOM = " && ")
env.Append(LINKCOM = PEBBLE_RUN_FIPS_TOOLS_COMMAND)

#-------------------------------------------------------------------------------
# Add metadata to image
#-------------------------------------------------------------------------------
if env['CHIPSET'] == 'sm8250':
  md = {
   'appName':    app_name,
   'privileges': ['default',
                  'WhitelistBypass',
                  'ICCCGetDeviceStatus',
                  'ICCCSaveData',
                  'ICCCReadData',
                 ],
  'heapSize': 0x10000,
  'stackSize': 0x20000,
  }
else:
  md = {
   'appName':    app_name,
   'privileges': ['default',
                  'WhitelistBypass',
                  'OEMBuf', 'WhitelistBypass' # to use ICCC feature
                 ],
  'heapSize': 0x10000,
  }

deploy_header_files = env.Glob('../inc/*')

pebble_units = env.SecureAppBuilder(
  sources = sources,
  includes = includes,
  metadata = md,
  image = target_name,
  user_libs = libs,
  deploy_sources = sources + ['SConscript'] + deploy_header_files
)

for image in env['IMAGE_ALIASES']:
  op = env.Alias(image, pebble_units)
