1GIT_VERSION := $(shell git describe --tags) 2 3# There is no 64-bit gcc on Raspberry Pi, so use the 32-bit version 4ifneq (,$(wildcard /etc/rpi-issue)) 5TRGT ?= riscv32-unknown-elf- 6else 7TRGT ?= riscv64-unknown-elf- 8endif 9 10CC := $(TRGT)gcc 11CXX := $(TRGT)g++ 12OBJCOPY := $(TRGT)objcopy 13 14RM := rm -rf 15COPY := cp -a 16PATH_SEP := / 17 18ifeq ($(OS),Windows_NT) 19COPY := copy 20RM := del 21PATH_SEP := \\ 22endif 23 24BASE_DIR := . 25LD_DIR := $(BASE_DIR)/ld 26LDSCRIPT := $(BASE_DIR)/ld/linker.ld 27ADD_CFLAGS := -I$(BASE_DIR)/include -I$(BASE_DIR)/src/wasm3/ -D__vexriscv__ \ 28 -DFOMU -Dd_m3FixedHeap=8192 29 30ADD_LFLAGS := -lm 31PACKAGE := wasm3 32 33LTO := -flto -Wl,--allow-multiple-definition 34 35LDSCRIPTS := $(LDSCRIPT) $(LD_DIR)/output_format.ld $(LD_DIR)/regions.ld 36SRC_DIR := $(BASE_DIR)/src 37DBG_CFLAGS := -ggdb -g -DDEBUG -Wall 38DBG_LFLAGS := -ggdb -g -Wall 39CFLAGS := $(ADD_CFLAGS) \ 40 -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable \ 41 -Wno-missing-field-initializers \ 42 -ffunction-sections -fdata-sections -fno-common \ 43 -fomit-frame-pointer -Os $(LTO) \ 44 -march=rv32i -mabi=ilp32 \ 45 -DGIT_VERSION=u\"$(GIT_VERSION)\" -std=gnu11 46CXXFLAGS := $(CFLAGS) -std=c++11 -fno-rtti -fno-exceptions 47LFLAGS := $(CFLAGS) $(ADD_LFLAGS) -L$(LD_DIR) \ 48 -nostartfiles $(LTO) \ 49 -Wl,--gc-sections \ 50 -Wl,--script=$(LDSCRIPT) \ 51 -Wl,--build-id=none 52 53OBJ_DIR := .obj 54 55CSOURCES := $(shell find -L $(SRC_DIR) -type f -name '*.c') 56CPPSOURCES := $(shell find -L $(SRC_DIR) -type f -name '*.cpp') 57ASOURCES := $(shell find -L $(SRC_DIR) -type f -name '*.S') 58COBJS := $(addprefix $(OBJ_DIR)/,$(CSOURCES:.c=.o)) 59CXXOBJS := $(addprefix $(OBJ_DIR)/,$(CPPSOURCES:.cpp=.o)) 60AOBJS := $(addprefix $(OBJ_DIR)/,$(ASOURCES:.S=.o)) 61OBJECTS := $(COBJS) $(CXXOBJS) $(AOBJS) 62VPATH := $(SRC_DIR) 63 64QUIET := @ 65 66ALL := all 67TARGET := $(PACKAGE).elf 68CLEAN := clean 69 70$(ALL): $(TARGET) $(PACKAGE).bin $(PACKAGE).ihex $(PACKAGE).dfu 71 72#$(OBJECTS): | $(OBJ_DIR) 73 74$(TARGET): $(OBJECTS) $(LDSCRIPTS) 75 $(QUIET) echo " LD $@" 76 $(QUIET) $(CC) $(OBJECTS) $(LFLAGS) -o $@ 77 78$(PACKAGE).bin: $(TARGET) 79 $(QUIET) echo " OBJCOPY $@" 80 $(QUIET) $(OBJCOPY) -O binary $(TARGET) $@ 81 82$(PACKAGE).dfu: $(PACKAGE).bin 83 $(QUIET) echo " DFU $@" 84 $(QUIET) $(COPY) $(PACKAGE).bin $@ 85 $(QUIET) dfu-suffix -v 1209 -p 70b1 -a $@ 86 87$(PACKAGE).ihex: $(TARGET) 88 $(QUIET) echo " IHEX $(PACKAGE).ihex" 89 $(QUIET) $(OBJCOPY) -O ihex $(TARGET) $@ 90 91$(DEBUG): CFLAGS += $(DBG_CFLAGS) 92$(DEBUG): LFLAGS += $(DBG_LFLAGS) 93CFLAGS += $(DBG_CFLAGS) 94LFLAGS += $(DBG_LFLAGS) 95$(DEBUG): $(TARGET) 96 97$(OBJ_DIR): 98 $(QUIET) mkdir $(OBJ_DIR) 99 100$(COBJS) : $(OBJ_DIR)/%.o : %.c $(BASE_DIR)/Makefile 101 $(QUIET) mkdir -p $(@D) 102 $(QUIET) echo " CC $< $@" 103 $(QUIET) $(CC) -c $< $(CFLAGS) -o $@ -MMD 104 105$(OBJ_DIR)/%.o: %.cpp 106 $(QUIET) mkdir -p $(@D) 107 $(QUIET) echo " CXX $< $@" 108 $(QUIET) $(CXX) -c $< $(CXXFLAGS) -o $@ -MMD 109 110$(OBJ_DIR)/%.o: %.S 111 $(QUIET) mkdir -p $(@D) 112 $(QUIET) echo " AS $< $@" 113 $(QUIET) $(CC) -x assembler-with-cpp -c $< $(CFLAGS) -o $@ -MMD 114 115.PHONY: clean 116 117clean: 118 - $(RM) -rf $(OBJ_DIR) 119 - $(RM) $(TARGET) $(PACKAGE).bin $(PACKAGE).symbol $(PACKAGE).ihex $(PACKAGE).dfu 120 121-include $(OBJECTS:.o=.d) 122