##########################
##### user set space #####
##########################

CUR_FILE_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))

## 1. Set SDK / NDK PATH
CONFIG_SW_TOOLCHAIN_ROOT = $(realpath $(CUR_FILE_DIR)/../../)

# use android compiler from PATH environment variable
# if standalone compiler, please add custom path to root /some_paths/android-ndk/
CONFIG_NDK_ROOT = $(realpath $(dir $(shell which arm-linux-androideabi-gcc))/../../../../../)

#Example valid option is: CLANG
SECURE_TOOLCHAIN = GCC

## 2. Target architecture in normal world to build for.
#CONFIG_NW_TARGET = AARCH64
CONFIG_NW_TARGET = ARM

## 3. Target architecture in secure world to build for.
#CONFIG_SW_TARGET = AARCH64
CONFIG_SW_TARGET = ARM

## 4. Target environment to build for.
#CONFIG_TARGET_ENV = tizen
CONFIG_TARGET_ENV = android

## 4-1. Android level
CONFIG_ANDROID_LEVEL = android-21

## 5. Set Debug ON/OFF
CONFIG_DEBUG = ON
#CONFIG_DEBUG = OFF

## 6. Server Signing ON/OFF
#CONFIG_SERVER = ON
CONFIG_SERVER = OFF


##########################
##### auto set space #####
##########################

ifeq ($(filter /%, $(CONFIG_SW_TOOLCHAIN_ROOT)),)
  $(error Relative paths in CONFIG_SW_TOOLCHAIN_ROOT not supported.)
endif

ifeq ($(filter /%, $(CONFIG_NDK_ROOT)),)
  $(error Relative paths in CONFIG_NDK_ROOT not supported.)
endif

include $(CONFIG_SW_TOOLCHAIN_ROOT)/platform.version

## SW / NW toolchain path
CONFIG_ANDROID_PLATFORMS = $(CONFIG_NDK_ROOT)/platforms/${CONFIG_ANDROID_LEVEL}

#for specific version please write: PLATFORM_NAME=TEEGRIS-2.0
PLATFORM_NAME=TEEGRIS-${TEEGRIS_PLATFORM_VERSION_MAJOR}.${TEEGRIS_PLATFORM_VERSION_MINOR}
PLATFORM_ROOT=$(CONFIG_SW_TOOLCHAIN_ROOT)/platforms/${PLATFORM_NAME}


## NW toolchain prefix

ifeq ($(CONFIG_NW_TARGET),AARCH64)
  CONFIG_NW_TOOLCHAIN_PREFIX = $(CONFIG_NDK_ROOT)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
  CONFIG_NW_SYSROOT = ${CONFIG_ANDROID_PLATFORMS}/arch-arm64
  CONFIG_NW_LIB = $(PLATFORM_ROOT)/nwd/android/arch-arm64
