# ================ User Defined Variables ================							
SAG						:=  sp2cw3_rom.sag
REMOTE_DSP_DIR			:= 	./../oss
OPTIMIZATION			:= 	O1
LIBS					:=  -L"./algo/lib" -lalgo_aec
LIBS_IIS  				:=  -L"./../oss/driver/hal/asi" -lhal_iis
#LIBS_IIS                :=
# ================		     End          ================

# ================	   DO NOT MODIFY	  ================
CROSS_COMPILE			:=	riscv32-elf-
OUTPUT					:=	$(PROJECT_NAME)
BUILD_DIR				:=	./debug
LOCAL_DSP_DIR			:=  ./bsp
IMAGE_DIR				:=	./image
SECONDARY_OUTPUT_DIR	:=	output
LDSAG_DIR				:= 	$(LOCAL_DSP_DIR)/lds/utils
LDS						:=	$(BUILD_DIR)/$(basename $(SAG)).ld
TARGET					:=	$(OUTPUT).adx
DUMP					:=	$(OUTPUT).lst
BURN					:=	$(OUTPUT).bin
SIZ						:=  $(OUTPUT).siz

define uniq =
	$(eval seen :=)
	$(foreach _,$(1),$(if $(filter $_,${seen}),,$(eval seen += $_)))
	${seen}
endef

SRC_PATH				:=	$(call uniq, $(dir $(shell '$(CYGWIN)'/find -L . -name '*.[cS]')))
HEADER_PATH				:=	$(call uniq, $(dir $(shell '$(CYGWIN)'/find -L . -name '*.h')))

CFLAGS					:=	-c \
							$(addprefix -, $(OPTIMIZATION)) \
							-mcmodel=small \
							-g3 \
							-Wall \
							-mcpu=d25f \
							-fsingle-precision-constant \
							-ffunction-sections \
							-fdata-sections \
							-mext-dsp \
							-fmessage-length=0 \
							-fno-builtin-memset \
							-fno-builtin-memcpy \
							-fno-builtin-printf \
							-fstrict-volatile-bitfields \

LDFLAGS					:=	$(addprefix -, $(OPTIMIZATION)) \
							-nostartfiles \
							-static \
							-mcmodel=medium \
							-Wl,--gc-sections

INCLUDES	:=	$(addprefix -I, $(HEADER_PATH) $(IMAGE_DIR))
HEADERS		:=	$(foreach dir, $(HEADER_PATH), $(wildcard $(dir)*.h))
SRCS		:=	$(foreach dir, $(SRC_PATH), $(wildcard $(dir)*.c))
ASMS		:=	$(foreach dir, $(SRC_PATH), $(wildcard $(dir)*.S))
OBJS_SRC	:=	$(addprefix $(BUILD_DIR)/, $(SRCS:.c=.o))
OBJS_ASM	:=	$(addprefix $(BUILD_DIR)/, $(ASMS:.S=.o))
OBJS		:=	$(OBJS_ASM) $(OBJS_SRC) 
OBJS_SORTED	:=	$(addprefix $(BUILD_DIR)/,$(foreach dir, $(SRC_PATH), $(sort $(addsuffix .o,$(basename $(wildcard $(dir)*.[cS]))))))
DEPS		:=	$(OBJS:.o=.d)

$(shell mkdir -p $(addprefix $(BUILD_DIR)/, $(SRC_PATH)) $(SECONDARY_OUTPUT_DIR))
$(shell '$(CYGWIN)'/ln -sf $(REMOTE_DSP_DIR) $(LOCAL_DSP_DIR))


all:	$(LDS) $(TARGET) $(DUMP) $(BURN) $(SIZ) 

.PHONY: clean
clean:
	rm -rf $(SECONDARY_OUTPUT_DIR) $(BUILD_DIR)
	
$(SIZ):	$(TARGET)
	@echo 'Invoking: Create Listing'
	@$(CROSS_COMPILE)size --format=berkeley $(SECONDARY_OUTPUT_DIR)/$(TARGET)
	@echo 'Finished building: $@'
	@echo ' '

$(DUMP):	$(TARGET)
	@$(CROSS_COMPILE)objdump -S -x -d -C $(SECONDARY_OUTPUT_DIR)/$(TARGET) > $(SECONDARY_OUTPUT_DIR)/$(DUMP)

$(BURN):	$(TARGET)
	@echo 'Invoking: Objcopy (object content copy)'
	$(CROSS_COMPILE)objcopy -S -O binary $(SECONDARY_OUTPUT_DIR)/$(TARGET) $(SECONDARY_OUTPUT_DIR)/$(BURN)
	@echo 'Finished building: $@'
	@echo ' '
		
$(TARGET):	$(OBJS)
	@echo 'Building target: $@'
	@echo 'Invoking: Andes C Linker'
	$(CROSS_COMPILE)gcc $(LDFLAGS) -T$(LDS) -o $(SECONDARY_OUTPUT_DIR)/$(TARGET) $(OBJS_SORTED) $(LIBS_IIS) $(LIBS) -ldsp -mext-dsp -lm
	@echo 'Finished building target: $@'
	@echo 'Cleaning intermediate files'
	@echo 'done'
	@echo ' '
	
$(LDS):		$(LDSAG_DIR)/../$(SAG)
	@echo 'Generating the linker script: $@'
	@echo 'Invoking: LdSaG Tool'
	$(LDSAG_DIR)/nds_ldsag.exe --version=v5 -t $(LDSAG_DIR)/nds32_template_v5.txt $(LDSAG_DIR)/../$(SAG) -o $(LDS)
	@echo ' '
	
$(OBJS_ASM): $(BUILD_DIR)/%.o: %.S $(HEADERS) 
	@echo 'Building file: $<'
	@echo 'Invoking: Andes C Compiler'
	$(CROSS_COMPILE)gcc $(INCLUDES) $(CFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d) $(@:%.o=%.o)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

$(OBJS_SRC): $(BUILD_DIR)/%.o: %.c $(HEADERS) 
	@echo 'Building file: $<'
	@echo 'Invoking: Andes C Compiler'
	$(CROSS_COMPILE)gcc $(INCLUDES) $(CFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d) $(@:%.o=%.o)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '