################################################################################
# Makefile for Blinky

################################################################################
# USAGE
# -----
# make           .... build the program image
# make clean     .... remove intermediate and generated files

################################################################################
# define the name of the generated output file
#
TARGET        = main

################################################################################
# below only edit with care
#
VENDOR        = STM


################################################################################
# DIRECTORIES

GNU_DIR             = D:/stm32/gnu
GNU_LIBDIR          = $(GNU_DIR)/lib
STM32F4_DIR         = D:/stm32/discovery/STM32F4-Discovery_FW_V1.1.0

################################################################################
# INCLUDE DIRECTORIES

GNU_INCDIR              = $(GNU_DIR)/include
CMSIS_INCDIR            = $(STM32F4_DIR)/Libraries/CMSIS/Include
CMSIS_STM32_INCDIR      = $(STM32F4_DIR)/Libraries/CMSIS/ST/STM32F4xx/Include
STM32_STDPERIPH_INC     = $(STM32F4_DIR)/Libraries/STM32F4xx_StdPeriph_Driver/inc

################################################################################
# LIBRARY DIRECTORIES

CMSIS_LIBGCC_DIR        = $(STM32F4_DIR)/Libraries/CMSIS/Lib/GCC
CMSIS_LIBARM_DIR        = $(STM32F4_DIR)/Libraries/CMSIS/Lib/ARM

################################################################################
# MISC DIRECTORIES
CWD                 = .
BIN                 = ./bin
SRCDIR              = ./src
LDFDIR              = ./ldf

################################################################################
# TOOLS & ARGS
#
TOOLCHAIN     = arm-none-eabi
AS            = $(TOOLCHAIN)-as
CC            = $(TOOLCHAIN)-gcc
CP            = $(TOOLCHAIN)-objcopy
OD            = $(TOOLCHAIN)-objdump
GDB           = $(TOOLCHAIN)-gdb
SIZE          = $(TOOLCHAIN)-size


RM = del /Q
FixPath = $(subst /,\,$1)



CPU           = cortex-m4
FPU           = fpv4-sp-d16

################################################################################
# LIBRARIES
#LIBS          = -lm

################################################################################
# SOURCE FILES
SRC  = $(wildcard src/*.c)

################################################################################
# LINKER_FILE
LINKER_FILE = $(LDFDIR)/discovery.ld


# INCLUDE DIRECTORIES

INC_DIR = -I$(SRCDIR)
INC_DIR+= -I$(GNU_INCDIR)
INC_DIR+= -I$(CMSIS_INCDIR)
INC_DIR+= -I$(CMSIS_INCDIR)
INC_DIR+= -I$(CMSIS_STM32_INCDIR)
INC_DIR+= -I$(STM32_STDPERIPH_INC)

################################################################################
# LIBRARY DIRECTORIES
#LIBS_DIR  = -L$(CMSIS_LIBDIR)
#LIBS_DIR+= -L$(GNU_LIBDIR)
#LIBS_DIR+= -L$(CMSIS_LIBGCC_DIR)
#LIBS_DIR+= -L$(CMSIS_LIBARM_DIR)


################################################################################
# OBJECT FILES
OBJS = $(SRC:.c=.o)
OBJS+= $(SRCASM:.asm=.o)

################################################################################
# DEPENDENCY FILES
DEPS = $(SRC:.c=.d)
DEPS += $(SRCASM:.asm=.d)

################################################################################
# COMPILER, ASSEMBLER OPTIONS
CFLAGS = -mthumb
CFLAGS+= -mcpu=$(CPU)
CFLAGS+= -g2
CFLAGS+= -Wall
CFLAGS+= -O0
CFLAGS+= -DSTM32F401VC

LFLAGS = -mthumb -mcpu=$(CPU) -g2 -Wl,-Map=bin/$(TARGET).map -O0 -Wl,--gc-sections -L$(CWD) $(LIBS_DIR)
LFLAGS+= -Wl,-T$(LINKER_FILE) -g

CPFLAGS = -Obinary
ODFLAGS = -S

################################################################################
# BUILD RULES
all: $(OBJS) $(TARGET).elf $(TARGET)
#all: $(OBJS) $(TARGET).elf

%.o: %.c
	@echo "----------------------------------------------------------------------"
	@echo "Compilation of $<:"
	@echo ""
	$(CC) -c $(CFLAGS) $(INC_DIR) $< -o $@
	@echo ""

%.o: %.asm
	@echo "----------------------------------------------------------------------"
	@echo "Assembly of $<:"
	@echo ""
	$(CC) -c $(CFLAGS) $(INC_DIR) $(AFLAGS) $< -o $@
	@echo ""

$(TARGET).elf: $(OBJS)
	@echo "----------------------------------------------------------------------"
	@echo "Linking:"
	@echo ""
	$(CC) $(LFLAGS) -o $(BIN)/$(TARGET).elf $(OBJS) $(LIBS)
	@echo ""

$(TARGET): $(TARGET).elf
	@echo "----------------------------------------------------------------------"
	@echo "Creation of Binary:"
	@echo ""
	$(CP) $(CPFLAGS) $(BIN)/$(TARGET).elf $(BIN)/$(TARGET).bin
	@echo "----------------------------------------------------------------------"
	@echo "Create Listing File:"
	@echo ""
	$(OD) $(ODFLAGS) $(BIN)/$(TARGET).elf > $(BIN)/$(TARGET).lst
	@echo "----------------------------------------------------------------------"
	@echo "Create Static Usage Analysis:"
	@echo ""
	$(SIZE) $(BIN)/$(TARGET).elf

################################################################################
# CLEAN RULES
clean:
	$(RM) $(call FixPath, ${OBJS} ${DEPS} ${SU})
	$(RM) $(call FixPath, ${BIN}/*)

################################################################################
# EOF
################################################################################