else
  CONFIG_NW_TOOLCHAIN_PREFIX = $(CONFIG_NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
  CONFIG_NW_SYSROOT = ${CONFIG_ANDROID_PLATFORMS}/arch-arm
  CONFIG_NW_LIB = $(PLATFORM_ROOT)/nwd/android/arch-arm
endif

CONFIG_NW_INCLUDES = $(PLATFORM_ROOT)/nwd/android/includes

ifeq ($(CONFIG_TARGET_ENV),tizen)
  CONFIG_NW_SYSROOT = $(shell $(CC) -print-sysroot)
endif

ifeq ($(SECURE_TOOLCHAIN),GCC)
ifeq ($(CONFIG_SW_TARGET),AARCH64)
  CONFIG_SW_COMPILER_PATH = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/aarch64-secureos-gnueabi-gcc_6_3-linux-x86
else
  CONFIG_SW_COMPILER_PATH = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86
endif

else ifeq ($(SECURE_TOOLCHAIN),CLANG)
ifeq ($(CONFIG_SW_TARGET),AARCH64)
  CONFIG_SW_COMPILER_PATH = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/aarch64-secureos-gnueabi-clang_4_0_1-linux-x86
else
  CONFIG_SW_COMPILER_PATH = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/arm-secureos-gnueabi-clang_4_0_1-linux-x86
endif

else
$(error No such toolchain, please set SECURE_TOOLCHAIN option properly)
endif

## SW toolchain prefix
ifeq ($(CONFIG_SW_TARGET),AARCH64)
  CONFIG_SW_TOOLCHAIN_PREFIX = $(CONFIG_SW_COMPILER_PATH)/bin/aarch64-secureos-gnueabi-
  CONFIG_SW_SYSROOT = $(PLATFORM_ROOT)/swd/arch-arm64
else
  CONFIG_SW_TOOLCHAIN_PREFIX = $(CONFIG_SW_COMPILER_PATH)/bin/arm*-secureos-gnueabi-
  CONFIG_SW_SYSROOT = $(PLATFORM_ROOT)/swd/arch-arm
endif

## NW flags
CONFIG_CFLAGS_NW = -fPIE -pie -lteecl -llog

## SW flags
CONFIG_CFLAGS_SW = -lteesl -ltzsl

## Signing Path
CONFIG_TA_AUTH_SCRIPTS_PATH = ${CONFIG_SW_TOOLCHAIN_ROOT}/tools/teegris_authority_scripts/ta_auth_scripts

CONFIG_TA_SIGN_CERT = ${CONFIG_SW_TOOLCHAIN_ROOT}/tools/teegris_authority_scripts/ta_auth_dev_ta/cert.pem
CONFIG_TA_SIGN_KEY = ${CONFIG_SW_TOOLCHAIN_ROOT}/tools/teegris_authority_scripts/ta_auth_dev_ta/private/key.pem
CONFIG_TA_SIGN = $(CONFIG_TA_AUTH_SCRIPTS_PATH)/sign_file.sh -a -c $(CONFIG_TA_SIGN_CERT) -k $(CONFIG_TA_SIGN_KEY)

CONFIG_DRV_SIGN_CERT = ${CONFIG_SW_TOOLCHAIN_ROOT}/tools/teegris_authority_scripts/ta_auth_dev_drv/cert.pem
CONFIG_DRV_SIGN_KEY = ${CONFIG_SW_TOOLCHAIN_ROOT}/tools/teegris_authority_scripts/ta_auth_dev_drv/private/key.pem
CONFIG_DRV_SIGN = $(CONFIG_TA_AUTH_SCRIPTS_PATH)/sign_file.sh -a -c $(CONFIG_DRV_SIGN_CERT) -k $(CONFIG_DRV_SIGN_KEY)

CONFIG_SIGN_CLIENT = <abs_path>/signclient.jar
CONFIG_SIGN_SERVER = java -jar $(CONFIG_SIGN_CLIENT) -runtype ss_bf_ta -model BF_SAMSUNG_TA -runtype ss_bf_ta -input

ifeq ($(CONFIG_SERVER),ON)
	test_TA_with_keys = $(TA)
	signing_command = $(CONFIG_SIGN_SERVER) $< -output $@
else
	test_TA_with_keys = $(TA) \
	$(CONFIG_TA_SIGN_CERT) \
	$(CONFIG_TA_SIGN_KEY)
	signing_command = $(CONFIG_TA_SIGN) $< $@
endif

##################################################################################


## Options for compiler and linker

CONFIG_CFLAGS_COMMON = -Wall -Werror -Wextra -fPIE -pie
CONFIG_CFLAGS_OPTIMIZATION := -O2

ifeq ($(CONFIG_DEBUG), ON)
CONFIG_CFLAGS_COMMON += -DDEBUG
endif

CONFIG_CFLAGS_NW := \
	--sysroot=$(CONFIG_NW_SYSROOT) \
	-I $(CONFIG_NW_INCLUDES) \
	-L $(CONFIG_NW_LIB) \
	$(CONFIG_CFLAGS_COMMON) \
	$(CONFIG_CFLAGS_OPTIMIZATION) \
	$(CONFIG_CFLAGS_NW)


CONFIG_CFLAGS_SW := \
	--sysroot=$(CONFIG_SW_SYSROOT) \
	$(CONFIG_CFLAGS_COMMON) \
	$(CONFIG_CFLAGS_OPTIMIZATION) \
	$(CONFIG_CFLAGS_SW)


## Set compilers
CONFIG_CC_NW := $(CONFIG_NW_TOOLCHAIN_PREFIX)gcc
CONFIG_CXX_NW := $(CONFIG_NW_TOOLCHAIN_PREFIX)g++

ifeq ($(SECURE_TOOLCHAIN),GCC)
  CONFIG_CC_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)gcc
  CONFIG_CXX_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)g++
else ifeq ($(SECURE_TOOLCHAIN),CLANG)
  CONFIG_CC_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)clang
  CONFIG_CXX_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)clang++
endif
CONFIG_LD_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)ld
CONFIG_OBJCOPY_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)objcopy

ifeq ($(CONFIG_SW_TARGET),AARCH64)
  OBJCOPY_FLAGS_SW := -O elf64-littleaarch64 -B aarch64
else
  OBJCOPY_FLAGS_SW := -O elf32-littlearm -B arm
endif

MKDIR := -mkdir -p
RM := rm -rf
CP := cp -f
