#===================================================================================================
#                         THIS INFORMATION IS PROPRIETARY TO BROADCOM CORP
#---------------------------------------------------------------------------------------------------
#                                Copyright (c) 2018 Broadcom Corp.
#                                       ALL RIGHTS RESERVED
#===================================================================================================
#! \file
#!
#! Makefile include defining how to build executable.
#
#===================================================================================================

ROOTDIR = ..

LIBDIR = $(ROOTDIR)/lib
LIBVENDDIR = $(ROOTDIR)/lib_vend
SRCDIR = $(ROOTDIR)/src

-include $(ROOTDIR)/version.inc
include $(LIBDIR)/support_libs.inc
include $(LIBVENDDIR)/support_vend_libs.inc
include $(SRCDIR)/make_vend.inc

INCS += -I $(ROOTDIR)/include

#DEFS += -DHACK_VEND_SP_TOBE_MSBC
#DEFS += -DHACK_VEND_AU_TOBE_SBC

ifeq ($(ENABLE_LESS_DELAY_INEAR),y)
DEFS += -DENABLE_LESS_DELAY_INEAR
endif

#---------------------------------------------------------------------------------------------------
# add codec objects
#---------------------------------------------------------------------------------------------------

TARGET_LIBS = $(addprefix $(LIBDIR)/,$(addsuffix .a,$(SUPPORT_LIBS)))
TARGET_LIBS_AU += $(addprefix $(BLD_DIR_AU)/lib_vend/,$(addsuffix .a,$(SUPPORT_LIBS_AU_VEND)))
TARGET_LIBS_SP += $(addprefix $(BLD_DIR_SP)/lib_vend/,$(addsuffix .a,$(SUPPORT_LIBS_SP_VEND)))

OBJS_COMMON += $(TARGET_LIBS)

OBJS_AU += $(TARGET_LIBS_AU)
OBJS_AU += $(TARGET_LIBS)

OBJS_SP += $(TARGET_LIBS_SP)
OBJS_SP += $(TARGET_LIBS)

#---------------------------------------------------------------------------------------------------
# compiler option flags
#---------------------------------------------------------------------------------------------------

COMMON_FLAGS = --xtensa-system=$(XTENSA_SYSTEM) --xtensa-core=$(XTENSA_CORE)

CXX_FLAGS  = -c
# Add dependencies check
CXX_FLAGS += -MD -MP
# Add debug flags
CXX_FLAGS += -g
# Add warning flags
CXX_FLAGS += -Wall -Werror
# Add optimization flags
CXX_FLAGS += -O3 -Os

#CXX_FLAGS += -ffunction-sections
CXX_FLAGS += -mcoproc -mlongcalls
CXX_FLAGS += -INLINE:requested -mno-mul16 -mno-mul32 -mno-div32
CXX_FLAGS += -fmessage-length=0
CPP_FLAGS = $(CXX_FLAGS)
C_FLAGS = $(CXX_FLAGS)


INCS += -nostdlib -L $(LIBDIR)


# Define LSP
LD_FLAGS_OCD_COMMON = -mlsp=lsp/gdbio_common
LD_FLAGS_OCD_COMMON += -L $(LIBDIR)
LD_FLAGS_OCD_COMMON += -Wl,-Map,$(patsubst %.elf,%.map,$@)

LD_FLAGS_OCD_AUDIO = -mlsp=lsp/gdbio_audio
LD_FLAGS_OCD_AUDIO += -L $(LIBDIR)
LD_FLAGS_OCD_AUDIO += -Wl,-Map,$(patsubst %.elf,%.map,$@)

LD_FLAGS_OCD_SPEECH = -mlsp=lsp/gdbio_speech
LD_FLAGS_OCD_SPEECH += -L $(LIBDIR)
LD_FLAGS_OCD_SPEECH += -Wl,-Map,$(patsubst %.elf,%.map,$@)


LD_FLAGS_OCD_TDB_COMMON = -mlsp=lsp/gdbio_trace_common
LD_FLAGS_OCD_TDB_COMMON += -Wl,-Map,$(patsubst %.elf,%.tracedb.map,$@)

LD_FLAGS_OCD_TDB_AUDIO = -mlsp=lsp/gdbio_trace_audio
LD_FLAGS_OCD_TDB_AUDIO += -Wl,-Map,$(patsubst %.elf,%.tracedb.map,$@)

LD_FLAGS_OCD_TDB_SPEECH = -mlsp=lsp/gdbio_trace_speech
LD_FLAGS_OCD_TDB_SPEECH += -Wl,-Map,$(patsubst %.elf,%.tracedb.map,$@)

# gen asm
GENERATE_ASM_FILE = $(XT_OBJDUMP) -d $@ > $(patsubst %.elf,%.asm,$@)

