#===========================================================================
#  Copyright (c) 2011-2016, 2017 QUALCOMM Technologies Incorporated.
#  All Rights Reserved.
#  Qualcomm Confidential and Proprietary
#===========================================================================
#
#
# GENERAL DESCRIPTION
#    build script
#                      EDIT HISTORY FOR FILE
#
#  This section contains comments describing changes made to the module.
#  Notice that changes are listed in reverse chronological order.
#
# when       who     what, where, why
# --------   ---     ---------------------------------------------------------
#
#===============================================================================

# Import the SCons environment passed by the SConstruct to facilitate 
# TA compilation.
Import('env')
import os

# Cloning the passed SCons construction environment since changing the 
# environment may interfere with subsequent TA compilations.
env = env.Clone()

#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------

env['APP_NAME'] = 'sem'

TZ_CHIPSET = os.environ.get('TZ_CHIPSET', 'Unknown')
CHIP_VENDOR = os.environ.get('CHIP_VENDOR', 'nxpV4')
MEMORY_ALLOC = os.environ.get('MEMORY_ALLOC', 'USE_COMPILER_MEMORY_ALLOC')
USE_SCRYPTO = os.environ.get('USE_SCRYPTO', 'False')
SCRYPTO_VER = os.environ.get('SCRYPTO_VER', 'Unknown')
USE_GRDM = os.environ.get('USE_GRDM', 'False')
USE_QUICKBUILD_RBS = os.environ.get('USE_QUICKBUILD_RBS', 'False')
SUPPORT_NEW_TA_BUILD = os.environ.get('SUPPORT_NEW_TA_BUILD', 'False')

if USE_GRDM == 'y':
    USE_GRDM = 'True'

print('*****************************')
print('TZ_CHIPSET : ' + TZ_CHIPSET)
print('*****************************')
print('CHIP_VENDOR : ' + CHIP_VENDOR)
print('*****************************')
print('MEMORY_ALLOC : ' + MEMORY_ALLOC)
print('*****************************')
print('USE_SCRYPTO : ' + USE_SCRYPTO)
print('*****************************')
print('SCRYPTO_VER : ' + SCRYPTO_VER)
print('*****************************')
print('USE_GRDM : ' + USE_GRDM)
print('*****************************')
print('USE_QUICKBUILD_RBS : ' + USE_QUICKBUILD_RBS)
print('*****************************')
print('SUPPORT_NEW_TA_BUILD : ' + SUPPORT_NEW_TA_BUILD)
print('*****************************')

env.Append(CPPDEFINES = [
    "SEM",
    "USE_QSEE",
    "FACTORY_RESET",
#    "DEBUG_LOW",
#    "SCP11_ENABLE",
#    "LOW_SPI_TEST",
#    "EXTENDED_APDU",
])

env.Append(CPPDEFINES = [
    TZ_CHIPSET.upper(),
])

env.Append(CPPDEFINES = [
    MEMORY_ALLOC,
])

if SUPPORT_NEW_TA_BUILD == 'true':
    env.Append(CPPDEFINES = [
        "SECBOOT_OEM_SECAPP",
        "USE_ALT_ROTHASH",
    ])

if env.has_key('USES_NO_CP'):
    env.Append(CCFLAGS = ' -DUSES_NO_CP ')

#------------------------------------------------------------------------------
# We need to specify "neon" to generate SIMD instructions in 32-bit mode
#------------------------------------------------------------------------------
if env['PROC'] == 'scorpion':
  env.Append(CCFLAGS = " -mfpu=neon ")

#-------------------------------------------------------------------------------
# Compiler, object, and linker definitions
#-------------------------------------------------------------------------------
# do not generate thumb code for inline assembler code
#env.Append(ARMCC_OPT = ' -marm')

env.Append(CFLAGS = ' -fstack-protector -fstack-protector-all')
env.Append(LINKFLAGS=' -no-threads ')

if CHIP_VENDOR == 'nxp':
    env.Append(CPPDEFINES = [
        "NXP",
    ])
elif CHIP_VENDOR == 'nxpV4':
    env.Append(CPPDEFINES = [
        "NXP",
        "NXPV4"
    ])
