################################################################################
#                                                                              #
#  Makefile for STM32F107xC						       #
#                                                                              #
#  (c) 2015-2016 Joerg Wolfram (joerg@jcwolfram.de)                            #
#                                                                              #
################################################################################

myNAME=main

################################################################################

STARTUP=startup-stm32f1xx.o
DEVICE=stm32f107xc
PDEVICE=STM32F1xx-256k

LIBS=-luni-$(DEVICE) -lgcc

TOOLPREFIX=/usr/local/toolchain/arm-none-eabi/bin/arm-none-eabi
UNILIBPREFIX=/usr/local/toolchain/unilib/stm32

CC=$(TOOLPREFIX)-gcc
AS=$(TOOLPREFIX)-as
AR=$(TOOLPREFIX)-ar
LD=$(TOOLPREFIX)-gcc
OC=$(TOOLPREFIX)-objcopy
OD=$(TOOLPREFIX)-objdump
SZ=$(TOOLPREFIX)-size

CFLAGS=-Wall -Os -mthumb -mcpu=cortex-m3 -msoft-float -fno-builtin -fno-common -nostartfiles -nostdlib -fshort-double
CFLAGS+=-I$(UNILIBPREFIX)/include -L$(UNILIBPREFIX)/lib
CFLAGS+=-I./inc

LDOPTS=-Wl,-script=$(UNILIBPREFIX)/ldscripts/$(DEVICE).x
LDOPTS+=-nostartfiles -nostdlib
LDOPTS+=$(UNILIBPREFIX)/startup/$(STARTUP)
RLDOPTS=-Wl,-script=$(UNILIBPREFIX)/ldscripts/$(DEVICE)_ram.x
RLDOPTS+=-nostartfiles -nostdlib
RLDOPTS+=$(UNILIBPREFIX)/startup/$(STARTUP)
LDFLAGS=-L$(UNILIBPREFIX)/lib
OCFLAGS=-O srec
OC1FLAGS=-O ihex
ODFLAGS=-S -D -xdC
ARFLAGS=rcs

CSOURCES     := $(shell find ./src -type f -name *.c)
COBJECTS     := $(patsubst ./%,build/%,$(CSOURCES:.c=.o))

ASOURCES     := $(shell find ./src -type f -name *.s)
AOBJECTS     := $(patsubst ./%,build/%,$(ASOURCES:.s=.o))

################################################################################

bin:	dir $(COBJECTS) $(AOBJECTS)
	$(LD) $(LDOPTS)  -o $(myNAME).elf $(COBJECTS) $(AOBJECTS) $(LDFLAGS) $(LIBS)
	$(OC) $(OCFLAGS) $(myNAME).elf $(myNAME).s39
	$(OD) $(ODFLAGS) $(myNAME).elf > $(myNAME).lst
	$(SZ) $(myNAME).elf
	@dos2unix $(myNAME).s39

rbin:	dir $(COBJECTS) $(AOBJECTS)
	$(LD) $(RLDOPTS)  -o $(myNAME).elf $(COBJECTS) $(AOBJECTS) $(LDFLAGS) $(LIBS)
	$(OC) $(OCFLAGS) $(myNAME).elf $(myNAME).s39
	$(OD) $(ODFLAGS) $(myNAME).elf > $(myNAME).lst
	$(SZ) $(myNAME).elf
	@dos2unix $(myNAME).s39


lib:	dir $(COBJECTS) $(AOBJECTS)
	$(AR) $(ARFLAGS) $(myNAME).a $(COBJECTS) $(AOBJECTS)

build/%.o: ./%.c
	mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c -o $@ $<

build/%.o: ./%.s
	mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c -o $@ $<

dir:	
	mkdir -p build

prog:	clean bin
	uprog2 $(PDEVICE) -empm $(myNAME).s39

run:	clean rbin
	uprog2 $(PDEVICE) -rr $(myNAME).s39

start:	prog
	uprog2 $(PDEVICE) -st

clean:
	@rm -rf build
	@rm -f $(myNAME).elf
	@rm -f $(myNAME).s39
	@rm -f $(myNAME).a


