55 lines
1.6 KiB
Makefile
55 lines
1.6 KiB
Makefile
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
|
|
LDSCRIPT ?= link/hazard3_c10.ld
|
|
MEMOPS ?= $(RV_ENV_ROOT)/vendor/lab-runtime/memops.c
|
|
|
|
BUILD_ROOT ?= build
|
|
TASKS := task01_ecall_resume task02_machine_software_irq task03_pending_enable_matrix
|
|
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 -Wall -Wextra -Isrc/tasks -isystem $(H3_COMMON)
|
|
LDFLAGS := -Wl,--no-relax -T$(LDSCRIPT)
|
|
LIBS := -lgcc
|
|
|
|
.PHONY: all tasks check clean task1 task2 task3
|
|
all: tasks
|
|
tasks: $(TASKS)
|
|
task1: $(word 1,$(TASKS))
|
|
task2: $(word 2,$(TASKS))
|
|
task3: $(word 3,$(TASKS))
|
|
|
|
check:
|
|
@test -f "$(H3_INIT)"
|
|
@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/c10_common.h $(H3_INIT) $(LDSCRIPT) $(MEMOPS) | check
|
|
mkdir -p $$(@D)
|
|
$(CC) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map \
|
|
-o $$@ $(H3_INIT) 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)
|