PREFIX   = riscv64-unknown-elf-
CC       = $(PREFIX)gcc
OBJCOPY  = $(PREFIX)objcopy
OBJDUMP  = $(PREFIX)objdump
SIZE     = $(PREFIX)size

TARGET = test
OPT = -Og
DEBUG = 1
BUILD_DIR = build

C_SOURCES   = main.c
ASM_SOURCES = start.S entry.S
C_INCLUDES  = -I.
LDSCRIPT    = link.ld

ARCH   = -march=rv32imac -mabi=ilp32 -mcmodel=medlow
CFLAGS = $(ARCH) $(OPT) -ffunction-sections -fdata-sections -std=gnu11 $(C_INCLUDES)
LDFLAGS= -T$(LDSCRIPT) -nostartfiles -Wl,--no-relax -Wl,-Bstatic -Wl,--gc-sections -Wl,-Map=$(BUILD_DIR)/$(TARGET).map

ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o)))

all: $(BUILD_DIR)/$(TARGET).elf \
     $(BUILD_DIR)/$(TARGET).bin \
     $(BUILD_DIR)/$(TARGET).hex \

$(BUILD_DIR):
	mkdir -p $@

$(BUILD_DIR)/%.o: %.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: %.S | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS)
	$(CC) $(OBJECTS) $(CFLAGS) -o $@ $(LDFLAGS)
	$(SIZE) $@
	$(OBJDUMP) -xS $@ > $(BUILD_DIR)/$(TARGET).s

$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf
	$(OBJCOPY) -O binary $< $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf
	$(OBJCOPY) -O ihex $< $@

clean:
	rm -rf $(BUILD_DIR)
flash: all
	-openocd -f ./openocd_gd32vf103.cfg -c "program {$(BUILD_DIR)/$(TARGET).elf} verify reset exit"
debug:
	-openocd -f ./openocd_gd32vf103.cfg

.PHONY: all clean flash debug