elif CHIP_VENDOR == 'gem':
    env.Append(CPPDEFINES = [
        "GEM",
    ])
elif CHIP_VENDOR == 'gem51':
    env.Append(CPPDEFINES = [
        "GEM",
        "GEM51",
    ])
    CHIP_VENDOR = "gem"
elif CHIP_VENDOR == 'gem60':
    env.Append(CPPDEFINES = [
        "GEM",
        "GEM60",
    ])
    CHIP_VENDOR = "gem"
elif CHIP_VENDOR == 'ot':
    env.Append(CPPDEFINES = [
        "OT",
    ])
elif CHIP_VENDOR == 'otV5':
    env.Append(CPPDEFINES = [
        "OT",
        "OTV5",
    ])
elif CHIP_VENDOR == 'common':
    env.Append(CPPDEFINES = [
        "NXP",
        "NXPV4",
        "GEM",
        "COMMON_VENDOR"
    ])

includes = [
    "${SDK_ROOT}/inc/qsee/",
    "include",
    "include",
    "include/iso7816",
    "include/crypto",
    "include/sspm",
    "include/ssem",
    "include/scp03",
    "include/scp11",
    "include/sem",

]

if USE_GRDM == 'True':
    env.Append(CPPDEFINES = [
        "USE_GRDM",
    ])

if USE_SCRYPTO == 'True':
    env.Append(CPPDEFINES = [
        "USE_SCRYPTO",
    ])

    if SCRYPTO_VER == '2.6':
        includes = includes + [
            "include/crypto/scrypto/2.6",
        ]
    elif SCRYPTO_VER == '2.5':
        includes = includes + [
            "include/crypto/scrypto/2.5",
        ]
    else:
        includes = includes + [
            "include/crypto/scrypto/2.4",
        ]

else:
    env.Append(CPPDEFINES = [
        "CTR_DRBG_DYNAMIC_BUFFERS",
        "QSEE",
        "LOCAL_STD_LIB",
        "CRYPTO_CORE",
        "NO_SYS_TYPES_H",
        "OPENSSL_NO_LOCKING",
        "OPENSSL_NO_ENGINE",
        "OPENSSL_NO_DSA",
        "OPENSSL_NO_DH",
        "OPENSSL_NO_STDIO",
        "GETPID_IS_MEANINGLESS",
        "OPENSSL_NO_CMS",
        "OPENSSL_EXPORT_VAR_AS_FUNCTION",
        "SWD",
        "QSEE_SWD",
        "OPENSSL_NO_ASM",
        "OPENSSL_NO_SHA512",
        "USE_QSEE_API_DEVICE_UUID"
    ])

    includes = includes + [
        "include/crypto/cryptocore",
        "src/common/crypto",
    ]

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------
if CHIP_VENDOR == 'nxp':
    vendor_includes = [
        "include/iso7816/nxp/common",
        "include/iso7816/nxp/hal",
        "include/iso7816/nxp/inc",
        "include/iso7816/nxp/tml",
        "include/iso7816/nxp/tml",
    ]

    iso7816_sources = [
        'src/common/iso7816/sec_apdu.c',
        'src/common/iso7816/iso7816_self_test.c',
        'src/common/iso7816/nxp/hal/phNxpEseHal.c',
        'src/common/iso7816/nxp/hal/phNxpEseHal_Apdu.c',
        'src/common/iso7816/nxp/hal/phNxpEseProtocol.c',
        'src/common/iso7816/nxp/hal/phNxpEseRecvMgr.c',
        'src/common/iso7816/nxp/tml/phTmlEse_spi.c',
        'src/common/iso7816/nxp/sec_mw.c',
    ]

