import os
import re
Import('env')

env = env.Clone()
#------------------------------------------------------------------------------
# EM FUNC
#------------------------------------------------------------------------------
def EM_LOGD(str):
  print("\n\033[0;33;40m" +  "[EM_DBG] " + str + "\033[0;m\n")

CHIPSET = env['CHIPSET']
if CHIPSET == "bitra":
  CHIPSET = "sm7225"
if CHIPSET == "saipan":
  CHIPSET = "sm7250"
if CHIPSET == "kamorta":
  CHIPSET = "sm6115"
if CHIPSET == "lahaina":
  CHIPSET = "sm8350"
if CHIPSET == "rennell":
  CHIPSET = "sm7125"
if CHIPSET == "sdm855":
  CHIPSET = "sm8150"
if CHIPSET == "kodiak":
  CHIPSET = "sm7325"
if CHIPSET == "waipio":
  CHIPSET = "sm8450"

#if TARGET_BUILD_VARIANT == "eng":
#  EM_LOGD("CHIPSET:" + CHIPSET)
#  EM_LOGD("PLATFORM_VER : " + os.environ['PLATFORM_VERSION'])
#  EM_LOGD("SHIPPING_API_LEVEL : " + os.environ['PRODUCT_SHIPPING_API_LEVEL'])

env.Append(CCFLAGS = ' -DEM_SWD_QSEE ')
env.Append(CCFLAGS = ' -DEMAS ')
env.Append(CFLAGS = ' -fstack-protector -fstack-protector-all')

# for deterministic build
if os.getenv('SUPPORT_NEW_TA_BUILD', 'false') == 'true':
  env.Append(LINKFLAGS=' -no-threads ')

#------------------------------------------------------------------------------
# OUT DIR
#------------------------------------------------------------------------------
if os.path.exists(env['BUILD_ROOT'] + '/ssg'):
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/ssg"
else:
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/core"

