CC      = riscv64-unknown-elf-gcc
OBJCOPY = riscv64-unknown-elf-objcopy
SIZE    = riscv64-unknown-elf-size

PROJECT  = fan_controller
BUILD    = build
SRC_DIR  = src
FUN_DIR  = $(HOME)/git/ch32fun/ch32fun

MINICHLINK = $(FUN_DIR)/../minichlink/minichlink

SRCS = $(SRC_DIR)/main.c $(FUN_DIR)/ch32fun.c
OBJS = $(patsubst %.c, $(BUILD)/%.o, $(SRCS))

CFLAGS = \
    -march=rv32ec \
    -mabi=ilp32e \
    -Os \
    -flto \
    -ffunction-sections \
    -fdata-sections \
    -fno-common \
    -DCH32V003 \
    -Wall \
    -Wno-attributes \
    -I$(FUN_DIR) \
    -I$(SRC_DIR) \
    -I/usr/include/newlib \
    -I$(SRC_DIR)/funconf.h

LD_SCRIPT_IN  = $(FUN_DIR)/ch32fun.ld
LD_SCRIPT_OUT = $(BUILD)/ch32fun_processed.ld

LDFLAGS = \
    -march=rv32ec \
    -mabi=ilp32e \
    -T$(LD_SCRIPT_OUT) \
    -Wl,--gc-sections \
    -nostdlib \
    -flto

.PHONY: all flash clean

all: $(BUILD)/$(PROJECT).bin

# Preprocess linker script
$(LD_SCRIPT_OUT): $(LD_SCRIPT_IN) | $(BUILD)
	$(CC) -E -P -DCH32V003 -x assembler-with-cpp $< -o $@

# Compile
$(BUILD)/%.o: %.c | $(BUILD)
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c $< -o $@

# Link
$(BUILD)/$(PROJECT).elf: $(OBJS) $(LD_SCRIPT_OUT)
	$(CC) $(LDFLAGS) $(OBJS) -lgcc -o $@
	$(SIZE) $@

# Binary
$(BUILD)/$(PROJECT).bin: $(BUILD)/$(PROJECT).elf
	$(OBJCOPY) -O binary $< $@

# Flash
flash: $(BUILD)/$(PROJECT).bin
	$(MINICHLINK) -w $< flash -b

# Create build dir
$(BUILD):
	mkdir -p $(BUILD)

clean:
	rm -rf $(BUILD)