elif CHIP_VENDOR == 'nxpV4':
    vendor_includes = [
        "include/iso7816/nxpV4/common",
        "include/iso7816/nxpV4/inc",
        "include/iso7816/nxpV4/include",
        "include/iso7816/nxpV4/lib",
        "include/iso7816/nxpV4/log",
        "include/iso7816/nxpV4/pal",
        "include/iso7816/nxpV4/pal/spi",
    ]

    iso7816_sources = [
        'src/common/iso7816/sec_apdu.c',
        'src/common/iso7816/iso7816_self_test.c',
        'src/common/iso7816/nxpV4/lib/phNxpEse_Apdu_Api.c',
        'src/common/iso7816/nxpV4/lib/phNxpEse_Api.c',
        'src/common/iso7816/nxpV4/lib/phNxpEseDataMgr.c',
        'src/common/iso7816/nxpV4/lib/phNxpEseProto7816_3.c',
        'src/common/iso7816/nxpV4/log/phNxpLog.c',
        'src/common/iso7816/nxpV4/pal/phNxpEsePal.c',
        'src/common/iso7816/nxpV4/pal/spi/phNxpEsePal_spi.c',
        'src/common/iso7816/nxpV4/sec_mw.c',
    ]

elif CHIP_VENDOR == 'gem':
    vendor_includes = [
        "include/iso7816/gem",
        "src/common/iso7816/gem",
    ]

    iso7816_sources = [
        'src/common/iso7816/sec_apdu.c',
        'src/common/iso7816/iso7816_self_test.c',
        'src/common/iso7816/gem/checksum.c',
        'src/common/iso7816/gem/gto-secese.c',
        'src/common/iso7816/gem/iso7816_t1.c',
        'src/common/iso7816/gem/transport.c',
        'src/common/iso7816/gem/sec_mw.c',
    ]

elif CHIP_VENDOR == 'ot':
    vendor_includes = [
        "include/iso7816",
        "include/iso7816/ot",
        "src/common/iso7816/ot",
    ]

    iso7816_sources = [
        'src/common/iso7816/sec_apdu.c',
        'src/common/iso7816/iso7816_self_test.c',
        'src/common/iso7816/ot/crc.c',
        'src/common/iso7816/ot/otse_spi_transcieve.c',
        'src/common/iso7816/ot/spi_framing.c',
        'src/common/iso7816/ot/spi_state.c',
        'src/common/iso7816/ot/sec_mw.c',
    ]

elif CHIP_VENDOR == 'otV5':
    vendor_includes = [
        "include/iso7816",
        "include/iso7816/otV5",
        "src/common/iso7816/otV5",
    ]

    iso7816_sources = [
        'src/common/iso7816/sec_apdu.c',
        'src/common/iso7816/iso7816_self_test.c',
        'src/common/iso7816/otV5/lrc.c',
        'src/common/iso7816/otV5/spi_communication.c',
        'src/common/iso7816/otV5/spi_protocol.c',
        'src/common/iso7816/otV5/sec_mw.c',
    ]

elif CHIP_VENDOR == 'common':
    vendor_includes = [
        "include/iso7816/nxpV4/common",
        "include/iso7816/nxpV4/inc",
        "include/iso7816/nxpV4/include",
        "include/iso7816/nxpV4/lib",
        "include/iso7816/nxpV4/log",
        "include/iso7816/nxpV4/pal",
        "include/iso7816/nxpV4/pal/spi",
        "include/iso7816/gem",
        "src/common/iso7816/gem",
    ]

    iso7816_sources = [
        'src/common/iso7816/sec_apdu.c',
        'src/common/iso7816/iso7816_self_test.c',
        'src/common/iso7816/nxpV4/lib/phNxpEse_Apdu_Api.c',
        'src/common/iso7816/nxpV4/lib/phNxpEse_Api.c',
        'src/common/iso7816/nxpV4/lib/phNxpEseDataMgr.c',
        'src/common/iso7816/nxpV4/lib/phNxpEseProto7816_3.c',
        'src/common/iso7816/nxpV4/log/phNxpLog.c',
        'src/common/iso7816/nxpV4/pal/phNxpEsePal.c',
        'src/common/iso7816/nxpV4/pal/spi/phNxpEsePal_spi.c',
        'src/common/iso7816/gem/checksum.c',
        'src/common/iso7816/gem/gto-secese.c',
        'src/common/iso7816/gem/iso7816_t1.c',
        'src/common/iso7816/gem/transport.c',
        'src/common/iso7816/common/sec_mw.c',
    ]

if USE_SCRYPTO == 'True':
    crypto_sources = [
        'src/common/crypto/platform/qsee.c',
        'src/common/crypto/crypto_module.c',
        'src/common/crypto/openssl/ec/ec_print.c',
    ]

