# 	Makefile für Olimex LPC2103 
#


#-------------------------------------------------------------------------------
#		Grundeinstellung
#-------------------------------------------------------------------------------

CPU		= arm7tdmi-s

# Filename gibt den Hauptnamen der .c oder .cpp an
# die erzeugten Dateien heißen dann ebenfalls so, evtl. keine Namen
# länger als 8 Zeichen, sonst macht der Debugger Probleme

FILENAME	= main

# CoCPP cpp oder c angeben, für C++ oder C Programm.
# Der FILENAME muss dann auch auf cpp oder c enden. z.B. "main.cpp" 

#CoCPP		= c
CoCPP		= cpp

# Output Verzeichniss, für einen besseren Überblick werden dort alle
# erzeugten Dateien abgelegt.

OutVerz = Obj

# Name des LINKER_SCRIPT
LINKER_SCRIPT = lpc2103_flash.cmd


# Name der CRT Datei
CRT		= crt.s


#-------------------------------------------------------------------------------
#		Tools
#-------------------------------------------------------------------------------

# Name des Cross-Compilers
#CROSS_COMPILE = arm-elf
CROSS_COMPILE = arm-none-eabi

CPP = $(CROSS_COMPILE)-g++
CC = $(CROSS_COMPILE)-gcc
SIZE = $(CROSS_COMPILE)-size
STRIP = $(CROSS_COMPILE)-strip
OBJCOPY = $(CROSS_COMPILE)-objcopy
OBJDUMP = $(CROSS_COMPILE)-objdump
LD = $(CROSS_COMPILE)-ld
AS = $(CROSS_COMPILE)-as

#-------------------------------------------------------------------------------
#		Files
#-------------------------------------------------------------------------------

# include Verzeichniss: Hier können die Verzeichnisse angegeben werden,
# in dene Header-Dateien liegen die nicht gefunden werden z.B. math.h
# immer ein "-I"vorschreiben z.B.:
INCLUDES += -IC:\Arm\WinARM\arm-elf\include
INCLUDES  = -I./

# library Verzeichniss: Verzeichniss wo sich z.B. die libgcc.a(-lgcc) befindet
# arm-..-ld findet sie manchmal nicht
#LIBRARY  = -LC:\Arm\WinARM\lib\gcc\arm-elf\4.1.1
#LIBRARY += -LC:\Arm\WinARM\arm-elf\lib
#LIBRARY  = -LC:\Arm\GNUARM11\lib\gcc\arm-elf\4.1.1\thumb
#LIBRARY += -LC:\Arm\GNUARM11\arm-elf\lib
#LIBRARY += -LC:\Arm\yagarto\lib\gcc\arm-none-eabi\4.6.0\thumb\v7m
#LIBRARY += -L"C:\Arm\Sourcery G++ Lite\lib\gcc\arm-none-eabi\4.5.2\thumb2"
LIBRARY += -L"C:\Arm\Sourcery G++ Lite\lib\gcc\arm-none-eabi\4.5.2\thumb"
LIBRARY += -L"C:\Arm\Sourcery G++ Lite\arm-none-eabi\lib\thumb"

# Objects built from C source files
C_OBJECTS = $(OutVerz)/$(FILENAME).o

# Objects built from Assembly source files
ASM_OBJECTS = $(OutVerz)/crt.o

REMOVE = rm -rf


#-------------------------------------------------------------------------------
#		Optionen
#-------------------------------------------------------------------------------

# Trace level used for compilation
# 
# TRACE_LEVEL_DEBUG      5
# TRACE_LEVEL_INFO       4
# TRACE_LEVEL_WARNING    3
# TRACE_LEVEL_ERROR      2
# TRACE_LEVEL_FATAL      1
# TRACE_LEVEL_NO_TRACE   0
TRACE_LEVEL = 0

# Optimization level
# Optimization level, kann [0, 1, 2, 3, s]sein. 
# 0 = Opt off optimization. s = optimize for size.
# für C++ ging nur 0
OPTIMIZATION = -O0

#-------------------------------------------------------------------------------
#		Rules
#-------------------------------------------------------------------------------
ifeq ($(CoCPP),cpp)
LANG	= cpp
C		= $(CPP)
ASFLAGS += -std=c++0x
LDFLAGS += -std=c++0x
CFLAGS += -std=c++0x
else 
LANG	= c
C		= $(CC)
ASFLAGS += -std=gnu99
LDFLAGS += -std=gnu99
CFLAGS += -std=gnu99
endif


