#
# makedefs - General Makefile definitions for building applications with GCC
#            by Micromint Support <support@micromint.com>    May-2008
#
# Project Makefile should define application and source files, e.g.
# TARGET=myapp
# include makedefs
# SOURCE=$(TARGET).c util.c
#
# Common command line options
#
# make           - Builds target application for default board (Eagle 50E)
# make BOARD=XXX - Builds target application for specific board
# make clean     - Removes files created during build
# make program   - Download binary file to device flash
# make erase     - Erase device flash
#

#
# Board definitions
#
ifndef BOARD
BOARD=lincoln-all
endif

# Micromint Lincoln All (60, 60E)
ifeq ($(BOARD), lincoln-all)
BOARD_CFLAGS=-DBOARD_LINCOLN60
endif

# Micromint Lincoln 60E
ifeq ($(BOARD), lincoln-60e)
BOARD_CFLAGS=-DBOARD_LINCOLN60E
endif

#
# Compiler definitions
#
ifndef COMPILER
COMPILER=gcc
#COMPILER=devkitARM
endif

# Sourcery G++ Lite
ifeq ($(COMPILER), gcc)
PREFIX=arm-none-eabi-
endif

# devkitARM GCC
ifeq ($(COMPILER), devkitARM)
PREFIX=arm-eabi-
endif

# Platform and CPU options
CPUFLAGS=-mcpu=cortex-m3 -mthumb -mapcs-frame -msoft-float -mno-sched-prolog \
		-mtune=cortex-m3 -mfix-cortex-m3-ldrd
RAM_MODE=0

# Directories
ifndef ROOT
	ROOT=../..
endif
INC_CFLAGS=-I. -I$(ROOT)/Core/CM3/CoreSupport \
	-I$(ROOT)/Core/CM3/DeviceSupport/NXP/LPC17xx \
	-I$(ROOT)/Core/CM3/DeviceSupport/NXP/LPC17xx/startup \
	-I$(ROOT)/micromint/src \
	-I$(ROOT)/drivers/include
SETTINGS_DIR=$(ROOT)/micromint/$(COMPILER)
#OUTPUT_DIR=$(BOARD)/$(COMPILER)
OUTPUT_DIR=$(COMPILER)
OBJS_DIR=$(OUTPUT_DIR)/.objs

# Files
BIN_FILE=$(OUTPUT_DIR)/$(TARGET).bin
OUT_FILE=$(OUTPUT_DIR)/$(TARGET).elf
HEX_FILE=$(OUTPUT_DIR)/$(TARGET).hex
MAP_FILE=$(OUTPUT_DIR)/$(TARGET).map
LIB_FILE=$(OUTPUT_DIR)/$(TARGET).a

# Compiler and assembler flags
CC=$(PREFIX)gcc
DEBUG=-g -O0
#DEBUG=-Os
CFLAGS=-D$(COMPILER) -DEMBEDDED $(BOARD_CFLAGS) $(PROJ_CFLAGS) \
	-Wall -D__thumb2__=1 -D__RAM_MODE__=$(RAM_MODE) -gdwarf-2 -fno-hosted \
	-fomit-frame-pointer -ffunction-sections -fdata-sections \
	$(CPUFLAGS) $(DEBUG) $(INC_CFLAGS) 
CXX=$(PREFIX)g++
CXXFLAGS=$(CFLAGS)
AS=$(PREFIX)as
ASFLAGS=$(CFLAGS) -DRAM_MODE=0 -x assembler-with-cpp
SIZE=$(PREFIX)size
OBJCOPY=$(PREFIX)objcopy
OCFLAGS=-O binary
OCFLAGS2=-O ihex --strip-debug
AR=$(PREFIX)ar
ARFLAGS=r

# Default startup
ifndef STARTUP
STARTUP=$(ROOT)/micromint/src/debug.o \
	$(ROOT)/Core/CM3/DeviceSupport/NXP/LPC17xx/startup/$(COMPILER)/startup_LPC17xx.o
endif

ifndef LDSCRIPT
LDSCRIPT=$(SETTINGS_DIR)/project.ld
endif

# Linker flags assume $(CC) is used as linker
LDFLAGS=-Wl,--allow-multiple-definition \
	-T $(LDSCRIPT) \
	-Wl,-Map=$(MAP_FILE) \
	$(PROJ_LDFLAGS)

PROGFLASH=FlashMagic

#
# Rules to build project
#
OBJS=$(SOURCE:.c=.o)

LIBS= $(PROJ_LIBS) \
	$(ROOT)/drivers/library/${COMPILER}/libdriver.a

all: $(BIN_FILE)

$(BIN_FILE) : $(OUT_FILE)
	$(SIZE) $<
	$(OBJCOPY) $(OCFLAGS2) $< $(HEX_FILE)
	$(OBJCOPY) $(OCFLAGS) $< $@

$(OUT_FILE) : $(OBJS) $(STARTUP) Makefile
	$(CXX) $(CFLAGS) $(LDFLAGS) $(OBJS) $(STARTUP) $(LIBS) -o $(OUT_FILE)

$(LIB_FILE) : $(OBJS) Makefile
	$(AR) $(ARFLAGS) $(LIB_FILE) $(OBJS)

%.o : %.c Makefile
	$(CC) -c $(CFLAGS) $< -o $@

# Use $(CC) to compile assembler files so preprocessor is invoked
%.o : %.S Makefile
	$(CC) -c $(ASFLAGS) $< -o $@

clean:
	rm -f $(OUT_FILE) $(MAP_FILE) $(OBJS) $(STARTUP)

dump: $(OUT_FILE)
	$(PREFIX)objdump -d $<

program: $(BIN_FILE)
	$(PROGFLASH) -r $<

erase:
	$(PROGFLASH) -e all
