#===============================================================================
#
# secure_ui_sample  build script
#
# GENERAL DESCRIPTION
#    build script
#
# Copyright (c) 2013,2016-2020 Qualcomm Technologies Inc.
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
#-------------------------------------------------------------------------------
#
#                      EDIT HISTORY FOR FILE
#
#  This section contains schedulerents describing changes made to the module.
#  Notice that changes are listed in reverse chronological order.
#===============================================================================

import os

try:
  Import('env')
except:
  # We're doing an out of tree build so we need to setup the env to build our TA

  exc_obj = Exception('Exiting!...')

  # First, call into the QTEE SDK to get an Environment with all the tools
  try:
    # Either set $QTEE_SDK in the OS environment or pass
    # QTEE_SDK=/path/to/SDK as a SCons commandline argument
    # In this example, the SCons argument takes priority
    sdk_env_name = 'QTEE_SDK'
    sdk_dir = ARGUMENTS.get(sdk_env_name, os.environ.get(sdk_env_name))

    print 'Initialising QTEE SDK..'

    if not sdk_dir:
      print '\nEither set $QTEE_SDK in the OS environment or pass QTEE_SDK=/path/to/SDK as commandline argument..'
      raise exc_obj

    # Call the QTEE SDK SConscript to get a QTEE SDK SCons Environment  
    sdk_sconstruct = os.path.join(sdk_dir,'SConstruct')
    if not os.path.isfile(sdk_sconstruct):
      print '\nQTEE SDK SConstruct($QTEE_SDK/SConstruct) file not found!..'
      raise exc_obj
    qtee_sdk_env = SConscript(sdk_sconstruct)

  except Exception as e:
    if e == exc_obj:
      print exc_obj
    else:
      print '\nUnable to initialize QTEE SDK at ${}: {} '.format(sdk_env_name, sdk_dir)
      # re-raise the exception
      raise
    Exit(1)

  # We've gotten the env, now let's build our TA
  # Initialize the environment for the target architecture
  for arch in ['aarch32', 'aarch64']:
    env = qtee_sdk_env.Clone()

    # Initialize the environment for the target architecture
    env.InitArch(arch)

    # Establish where our compiled artifacts will go
    # out_dir = os.path.join(Dir('.').srcnode().abspath, 'out', env['PROC'])
    # env.Replace(OUT_DIR=out_dir)
    # env.Replace(LIB_OUT_DIR=out_dir)
    
    # We can call this exact sconscript again, but this time exporting the env we just got
    # so that we aren't tabbing over everthing below this
    this_sconscript = (lambda x:x).func_code.co_filename
    env.SConscript(this_sconscript,exports='env')

  Return()

# Cloning here since it may not be a good idea to trickle down -O0 to other env
env = env.Clone()

if env['PROC'] == 'scorpion':
  app_name = 'tuiapp32'
  stacksize = 0x12000
else:
  app_name = 'tuiapp'
  stacksize = 0x24000
  
env['APP_NAME'] = app_name
  
#-------------------------------------------------------------------------------
# layout resolution selection helper functions and definitions
#-------------------------------------------------------------------------------

#mapping the form factor to the layout resolution
#NOTE: default should specify lowest resolution available
form_factor_to_resolution_map = {
    'default'   :'1600x2560_1080x1920',
    '8250_fluid':'1440x2560',
    'saipan_fluid':'1440x2560',
}

#mapping the CHIPSET command-line parameter to the form factor
#safest option is to map to lowest resolution available for the CHIPSET
chipset_to_form_factor_map = {
    'default':'default',
    'sm8250' :'8250_fluid',
    'saipan' :'saipan_fluid',
}

#by default we will use resolution based on current CHIPSET.
#to compile with specific resolution use 'form_factor_layout=...' command-line
def get_layout_resolution(env):

    #make sure form_factor_layout is registered as a command-line parameter
    if 'form_factor_layout' not in env:
        vars = Variables()
        vars.Add(EnumVariable('form_factor_layout', 'form factor', 'default',
                               allowed_values=form_factor_to_resolution_map.keys(),
                               map={}, ignorecase=2))
        vars.Update(env)

    form_factor = env.subst('$form_factor_layout')

    #if no form_factor_layout given we guess the resolution based on current CHIPSET variable
    if form_factor == 'default':
        chipset = env.subst('$CHIPSET')
        if chipset in chipset_to_form_factor_map:
            form_factor = chipset_to_form_factor_map[chipset]
        else:
            #we don't have any mapping (new target?) - will use default form factor
            env.PrintWarning("Secure UI sample cannot find layout resolution for this target:" + chipset + " .(Using default)")

    #return the respective resolution
    return form_factor_to_resolution_map[form_factor]

#-------------------------------------------------------------------------------
# Compiler, object, and linker definitions
#-------------------------------------------------------------------------------

includes = [
  "${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TUICore/api",
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TrustedInput/inc',
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TrustedInput/layout/include',
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuiapp/composer/',
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuiapp/main/',
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuiapp/composer/layout_mgr/inc/',
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/misc_headers',
  '${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secureindicator2/inc/',
  "${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secuilib/SecureDisplay/libgd/include/",
  "${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secuilib/SecureDisplay/libpng/include/",
  "${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secuilib/SecureDisplay/zlib/include/",
]

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------
sources  = [
  'app_main.c'
]

#----------------------------------------------------------------------------
# libstd Objects
#----------------------------------------------------------------------------
#sources += Glob ('../libstd/*.c')

#if env['PROC'] != 'scorpion':
#  sources += Glob ('../libstd/aarch64/*.c')

#get the layout resolution and add the layout file to the compilation
layout_resolution = get_layout_resolution(env)
sources.append('../layouts/src/layout_' + layout_resolution + '.c')
deploy_headers = ['${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuiapp/main/payloadUtils.h']

libs = [
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TUICore/build/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TrustedInput/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuiapp/composer/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuiapp/composer/layout_mgr/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TrustedInput/controller/build/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/tuilib/TrustedInput/layout/build/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secuilib/SecureDisplay/zlib/build/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secuilib/SecureDisplay/libpng/build/SConscript', exports='env'),
  env.SConscript('${BUILD_ROOT}/apps/securemsm/trustzone/qsapps/secuilib/SecureDisplay/libgd/build/SConscript', exports='env'),
]

#-------------------------------------------------------------------------------
# Add metadata to image
#-------------------------------------------------------------------------------
md = {
  'appName':    'tuiapp', #both 32 bit and 64 bit use the same name in metadata.c
  'privileges': ['default',
                 'I2C',
                 'SecureDisplay',
                 'SecureIndicator',
                 'System'
                ],
   'stackSize': stacksize,
   'heapSize':  0x106000,
}

app_units = env.SecureAppBuilder(
  sources = sources,
  includes = includes,
  metadata = md,
  image = app_name,
  deploy_sources = [sources,
                    'SConscript',
                    deploy_headers],
  deploy_variants = env.GetDefaultPublicVariants(),
  user_libs=libs
)

op = env.Alias(app_name, app_units)
Return('app_units')