ifeq ($(ARCH_OSTYPE),unix)
TOOLDIR = ../../$(ROOTDIR)/scripts
GENERATE_BIN_COMMON = $(PERL) -I $(TOOLDIR) $(TOOLDIR)/elf2bin_common.pl -BASELINE_VER=$(BASELINE_VER) $@
GENERATE_BIN_OVERLAY = $(PERL) -I $(TOOLDIR) $(TOOLDIR)/elf2bin_overlay.pl -BASELINE_VER=$(BASELINE_VER) $@
GENERATE_TRACEDB = $(PERL) -I $(TOOLDIR) $(TOOLDIR)/elf2tracedb_multiproc_gnu.pl
else
TOOLDIR = tools
GENERATE_BIN_COMMON = $(TOOLDIR)\elf2bin_common.exe -BASELINE_VER=$(BASELINE_VER) $@
GENERATE_BIN_OVERLAY = $(TOOLDIR)\elf2bin_overlay.exe -BASELINE_VER=$(BASELINE_VER) $@
GENERATE_TRACEDB = $(TOOLDIR)\elf2tracedb_multiproc_gnu.exe
endif



# Preserve original timestamp
RENAME_FLAG = -p

# Rename sections
RENAME_FLAG += --rename-section .literal=.iram0_overlay.literal
RENAME_FLAG += --rename-section .text=.iram0_overlay.text
RENAME_FLAG += --rename-section .rodata=.dram0_overlay.rodata
RENAME_FLAG += --rename-section .rodata.str1.4=.dram0_overlay.rodata
RENAME_FLAG += --rename-section .bss=.dram0_overlay.bss
RENAME_FLAG += --rename-section .data=.dram0_overlay.data

#---------------------------------------------------------------------------------------------------
# rules
#---------------------------------------------------------------------------------------------------

# Rule to build regenerate codec library with different section tag
$(BLD_DIR_AU)/lib_vend/%.a: ../lib_vend/%.a
	@$(call make_parent_dir,$(@D))
	$(XT_OBJCOPY) $(RENAME_FLAG) $< $@

$(BLD_DIR_SP)/lib_vend/%.a: ../lib_vend/%.a
	@$(call make_parent_dir,$(@D))
	$(XT_OBJCOPY) $(RENAME_FLAG) $< $@


#---------------------------------------------------------------------------------------------------
# Targets
#---------------------------------------------------------------------------------------------------

clean_au:
	@$(call remove_file_exist,$(BLD_DIR_AU)/$(TARGET_AU))
	@$(call remove_file_exist,$(patsubst %.elf,%.asm,$(BLD_DIR_AU)/$(TARGET_AU)))
	@$(call remove_file_exist,$(patsubst %.elf,%.map,$(BLD_DIR_AU)/$(TARGET_AU)))


$(BLD_DIR_AU)/$(TARGET_AU): clean_au $(OBJS_AU)
	$(CXX_FOR_TARGET) -Wl,--start-group $(OBJS_AU) -Wl,--end-group $(LD_FLAGS_OCD_AUDIO) $(COMMON_FLAGS) -o $@
	@$(GENERATE_ASM_FILE)
	@$(call print,"---------------- Generating bin files for downloading from FLASH -------------------------")
#	@$(call remove_dir_silent,$(OUTPUTDIR))
#	@$(call make_parent_dir,$(OUTPUTDIR))
	@$(GENERATE_BIN_COMMON)
#	$(call copy_silent,$(BLD_DIR_AU)/$(patsubst %.elf,%.sflash.bin,$(TARGET_AU)),$(OUTPUTDIR)/dsp_$(patsubst %.elf,%_common.sflash.bin,$(TARGET_AU)))
	@$(GENERATE_BIN_OVERLAY)
	$(call copy_silent,$(BLD_DIR_AU)/$(patsubst %.elf,%.sflash.bin,$(TARGET_AU)),$(OUTPUTDIR)/dsp_$(patsubst %.elf,%_overlay.sflash.bin,$(TARGET_AU)))
	@$(call print,"-------------------------- Generate TRACE DB ---------------------------------------------")
	$(CXX_FOR_TARGET) -Wl,--start-group $(OBJS_AU) -Wl,--end-group $(LD_FLAGS_OCD_TDB_AUDIO) $(COMMON_FLAGS) -o $(BLD_DIR_AU)/$(patsubst %.elf,%.tracedb.elf,$(TARGET_AU))
	@$(GENERATE_TRACEDB) $(BLD_DIR_AU)/$(patsubst %.elf,%.tracedb.elf,$(TARGET_AU)) > $(BLD_DIR_AU)/$(patsubst %.elf,%_overlay_dsp_tracedb.txt,$(TARGET_AU))
	$(call copy_silent,$(BLD_DIR_AU)/$(patsubst %.elf,%_overlay_dsp_tracedb.txt,$(TARGET_AU)),$(OUTPUTDIR))
	@$(call print,"---------------------------Code size summary ---------------------------------------------")
	@$(SIZE_FOR_TARGET) -C $@



clean_sp:
	@$(call remove_file_exist,$(BLD_DIR_SP)/$(TARGET_SP))
	@$(call remove_file_exist,$(patsubst %.elf,%.asm,$(BLD_DIR_SP)/$(TARGET_SP)))
	@$(call remove_file_exist,$(patsubst %.elf,%.map,$(BLD_DIR_SP)/$(TARGET_SP)))

