A dungeon delver roguelike using Pathfinder 2nd edition rules
1include project.mk
2
3SRCDIR = src
4OBJDIR = obj
5BINDIR = bin
6LIBDIR = libs
7RESDIR = $(SRCDIR)/resources
8ASMDIR = $(SRCDIR)/main
9RESSPRITES = $(RESDIR)/sprites
10RESBACKGROUNDS = $(RESDIR)/backgrounds
11GENDIR = $(SRCDIR)/generated
12GENSPRITES = $(GENDIR)/sprites
13GENBACKGROUNDS = $(GENDIR)/backgrounds
14BINS = $(BINDIR)/$(ROMNAME).$(ROMEXT)
15
16RGBDS ?=
17ASM := $(RGBDS)rgbasm
18LINK := $(RGBDS)rgblink
19FIX := $(RGBDS)rgbfix
20GFX := $(RGBDS)rgbgfx
21
22INCLUDEDIRS = include/
23WARNINGS = all extra
24ASMFLAGS := -p $(PADVALUE) $(addprefix -I,$(INCLUDEDIRS)) $(addprefix -W,$(WARNINGS))
25LINKFLAGS := -p $(PADVALUE)
26FIXFLAGS := -v -p $(PADVALUE) -i "$(GAMEID)" -k "$(LICENSEE)" -l $(OLDLIC) -m $(MBC) -n $(VERSION) -r $(SRAMSIZE) -t $(TITLE)
27
28# https://stackoverflow.com/a/18258352
29# Make does not offer a recursive wild card function, so here's one:
30rwildcard = $(foreach d,\
31 $(wildcard $(1:=/*)), \
32 $(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d) \
33)
34
35# https://stackoverflow.com/a/16151140
36# This makes it so every entry in a space-delimited list appears only once
37unique = $(if $1,\
38 $(firstword $1) $(call unique,$(filter-out $(firstword $1),$1)) \
39)
40
41ASMSOURCES_COLLECTED = $(call rwildcard,$(ASMDIR),*.asm) $(call rwildcard,$(LIBDIR),*.asm)
42OBJS = $(patsubst %.asm,$(OBJDIR)/%.o,$(notdir $(ASMSOURCES_COLLECTED))) $(OBJDIR)/build_date.o
43
44all: $(BINS)
45
46NEEDED_GRAPHICS = \
47 $(GENBACKGROUNDS)/title.tilemap \
48 $(GENBACKGROUNDS)/text-font.2bpp
49
50GRAPHICS_DIR = $(GENDIR)/graphics
51GRAPHICS_CODE = $(call rwildcard,$(GRAPHICS_DIR),*.asm)
52GRAPHICS_OBJS = $(patsubst %.asm,$(OBJDIR)/%.o,$(notdir $(GRAPHICS_CODE)))
53
54test:
55 echo
56
57$(GENSPRITES)/%.2bpp: $(RESSPRITES)/%.png | $(GENSPRITES)
58 $(GFX) -c '#fff,#cfcfcf,#686868,#000;' --columns -o $@ $<
59
60$(GENBACKGROUNDS)/%.2bpp: $(RESBACKGROUNDS)/%.png | $(GENBACKGROUNDS)
61 $(GFX) -c '#fff,#9fa29f,#545654,#000;' -o $@ $<
62
63$(GENBACKGROUNDS)/%.tilemap: $(RESBACKGROUNDS)/%.png | $(GENBACKGROUNDS)
64 $(GFX) -c '#fff,#9fa29f,#545654,#000;' \
65 --tilemap $@ \
66 --unique-tiles \
67 -o $(GENBACKGROUNDS)/$*.2bpp \
68 $<
69
70ASMSOURCES_DIRS = $(patsubst %,%%.asm,\
71 $(call unique,$(dir $(ASMSOURCES_COLLECTED))) \
72)
73
74define object-from-asm
75$(OBJDIR)/%.o: $1 | $(OBJDIR) $(NEEDED_GRAPHICS)
76 $$(ASM) $$(ASMFLAGS) -o $$@ $$<
77endef
78
79$(foreach i, $(ASMSOURCES_DIRS), $(eval $(call object-from-asm,$i)))
80
81$(eval $(call object-from-asm,$(GRAPHICS_DIR)/%.asm))
82
83$(BINS): $(OBJS) $(GRAPHICS_OBJS) | $(BINDIR)
84 $(LINK) $(LINKFLAGS) -m $(@:.gb=.map) -n $(@:.gb=.sym) -o $@ $^
85 $(FIX) $(FIXFLAGS) $@
86
87$(OBJDIR)/build_date.o: $(SRCDIR)/assets/build_date.asm | $(OBJDIR)
88 $(ASM) $(ASMFLAGS) -o $@ $^
89
90define ensure-directory
91$1:
92 mkdir -p $$@
93endef
94
95PREPARE_DIRECTORIES = $(OBJDIR) $(GENSPRITES) $(GENBACKGROUNDS) $(BINDIR)
96
97$(foreach i, $(PREPARE_DIRECTORIES), $(eval $(call ensure-directory,$i)))
98
99clean:
100 rm -rfv $(PREPARE_DIRECTORIES)
101
102.PHONY: clean all test