engine.mk (4074B)
1 ENGINE ?= engine
2 BUILD_DIR ?= build
3
4 XXD ?= xxd
5 CC ?= gcc
6 AR ?= ar
7
8 BITS ?= 32
9
10 SRC ?= $(SRCS)
11 CLEAN_SRC := $(patsubst ./%,%,$(SRC))
12 RUNTIME_SRCS := $(sort $(foreach s,$(CLEAN_SRC),$(if $(wildcard $(s)/.),$(shell find $(patsubst %/,%,$(s)) -type f \( -name '*.c' -o -name '*.S' -o -name '*.s' \)),$(s))))
13 RUNTIME_SRCS := $(patsubst ./%,%,$(RUNTIME_SRCS))
14
15 RUNTIME_OBJS := $(patsubst %, $(BUILD_DIR)/runtime/%, $(RUNTIME_SRCS))
16 RUNTIME_OBJS := $(RUNTIME_OBJS:.c=.o)
17 RUNTIME_OBJS := $(RUNTIME_OBJS:.S=.o)
18 RUNTIME_OBJS := $(RUNTIME_OBJS:.s=.o)
19
20 ENGINE_DIR := $(ENGINE)
21 ENGINE_SRCS := $(shell find $(ENGINE_DIR)/src -type f -name '*.c' | sort)
22 ENGINE_OBJS := $(patsubst $(ENGINE_DIR)/src/%.c, $(BUILD_DIR)/engine/src/%.o, $(ENGINE_SRCS))
23
24 CONFIG_HEADER := $(BUILD_DIR)/engine/include/config.h
25 FILES_HEADER := $(BUILD_DIR)/engine/include/files.h
26
27 ASSETS := $(shell find $(ENGINE_DIR)/font $(ENGINE_DIR)/images $(ENGINE_DIR)/files -type f -not -name 'LICENSE' 2>/dev/null | sort)
28 asset_sym = $(shell printf '%s' 'ta_file_$(notdir $(basename $(1)))' | sed 's/[^a-zA-Z0-9_]/_/g')
29
30 ASSET_GEN_SRCS := $(foreach a,$(ASSETS),$(BUILD_DIR)/engine/assets/$(notdir $(basename $(a))).c)
31 ASSET_OBJS := $(ASSET_GEN_SRCS:.c=.o)
32
33 EMBED_GAME ?= 0
34 GAME_TAB ?= $(BUILD_DIR)/game/tuxanci2.tab
35
36 ifeq ($(EMBED_GAME),1)
37 GAME_EMBED_SRC := $(BUILD_DIR)/engine/embed/ta_game_tab.c
38 GAME_EMBED_OBJ := $(GAME_EMBED_SRC:.c=.o)
39 CFLAGS += -DTA_EMBED_GAME
40 endif
41
42 ALL_ENGINE_OBJS := $(ENGINE_OBJS) $(ASSET_OBJS) $(GAME_EMBED_OBJ)
43 ENGINE_LIB := $(BUILD_DIR)/engine/libtuxanci2-engine.a
44
45 OUT ?= $(BUILD_DIR)/tuxanci2
46
47 all: $(OUT)
48
49 .PHONY: all clean FORCE
50
51 define ASSET_RULE
52 $(BUILD_DIR)/engine/assets/$(notdir $(basename $(1))).c: $(1)
53 mkdir -p $$(@D)
54 $$(XXD) -i -n $(call asset_sym,$(1)) $$< $$@
55 endef
56 $(foreach a,$(ASSETS),$(eval $(call ASSET_RULE,$(a))))
57
58 EMBED_STAMP := $(BUILD_DIR)/engine/embed-$(EMBED_GAME).stamp
59
60 $(EMBED_STAMP):
61 mkdir -p $(@D)
62 rm -f $(BUILD_DIR)/engine/embed-*.stamp
63 touch $@
64
65 $(BUILD_DIR)/engine/src/tab.o: $(EMBED_STAMP)
66
67 ifeq ($(EMBED_GAME),1)
68 $(GAME_EMBED_SRC): $(GAME_TAB)
69 mkdir -p $(@D)
70 $(XXD) -i -n ta_game_tab $< $@
71
72 $(BUILD_DIR)/engine/embed/%.o: $(BUILD_DIR)/engine/embed/%.c $(CONFIG_HEADER)
73 mkdir -p $(@D)
74 $(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
75 endif
76
77 $(CONFIG_HEADER): $(ENGINE_DIR)/include/config.h.in
78 mkdir -p $(@D)
79 sed 's/\$$BITS/$(BITS)/g' $< > $@
80
81 $(FILES_HEADER): FORCE
82 mkdir -p $(@D)
83 { \
84 printf '#ifndef TA_FILES_H\n#define TA_FILES_H\n\n'; \
85 $(foreach a,$(ASSETS),printf 'extern unsigned char %s[];\nextern unsigned int %s_len;\n' '$(call asset_sym,$(a))' '$(call asset_sym,$(a))';) \
86 printf '\n#endif // TA_FILES_H\n'; \
87 } > $@.tmp
88 if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv $@.tmp $@; fi
89
90 FORCE:
91
92 $(BUILD_DIR)/engine/src/%.o: $(ENGINE_DIR)/src/%.c $(CONFIG_HEADER) $(FILES_HEADER)
93 mkdir -p $(@D)
94 $(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
95
96 $(BUILD_DIR)/engine/assets/%.o: $(BUILD_DIR)/engine/assets/%.c $(CONFIG_HEADER)
97 mkdir -p $(@D)
98 $(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
99
100 $(BUILD_DIR)/runtime/%.o: %.c $(CONFIG_HEADER)
101 mkdir -p $(@D)
102 $(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
103
104 $(BUILD_DIR)/runtime/%.o: %.S $(CONFIG_HEADER)
105 mkdir -p $(@D)
106 $(CC) $(CFLAGS) $(ASFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
107
108 $(BUILD_DIR)/runtime/%.o: %.s $(CONFIG_HEADER)
109 mkdir -p $(@D)
110 $(CC) $(CFLAGS) $(ASFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
111
112 $(ENGINE_LIB): $(ALL_ENGINE_OBJS)
113 mkdir -p $(@D)
114 rm -f $@
115 $(AR) rcs $@ $^
116
117 ifneq ($(NO_DEFAULT_LINK),1)
118 $(OUT): $(RUNTIME_OBJS) $(ENGINE_LIB)
119 mkdir -p $(@D)
120 $(CC) $(CFLAGS) $(RUNTIME_OBJS) $(ENGINE_LIB) $(LDFLAGS) $(LDLIBS) -o $@
121 endif
122
123 clean:
124 rm -rf $(BUILD_DIR)/engine $(BUILD_DIR)/runtime $(OUT)
125
126 DEPS := $(ALL_ENGINE_OBJS:.o=.d) $(RUNTIME_OBJS:.o=.d)
127 -include $(DEPS)