# Build qsee.

# Common parameters:
# - LOCAL_SDK_PATH
# - LOCAL_NAME
# - LOCAL_CHIP
# - LOCAL_BUILD_TOOL
# - LOCAL_QSEE_UNPROTECTED_MEM
# - LOCAL_QSEE_PROC
# - 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_STATIC_LIBRARIES
# - LOCAL_ARMCC_LICENSE
# - LOCAL_ARMCC_PATH
# - LOCAL_QSEE_ACCEPT_BUFFER_SIZE
# - LOCAL_SHRINK_PROTOCOL_BUFFER

_sdk_dir := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

include $(_sdk_dir)/uuid-utils.mk
include $(_sdk_dir)/qsee-utils.mk
include $(_sdk_dir)/path-utilities.mk

##########################
# Strip input parameters #
##########################

LOCAL_NAME := $(strip $(LOCAL_NAME))
LOCAL_OUT := $(strip $(LOCAL_OUT))
LOCAL_CHIP := $(strip $(LOCAL_CHIP))
LOCAL_SDK_PATH := $(strip $(LOCAL_SDK_PATH))
LOCAL_BUILD_TOOL := $(strip $(LOCAL_BUILD_TOOL))
LOCAL_QSEE_PROC := $(strip $(LOCAL_QSEE_PROC))
LOCAL_LINK_GP_TEE := $(strip $(LOCAL_LINK_GP_TEE))
LOCAL_UUID := $(strip $(LOCAL_UUID))
LOCAL_GROUP_ID := $(strip $(LOCAL_GROUP_ID))
LOCAL_IMPRINT_TOOL := $(strip $(LOCAL_IMPRINT_TOOL))
LOCAL_FIPS_CRYPTO := $(strip $(LOCAL_FIPS_CRYPTO))
LOCAL_QSEE_UNPROTECTED_MEM := $(strip $(LOCAL_QSEE_UNPROTECTED_MEM))
LOCAL_QSEE_ACCEPT_BUFFER_SIZE := $(strip $(LOCAL_QSEE_ACCEPT_BUFFER_SIZE))
LOCAL_LLVM_ROOT := $(patsubst /,\/,$(strip $(LOCAL_LLVM_ROOT)))
LOCAL_ARM7_ROOT := $(patsubst /,\/,$(strip $(LOCAL_ARM7_ROOT)))
LOCAL_AARCH64_ROOT := $(patsubst /,\/,$(strip $(LOCAL_AARCH64_ROOT)))
LOCAL_LLVM_VERSION := $(strip $(LOCAL_LLVM_VERSION))
LOCAL_QSEE_BRANCH := $(strip $(LOCAL_QSEE_BRANCH))
LOCAL_SHRINK_COMMAND_BUFFER := $(strip $(LOCAL_SHRINK_COMMAND_BUFFER))

####################################
# Check necessary input parameters #
####################################

ifeq ($(LOCAL_NAME),)
  $(error LOCAL_NAME is not specified)
endif

ifeq ($(LOCAL_OUT),)
  LOCAL_OUT := $(abspath ./out)
endif

ifeq ($(LOCAL_CHIP),)
  $(error LOCAL_CHIP is not specified)
endif

ifeq ($(LOCAL_FIPS_CRYPTO),)
  LOCAL_FIPS_CRYPTO := n
endif

ifeq ($(LOCAL_LINK_GP_TEE),)
  LOCAL_LINK_GP_TEE := n
endif

ifeq ($(LOCAL_BUILD_TOOL),)
  LOCAL_BUILD_TOOL := arm
  ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),msm8996 msm8998 sdm439 sdm450 sdm660 sdm670 msm8953 sdm845 sm6150 sm7150 sm7225 sm7250 sm8150 sm8250))
    LOCAL_BUILD_TOOL := llvm
  endif
endif

ifeq ($(LOCAL_QSEE_PROC),)
  LOCAL_QSEE_PROC := scorpion
endif

ifeq ($(LOCAL_QSEE_ACCEPT_BUFFER_SIZE),)
  LOCAL_QSEE_ACCEPT_BUFFER_SIZE := -1
endif

ifeq ($(LOCAL_QSEE_UNPROTECTED_MEM),)
  LOCAL_QSEE_UNPROTECTED_MEM = n
else
  ifneq ($(LOCAL_QSEE_UNPROTECTED_MEM),y)
  ifneq ($(LOCAL_QSEE_UNPROTECTED_MEM),n)
    $(error LOCAL_QSEE_UNPROTECTED_MEM option is invalid. Use y/n)
  endif
  endif
endif

ifneq ($(LOCAL_BUILD_TOOL),llvm)
  ifeq ($(LOCAL_ARMCC_LICENSE),)
    $(error LOCAL_ARMCC_LICENSE is not specified)
  endif
  ifeq ($(LOCAL_ARMCC_PATH),)
    $(error LOCAL_ARMCC_PATH is not specified)
  endif
