-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathMakefile
More file actions
497 lines (447 loc) · 23.8 KB
/
Copy pathMakefile
File metadata and controls
497 lines (447 loc) · 23.8 KB
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
#
# 4cade Makefile
# assembles source code, optionally builds a disk image and mounts it
# note: Windows users should probably use winmake.bat instead
#
# original by Quinn Dunki on 2014-08-15
# One Girl, One Laptop Productions
# http://www.quinndunki.com/blondihacks
#
# adapted by 4am on 2018-08-19
#
DISK=4cade.hdv
VOLUME=TOTAL.REPLAY
SHELL := /bin/bash
# third-party tools required to build
# https://sourceforge.net/projects/acme-crossass/
# version 0.97 or later
ACME=acme
# https://github.com/mach-kernel/cadius
# version 1.4.0 or later
CADIUS=TZ=UTC0 cadius
# https://www.gnu.org/software/parallel/
PARALLEL=parallel
# https://python.org/
PYTHON=python3
# https://bitbucket.org/magli143/exomizer/wiki/Home
# version 3.1.0 or later
EXOMIZER=exomizer mem -q -P23 -lnone
BUILDDIR=build
MD=$(BUILDDIR)/make.touch
CADIUS.LOG=$(BUILDDIR)/log
DEMO.SOURCES=$(wildcard src/demo/*.a)
FX.SOURCES=$(wildcard src/fx/*.a)
PRELAUNCH.SOURCES=$(wildcard src/prelaunch/*.a)
PROBOOT.SOURCES=$(wildcard src/proboot/*.a)
LAUNCHER.SOURCES=$(wildcard src/*.a src/index/*.a)
HDV=$(BUILDDIR)/$(DISK)
PROBOOTHD=$(BUILDDIR)/proboothd
DEMO=$(BUILDDIR)/DEMO
DEMO.LIST=$(BUILDDIR)/demo.list
FX=$(BUILDDIR)/FX
FXCODE.LIST=$(BUILDDIR)/fxcode.list
FXDATA.LIST=$(BUILDDIR)/fxdata.list
PRELAUNCH=$(BUILDDIR)/PRELAUNCH
LAUNCHER.SYSTEM=$(BUILDDIR)/LAUNCHER.SYSTEM
ATTRACT=$(BUILDDIR)/ATTRACT
MINI.ATTRACT0.LIST=$(BUILDDIR)/mini.attract0.list
MINI.ATTRACT1.LIST=$(BUILDDIR)/mini.attract1.list
ATTRACT.IDX=$(BUILDDIR)/ATTRACT.IDX
HELPTEXT=$(BUILDDIR)/HELPTEXT
CREDITS=$(BUILDDIR)/CREDITS
GAMEHELP=$(BUILDDIR)/GAMEHELP
GAMEHELP.COMPRESSED=$(BUILDDIR)/GAMEHELP.COMPRESSED
GAMES.CONF=$(BUILDDIR)/GAMES.CONF
GAMES.SORTED=$(BUILDDIR)/GAMES.SORTED
PREFS.CONF=$(BUILDDIR)/PREFS.CONF
SS=$(BUILDDIR)/SS
SS.LIST=$(BUILDDIR)/ss.list
ACTION.DGR.LIST=$(BUILDDIR)/action.dgr.list
ACTION.DHGR.LIST=$(BUILDDIR)/action.dhgr.list
ACTION.GR.LIST=$(BUILDDIR)/action.gr.list
ACTION.HGR0.LIST=$(BUILDDIR)/action.hgr0.list
ACTION.HGR1.LIST=$(BUILDDIR)/action.hgr1.list
ACTION.HGR2.LIST=$(BUILDDIR)/action.hgr2.list
ACTION.HGR3.LIST=$(BUILDDIR)/action.hgr3.list
ACTION.HGR4.LIST=$(BUILDDIR)/action.hgr4.list
ACTION.HGR5.LIST=$(BUILDDIR)/action.hgr5.list
ACTION.HGR6.LIST=$(BUILDDIR)/action.hgr6.list
ARTWORK.SHR.LIST=$(BUILDDIR)/artwork.shr.list
TITLE.HGR.LIST=$(BUILDDIR)/title.hgr.list
TITLE.DHGR.LIST=$(BUILDDIR)/title.dhgr.list
TOTAL.DATA=$(BUILDDIR)/TOTAL.DATA
X=$(BUILDDIR)/X
XSINGLE.LIST=$(BUILDDIR)/xsingle.list
ACTION.DGR.SOURCES=$(wildcard res/ACTION.DGR/*)
ACTION.DHGR.SOURCES=$(wildcard res/ACTION.DHGR/*)
ACTION.GR.SOURCES=$(wildcard res/ACTION.GR/*)
ACTION.HGR.SOURCES=$(wildcard res/ACTION.HGR/*)
ARTWORK.SHR.SOURCES=$(wildcard res/ARTWORK.SHR/*)
ATTRACT.SOURCES=$(wildcard res/ATTRACT/*)
GAMEHELP.SOURCES=$(wildcard res/GAMEHELP/*)
SS.SOURCES=$(wildcard res/SS/*)
TITLE.ANIMATED.SOURCES=$(wildcard res/TITLE.ANIMATED/*)
TITLE.DHGR.SOURCES=$(wildcard res/TITLE.DHGR/*)
TITLE.HGR.SOURCES=$(wildcard res/TITLE.HGR/*)
CACHE.SOURCES=$(wildcard res/CACHE*.IDX)
ICONS.SOURCE.DIR=res/ICONS
ICONS=$(wildcard $(ICONS.SOURCE.DIR)/*)
ATTRACT.CONF.SOURCE=res/ATTRACT.CONF
DFX.CONF=res/DFX.CONF
FX.CONF=res/FX.CONF
SFX.CONF=res/SFX.CONF
PREFS.CONF.SOURCE=res/PREFS.CONF
GAMES.CONF.SOURCE=res/GAMES.CONF
CREDITS.SOURCE=res/CREDITS
HELPTEXT.SOURCE=res/HELPTEXT
COVER=res/COVER
FINDER.DATA=res/Finder.Data
FINDER.ROOT=res/Finder.Root
HELP=res/HELP
JOYSTICK=res/JOYSTICK
TITLE=res/TITLE
SOURCE_DATE := $(shell TZ=UTC0 git show -s --date='format-local:%Y-%m-%dT%H:%M:%SZ' --format="%cd")
export SOURCE_DATE_EPOCH = $(shell git show -s --format=%ct)
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
MOUNTER=xdg-open
else
MOUNTER=osascript bin/V2Make.scpt "`pwd`" bin/4cade.vii
endif
.PHONY: compress attract cache clean mount all al
# build final disk image
$(HDV): $(PROBOOTHD) $(LAUNCHER.SYSTEM) $(PRELAUNCH) $(X) $(TOTAL.DATA) $(TITLE.ANIMATED.SOURCES) $(ICONS) $(FINDER.DATA) $(FINDER.ROOT) $(PREFS.CONF)
cp res/blank.hdv "$@"
cp res/_FileInformation.txt "$(BUILDDIR)"/
touch -d"$(SOURCE_DATE)" "$(LAUNCHER.SYSTEM)"
$(CADIUS) ADDFILE "$@" "/$(VOLUME)/" "$(LAUNCHER.SYSTEM)" -C >> "$(CADIUS.LOG)"
for f in "$(TOTAL.DATA)" "$(PREFS.CONF)" "$(FINDER.DATA)" "$(FINDER.ROOT)"; do \
touch -d"$(SOURCE_DATE)" "$$f"; \
$(CADIUS) ADDFILE "$@" "/$(VOLUME)/" "$$f" -C >> "$(CADIUS.LOG)"; \
done
cp src/prelaunch/_FileInformation.txt "$(PRELAUNCH)"/
for f in "$(PRELAUNCH)"/*; do \
touch -d"$(SOURCE_DATE)" "$$f"; \
done
for f in res/TITLE.ANIMATED "$(ICONS.SOURCE.DIR)" "$(PRELAUNCH)" "$(X)"; do \
rm -f "$$f"/.DS_Store; \
$(CADIUS) ADDFOLDER "$@" "/$(VOLUME)/$$(basename $$f)" "$$f" -C >> "$(CADIUS.LOG)"; \
done
[[ $$(grep -c "Error(s) : [^0]" "$(CADIUS.LOG)") == 0 ]] || exit 1
bin/changebootloader.sh "$@" $(PROBOOTHD)
@touch "$@"
# build padded prefs file (padding is required for writing by ProRWTS)
$(PREFS.CONF): $(PREFS.CONF.SOURCE) | $(MD)
cp "$(PREFS.CONF.SOURCE)" "$@"
bin/padto.sh "$@"
# create a version of GAMES.CONF without comments or blank lines or anything after display titles
$(GAMES.CONF): $(MD) $(GAMES.CONF.SOURCE)
awk '!/^$$|^#/' < "$(GAMES.CONF.SOURCE)" | awk -F'/' '{ print $$1 }' > "$@"
# create a list of all game filenames, without metadata or display names, sorted by game filename
$(GAMES.SORTED): | $(MD) $(GAMES.CONF)
awk -F, '/,/ { print $$2 }' < "$(GAMES.CONF)" | awk -F= '{ print $$1 }' | sort > "$@"
# extract files from original disk images and move them to their final directories
$(X): | $(MD) $(GAMES.CONF)
mkdir -p "$@" "$(BUILDDIR)"/X.INDEXED
$(PARALLEL) '$(CADIUS) EXTRACTVOLUME {} "$@"/ >> "$(CADIUS.LOG)"' ::: res/dsk/*.po
rm -f "$@"/**/.DS_Store "$@"/**/PRODOS* "$@"/**/LOADER.SYSTEM* "$@"/**/_FileInformation.txt
for f in $$(grep '^.....1' "$(GAMES.CONF)" | awk '!/^$$|^#/' | awk -F, '/,/ { print $$2 }' | awk -F= '{ print $$1 }'); do mv "$@"/"$$f"/"$$f"* "$(BUILDDIR)"/X.INDEXED/; rm -rf "$@"/"$$f"; done
(cd "$(BUILDDIR)"/X.INDEXED/ && for f in *; do echo "$$f"; done) > "$(XSINGLE.LIST)"
for d in "$@"/*; do mv "$$d"/* "$@"/; rmdir "$$d"; done
@touch "$@"
# precompute binary data structure for mega-attract mode configuration file
$(ATTRACT.IDX): $(ATTRACT.CONF.SOURCE) | $(MD)
bin/buildokvs.py < "$(ATTRACT.CONF.SOURCE)" > "$@"
# precompute binary data structure and substitute special characters in global help
$(HELPTEXT): $(HELPTEXT.SOURCE) | $(MD)
bin/converthelp.sh "$(HELPTEXT.SOURCE)" "$@"
# precompute binary data structure and substitute special characters in credits
$(CREDITS): $(CREDITS.SOURCE) | $(MD)
bin/converthelp.sh "$(CREDITS.SOURCE)" "$@"
# precompute binary data structures and substitute special characters for each game's help
$(GAMEHELP): $(GAMEHELP.SOURCES) | $(MD)
mkdir -p "$@"
$(PARALLEL) 'bin/converthelp.sh "{}" "$@/{/}"' ::: res/GAMEHELP/*
@touch "$@"
$(GAMEHELP.COMPRESSED): $(GAMEHELP) | $(MD)
mkdir -p "$@"
$(PARALLEL) '[ -f "$@/{/}" ] || ${EXOMIZER} "{}"@0x0900 -o "$@/{/}"' ::: "$(GAMEHELP)"/*
@touch "$@"
# precompute binary data structures for slideshow configuration files
$(SS): $(SS.SOURCES) | $(MD) $(GAMES.CONF)
mkdir -p "$@"
$(PARALLEL) 'bin/buildslideshow.py "{}" "$(GAMES.CONF)" < "{}" > "$@/{/}"' ::: res/SS/*
(cd "$(SS)"/ && for f in *; do echo "$$f"; done) > "$(SS.LIST)"
@touch "$@"
# precompute binary data structures for each game's mini-attract configuration file
$(ATTRACT): $(ATTRACT.SOURCES) | $(MD)
mkdir -p "$@"
$(PARALLEL) 'bin/buildokvs.py < "{}" > "$@/{/}"' ::: res/ATTRACT/*
(cd "$(ATTRACT)"/ && for f in [ABCDEFGHIJKLMNOP]*; do echo "$$f"; done) > "$(MINI.ATTRACT0.LIST)"
(cd "$(ATTRACT)"/ && for f in [QRSTUVWXYZ]*; do echo "$$f"; done) > "$(MINI.ATTRACT1.LIST)"
@touch "$@"
# create lists of specific files used to build data structures later
$(ACTION.HGR0.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [ABCD]*; do echo "$$f"; done) > "$@"
$(ACTION.HGR1.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [EFGH]*; do echo "$$f"; done) > "$@"
$(ACTION.HGR2.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [IJKL]*; do echo "$$f"; done) > "$@"
$(ACTION.HGR3.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [MNOP]*; do echo "$$f"; done) > "$@"
$(ACTION.HGR4.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [QRST]*; do echo "$$f"; done) > "$@"
$(ACTION.HGR5.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [UVWX]*; do echo "$$f"; done) > "$@"
$(ACTION.HGR6.LIST): $(ACTION.HGR.SOURCES) | $(MD)
(cd res/ACTION.HGR/ && for f in [YZ]*; do echo "$$f"; done) > "$@"
$(ACTION.DHGR.LIST): $(ACTION.DHGR.SOURCES) | $(MD)
(cd res/ACTION.DHGR/ && for f in *; do echo "$$f"; done) > "$@"
$(ACTION.GR.LIST): $(ACTION.GR.SOURCES) | $(MD)
(cd res/ACTION.GR/ && for f in *; do echo "$$f"; done) > "$@"
$(ACTION.DGR.LIST): $(ACTION.DGR.SOURCES) | $(MD)
(cd res/ACTION.DGR/ && for f in *; do echo "$$f"; done) > "$@"
$(ARTWORK.SHR.LIST): $(ARTWORK.SHR.SOURCES) | $(MD)
(cd res/ARTWORK.SHR/ && for f in *; do echo "$$f"; done) > "$@"
$(TITLE.HGR.LIST): $(TITLE.HGR.SOURCES) | $(MD)
(cd res/TITLE.HGR/ && for f in *; do echo "$$f"; done) > "$@"
$(TITLE.DHGR.LIST): $(TITLE.DHGR.SOURCES) | $(MD)
(cd res/TITLE.DHGR/ && for f in *; do echo "$$f"; done) > "$@"
$(TOTAL.DATA): $(FX) $(PRELAUNCH) $(DEMO) $(SS) $(X) $(ATTRACT) $(ATTRACT.IDX) $(HELPTEXT) $(CREDITS) $(GAMEHELP.COMPRESSED) $(GAMES.CONF) $(GAMES.SORTED) $(ACTION.HGR0.LIST) $(ACTION.HGR1.LIST) $(ACTION.HGR2.LIST) $(ACTION.HGR3.LIST) $(ACTION.HGR4.LIST) $(ACTION.HGR5.LIST) $(ACTION.HGR6.LIST) $(ACTION.DGR.LIST) $(ACTION.DHGR.LIST) $(ACTION.GR.LIST) $(ARTWORK.SHR.LIST) $(TITLE.DHGR.LIST) $(TITLE.HGR.LIST) $(CACHE.SOURCES) $(DFX.CONF) $(FX.CONF) $(SFX.CONF) $(COVER) $(HELP) $(JOYSTICK) $(TITLE)
#
# precompute indexed files for prelaunch
# note: prelaunch must be first in TOTAL.DATA due to a hack in LoadStandardPrelaunch
# note 2: these can not be padded because they are loaded at $0106 and padding would clobber the stack
#
rm -f "$@"
touch "$@"
bin/buildindexedfile.py "$@" "$(BUILDDIR)"/PRELAUNCH.INDEXED < "$(GAMES.SORTED)" > "$(BUILDDIR)"/PRELAUNCH.IDX
#
# precompute indexed files for HGR & DHGR titles
# note: these are not padded because they are all an exact block-multiple anyway
#
bin/padto.sh "$@"
bin/buildindexedfile.py "$@" res/TITLE.HGR "$(BUILDDIR)"/HGR.TITLES.LOG < "$(TITLE.HGR.LIST)" > "$(BUILDDIR)"/TITLE.IDX
bin/buildindexedfile.py "$@" res/TITLE.DHGR "$(BUILDDIR)"/DHGR.TITLES.LOG < "$(TITLE.DHGR.LIST)" > "$(BUILDDIR)"/DTITLE.IDX
mkdir -p "$(BUILDDIR)"/index/
bin/addfiles.py "$@" \
"$(COVER)" "$(BUILDDIR)"/index/res.cover.idx.a \
"$(TITLE)" "$(BUILDDIR)"/index/res.title.idx.a \
"$(HELP)" "$(BUILDDIR)"/index/res.help.idx.a
#
# precompute indexed files for game help
# note: these can not be padded because they are compressed and the decompressor needs the exact size
#
bin/buildindexedfile.py "$@" "$(GAMEHELP.COMPRESSED)" < "$(GAMES.SORTED)" > "$(BUILDDIR)"/GAMEHELP.IDX
#
# precompute indexed files for slideshows
# note: these can be padded because they're loaded into $800 at a time when $800..$1FFF is clobber-able
#
bin/buildindexedfile.py -p "$@" "$(SS)" < "$(SS.LIST)" > "$(BUILDDIR)"/SLIDESHOW.IDX
bin/buildindexedfile.py -p "$@" "$(ATTRACT)" < "$(MINI.ATTRACT0.LIST)" > "$(BUILDDIR)"/MINIATTRACT0.IDX
bin/buildindexedfile.py -p "$@" "$(ATTRACT)" < "$(MINI.ATTRACT1.LIST)" > "$(BUILDDIR)"/MINIATTRACT1.IDX
#
# precompute indexed files for graphic effects
# note: these can be padded because they're loaded into $6000 at a time when $6000..$BEFF is clobber-able
#
bin/buildindexedfile.py -p "$@" "$(BUILDDIR)"/FX.INDEXED < "$(FX.CONF)" > "$(BUILDDIR)"/FX.IDX
bin/buildindexedfile.py -p "$@" "$(BUILDDIR)"/FX.INDEXED < "$(DFX.CONF)" > "$(BUILDDIR)"/DFX.IDX
bin/buildindexedfile.py -p "$@" "$(BUILDDIR)"/FX.INDEXED < "$(SFX.CONF)" > "$(BUILDDIR)"/SFX.IDX
bin/buildindexedfile.py -p "$@" "$(BUILDDIR)"/FXCODE < "$(FXCODE.LIST)" > "$(BUILDDIR)"/FXCODE.IDX
#
# precompute indexed files for coordinates files loaded by graphic effects
# note: these can not be padded because some of them are loaded into tight spaces near the unclobberable top of main memory
#
bin/buildindexedfile.py "$@" "$(BUILDDIR)"/FXDATA < "$(FXDATA.LIST)" > "$(BUILDDIR)"/FXDATA.IDX
#
# precompute indexed files for HGR & DHGR action screenshots
# note: these can not be padded because they are compressed and the decompressor needs the exact size
#
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR0.LIST)" > "$(BUILDDIR)"/HGR0.IDX
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR1.LIST)" > "$(BUILDDIR)"/HGR1.IDX
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR2.LIST)" > "$(BUILDDIR)"/HGR2.IDX
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR3.LIST)" > "$(BUILDDIR)"/HGR3.IDX
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR4.LIST)" > "$(BUILDDIR)"/HGR4.IDX
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR5.LIST)" > "$(BUILDDIR)"/HGR5.IDX
bin/buildindexedfile.py "$@" res/ACTION.HGR < "$(ACTION.HGR6.LIST)" > "$(BUILDDIR)"/HGR6.IDX
bin/buildindexedfile.py "$@" res/ACTION.DHGR < "$(ACTION.DHGR.LIST)" > "$(BUILDDIR)"/DHGR.IDX
#
# precompute indexed files for GR and DGR action screenshots
# note: these can be padded because they are not compressed
#
bin/buildindexedfile.py -p "$@" res/ACTION.GR < "$(ACTION.GR.LIST)" > "$(BUILDDIR)"/GR.IDX
bin/buildindexedfile.py -p "$@" res/ACTION.DGR < "$(ACTION.DGR.LIST)" > "$(BUILDDIR)"/DGR.IDX
#
# precompute indexed files for SHR artwork
# note: these can not be padded because they are compressed and the decompressor needs the exact size
#
bin/buildindexedfile.py "$@" res/ARTWORK.SHR < "$(ARTWORK.SHR.LIST)" > "$(BUILDDIR)"/ARTWORK.IDX
#
# precompute indexed files for demo launchers
# note: these can not be padded because some of them are loaded too close to $C000
#
bin/buildindexedfile.py "$@" "$(DEMO)" < "$(DEMO.LIST)" > "$(BUILDDIR)"/DEMO.IDX
#
# precompute indexed files for single-load game binaries
# note: these can be padded because they are loaded at a time when all of main memory is clobber-able
#
bin/buildindexedfile.py -p "$@" "$(BUILDDIR)"/X.INDEXED < "$(XSINGLE.LIST)" > "$(BUILDDIR)"/XSINGLE.IDX
#
# create search indexes for each variation of (game-requires-mouse) X (game-requires-joystick) X (game-requires-128K)
# in the form of OKVS data structures, plus game counts in the form of source files
#
$(PARALLEL) ::: \
'(grep "^000" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count000.a "$(BUILDDIR)"/HGR.TITLES.LOG "" > "$(BUILDDIR)"/SEARCH000.IDX)' \
'(grep "^00" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count001.a "$(BUILDDIR)"/HGR.TITLES.LOG "$(BUILDDIR)"/DHGR.TITLES.LOG > "$(BUILDDIR)"/SEARCH001.IDX)' \
'(grep "^0.0" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count010.a "$(BUILDDIR)"/HGR.TITLES.LOG "" > "$(BUILDDIR)"/SEARCH010.IDX)' \
'(grep "^0" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count011.a "$(BUILDDIR)"/HGR.TITLES.LOG "$(BUILDDIR)"/DHGR.TITLES.LOG > "$(BUILDDIR)"/SEARCH011.IDX)' \
'(grep "^.00" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count100.a "$(BUILDDIR)"/HGR.TITLES.LOG "" > "$(BUILDDIR)"/SEARCH100.IDX)' \
'(grep "^.0" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count101.a "$(BUILDDIR)"/HGR.TITLES.LOG "$(BUILDDIR)"/DHGR.TITLES.LOG > "$(BUILDDIR)"/SEARCH101.IDX)' \
'(grep "^..0" < "$(GAMES.CONF)" | bin/buildsearch.py "$(BUILDDIR)"/index/count110.a "$(BUILDDIR)"/HGR.TITLES.LOG "" > "$(BUILDDIR)"/SEARCH110.IDX)' \
'(bin/buildsearch.py "$(BUILDDIR)"/index/count111.a "$(BUILDDIR)"/HGR.TITLES.LOG "$(BUILDDIR)"/DHGR.TITLES.LOG < "$(GAMES.CONF)" > "$(BUILDDIR)"/SEARCH111.IDX)'
#
# add IDX files to the combined index file and generate
# the index records that callers use to reference them,
# plus additional miscellaneous files
#
bin/addfiles.py "$@" \
"$(BUILDDIR)"/SEARCH000.IDX "$(BUILDDIR)"/index/search000.idx.a \
res/CACHE000.IDX "$(BUILDDIR)"/index/cache000.idx.a \
"$(BUILDDIR)"/SEARCH001.IDX "$(BUILDDIR)"/index/search001.idx.a \
res/CACHE001.IDX "$(BUILDDIR)"/index/cache001.idx.a \
"$(BUILDDIR)"/SEARCH010.IDX "$(BUILDDIR)"/index/search010.idx.a \
res/CACHE010.IDX "$(BUILDDIR)"/index/cache010.idx.a \
"$(BUILDDIR)"/SEARCH011.IDX "$(BUILDDIR)"/index/search011.idx.a \
res/CACHE011.IDX "$(BUILDDIR)"/index/cache011.idx.a \
"$(BUILDDIR)"/SEARCH100.IDX "$(BUILDDIR)"/index/search100.idx.a \
res/CACHE100.IDX "$(BUILDDIR)"/index/cache100.idx.a \
"$(BUILDDIR)"/SEARCH101.IDX "$(BUILDDIR)"/index/search101.idx.a \
res/CACHE101.IDX "$(BUILDDIR)"/index/cache101.idx.a \
"$(BUILDDIR)"/SEARCH110.IDX "$(BUILDDIR)"/index/search110.idx.a \
res/CACHE110.IDX "$(BUILDDIR)"/index/cache110.idx.a \
"$(BUILDDIR)"/SEARCH111.IDX "$(BUILDDIR)"/index/search111.idx.a \
res/CACHE111.IDX "$(BUILDDIR)"/index/cache111.idx.a \
"$(BUILDDIR)"/PRELAUNCH.IDX "$(BUILDDIR)"/index/prelaunch.idx.a \
"$(ATTRACT.IDX)" "$(BUILDDIR)"/index/attract.idx.a \
"$(BUILDDIR)"/DEMO.IDX "$(BUILDDIR)"/index/demo.idx.a \
"$(BUILDDIR)"/XSINGLE.IDX "$(BUILDDIR)"/index/xsingle.idx.a \
"$(BUILDDIR)"/FX.IDX "$(BUILDDIR)"/index/fx.idx.a \
"$(BUILDDIR)"/DFX.IDX "$(BUILDDIR)"/index/dfx.idx.a \
"$(BUILDDIR)"/SFX.IDX "$(BUILDDIR)"/index/sfx.idx.a \
"$(BUILDDIR)"/FXCODE.IDX "$(BUILDDIR)"/index/fxcode.idx.a \
"$(BUILDDIR)"/FXDATA.IDX "$(BUILDDIR)"/index/fxdata.idx.a \
"$(BUILDDIR)"/GAMEHELP.IDX "$(BUILDDIR)"/index/gamehelp.idx.a \
"$(BUILDDIR)"/SLIDESHOW.IDX "$(BUILDDIR)"/index/slideshow.idx.a \
"$(BUILDDIR)"/MINIATTRACT0.IDX "$(BUILDDIR)"/index/miniattract0.idx.a \
"$(BUILDDIR)"/MINIATTRACT1.IDX "$(BUILDDIR)"/index/miniattract1.idx.a \
"$(BUILDDIR)"/TITLE.IDX "$(BUILDDIR)"/index/title.idx.a \
"$(BUILDDIR)"/DTITLE.IDX "$(BUILDDIR)"/index/dtitle.idx.a \
"$(BUILDDIR)"/HGR0.IDX "$(BUILDDIR)"/index/hgr0.idx.a \
"$(BUILDDIR)"/HGR1.IDX "$(BUILDDIR)"/index/hgr1.idx.a \
"$(BUILDDIR)"/HGR2.IDX "$(BUILDDIR)"/index/hgr2.idx.a \
"$(BUILDDIR)"/HGR3.IDX "$(BUILDDIR)"/index/hgr3.idx.a \
"$(BUILDDIR)"/HGR4.IDX "$(BUILDDIR)"/index/hgr4.idx.a \
"$(BUILDDIR)"/HGR5.IDX "$(BUILDDIR)"/index/hgr5.idx.a \
"$(BUILDDIR)"/HGR6.IDX "$(BUILDDIR)"/index/hgr6.idx.a \
"$(BUILDDIR)"/DHGR.IDX "$(BUILDDIR)"/index/dhgr.idx.a \
"$(BUILDDIR)"/GR.IDX "$(BUILDDIR)"/index/gr.idx.a \
"$(BUILDDIR)"/DGR.IDX "$(BUILDDIR)"/index/dgr.idx.a \
"$(BUILDDIR)"/ARTWORK.IDX "$(BUILDDIR)"/index/artwork.idx.a \
"$(BUILDDIR)"/COVERFADE "$(BUILDDIR)"/index/coverfade.idx.a \
"$(BUILDDIR)"/GR.FIZZLE "$(BUILDDIR)"/index/gr.fizzle.idx.a \
"$(BUILDDIR)"/DGR.FIZZLE "$(BUILDDIR)"/index/dgr.fizzle.idx.a \
"$(HELPTEXT)" "$(BUILDDIR)"/index/helptext.idx.a \
"$(CREDITS)" "$(BUILDDIR)"/index/credits.idx.a \
"$(JOYSTICK)" "$(BUILDDIR)"/index/joystick.idx.a
@touch "$@"
# assemble main program
$(LAUNCHER.SYSTEM): $(LAUNCHER.SOURCES) | $(MD) $(TOTAL.DATA)
$(ACME) -DBUILDNUMBER=`git rev-list --count HEAD` src/4cade.a 2>"$(BUILDDIR)"/relbase.log
$(ACME) -r "$(BUILDDIR)"/4cade.lst -DBUILDNUMBER=`git rev-list --count HEAD` -DRELBASE=`cat "$(BUILDDIR)"/relbase.log | grep "RELBASE =" | cut -d"=" -f2 | cut -d"(" -f2 | cut -d")" -f1` src/4cade.a
@touch "$@"
# assemble launchers for self-running demos
$(DEMO): $(DEMO.SOURCES) | $(MD)
mkdir -p "$@"
$(PARALLEL) 'if grep -q "^!to" "{}"; then $(ACME) "{}"; fi' ::: src/demo/*.a
(cd "$(DEMO)"/ && for f in *; do echo "$$f"; done) > "$(DEMO.LIST)"
@touch "$@"
# assemble graphic effects
$(FX): $(FX.SOURCES) | $(MD)
mkdir -p "$@" "$(BUILDDIR)"/FX.INDEXED "$(BUILDDIR)"/FXDATA "$(BUILDDIR)"/FXDATA.UNCOMPRESSED "$(BUILDDIR)"/FXCODE
$(PARALLEL) 'if grep -q "^!to" "{}"; then $(ACME) "{}"; fi' ::: src/fx/*.a
$(PARALLEL) '${EXOMIZER} {}@0x$$(echo {/}|cut -d, -f2) -o "$(BUILDDIR)/FXDATA/"$$(echo {/}|cut -d, -f1)' ::: "$(BUILDDIR)"/FXDATA.UNCOMPRESSED/*
(cd "$(BUILDDIR)"/FXCODE/ && for f in *; do echo "$$f"; done) > "$(FXCODE.LIST)"
(cd "$(BUILDDIR)"/FXDATA/ && for f in *; do echo "$$f"; done) > "$(FXDATA.LIST)"
@touch "$@"
# assemble launchers for games
$(PRELAUNCH): $(PRELAUNCH.SOURCES) | $(MD)
mkdir -p "$@" "$(BUILDDIR)"/PRELAUNCH.INDEXED
$(PARALLEL) 'if grep -q "^!to" "{}"; then $(ACME) "{}"; fi' ::: src/prelaunch/*.a
@touch "$@"
# assemble bootloader
$(PROBOOTHD): $(PROBOOT.SOURCES) | $(MD)
$(ACME) -r "$(BUILDDIR)"/proboothd.lst src/proboothd/proboothd.a
@touch "$@"
#
# |compress| must be called separately because it is slow and
# only needs to be run when a new graphic file is added.
# It create files in the repository which can then be checked in.
#
# Most of these files are a known size (enforced by truncate command)
# so we do not include the target address in the compressed data.
# The launcher will set the target address at runtime before
# decompressing. This saves 2 bytes per file.
#
compress: $(MD)
$(PARALLEL) '[ -f "res/ACTION.HGR/{/}" ] || (truncate -s 8192 "{}" && ${EXOMIZER} "{}"@0x0000 -o "res/ACTION.HGR/{/}" && truncate -s -2 "res/ACTION.HGR/{/}")' ::: res/ACTION.HGR.UNCOMPRESSED/*
$(PARALLEL) '[ -f "res/ACTION.DHGR/{/}" ] || (truncate -s 16384 "{}" && ${EXOMIZER} "{}"@0x0000 -o "res/ACTION.DHGR/{/}" && truncate -s -2 "res/ACTION.DHGR/{/}")' ::: res/ACTION.DHGR.UNCOMPRESSED/*
$(PARALLEL) '[ -f "res/ARTWORK.SHR/{/}" ] || (truncate -s 32768 "{}" && ${EXOMIZER} "{}"@0x0000 -o "res/ARTWORK.SHR/{/}" && truncate -s -2 "res/ARTWORK.SHR/{/}")' ::: res/ARTWORK.SHR.UNCOMPRESSED/*
$(PARALLEL) '[ -f "res/TITLE.HGR/{/}" ] || bin/packhgrfile.py "{}" "res/TITLE.HGR/{/}"' ::: res/TITLE.HGR.UNPACKED/*
$(PARALLEL) '[ -f "res/TITLE.DHGR/{/}" ] || bin/packdhgrfile.py "{}" "res/TITLE.DHGR/{/}"' ::: res/TITLE.DHGR.UNPACKED/*
#
# |attract| must be called separately because it is slow and
# only needs to be run when a new game or demo is added.
# It create files in the repository which can then be checked in.
#
attract: compress
bin/check-attract-mode.sh
bin/generate-mini-attract-mode.sh
#
# |cache| must be called separately because it is slow and
# only needs to be run when a new game is added.
# It create files in the repository which can then be checked in.
#
cache: $(GAMES.CONF)
$(PARALLEL) ::: \
'awk -F= '"'"'/^000/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache000.a' \
'awk -F= '"'"'/^00/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache001.a' \
'awk -F= '"'"'/^0.0/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache010.a' \
'awk -F= '"'"'/^0/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache011.a' \
'awk -F= '"'"'/^.00/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache100.a' \
'awk -F= '"'"'/^.0/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache101.a' \
'awk -F= '"'"'/^..0/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py > "$(BUILDDIR)"/cache110.a' \
'awk -F= '"'"'!/^$$|^#/ { print $$2 }'"'"' < "$(GAMES.CONF)" | bin/buildcache.py -v > "$(BUILDDIR)"/cache111.a' 2> "$(BUILDDIR)"/cache.log
$(PARALLEL) ::: \
'$(ACME) -o res/CACHE000.IDX "$(BUILDDIR)"/cache000.a' \
'$(ACME) -o res/CACHE001.IDX "$(BUILDDIR)"/cache001.a' \
'$(ACME) -o res/CACHE010.IDX "$(BUILDDIR)"/cache010.a' \
'$(ACME) -o res/CACHE011.IDX "$(BUILDDIR)"/cache011.a' \
'$(ACME) -o res/CACHE100.IDX "$(BUILDDIR)"/cache100.a' \
'$(ACME) -o res/CACHE101.IDX "$(BUILDDIR)"/cache101.a' \
'$(ACME) -o res/CACHE110.IDX "$(BUILDDIR)"/cache110.a' \
'$(ACME) -o res/CACHE111.IDX "$(BUILDDIR)"/cache111.a'
mount: $(HDV)
$(MOUNTER) $(HDV) &
$(MD):
@$(ACME) --version | grep -q "ACME, release" || (echo "ACME is not installed" && exit 1)
@$(CADIUS) | grep -q "cadius v" || (echo "Cadius is not installed" && exit 1)
@$(PARALLEL) --version | grep -q "GNU" || (echo "GNU Parallel is not installed" && exit 1)
@$(PYTHON) --version | grep -q "Python 3" || (echo "Python 3 is not installed" && exit 1)
mkdir -p "$(BUILDDIR)"
touch "$(CADIUS.LOG)"
@touch "$@"
clean:
rm -rf "$(BUILDDIR)"/ || rm -rf "$(BUILDDIR)"
all: clean $(HDV) mount
al: all
.NOTPARALLEL: