Files
Binx/Makefile
ISSOtm 06ea1ea0fa Overhaul boilerplate
Fix occasional build issues, which turned out to be improper use of multiple targets
Update links to point to current URLs for resources
Improve formatting where applicable
Switch to recursively scanning for assembly files, as this has proven to scale better
2023-11-05 11:55:48 +01:00

90 lines
2.9 KiB
Makefile

.SUFFIXES: # Suppress a lot of useless default rules, which also provides a nice speedup.
# Recursive `wildcard` function.
rwildcard = $(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
# Program constants.
# POSIX OSes (the sane default).
RM_RF := rm -rf
MKDIR_P := mkdir -p
ifeq ($(strip $(shell which rm)),)
# Windows *really* tries its hardest to be Special™!
RM_RF := -del /q
MKDIR_P := -mkdir
endif
RGBDS ?= # Shortcut if you want to use a local copy of RGBDS.
RGBASM := ${RGBDS}rgbasm
RGBLINK := ${RGBDS}rgblink
RGBFIX := ${RGBDS}rgbfix
RGBGFX := ${RGBDS}rgbgfx
ROM = bin/${ROMNAME}.${ROMEXT}
# Argument constants
INCDIRS = src/ src/include/
WARNINGS = all extra
ASFLAGS = -p ${PADVALUE} $(addprefix -I,${INCDIRS}) $(addprefix -W,${WARNINGS})
LDFLAGS = -p ${PADVALUE}
FIXFLAGS = -p ${PADVALUE} -i "${GAMEID}" -k "${LICENSEE}" -l ${OLDLIC} -m ${MBC} -n ${VERSION} -r ${SRAMSIZE} -t ${TITLE}
# The list of ASM files that RGBASM will be invoked on.
SRCS = $(call rwildcard,src,*.asm)
## Project-specific configuration
# Use this to override the above
include project.mk
# `all` (Default target): build the ROM
all: ${ROM}
.PHONY: all
# `clean`: Clean temp and bin files
clean:
${RM_RF} bin obj assets
.PHONY: clean
# `rebuild`: Build everything from scratch
# It's important to do these two in order if we're using more than one job
rebuild:
${MAKE} clean
${MAKE} all
.PHONY: rebuild
# By default, asset recipes convert files in `assets/` into other files in `assets/`.
# This line causes assets not found in `assets/` to be also looked for in `src/assets/`.
# "Source" assets can thus be safely stored there without `make clean` removing them!
VPATH := src
# Define how to compress files using the PackBits16 codec.
# (The compressor script requires Python 3.)
assets/%.pb16: src/tools/pb16.py assets/%
@${MKDIR_P} ${@D}
$^ $@
# How to build a ROM.
# Notice that the build date is always refreshed.
bin/%.${ROMEXT}: $(patsubst src/%.asm,obj/%.o,${SRCS})
@${MKDIR_P} ${@D}
${RGBASM} ${ASFLAGS} -o obj/build_date.o src/assets/build_date.asm
${RGBLINK} ${LDFLAGS} -m bin/$*.map -n bin/$*.sym -o $@ $^ \
&& ${RGBFIX} -v ${FIXFLAGS} $@
# `.mk` files are auto-generated dependency lists of the source ASM files, to save a lot of hassle.
# Also add all obj dependencies to the dep file too, so Make knows to remake it.
# Caution: some of these flags were added in RGBDS 0.4.0, using an earlier version WILL NOT WORK
# (and produce weird errors).
obj/%.mk: src/%.asm
@${MKDIR_P} ${@D}
${RGBASM} ${ASFLAGS} -M $@ -MG -MP -MQ ${@:.mk=.o} -MQ $@ -o ${@:.mk=.o} $<
# DO NOT merge this with the rule above, otherwise Make will assume that the `.o` file is generated,
# even when it isn't!
# This causes weird issues that depend, among other things, on the version of Make.
obj/%.o: obj/%.mk
@touch $@
ifeq ($(filter clean,${MAKECMDGOALS}),)
include $(patsubst src/%.asm,obj/%.mk,${SRCS})
endif