RISCV_PREFIX ?= riscv64-unknown-elf- CC := $(RISCV_PREFIX)gcc OBJCOPY := $(RISCV_PREFIX)objcopy OBJDUMP := $(RISCV_PREFIX)objdump SIZE := $(RISCV_PREFIX)size HOST_CC ?= cc DEBUG ?= 1 ifeq ($(DEBUG),1) DBGFLAGS := -g3 -ggdb else DBGFLAGS := endif RV_ENV_ROOT ?= /opt/rv-env SUPPORT_ROOT ?= $(RV_ENV_ROOT)/vendor/Hazard3 H3_COMMON ?= $(SUPPORT_ROOT)/test/sim/common H3_INIT ?= $(H3_COMMON)/init.S LDSCRIPT ?= $(H3_COMMON)/link_hazard3.ld LAB_RUNTIME_DIR ?= $(RV_ENV_ROOT)/vendor/lab-runtime MEMOPS ?= $(LAB_RUNTIME_DIR)/memops.c BUILD_ROOT ?= build HOST_BUILD_ROOT ?= host-build TASKS := \ task01_heap_map \ task02_free_list \ task03_heap_init \ task04_alignment \ task05_malloc_first_fit \ task06_split_block \ task07_free_insert \ task08_coalescing \ task09_config_macros \ task10_heap4_demo ARCH ?= rv32i_zicsr_zifencei ABI ?= ilp32 COMMON_FLAGS := -std=c99 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles -ffreestanding -fno-builtin -fno-stack-protector $(DBGFLAGS) -Wall -Wextra -Isrc/tasks LINK_FLAGS := -Wl,--no-relax -Wl,-T,$(LDSCRIPT) LIBS := -lgcc EMIT_FLAGS := -std=c99 -march=$(ARCH) -mabi=$(ABI) -O -ffreestanding -fno-builtin -fno-stack-protector -nostdlib -nostartfiles -Wall -Wextra -Isrc/tasks CFLAGS_STEP := $(COMMON_FLAGS) -O HOST_CFLAGS := -std=c99 -O0 -g -Wall -Wextra -DHOST_PRINTF=1 -Isrc/tasks .PHONY: all tasks host \ task1 task2 task3 task4 task5 task6 task7 task8 task9 task10 \ t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 \ host-task1 host-task2 host-task3 host-task4 host-task5 host-task6 host-task7 host-task8 host-task9 host-task10 \ ht1 ht2 ht3 ht4 ht5 ht6 ht7 ht8 ht9 ht10 \ clean check-support $(TASKS) all: tasks tasks: $(TASKS) host: $(addprefix $(HOST_BUILD_ROOT)/,$(addsuffix /prog,$(TASKS))) task1 t1: $(word 1,$(TASKS)) task2 t2: $(word 2,$(TASKS)) task3 t3: $(word 3,$(TASKS)) task4 t4: $(word 4,$(TASKS)) task5 t5: $(word 5,$(TASKS)) task6 t6: $(word 6,$(TASKS)) task7 t7: $(word 7,$(TASKS)) task8 t8: $(word 8,$(TASKS)) task9 t9: $(word 9,$(TASKS)) task10 t10: $(word 10,$(TASKS)) host-task1 ht1: $(HOST_BUILD_ROOT)/$(word 1,$(TASKS))/prog host-task2 ht2: $(HOST_BUILD_ROOT)/$(word 2,$(TASKS))/prog host-task3 ht3: $(HOST_BUILD_ROOT)/$(word 3,$(TASKS))/prog host-task4 ht4: $(HOST_BUILD_ROOT)/$(word 4,$(TASKS))/prog host-task5 ht5: $(HOST_BUILD_ROOT)/$(word 5,$(TASKS))/prog host-task6 ht6: $(HOST_BUILD_ROOT)/$(word 6,$(TASKS))/prog host-task7 ht7: $(HOST_BUILD_ROOT)/$(word 7,$(TASKS))/prog host-task8 ht8: $(HOST_BUILD_ROOT)/$(word 8,$(TASKS))/prog host-task9 ht9: $(HOST_BUILD_ROOT)/$(word 9,$(TASKS))/prog host-task10 ht10: $(HOST_BUILD_ROOT)/$(word 10,$(TASKS))/prog check-support: @test -f "$(H3_INIT)" || { echo "Missing $(H3_INIT). Run inside rv-env or set RV_ENV_ROOT=/path/to/rv32i-hazard3-env" >&2; exit 1; } @test -f "$(LDSCRIPT)" || { echo "Missing $(LDSCRIPT)." >&2; exit 1; } @test -f "$(MEMOPS)" || { echo "Missing $(MEMOPS)." >&2; exit 1; } define task_rules $(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.elf $(BUILD_ROOT)/$(1)/prog.lst $(BUILD_ROOT)/$(1)/$(1).s $(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/heap4_common.h $(H3_INIT) $(LDSCRIPT) $(MEMOPS) | check-support mkdir -p $$(@D) $(CC) $(CFLAGS_STEP) $(LINK_FLAGS) -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 -M no-aliases,numeric $$< > $$@ $(BUILD_ROOT)/$(1)/$(1).s: src/tasks/$(1).c src/tasks/heap4_common.h | check-support mkdir -p $$(@D) $(CC) $(EMIT_FLAGS) -S -o $$@ $$< $(HOST_BUILD_ROOT)/$(1)/prog: src/tasks/$(1).c src/tasks/heap4_common.h mkdir -p $$(@D) $(HOST_CC) $(HOST_CFLAGS) -o $$@ $$< endef $(foreach task,$(TASKS),$(eval $(call task_rules,$(task)))) clean: rm -rf $(BUILD_ROOT) $(HOST_BUILD_ROOT)