RISCV_PATH?=/opt/riscv/ RISCV_NAME = riscv64-unknown-elf RISCV_OBJCOPY = $(RISCV_PATH)/bin/$(RISCV_NAME)-objcopy RISCV_OBJDUMP = $(RISCV_PATH)/bin/$(RISCV_NAME)-objdump RISCV_CLIB=$(RISCV_PATH)$(RISCV_NAME)/lib/ RISCV_CC=$(RISCV_PATH)/bin/$(RISCV_NAME)-gcc LDSCRIPT=src/ld MABI=ilp32 MARCH := rv32i ifeq ($(MULDIV),yes) MARCH := $(MARCH)m endif ifeq ($(ATOMIC),yes) MARCH := $(MARCH)a endif ifeq ($(COMPRESSED),yes) MARCH := $(MARCH)c endif ifeq ($(FLOATING),yes) MARCH := $(MARCH)fd endif CFLAGS += -march=$(MARCH) -mabi=$(MABI) LDFLAGS += -march=$(MARCH) -mabi=$(MABI) SRCS = $(wildcard src/*.c) \ $(wildcard src/*.cpp) \ $(wildcard src/*.S) CFLAGS += -static LDFLAGS += -e_start -T $(LDSCRIPT) -nostartfiles -Wl,-Map,$(OBJDIR)/$(PROJ_NAME).map -Wl,--print-memory-usage OBJDIR = build OBJS := $(SRCS) OBJS := $(OBJS:.c=.o) OBJS := $(OBJS:.cpp=.o) OBJS := $(OBJS:.S=.o) OBJS := $(addprefix $(OBJDIR)/,$(OBJS)) all: $(OBJDIR)/$(PROJ_NAME).elf $(OBJDIR)/$(PROJ_NAME).hex $(OBJDIR)/$(PROJ_NAME).asm $(OBJDIR)/$(PROJ_NAME).bin @echo "done" $(OBJDIR)/%.elf: $(OBJS) | $(OBJDIR) $(RISCV_CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) %.hex: %.elf $(RISCV_OBJCOPY) -O ihex $^ $@ %.bin: %.elf $(RISCV_OBJCOPY) -O binary $^ $@ %.v: %.elf $(RISCV_OBJCOPY) -O verilog $^ $@ %.asm: %.elf $(RISCV_OBJDUMP) -S -d $^ > $@ $(OBJDIR)/%.o: %.c mkdir -p $(dir $@) $(RISCV_CC) -c $(CFLAGS) $(INC) -o $@ $^ $(OBJDIR)/%.o: %.cpp mkdir -p $(dir $@) $(RISCV_CC) -c $(CFLAGS) $(INC) -o $@ $^ $(OBJDIR)/%.o: %.S mkdir -p $(dir $@) $(RISCV_CC) -c $(CFLAGS) -o $@ $^ -D__ASSEMBLY__=1 $(OBJDIR): mkdir -p $@ clean: rm -f $(OBJDIR)/$(PROJ_NAME).elf rm -f $(OBJDIR)/$(PROJ_NAME).hex rm -f $(OBJDIR)/$(PROJ_NAME).map rm -f $(OBJDIR)/$(PROJ_NAME).v rm -f $(OBJDIR)/$(PROJ_NAME).asm find $(OBJDIR) -type f -name '*.o' -print0 | xargs -0 -r rm .SECONDARY: $(OBJS)