# Build blowfish.

# Common parameters:
# - LOCAL_SDK_PATH
# - LOCAL_NAME
# Optional:
# - LOCAL_INCLUDE_DIRS
# - LOCAL_SRC_LIB_C
# - LOCAL_SRC_CPP
# - LOCAL_SRC_C
# - LOCAL_SRC_S
# - LOCAL_CFLAGS
# - LOCAL_CPPFLAGS
# - LOCAL_STATIC_LIBRARIES
# - LOCAL_CUSTOM_LIBS
# - LOCAL_SHRINK_PROTOCOL_BUFFER

_sdk_dir := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

_local_blowfish_platform := $(strip $(_local_blowfish_platform))

ifeq ($(_local_blowfish_platform),)
  _local_blowfish_platform := blowfish
endif

include $(_sdk_dir)/blowfish-utils.mk
include $(_sdk_dir)/path-utilities.mk

##########################
# Strip input parameters #
##########################

LOCAL_SDK_PATH := $(strip $(LOCAL_SDK_PATH))
LOCAL_NAME := $(strip $(LOCAL_NAME))
LOCAL_LINK_GP_TEE := $(strip $(LOCAL_LINK_GP_TEE))
LOCAL_GROUP_ID := $(strip $(LOCAL_GROUP_ID))
LOCAL_OUT := $(strip $(LOCAL_OUT))

####################################
# Check necessary input parameters #
####################################

ifeq ($(LOCAL_OUT),)
  LOCAL_OUT := $(abspath ./out)
endif

ifeq ($(LOCAL_NAME),)
  $(error LOCAL_NAME is not specified)
endif
ifeq ($(LOCAL_LINK_GP_TEE),)
  LOCAL_LINK_GP_TEE := n
endif

ifeq ($(LOCAL_SHRINK_PROTOCOL_BUFFER),y)
  LOCAL_CFLAGS += -DSHRINK_PROTOCOL_BUFFER
endif

############################
# Default build parameters #
############################

_local_output_base := $(call get-absolute-path,$(LOCAL_OUT)/$(LOCAL_TARGET_NAME:=/)$(_local_blowfish_platform))
_local_output_dir := $(_local_output_base)/$(LOCAL_NAME)

##################
# Set up sources #
##################

_arch := $(strip $(call get-blowfish-swd-arch,$(LOCAL_SDK_PATH)))

_platform_libs :=

ifeq ($(LOCAL_LINK_GP_TEE),y)
  ifeq ($(LOCAL_GROUP_ID),)
    LOCAL_GROUP_ID := dev_ta
  endif

  # Don't use "../" here. Also the line must be absolutely the same as target to build platform library.
  _platform_libs := $(LOCAL_OUT)/$(LOCAL_TARGET_NAME:=/)$(_local_blowfish_platform)/$(_arch)_$(LOCAL_UUID)_blowfish_gp_tee/$(_arch)_$(LOCAL_UUID)_blowfish_gp_tee.a
  LOCAL_INCLUDE_DIRS += $(_sdk_dir)/../include/gp-mb

  # Fix for compiler/linker optimization for unreferenced sections.
  include $(_sdk_dir)/../source/gp-api/tee-blowfish-fix.mk
  LOCAL_SRC_C += $(_local_additional_src)
endif

LOCAL_INCLUDE_DIRS += $(call get-blowfish-swd-include-paths,$(LOCAL_SDK_PATH),$(_local_blowfish_platform),$(_arch))

####################################
# Check of user input parameters   #
####################################

include $(_sdk_dir)/rules-utils.mk
$(call blowfish-build-rules)

#########################
# Handle LOCAL_EXPORT_* #
#########################

include $(_sdk_dir)/local-export.mk

$(call save-all-local-export,$(_local_blowfish_platform),$(LOCAL_TARGET_NAME:=),$(LOCAL_NAME))

$(foreach _lib,$(LOCAL_STATIC_LIBRARIES), \
  $(call restore-all-local-export,$(_local_blowfish_platform),$(LOCAL_TARGET_NAME:=),$(_lib)))

LOCAL_INCLUDE_DIRS := $(call get-absolute-path,$(LOCAL_INCLUDE_DIRS))

#######################
# Add stack protector #
#######################

LOCAL_CFLAGS += -fstack-protector -fstack-protector-all

###################
# Set up compiler #
###################

_toolchain_prefix := $(LOCAL_SDK_PATH)/bin/$(strip $(call get-blowfish-toolchain-prefix,$(LOCAL_SDK_PATH)))
_teesl := $(addprefix -L,$(call get-blowfish-swd-libdir,$(LOCAL_SDK_PATH),$(_local_blowfish_platform),$(_arch))) -lteesl

_cc    := $(_toolchain_prefix)gcc
_cxx   := $(_toolchain_prefix)g++
_ld    := $(_toolchain_prefix)gcc $(_teesl)
_ar    := $(_toolchain_prefix)ar
_strip := $(_toolchain_prefix)strip

#############
# Build all #
#############

include $(_sdk_dir)/build-binary.mk