else
  ifeq ($(LOCAL_LLVM_ROOT),)
    LOCAL_LLVM_ROOT := opt\/toolchains\/Qualcomm\/llvm
  endif
  ifeq ($(LOCAL_AARCH64_ROOT),)
    LOCAL_AARCH64_ROOT := opt\/toolchains\/linaro\/gcc-linaro-aarch64-none-elf-4.9-2014.07_linux
  endif
  ifeq ($(LOCAL_ARM7_ROOT),)
    LOCAL_ARM7_ROOT := opt\/toolchains\/linaro\/gcc-linaro-arm-linux-gnueabihf-4.8-2014.02_linux
  endif
  ifeq ($(LOCAL_LLVM_VERSION),)
    ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm845 sm6150 sm7150 sm7225 sm7250 sm8150 sm8250))
      LOCAL_LLVM_VERSION := 4.0.11
    endif
    ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),msm8998 sdm660))
      LOCAL_LLVM_VERSION := 3.7.6
    endif
    ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),msm8996 msm8953 sdm439 sdm450))
      LOCAL_LLVM_VERSION := 3.5.2.4
    endif
    ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm670))
      LOCAL_LLVM_VERSION := 4.0.3
    endif
  endif
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

  _local_qsee_uuid := $(strip $(call get-qsee-uuid,$(LOCAL_UUID)))
endif

ifeq ($(LOCAL_QSEE_BRANCH),)
  LOCAL_QSEE_BRANCH := TZ.BF.4.0
  ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm670 sdm845 sm6150 sm7150 sm7225 sm7250 sm8150 sm8250))
    LOCAL_QSEE_BRANCH := TZ.XF.5.0
  else
     ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),msm8953))
       LOCAL_QSEE_BRANCH := TZ.XF.4.0.5
     endif
  endif
endif

ifeq ($(LOCAL_IMPRINT_TOOL),)
  ifeq ($(LOCAL_FIPS_CRYPTO),y)
    # If imprint tool is not set and fips crypto selected, use default imprint
    LOCAL_IMPRINT_TOOL := $(_sdk_dir)/../tools/imprint
  else
    # If imprint tool is not set, do nothing
    LOCAL_IMPRINT_TOOL := echo No imprint required for
  endif
endif

ifeq ($(LOCAL_SHRINK_PROTOCOL_BUFFER),y)
  LOCAL_CFLAGS += -DSHRINK_PROTOCOL_BUFFER
endif

ifeq ($(LOCAL_BUILD_TOOL),arm)
  export LM_LICENSE_FILE := $(LOCAL_ARMCC_LICENSE)
endif

####################################
# Check of user input parameters   #
####################################

include $(_sdk_dir)/rules-utils.mk
$(call qsee-build-rules)

#####################
# Setup nhlos paths #
#####################

_qsee_build_script_tmp := $(strip $(call get-qsee-swd-build-script-name,$(LOCAL_SDK_PATH)))

ifeq ($(_qsee_build_script_tmp),)
  _qsee_build_script := python ./build_all.py -b $(LOCAL_QSEE_BRANCH) PRODUCT_NAME=multibuild
  _qsee_new := .new
else
  _qsee_build_script := bash ./$(_qsee_build_script_tmp)
  _qsee_new :=
endif

ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm439))
  _qsee_new := .new
endif

_nhlos_chipset_name := $(LOCAL_CHIP)

ifeq ($(LOCAL_CHIP),sm7250)
  _nhlos_chipset_name := saipan
endif

ifeq ($(LOCAL_CHIP),sm7225)
  _nhlos_chipset_name := bitra
endif

_local_qsee_apps_dir := $(strip $(call get-qsee-apps-location,$(LOCAL_SDK_PATH)))
ifeq ($(_local_qsee_apps_dir),)
  _local_qsee_apps_dir := core
endif

_local_scl_path := $(call get-absolute-path, $(_sdk_dir)/../tools/templates/qsee/build)

############################
# Default build parameters #
############################
_local_output_base := $(call get-absolute-path,$(LOCAL_OUT)/$(LOCAL_TARGET_NAME:=/)qsee/$(LOCAL_CHIP)_$(LOCAL_QSEE_PROC))
_local_output_dir := $(_local_output_base)/$(LOCAL_NAME)
_local_tmp_src_prefix := $(_local_output_dir)/src
_local_tmp_nhlos_path_base := $(_local_output_base)/$(LOCAL_CHIP)_$(LOCAL_QSEE_PROC)_nhlos
_local_tmp_nhlos_path := $(_local_output_dir)/$(LOCAL_CHIP)_$(LOCAL_QSEE_PROC)_nhlos
_qsee_build_dir_base := $(call get-qsee-swd-build-dir,$(_local_tmp_nhlos_path_base))
_qsee_build_dir := $(call get-qsee-swd-build-dir,$(_local_tmp_nhlos_path))
_qsee_build_output_dir := $(call get-qsee-swd-out-build-dir,$(_local_tmp_nhlos_path),$(_local_qsee_apps_dir))

_local_standalone_script := n
ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm670 sm6150 sm7150 sm7225 sm7250 sm8150 sdm439 sm8250))
  _local_standalone_script := y
endif

_local_build_project_name := $(strip multibuild)
ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm670))
_local_build_project_name := $(strip --cbt=multibuild)
endif

##################
# Set up sources #
##################

LOCAL_SRC_LIB_C := $(call get-absolute-path,$(LOCAL_SRC_LIB_C))
LOCAL_SRC_CPP := $(call get-absolute-path,$(LOCAL_SRC_CPP))
LOCAL_SRC_C := $(call get-absolute-path,$(LOCAL_SRC_C))
LOCAL_SRC_S := $(call get-absolute-path,$(LOCAL_SRC_S))
LOCAL_CUSTOM_LIBS := $(call get-absolute-path,$(LOCAL_CUSTOM_LIBS))

