#
#       !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!!
#
##############################################################################################
#
# On command line:
#
# make all = Create project
#
# make clean = Clean project files.
#
# To rebuild project do "make clean" and "make all".
#

##############################################################################################
# Start of default section
#

TRGT = arm-elf-
CC   = $(TRGT)gcc
CP   = $(TRGT)objcopy
AS   = $(TRGT)gcc -x assembler-with-cpp
OD   = $(TRGT)objdump
HEX  = $(CP) -O ihex
BIN  = $(CP) -O binary

MCU  = arm7tdmi

# Enable this if you want the linker to remove unused code and data
LINK_GC = yes

# 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 = ch

# Define linker script file here
LDSCRIPT= ch.ld

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

# Define ASM defines here
UADEFS =

# Imported source files
include ../../src/kernel.mk
include ../../test/test.mk

# List ARM-mode C source files here
ASRC =

# List THUMB-mode C sources here
# NOTE: If any module is compiled in thumb mode then -mthumb-interwork is
#       enabled for all modules and that lowers performance.
TSRC = ../../ports/ARM7-AT91SAM7X/chcore.c \
       ../../ports/ARM7-AT91SAM7X/sam7x_serial.c \
       ${KERNSRC} \
       ${TESTSRC} \
       ../../src/lib/evtimer.c \
       at91lib/aic.c \
       board.c main.c

# List ASM source files here
ASMSRC = ../../ports/ARM7/crt0.s ../../ports/ARM7/chsys.s \
         ../../ports/ARM7-AT91SAM7X/vectors.s

# List all user directories here
UINCDIR = ../../src/include ../../src/lib ../../test \
          ../../ports/ARM7 ../../ports/ARM7-AT91SAM7X

# List the user directory to look for the libraries here
ULIBDIR =

# List all user libraries here
ULIBS =

# ARM-specific options here
AOPT =

# THUMB-specific options here
TOPT = -mthumb -D THUMB

# Common options here
# NOTE: -ffixed-r7 is only needed if you enabled CH_CURRP_REGISTER_CACHE in
#       chconf.h.
# NOTE: -falign-functions=16 may improve the performance, not always, but
#       increases the code size.
OPT = -Os -ggdb -fomit-frame-pointer -mabi=apcs-gnu
#OPT += -ffixed-r7
#OPT += -falign-functions=16

# Define warning options here
WARN = -Wall -Wstrict-prototypes

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

ifeq ($(LINK_GC),yes)
  OPT += -ffunction-sections -fdata-sections
endif

INCDIR  = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
LIBDIR  = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
DEFS    = $(DDEFS) $(UDEFS)
ADEFS   = $(DADEFS) $(UADEFS)
AOBJS   = $(ASRC:.c=.o)
TOBJS   = $(TSRC:.c=.o)
OBJS	= $(ASMOBJS) $(AOBJS) $(TOBJS)
ASMOBJS = $(ASMSRC:.s=.o)
LIBS    = $(DLIBS) $(ULIBS)
MCFLAGS = -mcpu=$(MCU)

ODFLAGS	= -x --syms
ASFLAGS = $(MCFLAGS) -Wa,-amhls=$(<:.s=.lst) $(ADEFS)
CPFLAGS = $(MCFLAGS) $(OPT) $(WARN) -Wa,-alms=$(<:.c=.lst) $(DEFS)
ifeq ($(LINK_GC),yes)
  LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch,--gc-sections $(LIBDIR)
else
  LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR)
endif

# Thumb interwork enabled only if needed because it kills performance.
ifneq ($(TSRC),)
  CPFLAGS += -D THUMB_PRESENT
  ASFLAGS += -D THUMB_PRESENT
  ifneq ($(ASRC),)
    # Mixed ARM and THUMB case.
    CPFLAGS += -mthumb-interwork
    LDFLAGS += -mthumb-interwork
  else
    # Pure THUMB case, THUMB C code cannot be called by ARM asm code directly.
    CPFLAGS += -mno-thumb-interwork -D THUMB_NO_INTERWORKING
    LDFLAGS += -mno-thumb-interwork -mthumb
    ASFLAGS += -D THUMB_NO_INTERWORKING
  endif
else
  CPFLAGS += -mno-thumb-interwork
  LDFLAGS += -mno-thumb-interwork
endif

# Generate dependency information
CPFLAGS += -MD -MP -MF .dep/$(@F).d

#
# Makefile rules
#

all: $(OBJS) $(PROJECT).elf $(PROJECT).hex $(PROJECT).bin $(PROJECT).dmp

$(AOBJS) : %.o : %.c
	@echo
	$(CC) -c $(CPFLAGS) $(AOPT) -I . $(INCDIR) $< -o $@

$(TOBJS) : %.o : %.c
	@echo
	$(CC) -c $(CPFLAGS) $(TOPT) -I . $(INCDIR) $< -o $@

$(ASMOBJS) : %.o : %.s
	@echo
	$(AS) -c $(ASFLAGS) -I . $(INCDIR) $< -o $@

%elf: $(OBJS)
	@echo
	$(CC) $(ASMOBJS) $(AOBJS) $(TOBJS) $(LDFLAGS) $(LIBS) -o $@

%hex: %elf
	$(HEX) $< $@

%bin: %elf
	$(BIN) $< $@

%dmp: %elf
	$(OD) $(ODFLAGS) $< > $@

clean:
	-rm -f $(OBJS)
	-rm -f $(PROJECT).elf
	-rm -f $(PROJECT).dmp
	-rm -f $(PROJECT).map
	-rm -f $(PROJECT).hex
	-rm -f $(PROJECT).bin
	-rm -f $(ASRC:.c=.c.bak)
	-rm -f $(ASRC:.c=.lst)
	-rm -f $(TSRC:.c=.c.bak)
	-rm -f $(TSRC:.c=.lst)
	-rm -f $(ASMSRC:.s=.s.bak)
	-rm -f $(ASMSRC:.s=.lst)
	-rm -fR .dep

#
# Include the dependency files, should be the last of the makefile
#
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

# *** EOF ***