# Be silent per default, but 'make V=1' will show all compiler calls.
ifneq ($(V),1)
Q = @
NULL = 2>&1 > /dev/null
endif

ifneq ($(DEVELOPER_LOCAL_BUILD), true)
# TEEGRIS TA CONFIG for RBS/PBS BUILD
TARGET_SOC = $(KM_TARGET_SOC)
TA_UUID = 00000000-0000-0000-0000-4b45594d5354
HW_CRYPTO = TEEGRIS
COMMON_LIB_ARCH_DIR = TEEgris
KNOX_EXTENSION = y
ROOT_OF_TRUST_API = y
CONFIG_TA_ARCH = 64
ifeq ($(TARGET_SOC), $(filter tg_exynos3830 tg_exynos850, $(TARGET_SOC)))
	TARGET_SOC = tg_exynos3830
	SCRYPTO_VER = 2_5
	TEEGRIS_TZ_VER = 41
	CONFIG_TA_ARCH = 32
	ifeq ($(TARGET_PRODUCT), $(filter gshh%, $(TARGET_PRODUCT)))
		#NOTE: gshh%(V320) don't use ICCC
		#USE_TEEGRIS_ROT_API=y
	endif
else ifeq ($(TARGET_SOC), $(filter tg_s5e8825, $(TARGET_SOC)))
	TARGET_SOC = tg_s5e8825
	SCRYPTO_VER = 2_6
	TEEGRIS_TZ_VER = 421
	USE_FBE_WRAPPED_KEY = y
else ifeq ($(TARGET_SOC), $(filter tg_s5e9925, $(TARGET_SOC)))
	TARGET_SOC = tg_s5e9925
	SCRYPTO_VER = 2_6
	TEEGRIS_TZ_VER = 421
	USE_SPU_PROV = y
	USE_FBE_WRAPPED_KEY = y
	USE_HWVAULT = y
	USE_STRONGBOX = y
