# ================ User Defined Variables ================							
OPTIMIZATION			:= 	O1
SRCFILE_PATH			:=	./../oss/driver/hal/asi
# ================		     End          ================

# ================	   DO NOT MODIFY	  ================
REMOTE_DSP_DIR			:= 	./../../oss
CROSS_COMPILE			:=	riscv32-elf-
OUTPUT					:=	$(PROJECT_NAME)
BUILD_DIR				:=	./debug
LOCAL_DSP_DIR			:=  ./bsp
IMAGE_DIR				:=	./image
SECONDARY_OUTPUT_DIR	:=	output
TARGET					:=	$(OUTPUT).a

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


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

CFLAGS					:=	-c \
							$(addprefix -, $(OPTIMIZATION)) \
							-mcmodel=small \
							-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 \

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:	$(TARGET) strip


.PHONY: clean
clean:
	rm -rf $(SECONDARY_OUTPUT_DIR) $(BUILD_DIR)
	
strip:
	@echo 'Invoking: Strip the Static Library'
	$(CROSS_COMPILE)strip -g -S -d --strip-debug --strip-unneeded  $(SECONDARY_OUTPUT_DIR)/$(TARGET) 
	@echo 'done'
		
$(TARGET):	$(OBJS)
	@echo 'Building target: $@'
	@echo 'Invoking: Andes Archiver'
	$(CROSS_COMPILE)ar -r $(SECONDARY_OUTPUT_DIR)/$(TARGET) $(OBJS_SORTED)
	@echo 'Finished building target: $@'
	@echo 'Cleaning intermediate files'
	@echo 'done'

	
$(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 ' '