_platform_libs :=
_local_entry_point := $(_sdk_dir)/../tools/templates/qsee/entry_points.c
_local_secure_memset := $(_sdk_dir)/../tools/templates/qsee/mb_secure_memset.c

_x64 :=

ifeq ($(LOCAL_QSEE_PROC),A53_64)
  _x64 := 64
endif



# Only msm8996+ devices support qsee_realloc function
ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP), msm8996 msm8998 sdm439 sdm450 sdm660 sdm670 sdm845 msm8953 sm6150 sm7150 sm7225 sm7250 sm8150 sm8250))
  LOCAL_CFLAGS += -DUSE_QSEE_REALLOC
endif

ifeq ($(LOCAL_LINK_GP_TEE),y)
  ifeq ($(LOCAL_FIPS_CRYPTO),y)
    _crypto_lib :=
  else
    _crypto_lib := $(dir $(_sdk_dir))prebuilt/arm$(_x64)/cryptocore/lib/libcryptocore_qsee$(_x64)_$(LOCAL_CHIP).lib
  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:=/)qsee/$(LOCAL_CHIP)_$(LOCAL_QSEE_PROC)/$(_local_qsee_uuid)_qsee_gp_tee/$(_local_qsee_uuid)_qsee_gp_tee.lib \
                    $(_crypto_lib)

  LOCAL_INCLUDE_DIRS += $(_sdk_dir)/../include/gp-api $(_sdk_dir)/../include/gp-ext $(_sdk_dir)/../include/gp-mb
  _local_entry_point := $(_sdk_dir)/../tools/templates/swd-bin/gp-handler.c
endif

LOCAL_CUSTOM_LIBS := $(LOCAL_CUSTOM_LIBS) $(_platform_libs)

#########################
# Handle LOCAL_EXPORT_* #
#########################

include $(_sdk_dir)/local-export.mk

$(call save-all-local-export,qsee,$(LOCAL_TARGET_NAME:=),$(LOCAL_NAME))

$(foreach _lib,$(LOCAL_STATIC_LIBRARIES), \
  $(call restore-all-local-export,qsee,$(LOCAL_TARGET_NAME:=),$(_lib)))

LOCAL_INCLUDE_DIRS := $(call get-absolute-path,$(LOCAL_INCLUDE_DIRS))

######################
# Build dependencies #
######################

$(foreach _lib,$(LOCAL_STATIC_LIBRARIES),\
  $(if $(filter _exported_$(LOCAL_TARGET_NAME)_$(LOCAL_PLATFORM)_$(_lib),$(_global_exported_libs)),\
    $(eval LOCAL_CUSTOM_LIBS += $(_exported_$(LOCAL_TARGET_NAME)_$(LOCAL_PLATFORM)_$(_lib))),\
    $(eval LOCAL_CUSTOM_LIBS += $(_local_output_base)/$(_lib)/$(_lib).lib)))

########################################
# Add prerequisites to default targets #
########################################
# Library target.
_lib := $(_local_output_dir)/$(LOCAL_NAME).lib
# TA target.
_bin := $(_local_output_dir)/$(LOCAL_NAME).mbn

$(_local_tmp_src_prefix)/tima_config.h \
$(_local_tmp_src_prefix)/board.h:
	mkdir -p $(dir $(@))
	touch $(@)
	mkdir -p $(dir $(@))../../../boot_images/build/ms/
	touch $(dir $(@))../../../boot_images/build/ms/$(notdir $(@))

# Use temporary directory for building sources to avoid
# putting .o files into multibuild sources directory.
# Also copy all headers from src dir to dest dir
$(_local_tmp_src_prefix)/%.c:%.c $(_local_tmp_src_prefix)/tima_config.h $(_local_tmp_src_prefix)/board.h
	@mkdir -p $(dir $(@))
	@cp -f $(<) $(@)
	@cp -f $(dir $(<))*.h $(dir $(@)) 2>/dev/null || :

$(_local_tmp_src_prefix)/%.cpp:%.cpp $(_local_tmp_src_prefix)/tima_config.h $(_local_tmp_src_prefix)/board.h
	@mkdir -p $(dir $(@))
	@cp -f $(<) $(@)
	@cp -f $(dir $(<))*.hpp $(dir $(@)) 2>/dev/null || :
	@cp -f $(dir $(<))*.h $(dir $(@)) 2>/dev/null || :

####################
# Find proper libc #
####################
_local_libc_path := $(call qsee-get-libc32-path,$(subst \/,/,/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)))
_local_libc64_path := $(call qsee-get-libc64-path,$(subst \/,/,/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)))

#################
# Build library #
#################

# TODO:
# Optimize copying files to nhlos.

