#-------------------------------------------------------------------------------
#		User-modifiable options
#-------------------------------------------------------------------------------

# Trace level used for compilation
# (can be overriden by adding TRACE_LEVEL=#number to the command-line)
# 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 = TRACE_LEVEL_NO_TRACE

# Optimization level, put in comment for debugging
#OPTIMIZATION = -Os
OPTIMIZATION = -Os

# Output file basename
OUTPUT = stm_ecoscpp

# Output directories
BIN = bin
OBJ = obj

#-------------------------------------------------------------------------------
#		Tools
#-------------------------------------------------------------------------------

# Tool suffix when cross-compiling
CROSS_COMPILE = arm-none-eabi-
PREFIX = C:\cygwin\tmp\ecos_stm32_install

# Compilation tools
CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)g++
SIZE = $(CROSS_COMPILE)size
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy

# Flags
INCLUDES  = -I$(PREFIX)/include
INCLUDES += -Iapp/../
INCLUDES += -Ilibs/libstm32/inc
#CFLAGS 		= $(INCLUDES) -DTRACE_LEVEL=$(TRACE_LEVEL) -Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m3 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions
CFLAGS 		= -Wall -ffunction-sections -g $(OPTIMIZATION) $(INCLUDES) -DTRACE_LEVEL=$(TRACE_LEVEL) -mcpu=cortex-m3 -mthumb
#CPPFLAGS 	=
CPPFLAGS 	= -fno-rtti -fno-exceptions
ASFLAGS 	= -g $(OPTIMIZATION) $(INCLUDES) -D__ASSEMBLY__
LDFLAGS 	= -g $(OPTIMIZATION) -nostartfiles -Wl,-Map=output.map,--gc-sections -mcpu=cortex-m3 -mthumb -n -g -nostdlib -lstdc++
#LDFLAGS 	= -mcpu=cortex-m3 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib -lstdc++
#LDFLAGS 	= -mcpu=cortex-m3 -mthumb -Wl,--gc-sections -Wl,-n -g -nostdlib -lstdc++
 
#-------------------------------------------------------------------------------
#		Files
#-------------------------------------------------------------------------------

# Directories where source files can be found

VPATH += Demodulators
VPATH += Drivers
VPATH += Filters
VPATH += GainControl
VPATH += PVTracer
VPATH += libs/libdsp
VPATH += libs/libstm32/src


# List C++ source files here which must be compiled in ARM-Mode.
# use file-extension cpp for C++-files (use extension .cpp)

CPP_OBJECTS = main2.o DSPController.o RxDSP.o

#Demodulators
CPP_OBJECTS += SSBDemod.o
#Drivers
CPP_OBJECTS += Timer7.o DebugLED.o
#Filters
CPP_OBJECTS += FIR6OrderLP32TabFilter.o
#GainControl
CPP_OBJECTS += VoiceGainControl.o
#PVTracer
CPP_OBJECTS += ProcValTracer.o TraceableProcVal.o

#libstm32
C_OBJECTS += stm32f10x_gpio.o stm32f10x_can.o stm32f10x_rcc.o stm32f10x_tim.o stm32f10x_adc.o
C_OBJECTS += stm32f10x_dma.o stm32f10x_exti.o stm32f10x_dac.o stm32f10x_spi.o stm32f10x_i2c.o
C_OBJECTS += stm32f10x_iwdg.o

# Objects built from Assembly source files
ASM_OBJECTS =

# Append OBJ and BIN directories to output filename
OUTPUT := $(BIN)/$(OUTPUT)

MEMORIES = flash
#-------------------------------------------------------------------------------
#		Rules
#-------------------------------------------------------------------------------

clean:

all: $(BIN) $(OBJ) $(MEMORIES)
$(BIN) $(OBJ):
	mkdir $@

define RULES
C_OBJECTS_$(1)   = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
CPP_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(CPP_OBJECTS))
ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))

$(1): $$(ASM_OBJECTS_$(1)) $$(CPP_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
	$(CPP) $(LDFLAGS) -L$(PREFIX)/lib -T$(PREFIX)/lib/target.ld -o $(OUTPUT)-$$@.elf $$^
	$(OBJCOPY) -O binary $(OUTPUT)-$$@.elf $(OUTPUT)-$$@.bin
	@echo 'Size of modules:'
	$(SIZE) -B --common $$(CPP_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
	@echo ' '
	$(SIZE) -B $(PREFIX)/lib/libtarget.a
	$(SIZE) -B $(PREFIX)/lib/libextras.a
	@echo 'Size of target .elf file:'
	$(SIZE) -B $(OUTPUT)-$$@.elf
	arm-none-eabi-objdump -h -S -C $(OUTPUT)-$$@.elf > main.lss

$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)
	$(CC) $(CFLAGS) -D$(1) -c -o $$@ $$<

$$(CPP_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.cpp Makefile $(OBJ) $(BIN)
	$(CPP)  -S -c $(CFLAGS) $(CPPFLAGS) $$<
	$(CPP)  -c -g -Wa,-a,-ad $(CFLAGS) $(CPPFLAGS) $$< > %.lst
	$(CPP) $(CFLAGS) $(CPPFLAGS) -c -o $$@ $$<

$$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)
	$(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$<
	
endef

$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))
	