
# toolchain
TOOLCHAIN    = arm-none-eabi-
CC           = $(TOOLCHAIN)gcc
CP           = $(TOOLCHAIN)objcopy
AS           = $(TOOLCHAIN)gcc -x assembler-with-cpp
HEX          = $(CP) -O ihex
BIN          = $(CP) -O binary -S

# define mcu, specify the target processor
MCU          = cortex-m0plus

# all the files will be generated with this name (main.elf, main.bin, main.hex, etc)
PROJECT_NAME=music-box-nv32

# specify define
DDEFS       =

# define root dir
ROOT_DIR     = .

# define include dir
INCLUDE_DIRS =

# define nv32 lib dir
NV32_LIB_DIR      = $(ROOT_DIR)/nv32lib

# define user dir
USER_DIR     = $(ROOT_DIR)

# link file
LINK_SCRIPT  = $(ROOT_DIR)/nv32f100.ld

# user specific
SRC       =
ASM_SRC   =


SRC      += $(USER_DIR)/main.c
SRC      += $(USER_DIR)/gcc-stdio-retarget.c
SRC      += $(USER_DIR)/KeyScan.c
SRC      += $(USER_DIR)/DownloadScoreData.c

SRC      += $(ROOT_DIR)/WaveTableSynthesizer/SynthCore.c
SRC      += $(ROOT_DIR)/WaveTableSynthesizer/EnvelopTable.c
SRC      += $(ROOT_DIR)/WaveTableSynthesizer/AlgorithmTest.c
SRC      += $(ROOT_DIR)/WaveTableSynthesizer/WaveTable_Celesta_C5.c
SRC      += $(ROOT_DIR)/WaveTableSynthesizer/WaveTable_Celesta_C6.c
SRC      += $(ROOT_DIR)/WaveTableSynthesizer/Player.c

SRC      += $(ROOT_DIR)/Ring-Buffer/ringbuffer.c

ASM_SRC  += $(ROOT_DIR)/WaveTableSynthesizer/PeriodTimer.s
ASM_SRC  += $(ROOT_DIR)/WaveTableSynthesizer/SynthCoreAsm.s
# ASM_SRC  += $(ROOT_DIR)/ScoreList.s


# user include
INCLUDE_DIRS  = $(USER_DIR)
INCLUDE_DIRS  += $(ROOT_DIR)/WaveTableSynthesizer
INCLUDE_DIRS  += $(ROOT_DIR)/Ring-Buffer

# include sub makefiles
include makefile_std_lib.mk   # NV32 Library

INC_DIR  = $(patsubst %, -I%, $(INCLUDE_DIRS))

# run from Flash
DEFS	 = $(DDEFS) -DRUN_FROM_FLASH=1

OBJECTS  = $(ASM_SRC:.s=.o) $(SRC:.c=.o) scoreList.o

DEPS = $(SRC:.c=.d) $(ASM_SRC:.s=.d)


# Define optimisation level here
OPT = -Os

MC_FLAGS = -mcpu=$(MCU)

AS_FLAGS = $(MC_FLAGS) -g -gdwarf-2 -mthumb  -Wa,-amhls=$(<:.s=.lst)
CP_FLAGS = $(MC_FLAGS) $(OPT) -std=gnu99 -fdata-sections -ffunction-sections -g -gdwarf-2 -mthumb -fomit-frame-pointer -Wall -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS)
LD_FLAGS = $(MC_FLAGS) -g -specs=nano.specs -specs=nosys.specs -gdwarf-2 -mthumb -nostartfiles -Xlinker -T$(LINK_SCRIPT) -Wl,-Map=$(PROJECT_NAME).map,--cref,--no-warn-mismatch,--gc-sections
DEPFLAGS = -MT $@ -MMD -MP -MF $*.d
#
# makefile rules
#



all: $(OBJECTS) $(PROJECT_NAME).elf  $(PROJECT_NAME).hex $(PROJECT_NAME).bin
	$(TOOLCHAIN)size $(PROJECT_NAME).elf


# Don't delete dependency files
.PRECIOUS: %.d

# Don't rebuild deps if cleaning
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)	
endif


%.o: %.c Makefile makefile_std_lib.mk
	@echo [CC] $(notdir $<)
	@$(CC) $(DEPFLAGS) -c $(CP_FLAGS) -I . $(INC_DIR) $< -o $@

%.o: %.s
	@echo [AS] $(notdir $<)
	@$(AS) $(DEPFLAGS) -c $(AS_FLAGS) $< -o $@
	
scoreList.o: scoreList.raw
	@echo [RAW] scoreList.raw
	@$(CP) -I binary -O elf32-littlearm scoreList.raw scoreList.o

%.elf: $(OBJECTS)  $(LINK_SCRIPT)
	@echo [LD] $(PROJECT_NAME).elf
	@$(CC) $(OBJECTS) $(LD_FLAGS) -o $@

%.hex: %.elf
	@echo [HEX] $(PROJECT_NAME).hex
	@$(HEX) $< $@

%.bin: %.elf
	@echo [BIN] $(PROJECT_NAME).bin
	@$(BIN)  $< $@

flash: $(PROJECT_NAME).bin
	st-flash write $(PROJECT_NAME).bin 0x8000000

erase:
	st-flash erase

clean:
	@echo [RM] OBJ
	@-rm -rf $(OBJECTS)
	@echo [RM] BIN "(ELF,HEX,BIN)"
	@-rm -rf $(PROJECT_NAME).elf
	@-rm -rf $(PROJECT_NAME).hex
	@-rm -rf $(PROJECT_NAME).bin
	@echo [RM] LST
	@-rm -rf $(SRC:.c=.lst)
	@-rm -rf $(ASM_SRC:.s=.lst)
	@echo [RM] MAP
	@-rm -rf $(PROJECT_NAME).map
	@echo [RM] DEPENDENCY
	@-rm -rf $(DEPS)
