TOOLCHAIN_PREFIX ?= riscv64-elf-

CC      := $(TOOLCHAIN_PREFIX)gcc
OBJCOPY := $(TOOLCHAIN_PREFIX)objcopy
OBJDUMP := $(TOOLCHAIN_PREFIX)objdump
SIZE    := $(TOOLCHAIN_PREFIX)size

TARGET  := sweep
SRCS_C  := sweep.c
SRCS_S  := start.s
OBJS    := $(SRCS_C:.c=.o) $(SRCS_S:.s=.o)

ARCH_FLAGS := -march=rv32i_zicsr -mabi=ilp32
CFLAGS     := $(ARCH_FLAGS) -Os -ffreestanding -fno-builtin -Wall -Wextra
ASFLAGS    := $(ARCH_FLAGS)
LDFLAGS    := $(ARCH_FLAGS) -nostdlib -nostartfiles -Wl,-Bstatic,-Tlink.ld,--gc-sections,-Map,$(TARGET).map

.PHONY: all clean disasm size

all: $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).elf.asm

$(TARGET).elf: $(OBJS) link.ld
	$(CC) $(LDFLAGS) -o $@ $(OBJS)

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

%.o: %.s
	$(CC) $(ASFLAGS) -c -o $@ $<

$(TARGET).bin: $(TARGET).elf
	$(OBJCOPY) -O binary $< $@

$(TARGET).hex: $(TARGET).bin
	hexdump -v -e '1/4 "%08x\n"' $< > $@

$(TARGET).elf.asm: $(TARGET).elf
	$(OBJDUMP) -d -S $< > $@

disasm: $(TARGET).elf.asm

size: $(TARGET).elf
	$(SIZE) $<

clean:
	rm -f $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).coe $(TARGET).mif \
		$(TARGET).elf.asm $(TARGET).map $(OBJS)