else:
    crypto_sources = [
        'src/common/crypto/platform/qsee.c',
        'src/common/crypto/crypto_module.c',
        'src/common/crypto/crypto_core_init.c',
        'src/common/crypto/cryptolib_init.c',
        'src/common/crypto/cryptolib_ver.c',
        'src/common/crypto/pd_rand/pd_rand.c',
        'src/common/crypto/rand/cc_rand.c',
        'src/common/crypto/drbg/ctr_drbg.c',
        'src/common/crypto/drbg/ctr_drbg_raw.c',
        'src/common/crypto/drbg/ctr_drbg_ossl.c',
        'src/common/crypto/libc_functions/libc_functions.c',
        'src/common/crypto/openssl/mem_clr.c',
        'src/common/crypto/openssl/ecdh/ech_ossl.c',
        'src/common/crypto/openssl/ecdh/ech_lib.c',
        'src/common/crypto/openssl/ecdh/ech_key.c',
        'src/common/crypto/openssl/sha/sha256.c',
        'src/common/crypto/openssl/sha/sha512.c',
        'src/common/crypto/openssl/sha/sha1dgst.c',
        'src/common/crypto/openssl/sha/sha1_one.c',
        'src/common/crypto/openssl/sha/sha_one.c',
        'src/common/crypto/openssl/sha/sha_dgst.c',
        'src/common/crypto/openssl/lhash/lhash.c',
        'src/common/crypto/openssl/modes/gcm128.c',
        'src/common/crypto/openssl/modes/cfb128.c',
        'src/common/crypto/openssl/modes/ofb128.c',
        'src/common/crypto/openssl/modes/cts128.c',
        'src/common/crypto/openssl/modes/ctr128.c',
        'src/common/crypto/openssl/modes/cbc128.c',
        'src/common/crypto/openssl/modes/ccm128.c',
        'src/common/crypto/openssl/modes/xts128.c',
        'src/common/crypto/openssl/asn1/a_object.c',
        'src/common/crypto/openssl/asn1/tasn_utl.c',
        'src/common/crypto/openssl/asn1/tasn_dec.c',
        'src/common/crypto/openssl/asn1/a_dup.c',
        'src/common/crypto/openssl/asn1/a_type.c',
        'src/common/crypto/openssl/asn1/tasn_fre.c',
        'src/common/crypto/openssl/asn1/tasn_enc.c',
        'src/common/crypto/openssl/asn1/tasn_typ.c',
        'src/common/crypto/openssl/asn1/x_algor.c',
        'src/common/crypto/openssl/asn1/a_int.c',
        'src/common/crypto/openssl/asn1/x_attrib.c',
        'src/common/crypto/openssl/asn1/x_sig.c',
        'src/common/crypto/openssl/asn1/a_bitstr.c',
        'src/common/crypto/openssl/asn1/x_bignum.c',
        'src/common/crypto/openssl/asn1/asn1_lib.c',
        'src/common/crypto/openssl/asn1/tasn_new.c',
        'src/common/crypto/openssl/bn/bn_word.c',
        'src/common/crypto/openssl/bn/bn_recp.c',
        'src/common/crypto/openssl/bn/bn_mpi.c',
        'src/common/crypto/openssl/bn/bn_mod.c',
        'src/common/crypto/openssl/bn/bn_print.c',
        'src/common/crypto/openssl/bn/bn_const.c',
        'src/common/crypto/openssl/bn/bn_sqr.c',
        'src/common/crypto/openssl/bn/bn_asm.c',
        'src/common/crypto/openssl/bn/bn_div.c',
        'src/common/crypto/openssl/bn/bn_prime.c',
        'src/common/crypto/openssl/bn/bn_mul.c',
        'src/common/crypto/openssl/bn/bn_add.c',
        'src/common/crypto/openssl/bn/bn_mont.c',
        'src/common/crypto/openssl/bn/bn_rand.c',
        'src/common/crypto/openssl/bn/bn_gcd.c',
        'src/common/crypto/openssl/bn/bn_exp.c',
        'src/common/crypto/openssl/bn/bn_shift.c',
        'src/common/crypto/openssl/bn/bn_nist.c',
        'src/common/crypto/openssl/bn/bn_blind.c',
        'src/common/crypto/openssl/bn/bn_kron.c',
        'src/common/crypto/openssl/bn/bn_lib.c',
        'src/common/crypto/openssl/bn/bn_sqrt.c',
        'src/common/crypto/openssl/bn/bn_ctx.c',
        'src/common/crypto/openssl/ecdsa/ecs_lib.c',
        'src/common/crypto/openssl/ecdsa/ecs_ossl.c',
        'src/common/crypto/openssl/ecdsa/ecs_sign.c',
        'src/common/crypto/openssl/ecdsa/ecs_vrf.c',
        'src/common/crypto/openssl/ecdsa/ecs_asn1.c',
        'src/common/crypto/openssl/aes/aes_cbc.c',
        'src/common/crypto/openssl/aes/aes_cfb.c',
        'src/common/crypto/openssl/aes/aes_core.c',
        'src/common/crypto/openssl/aes/aes_ctr.c',
        'src/common/crypto/openssl/aes/aes_ecb.c',
        'src/common/crypto/openssl/aes/aes_ige.c',
        'src/common/crypto/openssl/aes/aes_misc.c',
        'src/common/crypto/openssl/aes/aes_ofb.c',
        'src/common/crypto/openssl/aes/aes_wrap.c',
        'src/common/crypto/openssl/ex_data.c',
        'src/common/crypto/openssl/evp/m_sha1.c',
        'src/common/crypto/openssl/evp/e_aes.c',
        'src/common/crypto/openssl/evp/digest.c',
        'src/common/crypto/openssl/evp/c_all.c',
        'src/common/crypto/openssl/evp/c_allc.c',
        'src/common/crypto/openssl/evp/names.c',
        'src/common/crypto/openssl/evp/p_lib.c',
        'src/common/crypto/openssl/evp/evp_lib.c',
        'src/common/crypto/openssl/evp/pmeth_gn.c',
        'src/common/crypto/openssl/evp/c_alld.c',
        'src/common/crypto/openssl/evp/pmeth_lib.c',
        'src/common/crypto/openssl/evp/evp_enc.c',
        'src/common/crypto/openssl/hmac/hmac.c',
        'src/common/crypto/openssl/stack/stack.c',
        'src/common/crypto/openssl/buffer/buffer.c',
        'src/common/crypto/openssl/objects/obj_dat.c',
        'src/common/crypto/openssl/objects/o_names.c',
        'src/common/crypto/openssl/objects/obj_lib.c',
        'src/common/crypto/openssl/bio/b_print.c',
        'src/common/crypto/openssl/cryptlib.c',
        'src/common/crypto/openssl/rand/rand_lib.c',
        'src/common/crypto/openssl/rand/rand_poll_target.c',
        'src/common/crypto/openssl/rand/md_rand.c',
        'src/common/crypto/openssl/mem.c',
        'src/common/crypto/openssl/rsa/rsa_pmeth.c',
        'src/common/crypto/openssl/rsa/rsa_err.c',
        'src/common/crypto/openssl/rsa/rsa_pk1.c',
        'src/common/crypto/openssl/rsa/rsa_oaep.c',
        'src/common/crypto/openssl/rsa/rsa_gen.c',
        'src/common/crypto/openssl/rsa/rsa_x931.c',
        'src/common/crypto/openssl/rsa/rsa_none.c',
        'src/common/crypto/openssl/rsa/rsa_sign.c',
        'src/common/crypto/openssl/rsa/rsa_crpt.c',
        'src/common/crypto/openssl/rsa/rsa_ssl.c',
        'src/common/crypto/openssl/rsa/rsa_eay.c',
        'src/common/crypto/openssl/rsa/rsa_saos.c',
        'src/common/crypto/openssl/rsa/rsa_pss.c',
        'src/common/crypto/openssl/rsa/rsa_chk.c',
        'src/common/crypto/openssl/rsa/rsa_lib.c',
        'src/common/crypto/openssl/ec/ec_pmeth.c',
        'src/common/crypto/openssl/ec/ec_lib.c',
        'src/common/crypto/openssl/ec/ecp_oct.c',
        'src/common/crypto/openssl/ec/ec_mult.c',
        'src/common/crypto/openssl/ec/ec_key.c',
        'src/common/crypto/openssl/ec/ec_oct.c',
        'src/common/crypto/openssl/ec/ecp_smpl.c',
        'src/common/crypto/openssl/ec/ec_cvt.c',
        'src/common/crypto/openssl/ec/ec_curve.c',
        'src/common/crypto/openssl/ec/ec_print.c',
        'src/common/crypto/openssl/ec/ecp_nist.c',
        'src/common/crypto/openssl/ec/ecp_nistputil.c',
        'src/common/crypto/openssl/ec/ecp_nistp256.c',
        'src/common/crypto/openssl/ec/ecp_mont.c',
        'src/common/crypto/openssl/o_init.c',
        'src/common/crypto/openssl/err/err.c',
    ]

