-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
107 lines (83 loc) · 2.8 KB
/
Makefile
File metadata and controls
107 lines (83 loc) · 2.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
export LC_CTYPE=C
export PYTHONIOENCODING=utf-8
OUTPUT_NAME := metamode
GAME_NAME := METAMODE
GAME_ID := BTMJ
GAME_LICENSEE := C8
GAME_LICENSEEID := 0x33
GAME_MBCTYPE := 0x1B
GAME_RAMSIZE := 2
ORIGINAL_NAME := baserom
# Tools
PYTHON := python3
# Toolchain
CC := rgbasm
CC_ARGS :=
LD := rgblink
LD_ARGS :=
FIX := rgbfix
FIX_ARGS :=
CCGFX := rgbgfx
CCGFX_ARGS :=
# Types
ROM_TYPE := gbc
SYM_TYPE := sym
MAP_TYPE := map
SOURCE_TYPE := asm
INT_TYPE := o
# Directories
## It's important these remain relative
BASE := .
BUILD := $(BASE)/build
GAME := $(BASE)/game
SCRIPT := $(BASE)/scripts
# Game Source Directories
SRC := $(GAME)/src
COMMON := $(SRC)/common
# Build Directories
INTERMEDIATES := $(BUILD)/intermediate
# Source Modules (directories in SRC)
MODULES := \
core
# Helper functions
TOUPPER = $(shell echo '$1' | tr '[:lower:]' '[:upper:]')
FILTER = $(strip $(foreach v,$(2),$(if $(findstring $(1),$(v)),$(v),)))
FILTER_OUT = $(strip $(foreach v,$(2),$(if $(findstring $(1),$(v)),,$(v))))
ESCAPE = $(subst ','\'',$(1))
# Necessary for patsubst expansion
pc := %
# Input ROM
ORIGINAL_ROM := $(BASE)/$(ORIGINAL_NAME).$(ROM_TYPE)
# Final outputs (used by clean)
TARGET := $(BASE)/$(OUTPUT_NAME).$(ROM_TYPE)
SYM_OUT := $(BASE)/$(OUTPUT_NAME).$(SYM_TYPE)
MAP_OUT := $(BASE)/$(OUTPUT_NAME).$(MAP_TYPE)
# Sources
OBJNAMES := $(foreach MODULE,$(MODULES),$(addprefix $(MODULE)., $(addsuffix .$(INT_TYPE), $(notdir $(basename $(wildcard $(SRC)/$(MODULE)/*.$(SOURCE_TYPE)))))))
COMMON_SRC := $(wildcard $(COMMON)/*.$(SOURCE_TYPE))
# Intermediates for common sources
OBJECTS := $(foreach OBJECT,$(OBJNAMES), $(addprefix $(BUILD)/,$(OBJECT)))
# Additional dependencies, per module granularity (i.e. core) or per file granularity (e.g. core_main_ADDITIONAL)
#core_ADDITIONAL :=
#core_main_ADDITIONAL :=
.PHONY: all clean default test
default: $(TARGET)
all: default
clean:
rm -r $(BUILD) $(TARGET) $(SYM_OUT) $(MAP_OUT) || exit 0
# $| is a hack, we cannot have any other order-only prerequisites
.SECONDEXPANSION:
$(TARGET): $(OBJECTS) | $(ORIGINAL_ROM)
$(LD) $(LD_ARGS) -n $(SYM_OUT) -m $(MAP_OUT) -O $| -o $@ $^
$(FIX) $(FIX_ARGS) -v -C -k "$(GAME_LICENSEE)" -l $(GAME_LICENSEEID) -m $(GAME_MBCTYPE) -p 0 -r $(GAME_RAMSIZE) $@ -i "$(GAME_ID)" -t "$(GAME_NAME)"
cmp -l $| $@
# Build objects
.SECONDEXPANSION:
.SECONDARY: # Don't delete intermediate files
$(BUILD)/%.$(INT_TYPE): $(SRC)/$$(firstword $$(subst ., ,$$*))/$$(lastword $$(subst ., ,$$*)).$(SOURCE_TYPE) $(COMMON_SRC) $$(wildcard $(SRC)/$$(firstword $$(subst ., ,$$*))/include/*.$(SOURCE_TYPE)) $$($$(firstword $$(subst ., ,$$*))_ADDITIONAL) $$($$(firstword $$(subst ., ,$$*))_$$(lastword $$(subst ., ,$$*))_ADDITIONAL) | $$(patsubst $$(pc)/,$$(pc),$$(dir $$@))
$(CC) $(CC_ARGS) -o $@ $<
#Make directories if necessary
$(BUILD):
mkdir -p $(BUILD)
$(SCRIPT_RES):
mkdir -p $(SCRIPT_RES)