# TODO: some variables needed to be set

######### riscv backend, O2, noinline   
LLVM_PATH ?= /home/software/app/llvm-rv/llvm
GNU_PATH ?= /home/software/app/gcc-rv/riscv32-gcc-ilp32f-20230203
C_FLAGS ?= --target=summercore32p1p0-unknown-elf -mabi=ilp32f -g -march=rv32imfc -c -D __IEEE_LITTLE_ENDIAN -D FDM320RV_SC -O2 -I ./driverlib/include -I ./driverlib/include/interrupt -I ./system -I $(GNU_PATH)/lib/gcc/riscv32-unknown-elf/10.2.0/include -I $(GNU_PATH)/lib/gcc/riscv32-unknown-elf/10.2.0/include-fixed -I $(GNU_PATH)/riscv32-unknown-elf/include 
ASM_FLAGS ?= --target=summercore32p1p0-unknown-elf -g -mabi=ilp32f -march=rv32imf -c
LD_FLAGS ?= -g --gcc-toolchain=$(GNU_PATH) -Wl,--gc-sections --target=riscv32-unknown-elf -L /home/guoy/rv/newlib/build_gnu_basic/riscv32-unknown-elf/lib -T./system/link_riscv.ld -march=rv32imf -mabi=ilp32f
GET_LABEL_ADDRESS ?= tools/get_label_address.py

OBJDUMP_FLAGS ?= -S -d --triple=summercore32p1p0 --mattr=+a,m,f,c
OBJCOPY_FLAGS ?= -O binary
# set variables done


CC := $(LLVM_PATH)/bin/clang
AS := $(LLVM_PATH)/bin/clang
OBJDUMP := $(LLVM_PATH)/bin/llvm-objdump
OBJCOPY := $(LLVM_PATH)/bin/llvm-objcopy
BIN2HEX := ./tools/bin2vhx.pl

TARGET_EXEC ?= $(shell basename $(CURDIR)).elf
TARGET_DIS ?= $(shell basename $(CURDIR)).dis
TARGET_BIN ?= $(shell basename $(CURDIR)).bin
TARGET_HEX ?= $(shell basename $(CURDIR)).hex
TARGET_INI ?= $(shell basename $(CURDIR)).ini

BUILD_DIR ?= ./build
SRC_DIRS := ./

SRCS := $(shell find $(SRC_DIRS) -name *.c -or -name *.s -or -name *.S)
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)

$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS)
	$(CC) $(OBJS) -o $@ $(LD_FLAGS)
	$(OBJDUMP) $(OBJDUMP_FLAGS) $(BUILD_DIR)/$(TARGET_EXEC) > $(BUILD_DIR)/$(TARGET_DIS)
	$(OBJCOPY) $(OBJCOPY_FLAGS) $(BUILD_DIR)/$(TARGET_EXEC) $(BUILD_DIR)/$(TARGET_BIN)
	$(BIN2HEX) $(BUILD_DIR)/$(TARGET_BIN) $(BUILD_DIR)/$(TARGET_HEX)
	$(GET_LABEL_ADDRESS) $(BUILD_DIR)/$(TARGET_DIS) $(BUILD_DIR)/$(TARGET_INI)

# assembly
$(BUILD_DIR)/%.s.o: %.s
	@$(MKDIR_P) $(dir $@)
	$(AS) $(ASM_FLAGS) $< -o $@

$(BUILD_DIR)/%.S.o: %.S
	@$(MKDIR_P) $(dir $@)
	$(AS) $(ASM_FLAGS) $< -o $@

# c source
$(BUILD_DIR)/%.c.o: %.c
	@$(MKDIR_P) $(dir $@)
	$(CC) $(C_FLAGS) $(CFLAGS) -c $< -o $@

.PHONY: clean

clean:
	$(RM) -r $(BUILD_DIR)

MKDIR_P ?= mkdir -p

