# Build host.

# Common parameters:
# - LOCAL_NAME
# - LOCAL_UUID
# Optional:
# - LOCAL_INCLUDE_DIRS
# - LOCAL_SRC_LIB_C
# - LOCAL_SRC_CPP
# - LOCAL_SRC_C
# - LOCAL_SRC_S
# - LOCAL_CFLAGS
# - LOCAL_CPPFLAGS
# - LOCAL_CUSTOM_LIBS
# - LOCAL_SHRINK_PROTOCOL_BUFFER
# - LOCAL_CC
# - LOCAL_CXX

_sdk_dir := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

include $(_sdk_dir)/path-utilities.mk

##########################
# Strip input parameters #
##########################

LOCAL_NAME := $(strip $(LOCAL_NAME))
LOCAL_UUID := $(strip $(LOCAL_UUID))
LOCAL_LINK_GP_TEE := $(strip $(LOCAL_LINK_GP_TEE))
LOCAL_LINK_EMULATOR_GP_CLIENT := $(strip $(LOCAL_LINK_EMULATOR_GP_CLIENT))
LOCAL_GROUP_ID := $(strip $(LOCAL_GROUP_ID))
LOCAL_FIPS_CRYPTO := $(strip $(LOCAL_FIPS_CRYPTO))
LOCAL_OUT := $(strip $(LOCAL_OUT))
LOCAL_CC := $(strip $(LOCAL_CC))
LOCAL_CXX := $(strip $(LOCAL_CXX))

####################################
# Check necessary input parameters #
####################################

ifeq ($(LOCAL_NAME),)
  $(error LOCAL_NAME is not specified)
endif

ifeq ($(LOCAL_OUT),)
  LOCAL_OUT := $(abspath ./out)
endif

ifeq ($(LOCAL_LINK_GP_TEE),y)
  ifeq ($(LOCAL_GROUP_ID),)
    LOCAL_GROUP_ID := dev_ta
  endif

  ifeq ($(LOCAL_UUID),)
    $(error LOCAL_UUID is not specified)
  endif
else
  LOCAL_LINK_GP_TEE := n
endif

ifneq ($(LOCAL_FIPS_CRYPTO),y)
  LOCAL_FIPS_CRYPTO := n
endif

ifeq ($(LOCAL_SHRINK_PROTOCOL_BUFFER),y)
  LOCAL_CFLAGS += -DSHRINK_PROTOCOL_BUFFER
endif

ifeq ($(LOCAL_CC),)
  LOCAL_CC := gcc
endif

ifeq ($(LOCAL_CXX),)
  LOCAL_CXX := g++
endif

####################################
# Check of user input parameters   #
####################################

include $(_sdk_dir)/rules-utils.mk
$(call host-build-rules)

############################
# Default build parameters #
############################

_local_output_base := $(call get-absolute-path,$(LOCAL_OUT)/$(LOCAL_TARGET_NAME:=/)host)
_local_output_dir := $(_local_output_base)/$(LOCAL_NAME)

##################
# Set up sources #
##################

_platform_libs :=

# Handle building host client emulation
ifeq ($(LOCAL_LINK_EMULATOR_GP_CLIENT),y)
  # 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:=/)host/emulator_gp_client/emulator_gp_client.a
  LOCAL_INCLUDE_DIRS += $(_sdk_dir)/../include/gp-api
  # Force using openssl crypto:
  LOCAL_LDFLAGS += -lpthread -lz -lcrypto
endif

# Handle building host TA emulation
ifeq ($(LOCAL_LINK_GP_TEE),y)

  _fipsed :=
  ifeq ($(LOCAL_FIPS_CRYPTO),y)
    _fipsed := _fipsed
  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:=/)host/$(LOCAL_UUID)_emulator_gp_tee/$(LOCAL_UUID)_emulator_gp_tee.a

  LOCAL_INCLUDE_DIRS += $(_sdk_dir)/../include/gp-api $(_sdk_dir)/../include/gp-ext $(_sdk_dir)/../include/gp-mb

  # Force using openssl crypto:
  LOCAL_LDFLAGS += -lpthread -lz -lrt

  ifneq ($(LOCAL_FIPS_CRYPTO),y)
    LOCAL_LDFLAGS += -lcrypto
  endif
endif

#########################
# Handle LOCAL_EXPORT_* #
#########################

include $(_sdk_dir)/local-export.mk

$(call save-all-local-export,host,$(LOCAL_TARGET_NAME:=),$(LOCAL_NAME))

$(foreach _lib,$(LOCAL_STATIC_LIBRARIES), \
  $(call restore-all-local-export,host,$(LOCAL_TARGET_NAME:=),$(_lib)))

###################
# Set up compiler #
###################

_cc    := $(LOCAL_CC)
_cxx   := $(LOCAL_CXX)
_ld    := gcc
_ar    := ar
_strip := strip

#############
# Build all #
#############

include $(_sdk_dir)/build-binary.mk