$(BLD_DIR_SP)/$(TARGET_SP): clean_sp $(OBJS_SP)
	$(CXX_FOR_TARGET) -Wl,--start-group $(OBJS_SP) -Wl,--end-group $(LD_FLAGS_OCD_SPEECH) $(COMMON_FLAGS) -o $@
	@$(GENERATE_ASM_FILE)
	@$(call print,"---------------- Generating bin files for downloading from FLASH -------------------------")
	@$(GENERATE_BIN_COMMON)
#	$(call copy_silent,$(BLD_DIR_SP)/$(patsubst %.elf,%.sflash.bin,$(TARGET_SP)),$(OUTPUTDIR)/dsp_$(patsubst %.elf,%_common.sflash.bin,$(TARGET_SP)))
	@$(GENERATE_BIN_OVERLAY)
	$(call copy_silent,$(BLD_DIR_SP)/$(patsubst %.elf,%.sflash.bin,$(TARGET_SP)),$(OUTPUTDIR)/dsp_$(patsubst %.elf,%_overlay.sflash.bin,$(TARGET_SP)))
	@$(call print,"-------------------------- Generate TRACE DB ---------------------------------------------")
	$(CXX_FOR_TARGET) -Wl,--start-group $(OBJS_SP) -Wl,--end-group $(LD_FLAGS_OCD_TDB_SPEECH) $(COMMON_FLAGS) -o $(BLD_DIR_SP)/$(patsubst %.elf,%.tracedb.elf,$(TARGET_SP))
	@$(GENERATE_TRACEDB) $(BLD_DIR_SP)/$(patsubst %.elf,%.tracedb.elf,$(TARGET_SP)) > $(BLD_DIR_SP)/$(patsubst %.elf,%_overlay_dsp_tracedb.txt,$(TARGET_SP))
	$(call copy_silent,$(BLD_DIR_SP)/$(patsubst %.elf,%_overlay_dsp_tracedb.txt,$(TARGET_SP)),$(OUTPUTDIR))
	@$(call print,"---------------------------Code size summary ---------------------------------------------")
	@$(SIZE_FOR_TARGET) -C $@


clean_common:
	@$(call remove_file_exist,$(BLD_DIR_COMMON)/$(TARGET_COMMON))
	@$(call remove_file_exist,$(patsubst %.elf,%.asm,$(BLD_DIR_COMMON)/$(TARGET_COMMON)))
	@$(call remove_file_exist,$(patsubst %.elf,%.map,$(BLD_DIR_COMMON)/$(TARGET_COMMON)))

$(BLD_DIR_COMMON)/$(TARGET_COMMON): clean_common $(OBJS_COMMON)
	$(CXX_FOR_TARGET) -Wl,--start-group $(OBJS_COMMON) -Wl,--end-group $(LD_FLAGS_OCD_COMMON) $(COMMON_FLAGS) -o $@
	@$(GENERATE_ASM_FILE)
	@$(call print,"---------------- Generating bin files for downloading from FLASH -------------------------")
	@$(call remove_dir_silent,$(OUTPUTDIR))
	@$(call make_parent_dir,$(OUTPUTDIR))
	$(GENERATE_BIN_COMMON)
	@$(call copy_silent,$(BLD_DIR_COMMON)/$(patsubst %.elf,%.sflash.bin,$(TARGET_COMMON)),$(OUTPUTDIR)/dsp_$(patsubst %.elf,%_common.sflash.bin,$(TARGET_COMMON)))
#	@$(GENERATE_BIN_OVERLAY)
#	@$(call copy_silent,$(BLD_DIR_COMMON)/$(patsubst %.elf,%.sflash.bin,$(TARGET_COMMON)),$(OUTPUTDIR)/dsp_$(patsubst %.elf,%_overlay.sflash.bin,$(TARGET_COMMON)))
	@$(call print,"-------------------------- Generate TRACE DB ---------------------------------------------")
	$(CXX_FOR_TARGET) -Wl,--start-group $(OBJS_COMMON) -Wl,--end-group $(LD_FLAGS_OCD_TDB_COMMON) $(COMMON_FLAGS) -o $(BLD_DIR_COMMON)/$(patsubst %.elf,%.tracedb.elf,$(TARGET_COMMON))
	@$(GENERATE_TRACEDB) $(BLD_DIR_COMMON)/$(patsubst %.elf,%.tracedb.elf,$(TARGET_COMMON)) > $(BLD_DIR_COMMON)/$(patsubst %.elf,%_dsp_tracedb.txt,$(TARGET_COMMON))
	$(call copy_silent,$(BLD_DIR_COMMON)/$(patsubst %.elf,%_dsp_tracedb.txt,$(TARGET_COMMON)),$(OUTPUTDIR))
	@$(call print,"---------------------------Code size summary ---------------------------------------------")
	@$(SIZE_FOR_TARGET) -C $@




