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 == "waipio":
  CHIPSET = "sm8450"

if CHIPSET == "divar":
  CHIPSET = "sm6225"

#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
#------------------------------------------------------------------------------
QSEE_APP_DIR = os.getenv("BSP_QSAPPS_DIR")
QTEE_TAS_SDK_DIR = os.getenv("QTEE_TAS_SDK_DIR")
BUILD_ID = env['SHORT_BUILDPATH']

#------------------------------------------------------------------------------
# EM Source PATH
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# 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",
  QTEE_TAS_SDK_DIR + "/inc/gp",
  QTEE_TAS_SDK_DIR + "/inc/qsee",
  'inc',
  'inc/crypto',
  'inc/openssl',
  os.environ['TZ_SCRYPTO_HEADER_PATH'],
]

#------------------------------------------------------------------------------
# EM APP_CORE_ENTRY_SOURCES
#------------------------------------------------------------------------------
APP_CORE_ENTRY_SOURCES = [
  'app_main.c',
  'em_memory_qsee.c',
  'em_crypto_qsee.c',
  'em_qsee_rpmb.c',
  'em_client_manager.c',
  'em_crypto.c',
  'em_ta_utils.c',
  'em_cmd_handler.c',
  'em_context.c',
  'em_esi_manager.c',
  'em_utils.c',
  'em_token_manager.c',
  'em_init_manager.c',
  'em_wb_aes_ctr.c',
  'em_request.c',
  'em_ess_command.c',
  'em_extension_manager.c',
  'em_ess_manager.c',
  'qsee_printk.c',
]

#------------------------------------------------------------------------------
# Library
#------------------------------------------------------------------------------
libs = []

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
#------------------------------------------------------------------------------
SCRYPTO_TOOL_IMPRINT = os.environ['TZ_SCRYPTO_TOOLS_IMPRINT']

EM_USE_BUILD_ID = os.environ.get('EM_USE_BUILD_ID', 'True')

if EM_USE_BUILD_ID == 'False':
  EM_ELF_PATH = QSEE_APP_DIR + "/build/engmode.elf"
else:
  EM_ELF_PATH = QSEE_APP_DIR + "/build/" + BUILD_ID + "/engmode.elf"

EM_LOGD("EM_ELF_PATH:" + EM_ELF_PATH)

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,
)

op = env.Alias('engmode', engmode_units)
Return('engmode_units')