sspm_sources = [
    'src/common/sspm/ssp_self_test.c',
    'src/common/sspm/ssp_apdu.c',
    'src/common/sspm/ssp_util.c',
    'src/common/sspm/ssp.c',
]

sspm_priv_sources = [
    'src/common/sspm/ssp_service.c',
    'src/common/sspm/ssp_session.c',
]

ssem_sources = [
    'src/common/ssem/sse_entry_manage.c',
    'src/common/ssem/sse_entry_manage_util.c',
    'src/common/ssem/sse.c',
]

scp03_sources = [
    'src/common/scp03/GPCmd.c',
    'src/common/scp03/SCP03_cmdGenerator.c',
    'src/common/scp03/SCP03_crypto.c',
    'src/common/scp03/SCP03_kdf.c',
    'src/common/scp03/SCP03_rspParser.c',
    'src/common/scp03/SCP03_tools.c',
    'src/common/scp03/SCP03_transceive.c',
]

scp11_sources = [
    'src/common/scp11/SCP11_main.c',
    'src/common/scp11/SCP11_crypto.c',
    'src/common/scp11/SCP11_transceive.c',
    'src/common/scp11/SCP11_tool.c',
    'src/common/scp11/SCP11_test.c',
]

######################### GRDM #########################
if USE_GRDM == 'True':
    includes = includes + [
        "include/grdm",
        "include/grdm/common/hal",
        "include/grdm/common/inc",
        "include/grdm/common/src",
        "include/grdm/vendor/common/star/inc",
        "include/grdm/vendor/common/star/src",
        "include/grdm/vendor/guardianM/inc",
        "include/grdm/vendor/guardianM/src",
    ]
    grdm_sources = [
        'src/common/grdm/grdm.c',
        'src/common/grdm/common/hal/ese_hal.c',
        'src/common/grdm/common/src/ese_api.c',
        'src/common/grdm/common/src/ese_data.c',
        'src/common/grdm/common/src/ese_protocol.c',
        'src/common/grdm/common/src/ese_util.c',
        'src/common/grdm/vendor/common/star/src/star_apdu.c',
        'src/common/grdm/vendor/common/star/src/star_authentication.c',
        'src/common/grdm/vendor/common/star/src/star_credential.c',
        'src/common/grdm/vendor/common/star/src/star_certificate.c',
        'src/common/grdm/vendor/common/star/src/star_firmware.c',
        'src/common/grdm/vendor/common/star/src/star_signature.c',
        'src/common/grdm/vendor/guardianM/src/grdm_app.c',
        'src/common/grdm/vendor/guardianM/src/grdm_internal.c',
        'src/common/grdm/vendor/guardianM/src/grdm_transport.c',
        'src/common/grdm/vendor/guardianM/src/grdm_fw.c',
        'src/common/grdm/vendor/guardianM/src/grdm_common.c',
        'src/common/grdm/vendor/guardianM/src/grdm_crypto.c',
        'src/common/grdm/vendor/guardianM/src/grdm_boringssl.c',
        'src/common/grdm/vendor/guardianM/src/grdm_log.c',
    ]
    if 'DEBUG_LOW' in env['CPPDEFINES']:
        grdm_sources = grdm_sources + [
            'src/common/grdm/grdm_test.c',
            'src/common/grdm/vendor/guardianM/src/grdm_bl.c',
        ]
        env.Append(CPPDEFINES = [
            "GRDM_TEST",
        ])