$(_lib): _local_tmp_src_prefix := $(_local_tmp_src_prefix)
$(_lib): LOCAL_SRC_LIB := $(addprefix $(_local_tmp_src_prefix)/,$(LOCAL_SRC_C) $(LOCAL_SRC_CPP))
$(_lib): LOCAL_SRC_TA := $(addprefix $(_local_tmp_src_prefix)/,$(_local_entry_point) $(_local_secure_memset))
$(_lib): LOCAL_CFLAGS := $(LOCAL_CFLAGS) $(LOCAL_CPPFLAGS)
$(_lib): LOCAL_NAME := $(LOCAL_NAME)
$(_lib): LOCAL_CHIP := $(LOCAL_CHIP)
$(_lib): LOCAL_INCLUDE_DIRS := $(LOCAL_INCLUDE_DIRS) $(_local_tmp_src_prefix)
$(_lib): LOCAL_CUSTOM_LIBS := $(LOCAL_CUSTOM_LIBS)
$(_lib): LOCAL_BSP_DEFINES := $(LOCAL_BSP_DEFINES)
$(_lib): LOCAL_BUILD_TOOL := $(LOCAL_BUILD_TOOL)
$(_lib): LOCAL_QSEE_PROC := $(LOCAL_QSEE_PROC)
$(_lib): LOCAL_QSEE_UNPROTECTED_MEM := $(LOCAL_QSEE_UNPROTECTED_MEM)
$(_lib): LOCAL_IMPRINT_TOOL := $(LOCAL_IMPRINT_TOOL)
$(_lib): LOCAL_LLVM_ROOT := $(subst \/,/,$(LOCAL_LLVM_ROOT))
$(_lib): LOCAL_LLVM_VERSION := $(LOCAL_LLVM_VERSION)
$(_lib): _local_scl_path := $(_local_scl_path)
$(_lib): _local_output_dir := $(_local_output_dir)
$(_lib): _qsee_build_dir := $(_qsee_build_dir)
$(_lib): _qsee_build_script := $(_qsee_build_script)
$(_lib): _qsee_build_output_dir := $(_qsee_build_output_dir)
$(_lib): _sdk_dir := $(_sdk_dir)
$(_lib): _local_tmp_nhlos_path := $(_local_tmp_nhlos_path)
$(_lib): _qsee_new := $(_qsee_new)
$(_lib): _local_qsee_apps_dir := $(_local_qsee_apps_dir)
$(_lib): _local_libc_path := $(_local_libc_path)
$(_lib): _local_libc64_path := $(_local_libc64_path)
$(_lib): _local_standalone_script := $(_local_standalone_script)
$(_lib): _local_build_project_name := $(_local_build_project_name)
$(_lib): _nhlos_chipset_name := $(_nhlos_chipset_name)
$(_lib): $(_local_tmp_nhlos_path) $(LOCAL_CUSTOM_LIBS) $(addprefix $(_local_tmp_src_prefix)/,$(LOCAL_SRC_C) $(LOCAL_SRC_CPP) $(_local_entry_point) $(_local_secure_memset))
	mkdir -p $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/securemsm/trustzone/qsapps/multibuild/build
	mkdir -p $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/bsp/trustzone/qsapps/multibuild/build
	cp -t $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/securemsm/trustzone/qsapps/multibuild/build $(LOCAL_CUSTOM_LIBS) || :
	cp -f $(_sdk_dir)/../tools/templates/qsee/build/SConscript$(_qsee_new) $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/securemsm/trustzone/qsapps/multibuild/build/SConscript
	cp -f $(_sdk_dir)/../tools/templates/qsee/bsp-build/SConscript$(_qsee_new) $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/bsp/trustzone/qsapps/multibuild/build/SConscript
	cd $(_qsee_build_dir); \
	LLVMROOT="/$(LOCAL_LLVM_ROOT)" \
	LLVM_VERSION="$(LOCAL_LLVM_VERSION)" \
	LLVMBIN="/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)/bin" \
	LLVMLIB="/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)/lib/clang/$(LOCAL_LLVM_VERSION)/lib/linux" \
	LLVMINC="$(_local_libc64_path)/include" \
	LLVM32INC="$(_local_libc_path)/include" \
	MUSL32PATH="$(_local_libc_path)" \
	MUSLPATH="$(_local_libc64_path)" \
	LLVMTOOLPATH="/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)/tools/bin" \
	LOCAL_APPS_DIR="$(_local_qsee_apps_dir)" \
	LOCAL_CFLAGS="$(LOCAL_CFLAGS)" \
	LOCAL_NAME="$(LOCAL_NAME)" \
	LOCAL_SRC_LIB="$(LOCAL_SRC_LIB)" \
	LOCAL_SRC_TA="$(LOCAL_SRC_TA)" \
	LOCAL_BUILD_TOOL="$(LOCAL_BUILD_TOOL)" \
	LOCAL_INCLUDE_DIRS="$(LOCAL_INCLUDE_DIRS)" \
	LOCAL_CUSTOM_LIBS="$(LOCAL_CUSTOM_LIBS)" \
	LOCAL_SCL_PATH="$(_local_scl_path)" \
	LOCAL_BSP_DEFINES="$(LOCAL_BSP_DEFINES)" \
	LOCAL_QSEE_PROC="$(LOCAL_QSEE_PROC)" \
	LOCAL_STANDALONE_SCRIPT="$(_local_standalone_script)" \
	LOCAL_QSEE_UNPROTECTED_MEM="$(LOCAL_QSEE_UNPROTECTED_MEM)" \
	$(_qsee_build_script) CHIPSET=$(_nhlos_chipset_name) $(_local_build_project_name)
	mkdir -p $(_local_output_dir)
	cp $(_qsee_build_output_dir)/$(LOCAL_NAME).lib $(@)

############
# Build TA #
############

