##########################
##### user set space #####
##########################

#CUR_FILE_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))

## 1. Set SDK / NDK PATH
CONFIG_SW_TOOLCHAIN_ROOT = $(TEEGRIS_SDK_PATH)

# 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))/../../../../../)
CONFIG_NDK_ROOT = /home/tkeo/tools/android-ndk/android-ndk-r13b

#Example valid option is: CLANG
ifeq ($(TEEGRIS_TA_TOOLCHAIN),CLANG)
  SECURE_TOOLCHAIN = CLANG
  CONFIG_USE_LLD = y
else
  SECURE_TOOLCHAIN = GCC
endif

## 2. Target architecture in secure world to build for.
ifeq ($(TAD_TA_ARCH),64)
  CONFIG_SW_TARGET = AARCH64
else
  CONFIG_SW_TARGET = ARM
endif
$(info CONFIG_TA_ARCH($(CONFIG_SW_TARGET)) $(TA_NAME))

## 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. it is defined from target source
#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-3.0
PLATFORM_NAME=TEEGRIS-${TEEGRIS_PLATFORM_VERSION_MAJOR}.${TEEGRIS_PLATFORM_VERSION_MINOR}
PLATFORM_ROOT=$(CONFIG_SW_TOOLCHAIN_ROOT)/platforms/${PLATFORM_NAME}
$(info platform version: $(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_8_0_1-linux-x86
  else
    CONFIG_SW_COMPILER_PATH = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/arm-secureos-gnueabi-clang_8_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 = -lteecl -llog

## SW flags
CONFIG_CFLAGS_SW = -lteesl -ltzsl
CONFIG_LDFLAGS_SW = 

## Signing command
CONFIG_SIGN_CLIENT = $(CONFIG_SW_TOOLCHAIN_ROOT)/tools/teegris_authority_scripts/signclient.jar
CONFIG_SIGN_TYPE = ss_teegris_ta

ifeq ($(TEEGRIS_TA_SIGNING_SCHEME), V2)
$(info TEEGRIS_TA_SIGNING_SCHEME: V2)
$(info LOCAL_TA_SIGNER_PATH: $(LOCAL_TA_SIGNER_PATH))
CONFIG_SIGN_CLIENT = $(LOCAL_TA_SIGNER_PATH)
CONFIG_SIGN_TYPE = ss_teegris_dl_ta
endif

signing_command = java -jar $(CONFIG_SIGN_CLIENT) -runtype $(CONFIG_SIGN_TYPE) \
                  -model $(SIGN_MODEL) -input $< -output $@


##################################################################################


## Options for compiler and linker

CONFIG_CFLAGS_COMMON = -Wall -Werror -Wextra -fPIE
CONFIG_CFLAGS_SECURITY := -fstack-protector -fstack-protector-all
CONFIG_CFLAGS_OPTIMIZATION := -O2

CONFIG_LDFLAGS_COMMON := -pie
ifeq ($(TEEGRIS_USE_RELRO), TRUE)
  $(info RELRO: enable)
  CONFIG_LDFLAGS_SECURITY += -Wl,-z,relro,-z,now
endif

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_SECURITY) \
	$(CONFIG_CFLAGS_OPTIMIZATION)

CONFIG_LDFLAGS_SW := \
	$(CONFIG_LDFLAGS_COMMON) \
	$(CONFIG_LDFLAGS_SECURITY)

## 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++
  CONFIG_STRIP_SW = $(CONFIG_SW_TOOLCHAIN_PREFIX)strip
else ifeq ($(SECURE_TOOLCHAIN),CLANG)
  CONFIG_CC_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)clang
  CONFIG_CXX_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)clang++
  CONFIG_STRIP_SW := $(CONFIG_SW_COMPILER_PATH)/bin/llvm-strip
  ifeq ($(CONFIG_USE_LLD),y)
    CONFIG_LD_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)ld.lld
  else
    CONFIG_LD_SW := $(CONFIG_SW_TOOLCHAIN_PREFIX)ld
  endif
endif
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
STRIP_FLAGS_SW = -R .note -R .comment -s

MKDIR := -mkdir -p
RM := rm -rf
CP := cp -f