######################### GRDM #########################
app_core_sources = [
    'src/qsee/tz_main.c',
    'src/common/sem/cmd_handler.c',
    'src/common/sem/sem.c',
    'src/common/sem/scpkm.c',
    'src/common/sem/service_key.c',
    'src/common/sem/scrs.c',
    'src/common/sem/factory.c',
    'src/common/sem/ccm.c',
    'src/common/sem/fra.c',
]

common_sources = [
    'src/common/sem/tz_utils.c',
    'src/common/sem/debug.c',
]

user_static_lib = [
]

if USE_QUICKBUILD_RBS == 'True':
    app_core_sources += [
        iso7816_sources,
        sspm_sources,
        sspm_priv_sources,
        ssem_sources,
        crypto_sources,
        scp03_sources,
        scp11_sources,
        common_sources,
    ]

    if USE_GRDM == 'True':
        app_core_sources += [
            grdm_sources,
        ]

else:
    iso7816_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+iso7816_sources, 'iso7816')
    sspm_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+iso7816_sources+sspm_sources+crypto_sources, 'sspm')
    sspm_priv_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+sspm_priv_sources, 'sspm_priv')
    ssem_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+iso7816_sources+sspm_sources+sspm_priv_sources+crypto_sources+ssem_sources, 'ssem')
    scp03_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+scp03_sources, 'scp03')
    scp11_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+scp11_sources+scp03_sources+crypto_sources, 'scp11')

    ######################### GRDM #########################
    if USE_GRDM == 'True':
        grdm_static_lib = env.SecureAppLibBuilder(includes+vendor_includes, common_sources+grdm_sources, 'grdm')
    ######################### GRDM #########################

    user_static_lib += [
        iso7816_static_lib,
        sspm_static_lib,
        sspm_priv_static_lib,
        ssem_static_lib,
        scp03_static_lib,
        scp11_static_lib,
    ]

    ######################### GRDM #########################
    if USE_GRDM == 'True':
        user_static_lib += [
            grdm_static_lib,
        ]
    ######################### GRDM #########################