# TODO:
# Optimize copying files to nhlos.
_local_build_id := $(strip $(call get-qsee-swd-build-id,$(LOCAL_SDK_PATH),$(LOCAL_CHIP)))

# Try to get Build ID obtaining from shell script
ifeq ($(_local_build_id),)
  $(warning LOCAL_SDK_PATH=$(LOCAL_SDK_PATH))
  $(warning LOCAL_CHIP=$(LOCAL_CHIP))
  $(error Can't find BUILD_ID: please set correctly [get-qsee-swd-build-id] in qsee-utils.mk)
endif

_multibuild_mbn := $(_qsee_build_dir)/bin/$(_local_build_id)/unsigned/multibuild.mbn

ifeq ($(LOCAL_LINK_GP_TEE),y)
  include $(_sdk_dir)/../source/gp-api/tee-qsee-fix.mk
endif
_local_src_variable_name := LOCAL_SRC_LIB
ifeq ($(LOCAL_CHIP),$(filter $(LOCAL_CHIP),sdm670 sdm845 sdm439 sm6150 sm7150 sm7225 sm7250 sm8150 sm8250))
  _local_src_variable_name := LOCAL_SRC_TA
endif

$(_bin): _multibuild_mbn := $(_multibuild_mbn)
$(_bin): LOCAL_SDK_PATH := $(LOCAL_SDK_PATH)
$(_bin): _qsee_build_dir := $(_qsee_build_dir)
$(_bin): _local_build_id := $(_local_build_id)
$(_bin): _qsee_qsapp_build_dir := $(call get-qsee-qsapp-build-dir,$(_local_tmp_nhlos_path),$(_local_qsee_apps_dir))/$(_local_build_id)$(if $(filter sm7225 sm7250,$(LOCAL_CHIP)),/$(LOCAL_QSEE_PROC))
$(_bin): _local_tmp_src_prefix := $(_local_tmp_src_prefix)
$(_bin): LOCAL_CFLAGS := $(LOCAL_CFLAGS) $(LOCAL_CPPFLAGS)
$(_bin): LOCAL_NAME := $(LOCAL_NAME)
$(_bin): LOCAL_SRC_TA := $(addprefix $(_local_tmp_src_prefix)/,$(LOCAL_SRC_C) $(LOCAL_SRC_CPP) $(_local_secure_memset) $(_local_additional_src))
$(_bin): LOCAL_CHIP := $(LOCAL_CHIP)
$(_bin): LOCAL_INCLUDE_DIRS := $(LOCAL_INCLUDE_DIRS) $(_local_tmp_src_prefix)
$(_bin): LOCAL_CUSTOM_LIBS := $(LOCAL_CUSTOM_LIBS)
$(_bin): LOCAL_BSP_DEFINES := $(LOCAL_BSP_DEFINES)
$(_bin): LOCAL_BUILD_TOOL := $(LOCAL_BUILD_TOOL)
$(_bin): LOCAL_QSEE_PROC := $(LOCAL_QSEE_PROC)
$(_bin): LOCAL_QSEE_UNPROTECTED_MEM := $(LOCAL_QSEE_UNPROTECTED_MEM)
$(_bin): LOCAL_UUID := $(LOCAL_UUID)
$(_bin): LOCAL_IMPRINT_TOOL := $(LOCAL_IMPRINT_TOOL)
$(_bin): LOCAL_QSEE_SERVICES := $(strip $(LOCAL_DRIVER_ID))
$(_bin): LOCAL_QSEE_ACCEPT_BUFFER_SIZE := $(strip $(LOCAL_QSEE_ACCEPT_BUFFER_SIZE))
$(_bin): LOCAL_QSEE_PRIVILEGES := $(strip $(LOCAL_QSEE_PRIVILEGES))
$(_bin): LOCAL_LLVM_ROOT := $(subst \/,/,$(LOCAL_LLVM_ROOT))
$(_bin): LOCAL_LLVM_VERSION := $(LOCAL_LLVM_VERSION)
$(_bin): _local_scl_path := $(_local_scl_path)
$(_bin): _local_output_dir := $(_local_output_dir)
$(_bin): _qsee_build_script := $(_qsee_build_script)
$(_bin): _sdk_dir := $(_sdk_dir)
$(_bin): _local_tmp_nhlos_path := $(_local_tmp_nhlos_path)
$(_bin): _qsee_new := $(_qsee_new)
$(_bin): _local_libc_path := $(_local_libc_path)
$(_bin): _local_libc64_path := $(_local_libc64_path)
$(_bin): _local_qsee_apps_dir := $(_local_qsee_apps_dir)
$(_bin): _local_src_variable_name := $(_local_src_variable_name)
$(_bin): _local_standalone_script := $(_local_standalone_script)
$(_bin): _local_build_project_name := $(_local_build_project_name)
$(_bin): _nhlos_chipset_name := $(_nhlos_chipset_name)
$(_bin): $(_local_tmp_nhlos_path) $(LOCAL_CUSTOM_LIBS) $(addprefix $(_local_tmp_src_prefix)/,$(LOCAL_SRC_C) $(LOCAL_SRC_CPP) $(_local_secure_memset) $(_local_additional_src))
	mkdir -p $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/securemsm/trustzone/qsapps/multibuild/build
	mkdir -p $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/bsp/trustzone/qsapps/multibuild/build
	cp -t $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/securemsm/trustzone/qsapps/multibuild/build $(LOCAL_CUSTOM_LIBS) || :
	cp -f $(_sdk_dir)/../tools/templates/qsee/build/SConscript$(_qsee_new) $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/securemsm/trustzone/qsapps/multibuild/build/SConscript
	cp -f $(_sdk_dir)/../tools/templates/qsee/bsp-build/SConscript$(_qsee_new) $(_local_tmp_nhlos_path)/trustzone_images/$(_local_qsee_apps_dir)/bsp/trustzone/qsapps/multibuild/build/SConscript
	rm -f $(_multibuild_mbn)
	cd $(_qsee_build_dir); \
	LLVMROOT="/$(LOCAL_LLVM_ROOT)" \
	LLVM_VERSION="$(LOCAL_LLVM_VERSION)" \
	LLVMBIN="/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)/bin" \
	LLVMLIB="/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)/lib/clang/$(LOCAL_LLVM_VERSION)/lib/linux" \
	LLVMINC="$(_local_libc64_path)/include" \
	LLVM32INC="$(_local_libc_path)/include" \
	MUSL32PATH="$(_local_libc_path)" \
	MUSLPATH="$(_local_libc64_path)" \
	LLVMTOOLPATH="/$(LOCAL_LLVM_ROOT)/$(LOCAL_LLVM_VERSION)/tools/bin" \
	LOCAL_APPS_DIR="$(_local_qsee_apps_dir)" \
	LOCAL_CFLAGS="$(LOCAL_CFLAGS)" \
	LOCAL_NAME="$(LOCAL_NAME)" \
	$(_local_src_variable_name)="$(LOCAL_SRC_TA)" \
	LOCAL_UUID="$(LOCAL_UUID)" \
	LOCAL_INCLUDE_DIRS="$(LOCAL_INCLUDE_DIRS)" \
	LOCAL_CUSTOM_LIBS="$(LOCAL_CUSTOM_LIBS)" \
	LOCAL_BUILD_TOOL="$(LOCAL_BUILD_TOOL)" \
	LOCAL_SCL_PATH="$(_local_scl_path)" \
	LOCAL_BSP_DEFINES="$(_local_bsp_defines)" \
	LOCAL_QSEE_PROC="$(LOCAL_QSEE_PROC)" \
	LOCAL_QSEE_UNPROTECTED_MEM="$(LOCAL_QSEE_UNPROTECTED_MEM)" \
	LOCAL_QSEE_ACCEPT_BUFFER_SIZE="$(LOCAL_QSEE_ACCEPT_BUFFER_SIZE)" \
	LOCAL_IMPRINT_TOOL="$(LOCAL_IMPRINT_TOOL)" \
	LOCAL_QSEE_SERVICES="$(LOCAL_QSEE_SERVICES)" \
	LOCAL_QSEE_PRIVILEGES="$(LOCAL_QSEE_PRIVILEGES)" \
	LOCAL_STANDALONE_SCRIPT="$(_local_standalone_script)" \
	$(_qsee_build_script) CHIPSET=$(_nhlos_chipset_name) $(_local_build_project_name)
	mkdir -p $(dir $(@))
	cp $(_multibuild_mbn) $(@)
	-[ "${LOCAL_CHIP:sm%=%}" != "${LOCAL_CHIP}" ] && $(LOCAL_IMPRINT_TOOL) $(@)
	cp $(_qsee_qsapp_build_dir)/multibuild.elf $(basename $(@)).elf

###########################################################
# Copy and patch nhlos to keep the original one untouched #
##########################################################

# This kind of dark magic must be prohibited and it's
# fellows must be eternally cursed after being purified with fire.
# However, there is no other way to use out-of-the-box nhlos.
# There are several SConscript files inside nhlos itself that
# must be modified to make build successful.

# Define the suitable ancestor for hitch and expansion after it.
ifeq ($(LOCAL_QSEE_PROC),A53_64)
  $(LOCAL_QSEE_PROC)_local_parent_app := sampleauth
  $(LOCAL_QSEE_PROC)_local_parent_app_caps := SAMPLEAUTH
  $(LOCAL_QSEE_PROC)_local_applib_dir := qsee64
  _local_apps_suffix := 64
else
  $(LOCAL_QSEE_PROC)_local_parent_app := sampleapp
  $(LOCAL_QSEE_PROC)_local_parent_app_caps := SAMPLEAPP
  $(LOCAL_QSEE_PROC)_local_applib_dir := qsee
  _local_apps_suffix := 32
endif

ifneq ($($(_local_tmp_nhlos_path_base)_defined),y)
# These scripts intended to parse, to find the patterns and to inject the dose of raise.
_local_sed_script := "s/'$($(LOCAL_QSEE_PROC)_local_parent_app_caps)_IMAGE'/&, 'MULTIBUILD_IMAGE'/g"
_local_sed_script_heavy := "s/\(\(elif\|if\)\(.*\)'$($(LOCAL_QSEE_PROC)_local_parent_app_caps)_IMAGE')\)/\1 or\3'MULTIBUILD_IMAGE')/g;/Add\(BinaryObject|BinaryLibrary|LibsToImage\)\?.*('$($(LOCAL_QSEE_PROC)_local_parent_app_caps)_IMAGE'/p;s/\(Add\(BinaryObject|BinaryLibrary|LibsToImage\)\?.*\)('$($(LOCAL_QSEE_PROC)_local_parent_app_caps)_IMAGE'/\1('MULTIBUILD_IMAGE'/g"
_local_sed_script_license := "s/export ARMLMD_LICENSE_FILE=.*/export ARMLMD_LICENSE_FILE=$(LOCAL_ARMCC_LICENSE)/g"
_local_sed_script_path := "s|export ARM_COMPILER_PATH=.*|export ARM_COMPILER_PATH=$(LOCAL_ARMCC_PATH)|g;s/[\#export ]*LLVMROOT\s*=.*$$/export LLVMROOT=\/$(LOCAL_LLVM_ROOT)\/$(LOCAL_LLVM_VERSION)/g;s/[\#export ]*GNUROOT\s*=.*$$/export GNUROOT=\/$(LOCAL_AARCH64_ROOT)/g;s/[\#export ]*GNUARM7\s*=.*$$/export GNUARM7=\/$(LOCAL_ARM7_ROOT)/g"
_local_sed_script_config := 's/<alias [^q]*qsee\"[^\/]*\/>//g;s/opt\/python2.7/usr\/bin/g;s/sampleapp/multibuild/g;1h;1!H;$${g;s/<var name=\"LLVM_APPS\"[^>]*/<var name=\"LLVM_APPS\" value=\"$(LOCAL_LLVM_ROOT)\" intermediate=\"true\" \//;s/<var name=\"LLVM_VERSION\"[^>]*/<var name=\"LLVM_VERSION\" value=\"$(LOCAL_LLVM_VERSION)\" intermediate=\"true\" \//g;s/<var name=\"CLANG_VERSION\"[^>]*/<var name=\"CLANG_VERSION" value=\"$(LOCAL_LLVM_VERSION)\" intermediate=\"true\" \//g;p;}'
_local_sed_script_secimage := "s/tz_lib/multibuild/g; t; s/sampleauth/multibuild/g" # <tz_lib> because it's available in all secimage.xml (but it is absent in sdm439, so replace the 'sampleauth' then
_local_sed_script_ld := "s/data_section_base.*/&\n\*(.data.\* .bss.\*)/g"
_local_sed_script_bsp_sm8150 := "s/for app in apps$(_local_apps_suffix).*/apps$(_local_apps_suffix).append\(\"\$$\{BUILD_ROOT\}\/ssg\/securemsm\/trustzone\/qsapps\/multibuild\/build\/SConscript\"\)\n&/g"
_local_sed_script_config_deploy := "/\<var description=\"Bin directory for the expected standard Python installation/d"

# This is a patches where we will be searched.
$(_local_tmp_nhlos_path_base): LOCAL_SDK_PATH := $(LOCAL_SDK_PATH)
$(_local_tmp_nhlos_path_base): _local_sconscripts := $(_local_tmp_nhlos_path_base)/trustzone_images/core/kernel/libstd/build/ \
                                                $(_local_tmp_nhlos_path_base)/trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/proxy/build/
$(_local_tmp_nhlos_path_base): _local_sconscripts_heavy := $(_local_tmp_nhlos_path_base)/trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/common_applib/build/ \
                                                $(_local_tmp_nhlos_path_base)/trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/$($(LOCAL_QSEE_PROC)_local_applib_dir)/build/
$(_local_tmp_nhlos_path_base): _local_sed_script := $(_local_sed_script)
$(_local_tmp_nhlos_path_base): _local_sed_script_heavy := $(_local_sed_script_heavy)
$(_local_tmp_nhlos_path_base): _local_sed_script_license := $(_local_sed_script_license)
$(_local_tmp_nhlos_path_base): _local_sed_script_path := $(_local_sed_script_path)
$(_local_tmp_nhlos_path_base): _local_sed_script_config := $(_local_sed_script_config)
$(_local_tmp_nhlos_path_base): _qsee_build_dir_base := $(_qsee_build_dir_base)
$(_local_tmp_nhlos_path_base): _local_sed_script_secimage := $(_local_sed_script_secimage)
$(_local_tmp_nhlos_path_base): _local_sed_script_ld := $(_local_sed_script_ld)
$(_local_tmp_nhlos_path_base): _local_sed_script_bsp_sm8150 := $(_local_sed_script_bsp_sm8150)
$(_local_tmp_nhlos_path_base): LOCAL_CHIP := $(LOCAL_CHIP)
$(_local_tmp_nhlos_path_base):
	@echo "*****************"
	@echo "* COPYING NHLOS *"
	@echo "*****************"
	mkdir -p $(@)
	rsync -r --force --chmod=+w \
	      --exclude='*.pyc' \
	      --exclude='LOGFILE*.txt' \
	      --exclude='*log.txt' \
	      --exclude='*.log' \
	      --exclude='*.exe' \
	      --exclude='*.elf' \
	      $(LOCAL_SDK_PATH)/trustzone_images $(@)
	for x in $(_local_sconscripts) $(_local_sconscripts_heavy); do \
		if [ -d $$x/$($(LOCAL_QSEE_PROC)_local_parent_app) ]; then \
		ln -sf $$x/$($(LOCAL_QSEE_PROC)_local_parent_app) $$x/multibuild; \
		fi \
	done || :
	-find $(_local_sconscripts_heavy) -maxdepth 1 -name SConscript -type f -exec sed -i".backup" -e $(_local_sed_script_heavy) {} \;
	-find $(_local_sconscripts) -maxdepth 1 -name SConscript -type f -exec sed -i".backup" -e $(_local_sed_script) {} \;
	-find $(_qsee_build_dir_base) -maxdepth 1 -name "*.sh" -type f -exec sed -i".backup" -e $(_local_sed_script_license) -e $(_local_sed_script_path) {} \;
	-[ "${LOCAL_CHIP:sm%=%}" != "${LOCAL_CHIP}" ] && sed -i"*.backup" -e $(_local_sed_script_ld) "$(@)/trustzone_images/ssg/bsp/build/scripts/secureapp.ld"
	-[ "${LOCAL_CHIP:sm%=%}" != "${LOCAL_CHIP}" ] && sed -i"*.backup" -e $(_local_sed_script_ld) "$(@)/trustzone_images/ssg/bsp/build/scripts/secureapp64.ld"
	-[ "${LOCAL_CHIP:sm%=%}" != "${LOCAL_CHIP}" ] && sed -i"*.backup" -e $(_local_sed_script_bsp_sm8150) "$(@)/trustzone_images/ssg/bsp/trustzone/build/SConscript"
	-[ "${LOCAL_CHIP:sdm429%=%}" != "${LOCAL_CHIP}" ] && sed -i"*.backup" -e $(_local_sed_script_ld) "$(@)/trustzone_images/core/bsp/build/scripts/secureapp.ld"
	-[ "${LOCAL_CHIP:sdm429%=%}" != "${LOCAL_CHIP}" ] && sed -i"*.backup" -e $(_local_sed_script_ld) "$(@)/trustzone_images/core/bsp/build/scripts/secureapp64.ld"
	-[ "${LOCAL_CHIP:sm%=%}" != "${LOCAL_CHIP}" ] && cp -f $(@)/trustzone_images/build/ms/build_config_deploy.xml $(@)/trustzone_images/build/ms/build_config.xml
	-[ "$(LOCAL_CHIP)" = "sm6150" ] && cp -f $(@)/trustzone_images/build/ms/bin/PAZAANAA/build_config_deploy.xml/build_config_deploy.xml $(@)/trustzone_images/build/ms/build_config.xml
	-[ "$(LOCAL_CHIP)" = "sm7150" ] && cp -f $(@)/trustzone_images/build/ms/bin/QAOAANAA/build_config_deploy.xml/build_config_deploy.xml $(@)/trustzone_images/build/ms/build_config.xml
	-[ "$(LOCAL_CHIP)" = "sdm845" ] && sed -i"*.backup" -e $(_local_sed_script_ld) "$(@)/trustzone_images/ssg/bsp/build/scripts/secureapp.ld"
	-[ "$(LOCAL_CHIP)" = "sdm845" ] && sed -i"*.backup" -e $(_local_sed_script_ld) "$(@)/trustzone_images/ssg/bsp/build/scripts/secureapp64.ld"
	-[ "$(LOCAL_CHIP)" = "sdm845" ] && cp -f $(@)/trustzone_images/build/ms/build_config.xml $(@)/trustzone_images/build/ms/build_config.xml.backup && cp -f $(@)/trustzone_images/build/ms/build_config_deploy.xml $(@)/trustzone_images/build/ms/build_config.xml
	-[ -f "$(@)/trustzone_images/build/ms/build_config.xml" ] && sed -n -i"*.backup" -e $(_local_sed_script_config) "$(@)/trustzone_images/build/ms/build_config.xml"
	touch $(_qsee_build_dir_base)/board.h
	mkdir -p $(@)/trustzone_images/apps/securemsm/trustzone/qsapps
	mkdir -p $(_qsee_build_dir_base)/../../../boot_images/build/ms/ && touch $(_qsee_build_dir_base)/../../../boot_images/build/ms/board.h
	-sed -i -e $(_local_sed_script_secimage) $(call get-qsee-secimage-xml,$(LOCAL_SDK_PATH),$(@))
	# Remove the hard-coded path to python2.7 for SDM710 build
	-sed -i"*.backup" -i $(_local_sed_script_config_deploy) "$(@)/trustzone_images/build/ms/build_config_deploy.xml"

$(_local_tmp_nhlos_path_base)-clean: _local_tmp_nhlos_path_base := $(_local_tmp_nhlos_path_base)
$(_local_tmp_nhlos_path_base)-clean:
	rm -rf $(_local_tmp_nhlos_path_base)

ifneq ($(LOCAL_TARGET_NAME),)
$(LOCAL_TARGET_NAME)-clean: $(_local_tmp_nhlos_path_base)-clean
endif

$(_local_tmp_nhlos_path_base)_defined := y
endif

$(_local_tmp_nhlos_path): _local_tmp_nhlos_path_base := $(strip $(_local_tmp_nhlos_path_base))
$(_local_tmp_nhlos_path): $(_local_tmp_nhlos_path_base)
	mkdir -p $(@)
	cp -rl  $(_local_tmp_nhlos_path_base)/* $(@)

$(_local_tmp_nhlos_path)-clean: _local_tmp_nhlos_path := $(_local_tmp_nhlos_path)
$(_local_tmp_nhlos_path)-clean:
	rm -rf $(_local_tmp_nhlos_path)

#########################
# Default clean targets #
#########################

include $(_sdk_dir)/build-binary-goal-clean.mk
