RISCV_PREFIX ?= riscv64-unknown-elf- CC := $(RISCV_PREFIX)gcc OBJCOPY := $(RISCV_PREFIX)objcopy OBJDUMP := $(RISCV_PREFIX)objdump SIZE := $(RISCV_PREFIX)size RV_ENV_ROOT ?= /home/user/dev/edu/rv32i-hazard3-student-env H3_COMMON ?= $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/common H3_INIT ?= $(H3_COMMON)/init.S H3_IRQ_DISPATCH ?= $(H3_COMMON)/irq_dispatch.S LDSCRIPT ?= $(H3_COMMON)/link_hazard3.ld MEMOPS ?= $(RV_ENV_ROOT)/vendor/lab-runtime/memops.c BUILD_ROOT ?= build TASKS := task01_gpio_polling task02_gpio_rising_irq task03_gpio_quiet_window task04_raw_c_superloop ARCH ?= rv32i_zicsr_zifencei ABI ?= ilp32 CFLAGS := -std=gnu11 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles \ -ffreestanding -fno-builtin -fno-stack-protector -fno-pic -mno-relax \ -O0 -g3 -fno-omit-frame-pointer -Wall -Wextra \ -Isrc/tasks -isystem $(H3_COMMON) LDFLAGS := -Wl,--no-relax -T$(LDSCRIPT) LIBS := -lgcc .PHONY: all tasks test card-test clean check-support task1 task2 task3 task4 all: tasks tasks: $(TASKS) task1: $(word 1,$(TASKS)) task2: $(word 2,$(TASKS)) task3: $(word 3,$(TASKS)) task4: $(word 4,$(TASKS)) test: tasks ./tests/test_hazard3.sh card-test: ./tests/test_card.sh check-support: @test -f "$(H3_INIT)" @test -f "$(H3_IRQ_DISPATCH)" @test -f "$(H3_COMMON)/tb_gpio_io.h" @test -f "$(H3_COMMON)/tb_uart_io.h" @test -f "$(LDSCRIPT)" @test -f "$(MEMOPS)" define TASK_RULES $(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.lst $(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/c13_common.h $(H3_INIT) $(H3_IRQ_DISPATCH) $(LDSCRIPT) $(MEMOPS) | check-support mkdir -p $$(@D) $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map \ -o $$@ $(H3_INIT) $(H3_IRQ_DISPATCH) crt0.S $(MEMOPS) src/tasks/$(1).c $(LIBS) $(SIZE) -A -x $$@ $(BUILD_ROOT)/$(1)/prog.bin: $(BUILD_ROOT)/$(1)/prog.elf $(OBJCOPY) -O binary $$< $$@ $(BUILD_ROOT)/$(1)/prog.lst: $(BUILD_ROOT)/$(1)/prog.elf $(OBJDUMP) -d -S -M no-aliases,numeric $$< > $$@ endef $(foreach task,$(TASKS),$(eval $(call TASK_RULES,$(task)))) clean: rm -rf $(BUILD_ROOT)