sdk.mk (2822B)
1 CROSS ?= riscv32-unknown-elf-
2
3 SDK_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
4
5 CC := $(CROSS)gcc
6 OBJCOPY := $(CROSS)objcopy
7
8 BUILD ?= build
9 TABCONV_DIR ?= $(SDK_DIR)../tabconv
10 TABCONV ?= $(BUILD)/tabconv
11 FILES ?= files
12
13 OPT := 2
14 MARCH := rv32im
15 MABI := ilp32
16
17 LINKER_SCRIPT := linker.ld
18
19 CFLAGS := -O$(OPT) -march=$(MARCH) -mabi=$(MABI) -ffreestanding -nostdinc -fno-builtin -fno-pic -fno-stack-protector -fno-tree-loop-distribute-patterns -Wall -Wextra -I$(SDK_DIR)include -I$(SDK_DIR)../include -I$(BUILD)/include $(addprefix -I,$(INCLUDES))
20 ASFLAGS := -march=$(MARCH) -mabi=$(MABI) -I$(SDK_DIR)include -I$(SDK_DIR)../include
21 LDFLAGS := -march=$(MARCH) -mabi=$(MABI) -nostdlib -static -T $(SDK_DIR)$(LINKER_SCRIPT) -Wl,--gc-sections
22
23 SDK_SRCS := $(shell find $(SDK_DIR)src -type f \( -name '*.c' -o -name '*.S' \))
24 SRCS ?= src
25 GAME_SRCS := $(sort $(foreach s,$(SRCS),$(if $(wildcard $(s)/.),$(shell find $(patsubst %/,%,$(s)) -type f \( -name '*.c' -o -name '*.S' \)),$(s))))
26
27 SDK_OBJS := $(patsubst $(SDK_DIR)%, $(BUILD)/sdk/%, $(SDK_SRCS))
28 GAME_OBJS := $(patsubst %, $(BUILD)/game/%, $(GAME_SRCS))
29
30 OBJS := $(SDK_OBJS:.c=.o)
31 OBJS := $(OBJS:.S=.o)
32 GAME_OBJS := $(GAME_OBJS:.c=.o)
33 GAME_OBJS := $(GAME_OBJS:.S=.o)
34 OBJS += $(GAME_OBJS)
35
36 ASSETS := $(sort $(shell find $(FILES) -type f -not -name 'LICENSE' 2>/dev/null))
37 FILES_HEADER := $(BUILD)/include/ta_files.h
38
39 DEPS := $(OBJS:.o=.d)
40
41 all: $(BUILD)/$(TARGET).tab
42
43 $(BUILD)/$(TARGET).tab: $(BUILD)/$(TARGET).bin $(ASSETS) $(TABCONV)
44 $(TABCONV) $< $(ASSETS) $@
45
46 $(BUILD)/$(TARGET).bin: $(BUILD)/$(TARGET).elf
47 $(OBJCOPY) -O binary $< $@
48
49 $(TABCONV): $(TABCONV_DIR)/tabconv.c
50 mkdir -p $(@D)
51 $(MAKE) -C $(TABCONV_DIR) OUT=$(abspath $@)
52
53 $(BUILD)/$(TARGET).elf: $(OBJS)
54 $(CC) $(LDFLAGS) $^ -o $@
55
56 $(BUILD)/sdk/%.o: $(SDK_DIR)%.c
57 mkdir -p $(@D)
58 $(CC) $(CFLAGS) -MMD -MP -c $< -o $@
59
60 $(BUILD)/sdk/%.o: $(SDK_DIR)%.S
61 mkdir -p $(@D)
62 $(CC) $(ASFLAGS) -MMD -MP -c $< -o $@
63
64 $(BUILD)/game/%.o: %.c $(FILES_HEADER)
65 mkdir -p $(@D)
66 $(CC) $(CFLAGS) -MMD -MP -c $< -o $@
67
68 $(BUILD)/game/%.o: %.S
69 mkdir -p $(@D)
70 $(CC) $(ASFLAGS) -MMD -MP -c $< -o $@
71
72 $(FILES_HEADER): FORCE
73 mkdir -p $(@D)
74 { \
75 printf '#ifndef TA_FILES_H\n#define TA_FILES_H\n\n'; \
76 id=2; \
77 for a in $(ASSETS); do \
78 name=$$(basename "$$a"); \
79 name=$${name%.*}; \
80 name=$$(printf '%s' "$$name" | tr 'a-z' 'A-Z' | sed 's/[^A-Z0-9_]/_/g'); \
81 printf '#define TA_FILE_%s %d\n' "$$name" "$$id"; \
82 id=$$((id + 1)); \
83 done; \
84 printf '\n#endif // TA_FILES_H\n'; \
85 } > $@.tmp
86 if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv $@.tmp $@; fi
87
88 FORCE:
89
90 clean:
91 rm -rf $(BUILD)
92
93 -include $(DEPS)
94
95 .PHONY: all clean FORCE