
# Default project
# - Overwrite via command line argument ("make PROJECT=Turbo") or environment variable
ifndef $(PROJECT)
	PROJECT = Gearshift
endif

#BEGIN: Common source files of all projects
A_SRC_ALL = startup_stm32f10x_md.s
C_SRC_ALL = $(wildcard Libraries/STM32F10x_StdPeriph_Driver/src/*.c) \
            $(wildcard Libraries/FreeRTOS/Source/*.c) \
			Libraries/FreeRTOS/Source/portable/MemMang/heap_2.c \
			Libraries/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c \
			$(wildcard Libraries/FatFS/src/*.c) \
			$(wildcard Libraries/Common/*.c)
#END

#BEGIN: Project specific source files
C_SRC_GEARSHIFT = $(wildcard Projects/$(PROJECT)/*.c)
C_SRC_TURBO     = $(wildcard Projects/$(PROJECT)/*.c)
#END

#BEGIN: Include directories of all Projects
INC_DIRS = Libraries/CMSIS/Core/CM3 \
           Libraries/STM32F10x_StdPeriph_Driver/inc \
		   Libraries/FreeRTOS/Source/include \
		   Libraries/FreeRTOS/Source/portable/GCC/ARM_CM3 \
		   Libraries/FatFS/src \
		   Libraries/Common \
		   Projects/Gearshift \
		   Projects/Turbo \
		   "C:\Program Files\Cygwin\opt\gnuarm\arm-elf\include"
#END

#BEGIN: Assembler/Compiler/Linker flags
A_FLAGS = -mcpu=cortex-m3 -mthumb -Wa,-gdwarf-2 -lc -lgcc -lm
C_FLAGS = -mcpu=cortex-m3 -mthumb -O0 -gdwarf-2 $(patsubst %,-I%,$(INC_DIRS)) -I.
L_FLAGS = -T stm32f10x_md.ld -Wl,--gc-sections
#END


############# No need to edit anything beyond here #############



# BEGIN: Automatic project specific configuration
OUT_DIR = Objects/$(PROJECT)

# Create object files directory
$(shell mkdir $(OUT_DIR) 2>/dev/null)

ifeq ($(PROJECT),Gearshift)
 A_SRC = $(A_SRC_ALL)
 C_SRC = $(C_SRC_ALL) $(C_SRC_GEARSHIFT)
endif

ifeq ($(PROJECT),Turbo)
 A_SRC = $(A_SRC_ALL)
 C_SRC = $(C_SRC_ALL) $(C_SRC_TURBO)
endif
# END


# BEGIN: Automatic calculation of object file names (*.o)
ALL_SRC      = $(A_SRC) $(C_SRC)
ALL_SRC_BASE = $(notdir $(basename $(ALL_SRC)))
ALL_OBJ      = $(addprefix $(OUT_DIR)/, $(addsuffix .o, $(ALL_SRC_BASE)))
# END




.PHONY: all elf bin hex list-bin disassemble program reset clean

# ----------- TARGET: ALL ------------
all: elf
	@if test -f $(OUT_DIR)/$(PROJECT).elf; then \
		echo; \
		arm-elf-size --format=sysv $(OUT_DIR)/$(PROJECT).elf 2>/dev/null; \
	fi
	

# ----------- TARGET: ELF ------------
elf: $(OUT_DIR)/$(PROJECT).elf

$(OUT_DIR)/$(PROJECT).elf:  $(ALL_OBJ)
	@echo
	@echo Linking: $@
	arm-elf-gcc $(C_FLAGS) $(ALL_OBJ) --output $@ $(L_FLAGS)

define ASSEMBLE
$(OUT_DIR)/$(notdir $(basename $(1))).o : $(1)
	@echo
	@echo Assembling: $$<
	arm-elf-gcc -c $(A_FLAGS) $$< -o $$@
endef
$(foreach src, $(A_SRC), $(eval $(call ASSEMBLE,$(src))))

define COMPILE_AND_ASSEMBLE
$(OUT_DIR)/$(notdir $(basename $(1))).o : $(1)
	@echo
	@echo Compiling: $$<
	arm-elf-gcc -c $(C_FLAGS)  $$< -o $$@
endef
$(foreach src, $(C_SRC), $(eval $(call COMPILE_AND_ASSEMBLE,$(src))))

# ----------- TARGET: BIN ------------
bin: $(OUT_DIR)/$(PROJECT).bin

%.bin: %.elf
	@echo
	@echo Creating: $@
	arm-elf-objcopy -O binary $< $@

# ----------- TARGET: HEX ------------
hex: $(OUT_DIR)/$(PROJECT).hex

%.hex: %.elf
	@echo
	@echo Creating: $@
	arm-elf-objcopy -O ihex $< $@

# -------- TARGET: LIST-BIN ----------
list-bin:
	od -t x1 $(OUT_DIR)/$(PROJECT).bin

# ------- TARGET: DISASSEMBLE ---------
disassemble:
	arm-elf-objdump -d $(OUT_DIR)/$(PROJECT).elf

# --------- TARGET: PROGRAM ----------
program:
	openocd -f stm32-stick.cfg -d0 -c targets -c "reset halt" -c "flash write_image erase $(OUT_DIR)/$(PROJECT).elf" -c "reset run" -c shutdown
#	cp $(OUT_DIR)/$(PROJECT).elf C:/Users/Oliver
	@echo "make program finished"

# ---------- TARGET: RESET -----------
reset:
	openocd -f stm32-stick.cfg -d0 -c halt -c "reset run" -c shutdown
	@echo "make reset finished"

# ---------- TARGET: CLEAN -----------
clean:
	rm -f $(ALL_OBJ)
	rm -f $(OUT_DIR)/$(PROJECT).elf
	rm -f $(OUT_DIR)/$(PROJECT).hex
	rm -f $(OUT_DIR)/$(PROJECT).bin

