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