-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
235 lines (180 loc) · 5.77 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
.SUFFIXES:
.PHONY: hack clean
include Tools.mak
# Common cache directory
# Used to generate dependency files in
CACHE_DIR := .MkCache
$(shell mkdir -p $(CACHE_DIR) > /dev/null)
# ===============
# = MAIN TARGET =
# ===============
hack:
$(MAKE) $(ROM_TARGET)
# =================
# = THE BUILDFILE =
# =================
# ROMs
ROM_SOURCE := FE8U.gba
ROM_TARGET := VBAR.gba
# EA Input File
EVENT_MAIN := Main.event
# EA Secondary outupt files
EVENT_SYMBOLS := VBAR.sym.event
# EA Dependencies
EVENT_DEPENDS := $(shell $(EADEP) $(EVENT_MAIN) -I $(realpath .)/Tools/EventAssembler --add-missings)
# ROM making rule
$(ROM_TARGET): $(ROM_SOURCE) $(EVENT_MAIN) $(EVENT_DEPENDS)
@echo Building $(ROM_TARGET).
@cp -f $(ROM_SOURCE) $(ROM_TARGET)
@$(EA) A FE8 -output:$(ROM_TARGET) -input:$(EVENT_MAIN) --nocash-sym || (rm $(ROM_TARGET) && false)
# =============
# = PORTRAITS =
# =============
PORTRAIT_LIST := Spritans/PortraitList.txt
PORTRAIT_INSTALLER := Spritans/Portraits.event
PORTRAIT_DMPS := $(shell $(PORTRAIT_PROCESS) $(PORTRAIT_LIST) --list-files)
# Make the portrait installer
$(PORTRAIT_INSTALLER): $(PORTRAIT_LIST) $(PORTRAIT_DMPS)
$(NOTIFY_PROCESS)
@$(PORTRAIT_PROCESS) $< -o $@
# Convert a png to portrait components
%_mug.dmp %_palette.dmp %_frames.dmp %_minimug.dmp: %.png
$(NOTIFY_PROCESS)
@$(PORTRAITFORMATTER) $<
# ========
# = TEXT =
# ========
# Variable listing all text files in the writans directory
# The text installer depends on them (in case there was any change)
# (Too lazy to code a dependency thingy for that too)
WRITANS_ALL_TEXT := $(wildcard Writans/Text/*.txt)
# Main input text file
WRITANS_TEXT_MAIN := Writans/Text/TextMain.txt
# textprocess outputs
WRITANS_INSTALLER := Writans/Text.event
WRITANS_DEFINITIONS := Writans/TextDefinitions.event
# Make text installer and definitions from text
$(WRITANS_INSTALLER) $(WRITANS_DEFINITIONS): $(WRITANS_TEXT_MAIN) $(WRITANS_ALL_TEXT)
$(NOTIFY_PROCESS)
@$(TEXT_PROCESS) $(WRITANS_TEXT_MAIN) --installer $(WRITANS_INSTALLER) --definitions $(WRITANS_DEFINITIONS) --parser-exe $(PARSEFILE)
# ==========
# = TABLES =
# ==========
# Convert CSV+NMM to event
%.event: %.csv %.nmm
$(NOTIFY_PROCESS)
@echo | $(C2EA) -csv $*.csv -nmm $*.nmm -out $*.event $(ROM_SOURCE) > /dev/null
# ========
# = MAPS =
# ========
# TMX to event + dmp
%.event %_data.dmp: %.tmx
$(NOTIFY_PROCESS)
@echo | $(TMX2EA) $< > /dev/null
# ==========================
# = GRAPHICS & COMPRESSION =
# ==========================
# PNG to 4bpp rule
%.4bpp: %.png
$(NOTIFY_PROCESS)
@Tools/Png2Dmp $< -o $@
# @$(GBAGFX) $< $@
# PNG to gbapal rule
%.gbapal: %.png
$(NOTIFY_PROCESS)
# png2dmp doesn't seem to support palette output with --to-stdout
# @Tools/Png2Dmp $< -o $@ --palette-only
@$(GBAGFX) $< $@
# Anything to lz rule
%.lz: %
$(NOTIFY_PROCESS)
@$(GBAGFX) $< $@
# ==================
# = OBJECTS & DMPS =
# ==================
LYN_REFERENCE := Tools/CLib/reference/FE8U-20190316.o
# OBJ to event
%.lyn.event: %.o $(LYN_REFERENCE)
$(NOTIFY_PROCESS)
@$(LYN) $< $(LYN_REFERENCE) > $@
# OBJ to event (alt)
# TODO: we shouldn't need this
%.lyn.event: %.elf $(LYN_REFERENCE)
$(NOTIFY_PROCESS)
@$(LYN) $< $(LYN_REFERENCE) > $@
# OBJ to DMP rule
%.dmp: %.o
$(NOTIFY_PROCESS)
@$(OBJCOPY) -S $< -O binary $@
# ========================
# = ASSEMBLY/COMPILATION =
# ========================
# Setting C/ASM include directories up
INCLUDE_DIRS := Tools/CLib/include Wizardry/Include
INCFLAGS := $(foreach dir, $(INCLUDE_DIRS), -I "$(dir)")
# setting up compilation flags
ARCH := -mcpu=arm7tdmi -mthumb -mthumb-interwork
CFLAGS := $(ARCH) $(INCFLAGS) -Wall -Os -mtune=arm7tdmi -ffreestanding -mlong-calls
ASFLAGS := $(ARCH) $(INCFLAGS)
# defining dependency flags
CDEPFLAGS = -MMD -MT "$*.o" -MT "$*.asm" -MF "$(CACHE_DIR)/$(notdir $*).d" -MP
SDEPFLAGS = --MD "$(CACHE_DIR)/$(notdir $*).d"
# ASM to OBJ rule
%.o: %.s
$(NOTIFY_PROCESS)
@$(AS) $(ASFLAGS) $(SDEPFLAGS) -I $(dir $<) $< -o $@ $(ERROR_FILTER)
# C to ASM rule
# I would be fine with generating an intermediate .s file but this breaks dependencies
%.o: %.c
$(NOTIFY_PROCESS)
@$(CC) $(CFLAGS) $(CDEPFLAGS) -g -c $< -o $@ $(ERROR_FILTER)
# C to ASM rule
%.asm: %.c
$(NOTIFY_PROCESS)
@$(CC) $(CFLAGS) $(CDEPFLAGS) -S $< -o $@ -fverbose-asm $(ERROR_FILTER)
# Avoid make deleting objects it thinks it doesn't need anymore
# Without this make may fail to detect some files as being up to date
.PRECIOUS: %.o;
# ==============
# = MAKE CLEAN =
# ==============
ifeq ($(MAKECMDGOALS),clean)
# NMMs and generated events
NMMS := $(shell find -type f -name '*.nmm')
TABLE_EVENTS := $(NMMS:.nmm=.event)
# TMXs and generated files
TMXS := $(shell find -type f -name '*.tmx')
MAP_GENERATED := $(TMXS:.tmx=.event) $(TMXS:.tmx=_data.dmp)
# Portraits and generated files
PORTRAITS := $(wildcard Spritans/Portraits/*.png)
PORTRAIT_GENERATED := \
$(PORTRAITS:.png=_mug.dmp) $(PORTRAITS:.png=_palette.dmp) \
$(PORTRAITS:.png=_frames.dmp) $(PORTRAITS:.png=_minimug.dmp)
# ASM/C and generated files
CFILES := $(shell find -type f -name '*.c')
SFILES := $(shell find -type f -name '*.s')
ASM_C_GENERATED := $(CFILES:.c=.o) $(SFILES:.s=.o) $(CFILES:.c=.asm)
ASM_C_GENERATED += $(ASM_C_GENERATED:.o=.dmp) $(ASM_C_GENERATED:.o=.lyn.event)
# All files that are going to be cleaned
ALL_TO_CLEAN := \
$(ROM_TARGET) \
$(EVENT_SYMBOLS) \
$(TABLE_EVENTS) \
$(MAP_GENERATED) \
$(WRITANS_INSTALLER) \
$(WRITANS_DEFINITIONS) \
$(PORTRAIT_INSTALLER) \
$(PORTRAIT_GENERATED) \
$(ASM_C_GENERATED)
endif
clean:
@rm -f $(ALL_TO_CLEAN)
@rm -rf $(CACHE_DIR)
@rm -rf Writans/Text/.TextEntries
@echo all clean!
# ========================
# = INCLUDE DEPENDENCIES =
# ========================
ifneq ($(MAKECMDGOALS),clean)
-include $(wildcard $(CACHE_DIR)/*.d)
endif