NAME = play_rv32_with_qemu_template # ==== Toolchain Configure ==== PREFIX = W:/WCH/MounRiverStudio/toolchain/RISC-V Embedded GCC/bin CC = "$(PREFIX)/riscv-none-embed-gcc.exe" AS = "$(PREFIX)/riscv-none-embed-as.exe" LD = "$(PREFIX)/riscv-none-embed-ld.exe" OBJCOPY = "$(PREFIX)/riscv-none-embed-objcopy.exe" SIZE = "$(PREFIX)/riscv-none-embed-size.exe" QEMU_RV32 = "W:/QEMU/qemu-20210825/qemu-system-riscv32.exe" RM_CMD = ./tools/rm4win.exe -rf # ==== Path Configure ==== SRC_DIR = ./src ASM_DIR = ./asm INC_DIR = ./inc OUT_DIR = ./out LINKER_SCRIPT = ./linker-script.ld STARTUP_SRC = ./startup.s # ==== Other Arguments ==== CC_ARGS = -O0 AS_ARGS = LD_ARGS = OBJCOPY_ARGS = SIZE_ARGS = --format=berkeley QEMU_ARGS = -nographic -bios none QEMU_MACHINE = virt # =========================== STARTUP_OBJ = $(patsubst %.s,$(OUT_DIR)/%.o,$(STARTUP_SRC)) C_SRC = $(wildcard $(SRC_DIR)/*.c) C_OBJ = $(patsubst $(SRC_DIR)/%.c,$(OUT_DIR)/%.o,$(C_SRC)) AS_SRC = $(wildcard $(ASM_DIR)/*.s) AS_OBJ = $(patsubst $(ASM_DIR)/%.s,$(OUT_DIR)/%.o,$(AS_SRC)) .PHONY : all .PHONY : bin .PHONY : hex .PHONY : clean .PHONY : qemu .PHONY : size .IGNORE : qemu all : bin hex size bin : $(NAME).bin hex : $(NAME).hex $(NAME).hex : $(NAME).elf $(OBJCOPY) $(OBJCOPY_ARGS) -O ihex $< $@ $(NAME).bin : $(NAME).elf $(OBJCOPY) $(OBJCOPY_ARGS) -O binary $< $@ size : $(NAME).elf $(SIZE) $(SIZE_ARGS) $< $(NAME).elf : $(LINKER_SCRIPT) $(STARTUP_OBJ) $(C_OBJ) $(AS_OBJ) $(LD) -T $(LINKER_SCRIPT) $(LD_ARGS) -o $@ $(STARTUP_OBJ) $(C_OBJ) $(AS_OBJ) $(STARTUP_OBJ) : $(STARTUP_SRC) $(AS) $(AS_ARGS) -o $@ $< $(OUT_DIR)/%.o : $(ASM_DIR)/%.s $(AS) $(AS_ARGS) -o $@ $^ $(OUT_DIR)/%.o : $(SRC_DIR)/%.c $(CC) $(CC_ARGS) -I $(INC_DIR) -o $@ $< clean : -$(RM_CMD) ./$(NAME).bin -$(RM_CMD) ./$(NAME).hex -$(RM_CMD) ./$(NAME).elf -$(RM_CMD) ./$(OUT_DIR)/* qemu : $(NAME).bin $(QEMU_RV32) -machine $(QEMU_MACHINE) $(QEMU_ARGS) -kernel $<