.SILENT:

TARGET				:= app.elf

BUILDROOT			?= $(shell pwd)
BUILDDIR			:= build

SRCDIRS				:= $(BUILDROOT)/src
SRCFILESC			:= $(shell find $(SRCDIRS) -type f -name "*.c") 
OBJFILESC			:= $(SRCFILESC:%.c=$(BUILDDIR)/%.c.o) $(BUILDDIR)/src/ps7_init.o
DEPFILESC			:= $(SRCFILESC:%.c=$(BUILDDIR)/%.c.d)
SRCFILESA			:= $(shell find $(SRCDIRS) -type f -name "*.S")
OBJFILESA			:= $(SRCFILESA:%.S=$(BUILDDIR)/%.S.o)
DEPFILESA			:= $(SRCFILESA:%.S=$(BUILDDIR)/%.S.d)
SRCFILES			:= $(SRCFILESC) $(SRCFILESA)
OBJFILES			:= $(OBJFILESA) $(OBJFILESC)
DEPFILES			:= $(DEPFILESC) $(DEPFILESA)

FILESTOCLEAN		:= $(OBJFILES) $(DEPFILES) $(BUILDDIR)/$(TARGET)

CROSS_COMPILE		?= arm-none-eabi-
CC					:= $(CROSS_COMPILE)gcc
AS					:= $(CROSS_COMPILE)as
LD					:= $(CROSS_COMPILE)gcc

CC_WARNING			:= -Wall -Wextra
CC_LIBS				:= -lgcc
CC_FLAGS			:= -nostdlib -fno-builtin -g -mcpu=cortex-a9
CC_INCLUDES			:= -I $(BUILDROOT)/src -I $(BUILDROOT)/../OUT/ip/zynqps
LD_FLAGS			:= -Wl,-T$(BUILDROOT)/linker.ld

.PHONY: $(TARGET) all clean
all: $(TARGET)

# PHONY RULES
# -----------

$(TARGET): $(BUILDDIR)/$(TARGET)

clean:
	echo CLEAN FILES FOR $(TARGET)
	-rm -r $(FILESTOCLEAN)

# SPECIFIC BUILD RULES
# --------------------

$(BUILDDIR)/$(TARGET): $(OBJFILES)
	echo 'LD ' $@
	$(LD) $(CC_FLAGS) $(LD_FLAGS) -o $(BUILDDIR)/$(TARGET) $(OBJFILES) $(CC_LIBS)
	$(XILINX_BASE)/bin/$(CROSS_COMPILE)objdump -D $(BUILDDIR)/$(TARGET) > DISASS

$(BUILDDIR)/src/ps7_init.o : $(BUILDROOT)/../OUT/ip/zynqps/ps7_init.c $(BUILDROOT)/../OUT/ip/zynqps/ps7_init.h
	echo 'CC ' $@
	-mkdir -p $(shell dirname $@)
	$(CC) $(CC_FLAGS) $(CC_WARNING) $(CC_INCLUDES) -MD -o $(BUILDDIR)/src/ps7_init.o -c $(BUILDROOT)/../OUT/ip/zynqps/ps7_init.c

$(OBJFILES): $(BUILDDIR)/%.c.o: %.c
	echo 'CC ' $@
	-mkdir -p $(shell dirname $@)
	$(CC) $(CC_FLAGS) $(CC_WARNING) $(CC_INCLUDES) -MD -o $@ -c $<

$(OBJFILESA): $(BUILDDIR)/%.S.o: %.S
	echo 'AS ' $@
	-mkdir -p $(shell dirname $@)
	$(CC) $(CC_FLAGS) $(CC_WARNING) $(CC_INCLUDES) -MD -o $@ -c $<

# Add DEPFILE dependencies
-include $(DEPFILES)