BUILDDIR = ../build

CONFIG ?= release

CONFIGDIR = $(BUILDDIR)/$(CONFIG)

OBJDIR = $(CONFIGDIR)/objs

LSTDIR = $(CONFIGDIR)/lst

DEPDIR = $(CONFIGDIR)/.dep


TRGT = bfin-elf-
CC   = $(TRGT)gcc
CP   = $(TRGT)objcopy
AS   = $(TRGT)gcc -x assembler-with-cpp
LDR  = $(TRGT)ldr

LDRFLAGS = -T BF527


MCU  = bf523-0.2

# List all default C defines here, like -D_DEBUG=1
DDEFS = 

# List all default ASM defines here, like -D_DEBUG=1
DADEFS = 

# List all default directories to look for include files here
DINCDIR = 

# List the default directory to look for the libraries here
DLIBDIR =

# List all default libraries here
DLIBS = 

#
# End of default section
##############################################################################################

##############################################################################################
# Start of user section
#

# Define project name here
PROJECT = l502-bf

# Define linker script file here
LDSCRIPT= ../gcc/l502-bf.ld

BINDIR = $(CONFIGDIR)/bin
RESULT_FILES = $(BINDIR)/$(PROJECT).elf $(BINDIR)/$(PROJECT).ldr

# List all user C define here, like -D_DEBUG=1
 
UDEFS = NDEBUG CLOCK_INIT_CB

ifeq ($(CONFIG), debug)
    UDEFS +=  __DEBUG
    OPT = -O0
else
    OPT = -O3
endif

# List C source files here
SRC  = ../src/main.c \
       ../src/l502_init.c \
       ../src/l502_fpga.c \
       ../src/l502_sport_tx.c \
       ../src/l502_stream.c \
       ../src/l502_async.c \
       ../src/l502_cmd.c \
       ../src/l502_hdma.c \
       ../src/l502_params.c \
       ../src/l502_tests.c \
       ../src/l502_user_process.c



       
       
# List ASM source files here
ASRC = ../gcc/l502-bf_basiccrt.s

# List all user directories here
UINCDIR = ../src ../gcc



# List the user directory to look for the libraries here

# List all user libraries here
ULIBS = 



#
# End of user defines
##############################################################################################


INCDIR  = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
LIBDIR  = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
DEFS    = $(patsubst %,-D%,$(DDEFS) $(UDEFS)) #   = $(DDEFS) $(UDEFS)
ADEFS   = $(DADEFS) $(UADEFS)
#OBJS    = $(ASRC:.s=.o) $(SRC:.c=.o)
OBJS    = $(addprefix $(OBJDIR)/, $(notdir $(sort $(SRC:.c=.o))))
AOBJS    = $(addprefix $(OBJDIR)/, $(notdir $(sort $(ASRC:.s=.o))))
LIBS    = $(DLIBS) $(ULIBS)
MCFLAGS = -mcpu=$(MCU)

ASFLAGS = $(MCFLAGS) -g -mthumb -gdwarf-2 -Wa,-amhls=$(<:.s=.lst) $(ADEFS)
#-gdwarf-2
ANOMALY_FLAGS = -mspecld-anomaly -mcsync-anomaly
CPFLAGS = $(MCFLAGS) $(OPT) $(ANOMALY_FLAGS) -std=gnu99 -g -Wall -Wstrict-prototypes -Wa,-ahlms=$(addprefix $(LSTDIR)/, $(notdir $(@:.o=.lst))) $(DEFS)
LDFLAGS = $(MCFLAGS) -T$(LDSCRIPT) -nostartfiles -N -Wl,-Map=$(BINDIR)/$(PROJECT).map,--cref,--gc-sections $(LIBDIR) -lm
#
# Generate dependency information
CPFLAGS += -MD -MP -MF $(DEPDIR)/$(@F).d

#bfin-elf-gcc  $(CPFLAGS) -I . $(INCDIR) $(LDFLAGS) $(SRC) -o bf-test.elf

.PHONY: all clean prj dirs 
.SECONDEXPANSION:

all: dirs  $(RESULT_FILES)
	
	
$(OBJS) : $$(filter %/$$(basename $$(notdir $$@)).c, $$(SRC)) ##$$(patsubst %.o,%.c, $$@)
	$(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@
	
$(AOBJS) : $(ASRC)
	$(AS) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@
	
$(BINDIR)/$(PROJECT).elf: $(OBJS) $(AOBJS) $(LDSCRIPT)
	$(CC) $(OBJS) $(AOBJS) $(LDFLAGS) $(LIBS) -o $@
	
$(BINDIR)/$(PROJECT).ldr: $(BINDIR)/$(PROJECT).elf
	$(LDR) $(LDRFLAGS) -c $@ $<
			
dirs: $(BUILDDIR) $(CONFIGDIR) $(DEPDIR) $(OBJDIR) $(LSTDIR) $(BINDIR)
	

	
$(BINDIR): 
	mkdir $(BINDIR)	
	
$(LSTDIR):
	mkdir $(LSTDIR)
	
$(OBJDIR): 
	mkdir $(OBJDIR)
	
$(BUILDDIR):
	mkdir $(BUILDDIR)
	
$(CONFIGDIR): 
	mkdir $(CONFIGDIR)

$(DEPDIR): 
	mkdir $(DEPDIR)
	
clean:
	-rm -fR $(CONFIGDIR)

-include $(wildcard $(DEPDIR)/*)
