###############################################################################
# Infineon Processor
###############################################################################
#
#  Grundverzeichnis:
#     makefile
#     \src  (Verzeichnis der *.c Daten)
#     \inc  (Verzeichnis der *.h Daten)
#     \lib  (Verzeichnis CMSIS)
#     \out  (Verzeichnis Ausgabe Daten)
#     \obj  (Verzeichnis der *.o Daten)
#     \prj  (Verzeichnis Projektdaten)
#
###############################################################################
# Project Name: 
# definiert den Namen des erzeugten 'Output' - File
###############################################################################

TARGET   = main

###############################################################################
# Setup Processor
# fuer welchen Processor wird dieser Quellcode erzeugt!!
###############################################################################

VENDOR   = Infineon
UC    = XMC4500
UC_ID = 4500      #UC_ID      := 4503
CPU      = cortex-m4
FPU      = fpv4-sp-d16
FABI  = softfp #soft, softfp, hard

###############################################################################
# GNU GCC ARM Embeded Toolchain  
###############################################################################

TOOLCHAIN   = arm-none-eabi
AS          = $(TOOLCHAIN)-as
CC          = $(TOOLCHAIN)-gcc
CPP         = $(TOOLCHAIN)-g++
LD          = $(TOOLCHAIN)-gcc
OBJCOPY     = $(TOOLCHAIN)-objcopy
OBJDUMP     = $(TOOLCHAIN)-objdump
GDB         = $(TOOLCHAIN)-gdb
SIZE     = $(TOOLCHAIN)-size        

###############################################################################
# Flags für Compiler, Assembler, Linker  /// Libs
###############################################################################

CFLAGS   = -mthumb 
CFLAGS   += -mcpu=$(CPU) 
#CFLAGS  += -mfpu=$(FPU) 
#CFLAGS  += -mfloat-abi=$(FABI) 
CFLAGS   += -O0 
CFLAGS   += -ffunction-sections -fdata-sections -fsigned-char -fstack-usage
CFLAGS   += -MD -std=c99 -Wall -fms-extensions
CFLAGS   += -DUC_ID=$(UC_ID) -DARM_MATH_CM4
CFLAGS   += -g3 -fmessage-length=0 

AFLAGS   = -x assembler-with-cpp

LFLAGS   = -nostartfiles $(LIBS_DIR) -Wl,--gc-sections -Wl,-Map=bin/$(TARGET).map

CPFLAGS = -Obinary

ODFLAGS = -S

LIBS          = -larm_cortexM4_mathL_2
LIBS         += -lxmclibcstubs
LIBS         += -lm

GDB_ARGS      = -ex "target remote :2331" 
GDB_ARGS     += -ex "monitor reset" 
GDB_ARGS     += -ex "load" 
GDB_ARGS     += -ex "monitor reset"

###############################################################################
# Bezeichner verschiedener Verzeichnisse - Makros
###############################################################################

SRC_DIR     = src
INC_DIR     = -I inc
LIB_DIR     = lib
VPATH    = obj

CMSIS    = $(LIB_DIR)/CMSIS
CMSIS_INC   = $(CMSIS)/Include
CMSIS_LIB   = $(CMSIS)/Lib/GCC

XMC_INC     = $(CMSIS)/$(VENDOR)/$(UC)_series/Include
XMC_SRC     = $(CMSIS)/$(VENDOR)/$(UC)_series/Source
XMC_GCC     = $(CMSIS)/$(VENDOR)/$(UC)_series/Source/GCC

INC_DIR     += -I $(XMC_INC)
INC_DIR     += -I $(SRC_DIR)

DEPP     = $(wildcard $(XMC_SRC)/*.c)

SRC         = $(wildcard $(SRC_DIR)/*.c)
#SRC        += $(wildcard $(XMC_SRC)/*.c)
#SRC        = $(SRC_DIR)/*.c
#SRC        += $(wildcard $(XMC_SRC)/*.c)

###############################################################################
# Objects erzeugen
###############################################################################
#
#OBJS = $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRC:.c=.o))
OBJS = $(SRC:.c=.o)     
#OBJS = $(SRC:%.c= %.o)
#OBJS+= $(INF_SRC:.c=.o)
#OBJS+= $(XMC_SRC:.c=.o)
#OBJS+= $(XMC_ASRC:.asm=.o)
#

#OBJS  = $(SRC:.c=.o)
#OBJS += src\System_$(UC).o

##############################
# Regeln / rules
#############################

all: $(OBJS) $(TARGET).elf $(TARGET)

#$(C_OBJECTS): obj/%.o : %.c 
obj/%.o: src/%.c
   $(CC) -c $(CFLAGS) $(INC_DIR) $< -o $@

#%.o: %.asm
#  $(CC) -c $(CFLAGS) $(INC_DIR) $(AFLAGS) $< -o $@


$(TARGET).elf: $(OBJS)
   mkdir -p $(BIN)
   $(CC) -T $(LINKER_FILE) $(LFLAGS) $(CFLAGS) -o $(BIN)/$(TARGET).elf $(OBJS) $(LIBS)

$(TARGET): $(TARGET).elf
   $(CP) $(CPFLAGS) $(BIN)/$(TARGET).elf $(BIN)/$(TARGET).bin
   $(OD) $(ODFLAGS) $(BIN)/$(TARGET).elf > $(BIN)/$(TARGET).lst
   $(SIZE) $(BIN)/$(TARGET).elf



.PHONY: clean
clean:
   rm -f $(SRC_DIR)/*.o 
   rm -f $(OBJ_DIR)/*.o
#  rm -f bin\*
#  rm -f $(PROJ_NAME).elf
#  rm -f $(PROJ_NAME).hex
#  rm -f $(PROJ_NAME).bin


#  @echo $(OBJS)

text:
   @echo $(INC_DIR)
   @echo $(SRC)
   @echo $(OBJS)
   @echo $(DEPP)

   