else ifeq ($(TARGET_SOC), $(filter tg_MT6877, $(TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6877
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=421
	USE_MTK=y
else ifeq ($(TARGET_SOC), $(filter tg_MT6833, $(TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6833
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	USE_MTK=y
	ROOT_OF_TRUST_API=n
	CONFIG_TA_ARCH = 32
endif
TARGET_DIR = $(TARGET_SOC)
include $(KM_TEEGRIS_CONFIG)
TEEGRIS_SDK_ROOT = $(CONFIG_SW_TOOLCHAIN_ROOT)
ifeq ($(KM_SUPPORT_PROCA), TRUE)
	ifeq ($(TARGET_SOC), $(filter tg_s5e9925, $(TARGET_SOC)))
		SUPPORT_PROCA=y
	endif
endif

endif # ifneq ($(DEVELOPER_LOCAL_BUILD), true)

OUT_PATH=$(KMSRK_ROOT_PATH)/released_TA/$(TARGET_DIR)
KM_COMMON_LIB_PATH=$(KMSRK_ROOT_PATH)/../common

#-------------------------------------------------------------------------------
# Defines
#-------------------------------------------------------------------------------

DEF = OPENSSL_FIPS

DEF += $(TARGET_SOC)

ifeq ($(DEBUG), y)
	DEF += ENABLE_DBG_STRINGS=1
	DEF += TL_DEBUG
	DEF += DEBUG
	ifeq ($(HW_CRYPTO), QUALCOMM)
		DEF += TIMESTAMP="\\\"${TIMESTAMP}\\\""
	else
		DEF += TIMESTAMP="\"${TIMESTAMP}\""
	endif
endif

ifeq ($(OEM_DISABLE), y)
	DEF += OEM_DISABLE
endif

ifeq ($(MEMLEAK_DBG), y)
	DEF += MEMLEAK_DBG
endif

ifeq ($(ROOT_OF_TRUST_API), y)
	DEF += ROOT_OF_TRUST_API
endif

ifeq ($(USE_TEEGRIS_ROT_API), y)
    DEF += USE_TEEGRIS_ROT_API
endif

ifeq ($(USE_GATEKEEPER), y)
	DEF += USE_GATEKEEPER
	DEF += GOOGLE_THROTTLE_TIMEOUT
endif

ifeq ($(TEST_MODE), y)
	DEF += TEST_MODE
endif

ifeq ($(SELF_TEST), y)
	DEF += SELF_TEST
endif

ifeq ($(KNOX_EXTENSION),y)
	DEF += KNOX_EXTENSION
endif

ifeq ($(USE_STRONGBOX),y)
	DEF += USE_STRONGBOX
endif

ifeq ($(USE_SPU_PROV),y)
	DEF += USE_SPU_PROV
endif

ifeq ($(USE_FBE_WRAPPED_KEY),y)
	DEF += USE_FBE_WRAPPED_KEY
endif

ifeq ($(USE_GRDM),y)
	GRDM_LIB = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/GRDM/grdm.lib
	DEF += USE_GRDM
endif

ifeq ($(USE_MTK),y)
	DEF += USE_MTK
endif

ifeq ($(SUPPORT_RKP),y)
	DEF += SUPPORT_RKP
endif

DEF += SCRYPTO_VER=$(shell echo $(SCRYPTO_VER) | sed 's/_//')

KM_VERSION_H = $(KM_ROOT_PATH)/common/km_version.h
KM_VERSION = $(shell cat $(KM_VERSION_H) | grep 'MDFPP_KEYMINT_VERSION' | sed 's/.*"\([0-9]\)\([0-9]\)\([0-9]\)\.\([0-9]\)\.\([0-9]\+\)"/\1\2\3\4\5/g')
DEF += KM_VERSION=\"$(KM_VERSION)\"

ifeq ($(HW_CRYPTO), QUALCOMM)
	DEF += USE_QUALCOMM
	DEF += $(QSEE_CHIPSET)
	ARCH_DIR = qc
endif # End of 'ifeq ($(HW_CRYPTO), QUALCOMM)'

ifeq ($(HW_CRYPTO), TEEGRIS)
	DEF += USE_TEEGRIS
	DEF += TEEGRIS_TZ_VER=$(TEEGRIS_TZ_VER)
	ARCH_DIR = tg
endif

ifeq ($(USE_HWVAULT), y)
	DEF += USE_HWVAULT
endif

ifeq ($(TARGET_SOC), $(filter tg_s5e9925, $(TARGET_SOC)))
	DEF += CONFIG_SSP_SNVM_DATA_3KB
endif

#-------------------------------------------------------------------------------
# Include Dirs
#-------------------------------------------------------------------------------

INC =  $(KM_ROOT_PATH)/swd/src/trusted_app
INC += $(KM_ROOT_PATH)/swd/src/unit_tests
INC += $(KM_ROOT_PATH)/nwd/common
INC += $(KM_ROOT_PATH)/swd/common
INC += $(KM_ROOT_PATH)/common
INC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)
INC += $(KM_ROOT_PATH)/nwd/src_helper/common

INC += $(TZ_SCRYPTO_HEADER_PATH)
INC += $(KM_ROOT_PATH)/swd/common/scrypto_$(SCRYPTO_VER)

ifeq ($(USE_GRDM),y)
	INC += $(KM_COMMON_LIB_PATH)/include/GRDM/swd
endif

ifeq ($(USE_GATEKEEPER), y)
	ifeq ($(TEST_MODE), y)
		INC  += $(GK_ROOT_PATH)/swd/src/unit_tests
	endif
	INC += $(GK_ROOT_PATH)/swd/src
	INC += $(GK_ROOT_PATH)/common
endif

#-------------------------------------------------------------------------------
# Source Files
#-------------------------------------------------------------------------------

SRC =  $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_main.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_key.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_crypto.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_wrap.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_time.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_oem.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/spu_crypto.c

SRC += $(KM_ROOT_PATH)/common/parse.c
SRC += $(KM_ROOT_PATH)/common/shared_mem.c
SRC += $(KM_ROOT_PATH)/common/shared_mem_asn1.c
SRC += $(KM_ROOT_PATH)/common/km_dump.c
SRC += $(KM_ROOT_PATH)/common/swd_printable.c
SRC += $(KM_ROOT_PATH)/common/provision_tools.c
SRC += $(KM_ROOT_PATH)/common/attest_rec.c
SRC += $(KM_ROOT_PATH)/common/swd_log.c
SRC += $(KM_ROOT_PATH)/swd/common/swd_stack_protection.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_crypto.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_engine.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_service.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_verify_input.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_properties.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_generate.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_salt.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_integrity.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_version.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_blob_utl.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_blob_enc.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_blob_dec.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_processing.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_symm.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_asymm.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_get_supported.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_auth.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_operation.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_id.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_configure.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_attest.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_provision.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_root_of_trust.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_ecies.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_keybox_parser.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_secure_object.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_imp.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_exp.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_impwrapped.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_shared_hmac.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_auth_nwd.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_bootloader.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_keymaster_41.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_hwvault.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_wrapped_key.c

ifeq ($(SELF_TEST),y)
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_ecies.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_auth.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_main.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_verification_token.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_engine.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_provision.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_asn1.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_shared_mem_asn1.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_get_supported.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_export_key.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_import_key.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_integrity.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_rot.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_wrap_object.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_symm.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_shared_hmac.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_key_impwrapped.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_tz.c
	SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_common.c
	ifeq ($(KNOX_EXTENSION),y)
		SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_knox_extension.c
	endif
endif
ifeq ($(KNOX_EXTENSION),y)
	SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_knox_extension.c
endif

ifeq ($(USE_GRDM),y)
	SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_grdm_init.c
endif

ifeq ($(USE_GATEKEEPER), y)
	SRC += $(GK_ROOT_PATH)/swd/src/tz_ta_gatekeeper_process.c
	SRC += $(GK_ROOT_PATH)/swd/src/tz_ta_gatekeeper_service.c
	SRC += $(GK_ROOT_PATH)/swd/src/tz_ta_gatekeeper_key_function.c
	ifeq ($(TEST_MODE), y)
		SRC += $(GK_ROOT_PATH)/swd/src/unit_tests/swd_unit_tests.c
		SRC += $(GK_ROOT_PATH)/swd/src/unit_tests/swd_gk_enroll_test.c
		SRC += $(GK_ROOT_PATH)/swd/src/unit_tests/swd_gk_verify_test.c
		SRC += $(GK_ROOT_PATH)/swd/src/unit_tests/swd_static_func_test.c
		SRC += $(GK_ROOT_PATH)/swd/src/unit_tests/swd_gk_share_key_legacy.c
	endif
endif

ifeq ($(USE_STRONGBOX), y)
	SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_strongbox.c
endif

ifeq ($(SUPPORT_PROCA), y)
	ifeq ($(HW_CRYPTO), TEEGRIS)
		PROCA_LIB_A = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/PROCA/$(COMMON_LIB_ARCH_DIR)_v$(TEEGRIS_TZ_VER)/pa_tz_api.a
	else
		PROCA_LIB_A = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/PROCA/pa_tz_api.a
	endif
	DEF += SUPPORT_PROCA
endif

ifeq ($(SUPPORT_RKP),y)
	INC += $(KM_ROOT_PATH)/swd/common/rkp
	SRC_CPP = $(KM_ROOT_PATH)/swd/common/rkp/cppbor.cpp
	SRC_CPP += $(KM_ROOT_PATH)/swd/common/rkp/cppbor_parse.cpp
	SRC_CPP += $(KM_ROOT_PATH)/swd/common/rkp/cppcose.cpp
	SRC_CPP += $(KM_ROOT_PATH)/swd/common/rkp/remote_prov_utils.cpp
	SRC_CPP += $(KM_ROOT_PATH)/swd/common/rkp/rkp_test.cpp
endif

#-------------------------------------------------------------------------------
# Compiler Flags
#-------------------------------------------------------------------------------
CFLAGS =
CXXFLAGS =
LDFLAGS =

#-------------------------------------------------------------------------------
# QUALCOMM Settings
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), QUALCOMM)

SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_storage.c

ifeq ($(ROOT_OF_TRUST_API), y)
	INC += $(QSEE_ROOT_PATH)/core/api/boot/qfprom
	ifeq ($(USE_GRDM),y)
		INC += $(QSEE_ROOT_PATH)/apps/securemsm/tz_icccgrd_common/inc
		INC += $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/icccgrd/inc
		SRC += $(QSEE_ROOT_PATH)/apps/securemsm/tz_icccgrd_common/src/tz_iccc_grdm_api.c
	else
		# iccc v4 using TA branch(since R OS)
		INC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/public
		SRC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/src/tz_iccc_common_tl.c
	endif #End of 'ifeq ($(USE_GRDM),y)'
endif #End of 'ifeq ($(ROOT_OF_TRUST_API), y)'

ifeq ($(SUPPORT_RKP), y)
	CXXFLAGS += -std=c++17
endif

# Scrypto
SCRYPTO_LIB_A = $(TZ_SCRYPTO_LIB64)

# Build Settings
QSEE_APP = $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/skeymast
QSEE_BSP = $(QSEE_ROOT_PATH)/apps/bsp/trustzone/qsapps/skeymast
QSEE_DIR = $(QSEE_APP)/src

QSEE_BUILD_CHIPSET = $(QSEE_CHIPSET)

SRC_LIST = $(SRC)
SRC_LIST += $(SRC_CPP)
INC_LIST = $(INC:%=-I%)
DEF_LIST = $(DEF:%=-D%)
CXXFLAGS_LIST = $(CXXFLAGS)

BIN = $(QSEE_ROOT_PATH)/build/ms/bin/$(BINARY_ID)/skeymast.mbn
SIGNED_BIN = $(QSEE_ROOT_PATH)/build/ms/bin/$(BINARY_ID)/skeymast.mbn #it supposed to be signed by QC, but not. need to fix
UNSIGN = $(OUT_PATH)/skeymast.mbn
SIGN = $(OUT_PATH)/signed_skeymast.mbn #Signed by Samsung

endif #End of 'ifeq ($(HW_CRYPTO), QUALCOMM)'

#-------------------------------------------------------------------------------
# TEEGRIS Settings
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), TEEGRIS)

SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/cm_api.c

ifeq ($(USE_HWVAULT), y)
	SRC += $(HWVAULT_ROOT_PATH)/export/src/HwVaultHal_api.c
	INC += $(HWVAULT_ROOT_PATH)/export/include
endif

# Build Settings
CONFIG_TA_ARCH = 64
ifeq ($(TEEGRIS_TZ_VER), $(filter 421, $(TEEGRIS_TZ_VER)))
	TEEGRIS_TOOLCHAIN_PREFIX = $(TEEGRIS_SDK_ROOT)/toolchains/aarch64-secureos-gnueabi-clang_8_0_1-linux-x86/bin
	CLANG = $(TEEGRIS_TOOLCHAIN_PREFIX)/aarch64-secureos-gnueabi-clang
	LD = $(CLANG)
	STRIP = $(TEEGRIS_TOOLCHAIN_PREFIX)/llvm-strip
	TEEGRIS_SDK_SYS_ROOT = $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.2/swd/arch-arm64
else ifeq ($(TEEGRIS_TZ_VER), $(filter 42, $(TEEGRIS_TZ_VER)))
	CONFIG_TA_ARCH = 32
	TEEGRIS_TOOLCHAIN_PREFIX = $(TEEGRIS_SDK_ROOT)/toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86/bin
	CC = $(TEEGRIS_TOOLCHAIN_PREFIX)/arm-secureos-gnueabi-gcc
	LD = $(CC)
	STRIP = $(TEEGRIS_TOOLCHAIN_PREFIX)/arm-secureos-gnueabi-strip
	TEEGRIS_SDK_SYS_ROOT = $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.2/swd/arch-arm
else ifeq ($(TEEGRIS_TZ_VER), $(filter 41, $(TEEGRIS_TZ_VER)))
	CONFIG_TA_ARCH = 32
	TEEGRIS_TOOLCHAIN_PREFIX = $(TEEGRIS_SDK_ROOT)/toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86/bin
	CC = $(TEEGRIS_TOOLCHAIN_PREFIX)/arm-secureos-gnueabi-gcc
	LD = $(CC)
	STRIP = $(TEEGRIS_TOOLCHAIN_PREFIX)/arm-secureos-gnueabi-strip
# will be replaced to clnag, when rkp is supported
	# TEEGRIS_TOOLCHAIN_PREFIX = $(TEEGRIS_SDK_ROOT)/toolchains/arm-secureos-gnueabi-clang_8_0_1-linux-x86/bin
	# CLANG = $(TEEGRIS_TOOLCHAIN_PREFIX)/armv8-secureos-gnueabi-clang
	# LD = $(CLANG)
	# STRIP = $(TEEGRIS_TOOLCHAIN_PREFIX)/llvm-strip
# will be replaced to clnag, when rkp is supported
	TEEGRIS_SDK_SYS_ROOT = $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.1/swd/arch-arm
endif

CFLAGS += -O2 --sysroot=$(TEEGRIS_SDK_SYS_ROOT)
LDFLAGS += -O2 --sysroot=$(TEEGRIS_SDK_SYS_ROOT)
LDFLAGS += -L $(TEEGRIS_SDK_SYS_ROOT)/usr/lib -lpthread

ifeq ($(CONFIG_TA_ARCH), 32)
	CFLAGS += -Wno-pointer-to-int-cast # for cm_api.c
endif

CFLAGS += -Wall -Werror -Wextra -fPIE
CFLAGS += -fstack-protector-all -fvisibility=hidden
LDFLAGS += -pie

# Apply Full RELRO from TEEGRIS v4
LDFLAGS += -Wl,-z,relro,-z,now

# Add configs defined in teegris's config.mk
CFLAGS += $(CONFIG_CFLAGS_SW)
LDFLAGS += $(CONFIG_LDFLAGS_SW)

# Scrypto
LDFLAGS += -lscrypto

# ICCC
ifeq ($(ROOT_OF_TRUST_API), y)
	DEF += ICCC_v4
	ICCC_LIBS = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/v4_$(CONFIG_TA_ARCH)/icccOperations.ol
	INC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/include
endif

ifeq ($(SUPPORT_RKP), y)
	LD = $(CLANG)++
	CXXFLAGS += $(CFLAGS)
	CXXFLAGS += -std=c++17 -fno-rtti -fno-exceptions -fno-use-cxa-atexit
	CXXFLAGS += -Wno-sign-compare
	LDFLAGS += -lc++
endif

UNSIGN = $(OUT_PATH)/$(TA_UUID).unsigned
SIGN = $(OUT_PATH)/$(TA_UUID)
OBJS = $(SRC:.c=.o)
OBJS_CPP = $(SRC_CPP:.cpp=.o)

endif #End of 'ifeq ($(HW_CRYPTO), TEEGRIS)'

#-------------------------------------------------------------------------------
# Common Rules
#-------------------------------------------------------------------------------

build: $(OUT_PATH)
	@printf "BUILD\n"
	$(Q)$(MAKE) prepare
	$(Q)$(MAKE) all
	$(Q)$(MAKE) complete

$(OUT_PATH):
	$(Q)mkdir -p $(OUT_PATH)

#-------------------------------------------------------------------------------
# QUALCOMM Rules
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), QUALCOMM)