if not hasattr(env, 'IMAGE_ALIASES'):
  aliases = []
  aliases = ['engmode',]
  env.Replace(OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/engmode/build")
  env.Replace(LIB_OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/engmode/build/" + "${SHORT_BUILDPATH}")

#------------------------------------------------------------------------------
# EM Source PATH
#------------------------------------------------------------------------------
EM_ROOT_PATH = QSEE_APP_DIR + "/securemsm/trustzone/qsapps/engmode/"

#------------------------------------------------------------------------------
# EM Defines
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# We need to specify "neon" to generate SIMD instructions in 32-bit mode
#------------------------------------------------------------------------------
if 'scorpion' in env['PROC']:
  env.Append(CCFLAGS = " -mfpu=neon ")

#------------------------------------------------------------------------------
# EM includes
#------------------------------------------------------------------------------
includes = [
  "${INC_ROOT}/core/api/services",
  QSEE_APP_DIR + "/api/securemsm/trustzone/gp",
  QSEE_APP_DIR + "/api/securemsm/trustzone/qsee",
  EM_ROOT_PATH + "inc",
  EM_ROOT_PATH + "inc/crypto",
  EM_ROOT_PATH + "inc/openssl",
  os.environ['TZ_SCRYPTO_HEADER_PATH'],
]

#------------------------------------------------------------------------------
# EM APP_CORE_ENTRY_SOURCES
#------------------------------------------------------------------------------
APP_CORE_ENTRY_SOURCES = [
  EM_ROOT_PATH + "app_main.c",
  EM_ROOT_PATH + "em_memory_qsee.c",
  EM_ROOT_PATH + "em_crypto_qsee.c",
  EM_ROOT_PATH + "em_qsee_rpmb.c",
  EM_ROOT_PATH + "em_client_manager.c",
  EM_ROOT_PATH + "em_crypto.c",
  EM_ROOT_PATH + "em_ta_utils.c",
  EM_ROOT_PATH + "em_cmd_handler.c",
  EM_ROOT_PATH + "em_context.c",
  EM_ROOT_PATH + "em_esi_manager.c",
  EM_ROOT_PATH + "em_utils.c",
  EM_ROOT_PATH + "em_token_manager.c",
  EM_ROOT_PATH + "em_init_manager.c",
  EM_ROOT_PATH + "em_wb_aes_ctr.c",
  EM_ROOT_PATH + "em_request.c",
  EM_ROOT_PATH + "em_ess_command.c",
  EM_ROOT_PATH + "em_extension_manager.c",
  EM_ROOT_PATH + "em_ess_manager.c",
  EM_ROOT_PATH + "qsee_printk.c",
]

#------------------------------------------------------------------------------
# Library
#------------------------------------------------------------------------------
libs = []

SCRYPTO_LIB = os.environ['TZ_SCRYPTO_LIB32']
if CHIPSET in ['sdm439', 'msm8953']:
  SCRYPTO_LIB = EM_ROOT_PATH + "qualcomm_sdm845_scrypto_v2.1_x32_release.a"
if CHIPSET in ['sm8450']:
  SCRYPTO_LIB = os.environ['TZ_SCRYPTO_LIB64']

EM_LOGD("SCRYPTO_LIB:" + SCRYPTO_LIB)
libs.append(env.File(SCRYPTO_LIB.split()))

if env["PROC"] == "scorpion":
    libs.append(File(env.SubstRealPath('${MUSL32PATH}/lib/libc.a')))
else:
    libs.append(File(env.SubstRealPath('${MUSLPATH}/lib/libc.a')))


#------------------------------------------------------------------------------
# Add command to Imprint HMAC
#------------------------------------------------------------------------------
if CHIPSET in ['sdm439', 'msm8953']:
  SCRYPTO_TOOL_IMPRINT = EM_ROOT_PATH + "imprint"
else:
  SCRYPTO_TOOL_IMPRINT = os.environ['TZ_SCRYPTO_TOOLS_IMPRINT']

EM_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/' + "engmode.elf")
if CHIPSET in ['sm7250', 'sm7225']:
  EM_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/scorpion/' + "engmode.elf")
if CHIPSET in ['sm6115', 'sm8350', 'sm7325', 'sm8450']:
  EM_ELF_PATH = env.subst('${OUT_DIR}/' + "engmode.elf")

if os.path.exists(os.environ['TOPDIR']):
  RUN_SHELL_COMMAND = "size " + EM_ELF_PATH + " > " + os.environ['TOPDIR'] + "/android/engmode_elf.out"
  env.Append(LINKCOM = " && ")
  env.Append(LINKCOM = RUN_SHELL_COMMAND)

EM_RUN_FIPS_TOOLS_COMMAND =  SCRYPTO_TOOL_IMPRINT + " " + EM_ELF_PATH

env.Append(LINKCOM = " && ")
env.Append(LINKCOM = EM_RUN_FIPS_TOOLS_COMMAND)
env.Replace(EM_RUN_FIPS_TOOLS_COMMAND = SCRYPTO_TOOL_IMPRINT + " " + EM_ELF_PATH)

#------------------------------------------------------------------------------
# Add metadata to image
#------------------------------------------------------------------------------
md = {
   'appName': 'engmode',
   'privileges': ['default',
                  'HWFuse',
                  'System',
                 ],
   'heapSize': 0x100000,
   'storageFilesNoPersist': True,
   'totalStorageFiles': 2000
}

engmode_units = env.SecureAppBuilder(
  sources = [ APP_CORE_ENTRY_SOURCES ],
  includes = includes,
  metadata = md,
  image = 'engmode',
  user_libs = libs,
)

if hasattr(env, 'IMAGE_ALIASES'):
  for image in env['IMAGE_ALIASES']:
    env.Alias(image, engmode_units)
else:
  env.Alias(aliases, engmode_units)
