# Color definitions ------------------------------- NO_COLOR="\033[0m" RED="\033[38;5;009m" GREEN="\033[38;5;010m" YELLOW="\033[38;5;011m" ORANGE="\033[38;5;214m" LIGHTPURPLE="\033[38;5;177m" PURPLE="\033[38;5;135m" CYAN="\033[38;5;014m" LIGHTBLUE="\033[38;5;39m" BLUE="\033[38;5;75m" DARKBLUE="\033[38;5;33m" LIGHTGRAY="\033[38;5;252m" DARKGRAY="\033[38;5;242m" BRIGHTRED="\033[91m" BOLD="\033[1m" # PLATFORM definition, if not given ---------------- PLATFORM ?= pqvexriscvsim # PATHS (adapt to your system)---------------------- PATH_RISCV=/opt/riscv/ PATH_RISC_BIN=$(PATH_RISCV)bin/ PREFIX?=$(PATH_RISC_BIN)riscv64-unknown-elf # Project DIRS ------------------------------------- LD_DIR=ld/ BSP_DIR=bsp/ SRC_DIR=src/ INC_DIR=inc/ OBJ_DIR=obj/ # TOOLS -------------------------------------------- AR?=$(PREFIX)-ar GCC?=$(PREFIX)-gcc CLANG=clang GDB?=$(PREFIX)-gdb OBJDUMP?=$(PREFIX)-objdump OBJCOPY?=$(PREFIX)-objcopy RISCVPATH=$(PATH_RISCV)riscv64-unknown-elf ECHO?=echo # GCC FLAGS --------------------------------------- CC=$(GCC) GCC_CFLAGS_COMMON := -g \ -Os \ -fno-builtin-printf \ -Wno-unused-parameter \ -Wall -Wextra -Wredundant-decls \ -Wshadow -Wno-unused-function \ -fno-common \ -I$(RISCVPATH)/include \ -I$(INC_DIR) GCC_CFLAGS_MURAX=-fstrict-volatile-bitfields --specs=nosys.specs RISCV_ARCH?=rv32im RISCV_ABI?=ilp32 RISCV_CMODEL?=medany RISCV_ARCHFLAGS +=-march=$(RISCV_ARCH) RISCV_ARCHFLAGS +=-mabi=$(RISCV_ABI) RISCV_ARCHFLAGS +=-mcmodel=$(RISCV_CMODEL) GCC_RISCV_ARCHFLAGS=$(RISCV_ARCHFLAGS) CFLAGS += $(GCC_CFLAGS_COMMON) \ $(GCC_CFLAGS_MURAX) \ $(GCC_RISCV_ARCHFLAGS) # Linker flags -------------------------------------- LDSCRIPT = $(LD_DIR)$(PLATFORM).ld LDFLAGS = $(GCC_RISCV_ARCHFLAGS) LDFLAGS += --specs=nosys.specs LDFLAGS += -Wl,-T$(LDSCRIPT) LDFLAGS += -nostartfiles -ffreestanding -Wl,--gc-sections LDFLAGS += -L$(BSP_DIR) LDFLAGS += -Wl,--start-group -l$(PLATFORM)bsp -lc -lm -Wl,--end-group # Object files -------------------------------------- SDK_ASM_SRCS := $(wildcard $(SRC_DIR)*.S) SDK_C_SRCS := $(wildcard $(SRC_DIR)*.c) SDK_ASM_OBJS := $(SDK_ASM_SRCS:$(SRC_DIR)%.S=$(OBJ_DIR)%.o) SDK_C_OBJS := $(SDK_C_SRCS:$(SRC_DIR)%.c=$(OBJ_DIR)%.o) SDK_OBJS := $(SDK_C_OBJS) $(SDK_ASM_OBJS) # Target all ---------------------------------------- .PHONY: all all: $(BSP_DIR)lib$(PLATFORM)bsp.a main.hex main.bin # Targets -------------------------------------------- main.bin: main.elf @$(ECHO) $(PURPLE)"obj "$@""$(LIGHTGRAY) $(OBJCOPY) -O binary $< $@ main.hex: main.elf @$(ECHO) $(PURPLE)"obj "$@""$(LIGHTGRAY) $(OBJCOPY) -O ihex $< $@ main.elf: $(LIBWRAP) $(SDK_OBJS) $(LDSCRIPT) @$(ECHO) $(LIGHTPURPLE)"building "$@""$(LIGHTGRAY) $(GCC) $(GCC_RISCV_ARCHFLAGS) $(GCC_CFLAGS_COMMON) $(SDK_OBJS) -o $@ $(LDFLAGS) $(SDK_ASM_OBJS): $(OBJ_DIR)%.o: $(SRC_DIR)%.S @$(ECHO) $(ORANGE)"building "$@" (.S)"$(LIGHTGRAY) $(CC) $(CFLAGS) -c -o $@ $^ $(SDK_C_OBJS): $(OBJ_DIR)%.o: $(SRC_DIR)%.c @$(ECHO) $(ORANGE)"building "$@" (.c)"$(LIGHTGRAY) $(CC) $(CFLAGS) -c -o $@ $^ $(BSP_DIR)lib$(PLATFORM)bsp.a: @$(ECHO) $(ORANGE)"building "$@" (.a)"$(LIGHTGRAY) cd $(BSP_DIR) && $(MAKE) .PHONY: clean clean: @$(ECHO) $(RED)"cleaning..."$(LIGHTGRAY) rm -f main.elf main.bin main.hex $(SDK_OBJS) cd $(BSP_DIR) && $(MAKE) clean