#===============================================================================
#
# Multibuild build script
#
# GENERAL DESCRIPTION
#    App Core build script
#
# Copyright (c) Samsung Electronics Co, Ltd 2016. All rights reserved.
#
#===============================================================================
import os
Import('env')
env = env.Clone()

def get_multibuild_variable(local_name, default=None):
    var = os.getenv(local_name, default)
    if var != None:
      var = var.strip()

    if not var and default:
      var = default.strip()

    return var

def get_multibuild_array(local_name):
    arr = get_multibuild_variable(local_name)
    if None != arr:
        return arr.split()
    return []

multibuild_src_ta = get_multibuild_array("LOCAL_SRC_TA")
multibuild_src_lib = get_multibuild_array("LOCAL_SRC_LIB")
multibuild_includes = get_multibuild_array("LOCAL_INCLUDE_DIRS")
multibuild_app_name = get_multibuild_variable("LOCAL_NAME")
multibuild_uuid = get_multibuild_variable("LOCAL_UUID", "6d756c74696275696c64000000000000")
multibuild_build_tool = get_multibuild_variable("LOCAL_BUILD_TOOL", "arm")
multibuild_custom_libs = get_multibuild_array("LOCAL_CUSTOM_LIBS")
multibuild_defines = get_multibuild_array("LOCAL_CFLAGS")
multibuild_cflags = ""
multibuild_cpp_defines = []
for s in multibuild_defines:
    if not s.startswith('-D'):
        multibuild_cflags += " " + s.replace('"','\\"')
    else:
        multibuild_cpp_defines.append(s.replace('-D', '').replace('"','\\"'))

multibuild_use_unprotected_mem = get_multibuild_variable("LOCAL_QSEE_UNPROTECTED_MEM")

def get_multibuild_appname(uuid):
    name = uuid.decode('hex')
    return name[:name.index('00'.decode('hex'))];
#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------
SRCPATH = "${BUILD_ROOT}/core/securemsm/trustzone/qsapps/multibuild/src"

env.VariantDir('${BUILDPATH}', SRCPATH, duplicate=0)

#-------------------------------------------------------------------------------
# Compiler, object, and linker definitions
#-------------------------------------------------------------------------------

# do not generate thumb code for inline assembler code
# Warning/Error 66 should be suppressed because it breaks compiling some modules
# which use unsigned values in enums, i.e. internal_tee_api
if multibuild_build_tool != "llvm":
   env.Append(ARMCC_OPT = " --no_debug --enum_is_int  --interface_enums_are_32_bit --diag_suppress 66" + multibuild_cflags)
else:
   env.Append(CCFLAGS = " " + multibuild_cflags)
   env.Append(CFLAGS = " " + multibuild_cflags)

env.Append(CPPDEFINES = multibuild_cpp_defines)
env.PublishPrivateApi('SECUREMSM', [
   "${INC_ROOT}/core/api/services",
   "${INC_ROOT}/core/api/securemsm/trustzone/qsee",
   "${INC_ROOT}/core/securemsm/trustzone/qsapps/multibuild",
] + multibuild_includes)

INC_PATH = [
   "${INC_ROOT}/core/api/boot/qfprom/",
   "${INC_ROOT}/core/api/services",
   "${INC_ROOT}/core/api/securemsm/trustzone/qsee",
   "${INC_ROOT}/core/api/kernel/libstd/stringl",
   "${INC_ROOT}/core/securemsm/sse/common/include/",
   "${INC_ROOT}/core/securemsm/trustzone/qsapps/libs/applib/qsee/inc",
   "${INC_ROOT}/core/securemsm/trustzone/qsapps/libs/applib/qsee/src",
   "${INC_ROOT}/core/securemsm/trustzone/qsee/mink/include",
   "${INC_ROOT}/core/securemsm/tz_common/public",
]

env.Append(CPPPATH = INC_PATH)

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------
MULTIBUILD_SOURCES = multibuild_src_ta

MULTIBUILD_LIBRARY_SOURCES = multibuild_src_lib

static_lib = env.StaticLibrary(multibuild_app_name, MULTIBUILD_LIBRARY_SOURCES)
#-------------------------------------------------------------------------------
# Add Libraries to image
#-------------------------------------------------------------------------------
env.AddLibsToImage('MULTIBUILD_IMAGE', env.Object(MULTIBUILD_SOURCES))
env.AddLibsToImage('MULTIBUILD_IMAGE', static_lib)

for lib in multibuild_custom_libs:
    lib_path = "${BUILD_ROOT}/core/securemsm/trustzone/qsapps/multibuild/build/" + os.path.basename(lib)
    if lib.endswith(".a"):
        env.AddOEMLibrary('MULTIBUILD_IMAGE', lib_path)
    else:
        env.AddBinaryLibrary('MULTIBUILD_IMAGE', os.path.splitext(os.path.basename(lib))[0], lib_path)

# Workaround to be able to create custom services and use it.
# import SecureAppMetadata object from nhlos build system
import sys

# Add path where SecureAppMetadata module is located to be able to import it.
sys.path.append(env.SubstRealPath('${BUILD_ROOT}/core/bsp/build/scripts/'))
try:
    import SecureAppMetadata

    for i in multibuild_includes:
        if not os.path.exists(i):
            raise RuntimeError("path does not exist: " + i + "\n" + "   module name is: " + multibuild_app_name + "\n\n")

    rel_include_dirs = [os.path.relpath(i, env.SubstRealPath('${BUILD_ROOT}/')) for i in multibuild_includes]
    SecureAppMetadata._kClassIdDirs.extend(rel_include_dirs)
except ImportError:
    print 'There is no module SecureAppMetadata.'

#-------------------------------------------------------------------------------
# Add metadata to image
#-------------------------------------------------------------------------------
app_name = get_multibuild_appname(multibuild_uuid)

if multibuild_build_tool == "llvm":
   md = {
      'appName':    app_name,
      'privileges': ['default',
                     'I2C',
                     'OEMUnwrapKeys',
                     'CertValidate',
                     'SPI',
                     'TLMM',
                     'SecureDisplay',
                     'IntMask',
                     'OEMBuf',
                     'TransNSAddr',
                    ],
      'services':  get_multibuild_array("LOCAL_QSEE_SERVICES"),
   }
   md['privileges'].extend(get_multibuild_array("LOCAL_QSEE_PRIVILEGES"))

   multibuild_buffer_size = get_multibuild_variable("LOCAL_QSEE_ACCEPT_BUFFER_SIZE")
   if multibuild_buffer_size and multibuild_buffer_size != '-1':
      md['acceptBufSize'] = int(multibuild_buffer_size)

   if multibuild_use_unprotected_mem == 'y':
      md['memoryType'] = 'Unprotected'

   env.AddSecureAppMetadata('MULTIBUILD_IMAGE', md)

#-------------------------------------------------------------------------------
# Load sub scripts
#-------------------------------------------------------------------------------
env.LoadSoftwareUnits()
