#######################################################################
# 
# Makefile for GCC-ARM project
#
# ------------------------------------------------


# target
TARGET = test

# debug build?
DEBUG = 1

ASM_SOURCES := startup_stm32f103xb.s
C_SOURCES :=  main.c 

C_SOURCES := $(addprefix src/,$(C_SOURCES))

BUILD_DIR := build


############################## Setup toolchain ##############################

GCC_PATH := $(wildcard /opt/gcc-arm-none-eabi*)/bin
PREFIX := arm-none-eabi-

CC = $(GCC_PATH)/$(PREFIX)gcc
CPP = $(GCC_PATH)/$(PREFIX)cpp
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
DUMP = $(GCC_PATH)/$(PREFIX)objdump
GDB = $(GCC_PATH)/$(PREFIX)gdb
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S

CPU = -mcpu=cortex-m3
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

############################## ASM options ##################################

AS_DEFS = 
AS_INCLUDES = 
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

############################## C options ####################################

C_DEFS = -DUSE_HAL_DRIVER -DSTM32F103xB -D_GNU_SOURCE 
C_INCLUDES = -Isrc

OPT = -Og
CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections 
ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif

# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

############################## LD options ###################################

LDSCRIPT = STM32F103C8Tx_FLASH.ld

LIBS = -lc -lm -lnosys 
LIBDIR = 
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

############################## Objects ######################################

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))

OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))

#############################################################################
#
#                                  TARGETS


all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
	$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
	$(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
	$(CC) $(OBJECTS) $(LDFLAGS) -o $@
	$(SZ) $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
	$(HEX) $< $@

$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
	$(BIN) $< $@	
	@cp $@ /data/vmshare

$(BUILD_DIR):
	mkdir $@

info: $(BUILD_DIR)/$(TARGET).elf
	$(DUMP) -x -S $(BUILD_DIR)/$(TARGET).elf > $(BUILD_DIR)/$(TARGET).lst
	$(DUMP) -D $(BUILD_DIR)/$(TARGET).elf > $(BUILD_DIR)/$(TARGET).dis
	$(SZ) $(BUILD_DIR)/$(TARGET).elf > $(BUILD_DIR)/$(TARGET).size

size: $(BUILD_DIR)/$(TARGET).elf
	$(SZ) $(BUILD_DIR)/$(TARGET).elf

clean:
	-rm -fR $(BUILD_DIR)

## types shows the size of basic integer types -- I always forget them
.PHONY: types	
types:
	$(CPP) -dD /dev/null | grep -i sizeof


.PHONY: flash
flash:	$(BUILD_DIR)/$(TARGET).elf
	@echo "Flashing using openocd..."
	@openocd -f openocd.cfg -c init -c "reset halt" -c "flash write_image erase $(BUILD_DIR)/$(TARGET).elf" -c "verify_image $(BUILD_DIR)/$(TARGET).elf" -c reset -c shutdown

.PHONY: debug
debug:  $(BUILD_DIR)/$(TARGET).elf
	@openocd -f openocd.cfg -c init -c $(OPENOCD_DEBUG_CMDS) 

-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***
