#=============================================================================
#                    Copyright 2010 - 2015, 2017 QUALCOMM Technologies, Incorporated.
#                           All Rights Reserved.
#                         QUALCOMM Proprietary/GTDR
#=============================================================================
# STD Libs
#-----------------------------------------------------------------------------
import os
Import('env')
env = env.Clone()

#-----------------------------------------------------------------------------
# Source PATH
#-----------------------------------------------------------------------------
SRCPATH = "${BUILD_ROOT}/ssg/securemsm/trustzone/qsee/mink/libstd"

env.VariantDir('${BUILDPATH}', SRCPATH, duplicate=0)

#-----------------------------------------------------------------------------
# Internal depends within CoreBSP
#-----------------------------------------------------------------------------
CBSP_API = [
   'SERVICES',
   'KERNEL',
]

env.RequirePublicApi(CBSP_API, area='core')


#-----------------------------------------------------------------------------
# Source PATH
#-----------------------------------------------------------------------------
SRCPATH = '${BUILDPATH}/src/'

#-----------------------------------------------------------------------------
# Sources, libraries
#-----------------------------------------------------------------------------
sources = [ SRCPATH + f for f in [
    'memscpy.c',
    'memset.c',
    'memsmove.c',
    'secure_memset.c',
    'libstd_std_scanul.c',
    'timesafe_memcmp.c',
    'timesafe_strncmp.c',
    'wcslcat.c',
    'wcslcpy.c',
    'wstrlcat.c',
    'wstrlcpy.c',
    'wstrlen.c',
  ]
]

if env.OfftargetTesting():
  sources += [SRCPATH + f for f in ['strlcat.c', 'strlcpy.c',]]
else:
  sources.append(SRCPATH + 'io_fixup.c')

# XBL_SEC compiles required functions only due to memory size constraints
xblsec_sources = [ SRCPATH + f for f in [
    'memscpy.c',
    'secure_memset.c',
    'memsmove.c',
  ]
]

# The TEE builder doesn't set [TZ|APP]_EXEC_MODE properly, so this if
# statement is required to pull the correct libc binaries.  Please do
# not copypasta this conditional statement.
if env['PROC'] in ['A53_64']:
  archpath = os.path.join('..', 'aarch64')
else:
  archpath = os.path.join('..', 'aarch32')

#-----------------------------------------------------------------------------
# Add Libraries to images
#-----------------------------------------------------------------------------
if env.IsKeyEnable(['XBL_SEC_IMAGE']):
  libstd = env.AddBinaryLibrary('XBL_SEC_IMAGE', '${BUILDPATH}/libstd',  xblsec_sources)
  env.AddLibsToImage('XBL_SEC_IMAGE',
                     env.File('../${XBL_SEC_EXEC_MODE}/libc-nofp.a'))
  Return()

images = ['TZOS_IMAGE', 'MONITOR_IMAGE', 'HYPERVISOR_IMAGE','TZTESTEXEC_IMAGE','TZBSPTEST_IMAGE']
if env.IsKeyEnable(images):
  libstd = env.AddBinaryLibrary(images, '${BUILDPATH}/libstd',  sources)
  env.AddLibsToImage(images, env.File('../${TZ_EXEC_MODE}/libc-nofp.a'))
  Return()

# Use relative paths when building for applib, cmnlib and teetest images
relative_sources =  [s.replace(SRCPATH,'../src/') for s in sources]

images = ['APPLIB32_IMAGE', 'APPLIB64_IMAGE', 'CTZL_IMAGE', 'CTZL64_IMAGE',]
if env.IsKeyEnable(images):
  libstd_ext = env.SecureAppLibBuilder([], relative_sources, 'libstd_ext')

  if not env.OfftargetTesting() and env.IsKeyEnable(['CTZL_IMAGE', 'CTZL64_IMAGE']):
    libstd_ext.append(env.File(os.path.join(archpath, 'libc.a')))
    env.Deploy(libstd_ext)
    # This is the most convenient place to deploy minklibc.a to the TZ
    # libstd folder location so dependent TA compilation in that
    # folder structure will still work.
    env.Deploy(env.File(os.path.join(archpath, 'minklibc.a')))
  Return('libstd_ext')

if env.IsKeyEnable(['TEETEST_IMAGE', 'TEETEST64_IMAGE']):
  libstd_ext = env.SecureTEELibBuilder([], relative_sources, 'libstd_ext')
  libc = [env.File(os.path.join(archpath, 'libc-nofp.a'))]
  env.Deploy(['SConscript', libstd_ext, libc])
  Return(['libstd_ext', 'libc'])

if env.IsKeyEnable(['SDK_LIBS_IMAGE']):
  libs = env.SecureAppLibBuilder([], relative_sources, 'libstd_ext')
  libs.append([env.File(os.path.join(archpath, 'libc.a')),
               env.File(os.path.join(archpath, 'minklibc.a'))])
  env.DeploySdkLib(libs)
  Return()
