144 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Makefile
		
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Makefile
		
	
	
	
 | 
						|
.SUFFIXES:
 | 
						|
 | 
						|
################################################
 | 
						|
#                                              #
 | 
						|
#             CONSTANT DEFINITIONS             #
 | 
						|
#                                              #
 | 
						|
################################################
 | 
						|
 | 
						|
# Directory constants
 | 
						|
BINDIR := bin
 | 
						|
OBJDIR := obj
 | 
						|
DEPDIR := dep
 | 
						|
 | 
						|
# Program constants
 | 
						|
ifneq ($(strip $(shell which rm)),)
 | 
						|
    # POSIX OSes
 | 
						|
    RM_RF := rm -rf
 | 
						|
    MKDIR_P := mkdir -p
 | 
						|
    PY :=
 | 
						|
    filesize = printf 'NB_PB$2_BLOCKS equ ((%u) + $2 - 1) / $2\n' "`wc -c <$1`"
 | 
						|
else
 | 
						|
    # Windows outside of a POSIX env (Cygwin, MSYS2, etc.)
 | 
						|
    # We need Powershell to get any sort of decent functionality
 | 
						|
    $(warning Powershell is required to get basic functionality)
 | 
						|
    RM_RF := -del /q
 | 
						|
    MKDIR_P := -mkdir
 | 
						|
    PY := python
 | 
						|
    filesize = powershell Write-Output $$('NB_PB$2_BLOCKS equ ' + [string] [int] (([IO.File]::ReadAllBytes('$1').Length + $2 - 1) / $2))
 | 
						|
endif
 | 
						|
 | 
						|
# Shortcut if you want to use a local copy of RGBDS
 | 
						|
RGBDS   :=
 | 
						|
RGBASM  := $(RGBDS)rgbasm
 | 
						|
RGBLINK := $(RGBDS)rgblink
 | 
						|
RGBFIX  := $(RGBDS)rgbfix
 | 
						|
RGBGFX  := $(RGBDS)rgbgfx
 | 
						|
 | 
						|
ROM = $(BINDIR)/$(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) -v -i "$(GAMEID)" -k "$(LICENSEE)" -l $(OLDLIC) -m $(MBC) -n $(VERSION) -r $(SRAMSIZE) -t $(TITLE)
 | 
						|
 | 
						|
# The list of "root" ASM files that RGBASM will be invoked on
 | 
						|
SRCS = $(wildcard src/*.asm)
 | 
						|
 | 
						|
## Project-specific configuration
 | 
						|
# Use this to override the above
 | 
						|
include project.mk
 | 
						|
 | 
						|
################################################
 | 
						|
#                                              #
 | 
						|
#                    TARGETS                   #
 | 
						|
#                                              #
 | 
						|
################################################
 | 
						|
 | 
						|
# `all` (Default target): build the ROM
 | 
						|
all: $(ROM)
 | 
						|
.PHONY: all
 | 
						|
 | 
						|
# `clean`: Clean temp and bin files
 | 
						|
clean:
 | 
						|
	$(RM_RF) $(BINDIR)
 | 
						|
	$(RM_RF) $(OBJDIR)
 | 
						|
	$(RM_RF) $(DEPDIR)
 | 
						|
	$(RM_RF) res
 | 
						|
.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
 | 
						|
 | 
						|
################################################
 | 
						|
#                                              #
 | 
						|
#                RESOURCE FILES                #
 | 
						|
#                                              #
 | 
						|
################################################
 | 
						|
 | 
						|
# By default, asset recipes convert files in `res/` into other files in `res/`
 | 
						|
# This line causes assets not found in `res/` to be also looked for in `src/res/`
 | 
						|
# "Source" assets can thus be safely stored there without `make clean` removing them
 | 
						|
VPATH := src
 | 
						|
 | 
						|
res/%.1bpp: res/%.png
 | 
						|
	@$(MKDIR_P) $(@D)
 | 
						|
	$(RGBGFX) -d 1 -o $@ $<
 | 
						|
 | 
						|
# Define how to compress files using the PackBits16 codec
 | 
						|
# Compressor script requires Python 3
 | 
						|
res/%.pb16: res/% src/tools/pb16.py
 | 
						|
	@$(MKDIR_P) $(@D)
 | 
						|
	$(PY) src/tools/pb16.py $< res/$*.pb16
 | 
						|
 | 
						|
res/%.pb16.size: res/%
 | 
						|
	@$(MKDIR_P) $(@D)
 | 
						|
	$(call filesize,$<,16) > res/$*.pb16.size
 | 
						|
 | 
						|
# Define how to compress files using the PackBits8 codec
 | 
						|
# Compressor script requires Python 3
 | 
						|
res/%.pb8: res/% src/tools/pb8.py
 | 
						|
	@$(MKDIR_P) $(@D)
 | 
						|
	$(PY) src/tools/pb8.py $< res/$*.pb8
 | 
						|
 | 
						|
res/%.pb8.size: res/%
 | 
						|
	@$(MKDIR_P) $(@D)
 | 
						|
	$(call filesize,$<,8) > res/$*.pb8.size
 | 
						|
 | 
						|
###############################################
 | 
						|
#                                             #
 | 
						|
#                 COMPILATION                 #
 | 
						|
#                                             #
 | 
						|
###############################################
 | 
						|
 | 
						|
# How to build a ROM
 | 
						|
$(BINDIR)/%.$(ROMEXT) $(BINDIR)/%.sym $(BINDIR)/%.map: $(patsubst src/%.asm,$(OBJDIR)/%.o,$(SRCS))
 | 
						|
	@$(MKDIR_P) $(@D)
 | 
						|
	$(RGBASM) $(ASFLAGS) -o $(OBJDIR)/build_date.o src/res/build_date.asm
 | 
						|
	$(RGBLINK) $(LDFLAGS) -m $(BINDIR)/$*.map -n $(BINDIR)/$*.sym -o $(BINDIR)/$*.$(ROMEXT) $^ $(OBJDIR)/build_date.o \
 | 
						|
	&& $(RGBFIX) -v $(FIXFLAGS) $(BINDIR)/$*.$(ROMEXT)
 | 
						|
 | 
						|
# `.mk` files are auto-generated dependency lists of the "root" 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)
 | 
						|
$(OBJDIR)/%.o $(DEPDIR)/%.mk: src/%.asm
 | 
						|
	@$(MKDIR_P) $(patsubst %/,%,$(dir $(OBJDIR)/$* $(DEPDIR)/$*))
 | 
						|
	$(RGBASM) $(ASFLAGS) -M $(DEPDIR)/$*.mk -MG -MP -MQ $(OBJDIR)/$*.o -MQ $(DEPDIR)/$*.mk -o $(OBJDIR)/$*.o $<
 | 
						|
 | 
						|
ifneq ($(MAKECMDGOALS),clean)
 | 
						|
-include $(patsubst src/%.asm,$(DEPDIR)/%.mk,$(SRCS))
 | 
						|
endif
 | 
						|
 | 
						|
# Catch non-existent files
 | 
						|
# KEEP THIS LAST!!
 | 
						|
%:
 | 
						|
	@false
 |