# Assembling Flags
#ASFLAGS  = -ahls
#ASFLAGS += -mapcs-32
ASFLAGS += $(INCLUDES)
ASFLAGS += $(OPTIMIZATION)
ASFLAGS += -mcpu=$(CPU)
ASFLAGS += -adhlns=$(OutVerz)/crt.lst
ASFLAGS += -lm -lc -lgcc
ASFLAGS += -Wall 
ASFLAGS += -g -c
#ASFLAGS += -msoft-float
ASFLAGS += -march=armv4t -nostartfiles -nostdlib
ASFLAGS += -DTRACE_LEVEL=$(TRACE_LEVEL)

# Compiler Flags
CFLAGS += $(INCLUDES)
CFLAGS += $(OPTIMIZATION)
CFLAGS += -fno-common
CFLAGS += -c -g
CFLAGS += -DTRACE_LEVEL=$(TRACE_LEVEL) 
CFLAGS += -mcpu=$(CPU)
#CFLAGS += -msoft-float
CFLAGS += -march=armv4t -nostartfiles -nostdlib
CFLAGS += -lm -lc -lgcc
CFLAGS += -Wall 

# Linker Flags
LDFLAGS += -T$(LINKER_SCRIPT)
LDFLAGS += $(LIBRARY)
LDFLAGS += $(INCLUDES)
LDFLAGS += $(OPTIMIZATION)
LDFLAGS += -lm -lc -lgcc
LDFLAGS += -mcpu=$(CPU) 
LDFLAGS += -nostdlib
LDFLAGS += -Wl,-Map=$(OutVerz)/$(FILENAME).map
#LDFLAGS += -msoft-float 
LDFLAGS += -march=armv4t -nostartfiles -nostdlib
LDFLAGS += -Wall
LDFLAGS += -DTRACE_LEVEL=$(TRACE_LEVEL)

# Copy Flags 
OBJCOPYFLAGS = -O binary -S
OBJDUMPFLAGS = -x --syms

all: clean $(OutVerz) $(FILENAME).out bin

$(OutVerz):
	mkdir $(OutVerz)

# Assebler Aufruf
$(ASM_OBJECTS): crt.s
	@ echo "----assembling $@-------------------------"
	$(C) $(ASFLAGS) -o $(ASM_OBJECTS) $(CRT)
#arm-none-eabi-as   -o $(OutVerz)/crt.o crt.s
	@ echo "----assembling completed.------------------------"
	@ echo " "
	
# Compiler Aufruf
$(C_OBJECTS): $(FILENAME).$(LANG)
	@ echo "----compiling $@-------------------------"
	$(C) $(CFLAGS) -o $(OutVerz)/$(FILENAME).o $(FILENAME).$(LANG)
	@ echo "----compiling completed.-------------------------"
	@ @ echo " "
	
# Linker Aufruf
$(FILENAME).out: $(ASM_OBJECTS) $(C_OBJECTS) $(LINKER_SCRIPT)
	@ echo "----linking $@-----------------------------"
	$(C) $(ASM_OBJECTS) $(C_OBJECTS) $(LDFLAGS) -o $(OutVerz)/$(FILENAME).out 
	@ echo "----linking completed.---------------------------"
	@ echo " "
	
# ObjCopy Aufruf
bin: 
	@ echo "..copy $@"
	$(OBJCOPY) $(OBJCOPYFLAGS) $(OutVerz)/$(FILENAME).out $(OutVerz)/$(FILENAME).bin
	$(OBJDUMP) $(OBJDUMPFLAGS) $(OutVerz)/$(FILENAME).out
	@ echo "...copy completed."
	@ echo " "
	@ echo "...all finished."
	

clean: clean_list	
clean_list :
	@echo
	$(REMOVE) $(OutVerz)\$(FILENAME).lst
	$(REMOVE) $(OutVerz)\$(FILENAME).o
	$(REMOVE) $(OutVerz)\$(FILENAME).out
	$(REMOVE) $(OutVerz)\$(FILENAME).map
	$(REMOVE) $(OutVerz)\$(FILENAME).hex
	$(REMOVE) $(OutVerz)\$(FILENAME).dmp
	$(REMOVE) $(OutVerz)\$(FILENAME).bin
	$(REMOVE) $(OutVerz)\crt.lst
	$(REMOVE) $(OutVerz)\crt.o
	$(REMOVE) -r $(OutVerz)