all:
	@printf "ALL\n"
	$(Q)_SRC_LIST="$(SRC_LIST)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _CXXFLAGS_LIST="$(CXXFLAGS_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) _PROCA_LIB=$(PROCA_LIB_A) python3.6 $(SCONS) -c -C $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/skeymast/src skeymast CHIPSET=$(BUILD_CHIPSET_ID) qtee_sdk_version=latest
	$(Q)_SRC_LIST="$(SRC_LIST)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _CXXFLAGS_LIST="$(CXXFLAGS_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) _PROCA_LIB=$(PROCA_LIB_A) python3.6 $(SCONS) -C $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/skeymast/src skeymast CHIPSET=$(BUILD_CHIPSET_ID) qtee_sdk_version=latest

prepare:
	@printf "PREPARE\n"
	$(Q)mkdir -p $(QSEE_DIR)
	$(Q)mkdir -p $(QSEE_BSP)/build
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/$(QSEE_CHIPSET)/SConscript $(QSEE_DIR)/SConscript
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/$(QSEE_CHIPSET)/SConstruct $(QSEE_DIR)/SConstruct
	$(Q)cp -fv $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/idl/*.idl $(QSEE_DIR)/../

complete: $(BIN)
	@printf "COMPLETE\n"
	$(Q)cp -fv $(BIN) $(UNSIGN) $(NULL)

sign: $(UNSIGN)
ifneq ($(SIGNING_MODEL), n)
	@printf "SIGN\n"
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN) -alg ECDSA
endif
	$(Q)$(MAKE) split

ifneq ($(SIGNING_MODEL), n)
split: $(SIGN)
	@printf "SPLIT\n"
	$(Q)$(KMSRK_ROOT_PATH)/build/pil_splitter.py $(SIGN) $(OUT_PATH)/skeymast
else
split: $(SIGNED_BIN)
	@printf "SPLIT\n"
	$(Q)$(KMSRK_ROOT_PATH)/build/pil_splitter.py $(SIGNED_BIN) $(OUT_PATH)/skeymast
endif

clean:
	@printf "CLEAN\n"
	$(Q)rm -rfv $(QSEE_APP) $(QSEE_BSP) $(NULL)
	$(Q)rm -fv $(QSEE_ROOT_PATH)/build/ms/bin/PIL_IMAGES/SPLITBINS_$(BINARY_ID)/skeymast.* $(NULL)
	$(Q)rm -fv $(QSEE_ROOT_PATH)/build/ms/bin/$(BINARY_ID)/skeymast.* $(NULL)
	$(Q)rm -fv $(SRC:.c=.o) $(NULL)

distclean:
	@printf "DISTCLEAN\n"
	$(Q)$(MAKE) clean $(NULL)
	$(Q)rm -fv $(BIN) $(SIGN) $(UNSIGN) $(NULL)
	$(Q)rm -fv $(OUT_PATH)/skeymast.* $(NULL)

endif

#-------------------------------------------------------------------------------
# TEEgris Rules
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), TEEGRIS)

prepare: distclean
	@printf "  PREPARE done\n"
	@printf '  DEF: $(DEF)\n'
	@printf '  CFLAGS: $(CFLAGS)\n'
	@printf '  CXXFLAGS: $(CXXFLAGS)\n'
	@printf '  LDFLAGS: $(LDFLAGS)\n'

all: $(UNSIGN)
	@printf "  ALL done\n"

$(UNSIGN): $(OBJS) $(OBJS_CPP)
	@printf "  LD         $(TA_UUID)\n"
	$(Q)$(LD) $(LDFLAGS) $(OBJS) $(OBJS_CPP) $(ICCC_LIBS) $(PROCA_LIB_A) -o $(UNSIGN)

%.o: %.c
ifneq ($(CLANG),)
	@printf "  CLANG      $(*).c\n"
	$(Q)$(CLANG) $(CFLAGS) $(DEF:%=-D%) $(INC:%=-I%) -o $(*).o -c $(*).c
else
	@printf "  CC         $(*).c\n"
	$(Q)$(CC) $(CFLAGS) $(DEF:%=-D%) $(INC:%=-I%) -o $(*).o -c $(*).c
endif

%.o: %.cpp
	@printf "  CXX(CLANG) $(*).cpp\n"
	$(Q)$(CLANG) $(CXXFLAGS) $(DEF:%=-D%) $(INC:%=-I%) -o $(*).o -c $(*).cpp

sign:
	@printf "  \n"

$(SIGN): $(UNSIGN)
	$(STRIP) $(UNSIGN)
	@printf "  STRIP done\n"
ifeq ($(DEVELOPER_LOCAL_BUILD), true)
ifeq ($(USE_LEGACY_SIGN), y)
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN)
else
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN) -addinfo $(MODEL_KEY_NAME)
endif
else
	@$(signing_command)
	@printf "  Copy $(SIGN) $(TEEGRIS_TA_DIST_PATH)\n"
	$(Q)cp $(SIGN) $(TEEGRIS_TA_DIST_PATH)
endif
	@printf "  SIGN done\n"

complete: $(UNSIGN) $(SIGN)
	@printf "  BUILD/STRIP/SIGN COMPLETE\n"

clean:
	$(Q)rm -rfv $(OBJS) $(NULL)
	$(Q)rm -rfv $(OBJS_CPP) $(NULL)
	$(Q)rm -rfv $(UNSIGN) $(NULL)
	@printf "  CLEAN done\n"

distclean:
	$(Q)$(MAKE) clean $(NULL)
	$(Q)rm -rfv $(SIGN) $(NULL)
	@printf "  DISTCLEAN done\n"

endif