if USE_SCRYPTO == 'True':
    scrypto_libs = [
        File(os.getenv("SCRYPTO_LIB_FILE")),
    ]

    build_id = env['SHORT_BUILDPATH']
    fips_tools_script = os.getenv("FIPS_TOOLS_SCRIPT")
    QSAPPS_DIR = os.getenv("QSEE_BSP_QSAPPS_DIR")
    TOOLS_DIR = os.getenv("TOOLS_DIR")
    USE_BUILD_ID = os.environ.get('USE_BUILD_ID', 'True')
    if USE_BUILD_ID == 'True':
        run_fips_tools_command = fips_tools_script + " " + QSAPPS_DIR + "/sem/build/" + build_id + "/sem.elf " + TOOLS_DIR
    else:
        run_fips_tools_command = fips_tools_script + " " + QSAPPS_DIR + "/sem/build/sem.elf " + TOOLS_DIR
       
    env.Append(LINKCOM = " && ")
    env.Append(LINKCOM = run_fips_tools_command)

    if USE_QUICKBUILD_RBS != 'True':
        sspm_static_lib.append(scrypto_libs)
        ssem_static_lib.append(scrypto_libs)
        scp03_static_lib.append(scrypto_libs)
        scp11_static_lib.append(scrypto_libs)

    user_static_lib += [
        scrypto_libs,
    ]

# Add metadata to image
#-------------------------------------------------------------------------------
md = {
    'appName':      'sem',
    'privileges': [ 'default',
                    'I2C',
                    'OEMUnwrapKeys',
                    'CertValidate',
                    'SPI',
                    'TLMM',
                    'System',
                   ],
    'stackSize' : 0x32000,
    'heapSize' : 0x32000,
}

sem_units = env.SecureAppBuilder(
    sources = [ app_core_sources ],
    includes = includes+vendor_includes,
    metadata = md,
    image = 'sem',
    user_libs = [ user_static_lib ]
)

op = env.Alias('sem', sem_units)
Return('sem_units')

