#
# Copyright (C) 2018 Cadence Design Systems, Inc.
# 
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to use this Software with Cadence processor cores only and 
# not with any other processors and platforms, subject to
# the following conditions:
# 
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#

QUIET =
MAPFILE  = map_$(CODEC_NAME).txt
LDSCRIPT = ldscript_$(CODEC_NAME).txt
SYMFILE  = symbols_$(CODEC_NAME).txt
ELFTOBIN = $(ROOTDIR)/build_hikey/tools/elftobin.sh

ifeq ($(CPU), gcc)
    S = /
    AR = ar
    OBJCOPY = objcopy
    CC = gcc
    CXX = g++
    CFLAGS += -fno-exceptions -DCSTUB=1
    CFLAGS += -ffloat-store 
    CFLAGS += -DHIFI3_CSTUB
    RM = rm -f
    RM_R = rm -rf
    MKPATH = mkdir -p
    CP = cp -f
    INCLUDES += \
    -I$(ROOTDIR)/test/include
else
    AR = xt-ar $(XTCORE)
    OBJCOPY = xt-objcopy $(XTCORE)
    CC = xt-xcc $(XTCORE)
    CXX = xt-xc++ $(XTCORE)
    ISS = xt-run $(XTCORE)
    CONFIGDIR := $(shell $(ISS) --show-config=config)
    include $(CONFIGDIR)/misc/hostenv.mk
    #CFLAGS += -Wall 
    #CFLAGS += -Werror 
    #CFLAGS += -mno-mul16 -mno-mul32 -mno-div32 -fsigned-char -fno-exceptions -mlongcalls -INLINE:requested -mcoproc -fno-zero-initialized-in-bss
    CFLAGS += -mlongcalls -mtext-section-literals
    ASMFLAGS += -mlongcalls
endif

OBJDIR = objs$(S)$(CODEC_NAME)
LIBDIR = $(ROOTDIR)$(S)lib

OBJ_LIBO2OBJS = $(addprefix $(OBJDIR)/,$(LIBO2OBJS))
OBJ_LIBOSOBJS = $(addprefix $(OBJDIR)/,$(LIBOSOBJS))
OBJ_LIBO2CPPOBJS = $(addprefix $(OBJDIR)/,$(LIBO2CPPOBJS))
OBJ_LIBOSCPPOBJS = $(addprefix $(OBJDIR)/,$(LIBOSCPPOBJS))
OBJ_LIBASMOBJS = $(addprefix $(OBJDIR)/,$(LIBASMOBJS))

TEMPOBJ = temp.o    

ifeq ($(CPU), gcc)
    LIBOBJ   = $(OBJDIR)/xgcc_$(CODEC_NAME).o
    LIB      = xgcc_$(CODEC_NAME).img
else
    LIBOBJ   = $(OBJDIR)/xa_$(CODEC_NAME).o
    LIB      = xa_$(CODEC_NAME).img
endif

CFLAGS += \
    $(EXTRA_CFLAGS) $(EXTRA_CFLAGS2)


ifeq ($(DEBUG),1)
  NOSTRIP = 1
  OPT_O2 = -O0 -g 
  OPT_OS = -O0 -g
  CFLAGS += -DDEBUG
else
ifeq ($(CPU), gcc)
  OPT_O2 = -O2 -g 
  OPT_OS = -O2 -g 
else
  #OPT_O2 = -O3 -LNO:simd 
  OPT_O2 = -g -O2 
  OPT_OS = -Os 
endif
endif

OPT_ASM = -g -Wa,--gdwarf-2


all: $(OBJDIR) $(LIB) 
$(CODEC_NAME): $(OBJDIR) $(LIB) 

install: $(LIB)
	@echo "Installing $(LIB)"
	$(QUIET) -$(MKPATH) "$(LIBDIR)"
	$(QUIET) $(CP) $(LIB) "$(LIBDIR)"

$(OBJDIR):
	$(QUIET) -$(MKPATH) $@

ifeq ($(NOSTRIP), 1)
$(LIBOBJ): $(OBJ_LIBO2OBJS) $(OBJ_LIBOSOBJS) $(OBJ_LIBO2CPPOBJS) $(OBJ_LIBOSCPPOBJS) $(OBJ_LIBASMOBJS) $(PLUGINLIBS)
	@echo "Linking Objects"
	$(QUIET) $(CXX) -c $(OPT_O2) $(CFLAGS) -o $@ $^ \
	-Wl,-Map,$(MAPFILE) --no-standard-libraries \
	$(LDFLAGS) $(EXTRA_LDFLAGS)
else
$(LIBOBJ): $(OBJ_LIBO2OBJS) $(OBJ_LIBOSOBJS) $(OBJ_LIBO2CPPOBJS) $(OBJ_LIBOSCPPOBJS) $(OBJ_LIBASMOBJS) $(PLUGINLIBS)
	@echo "Linking Objects"
	$(QUIET) $(CXX) -c $(OPT_O2) $(CFLAGS) -o $@ $^ \
	-Wl,-Map,$(MAPFILE) --no-standard-libraries \
	-Wl,--retain-symbols-file,$(SYMFILE) \
	$(IPA_FLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS)
	$(QUIET) $(OBJCOPY) --keep-global-symbols=$(SYMFILE) $@ $(TEMPOBJ)
	$(QUIET) $(OBJCOPY) --strip-unneeded $(TEMPOBJ) $@
	$(QUIET) -$(RM) $(TEMPOBJ)
endif 


$(OBJ_LIBO2OBJS): $(OBJDIR)/%.o: %.c
	@echo "Compiling $<"
	$(QUIET) $(CC) -o $@ $(OPT_O2) $(CFLAGS) $(INCLUDES) -c $<
	
$(OBJ_LIBOSOBJS): $(OBJDIR)/%.o: %.c
	@echo "Compiling $<"
	$(QUIET) $(CC) -o $@ $(OPT_OS) $(CFLAGS) $(INCLUDES) -c $<
	
$(OBJ_LIBO2CPPOBJS): $(OBJDIR)/%.o: %.cpp
	@echo "Compiling $<"
	$(QUIET) $(CXX) -o $@ $(OPT_O2) $(CFLAGS) $(INCLUDES) -c $<
	
$(OBJ_LIBOSCPPOBJS): $(OBJDIR)/%.o: %.cpp
	@echo "Compiling $<"
	$(QUIET) $(CXX) -o $@ $(OPT_OS) $(CFLAGS) $(INCLUDES) -c $<

$(OBJ_LIBASMOBJS): $(OBJDIR)/%.o: %.S
	@echo "Compiling $<"
	$(QUIET) $(CC) -o $@ $(OPT_ASM) $(ASMFLAGS) $(INCLUDES) -c $<
	
$(LIB): %.img: $(OBJDIR)/%.o
	@echo "Creating Library $@"
	$(ELFTOBIN) $< $@

clean:
	-$(RM) $(LIB) $(MAPFILE)
	-$(RM_R) $(OBJDIR) $(LIBDIR)