forked from Jhynjhiruu/gameshark
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
184 lines (146 loc) · 4.9 KB
/
Makefile
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
COMPARE ?= 1
VERSION ?= us
ifeq ($(VERSION),us)
NAME := gameshark
VERSION_DEFINE := VERSION_US
else
NAME := actionreplay
VERSION_DEFINE := VERSION_EU
endif
USE_BUILT_SHELL ?= 1
USE_BUILT_TRAINER ?= 1
TARGET := build/$(NAME).bin
ELF := $(TARGET:.bin=.elf)
CROSS ?= mips-linux-gnu-
SN64_PATH ?= tools/gcc/
SET_CPATH := COMPILER_PATH=$(SN64_PATH)
CC := $(CROSS)gcc
SNCC := $(SET_CPATH) wine $(SN64_PATH)cc1n64.exe
CPP := $(SET_CPATH) wine $(SN64_PATH)cppn64.exe
AS := $(CROSS)as
SNAS := $(SET_CPATH) wine $(SN64_PATH)asn64.exe
LD := $(CROSS)ld
OBJCOPY := $(CROSS)objcopy
OBJDUMP := $(CROSS)objdump
STRIP := $(CROSS)strip
UNIX2DOS := unix2dos
INC := -I include -I include/shared -I include/shared/sys -I src -I include/src
CPPFLAGS := $(INC) -D_MIPS_SZLONG=32 -D_LANGUAGE_C -nostdinc -Wall -D$(VERSION_DEFINE) -DVERSION=$(VERSION)
SNCPPFLAGS := -D__SN64__
CFLAGS := -quiet -G0 -mcpu=vr4300 -mips3 -mhard-float -meb -Wall -mno-abicalls
ASFLAGS := $(INC) -G0 -EB -mtune=vr4300 -march=vr4300 -mabi=32 -O1
SNASFLAGS := $(INC) -q G0
OPTFLAGS := -O2 -g3
ifeq ($(COMPARE),0)
CPPFLAGS += -DNON_MATCHING
endif
# Source dirs
SRC_DIRS := $(shell find src -type d)
ASM_DIRS := $(shell find asm/$(VERSION) -type d -not -path "asm/*/nonmatchings*")
BIN_DIRS := $(shell find assets/$(VERSION) -type d)
# Source files
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
ifeq ($(PERMUTER),1)
C_FILES += permute.c
endif
S_FILES := $(foreach dir,$(SRC_DIRS) $(ASM_DIRS),$(wildcard $(dir)/*.s))
B_FILES := $(foreach dir,$(BIN_DIRS),$(wildcard $(dir)/*.bin))
O_FILES := $(foreach f,$(C_FILES:.c=.c.o),build/$(VERSION)/$f) \
$(foreach f, $(S_FILES:.s=.s.o),build/$(VERSION)/$f) \
$(foreach f,$(B_FILES:.bin=.bin.o),build/$(VERSION)/$f)
O_FILES += build/$(VERSION)/assets/$(VERSION)/fsblob.bin.o
ifeq ($(USE_BUILT_SHELL),1)
ifeq ($(VERSION),us)
FSBLOB_FILES := shell/build/us/shell.bin fs/us/gslogo3.bin fs/us/gslogo3.pal fs/us/tile1.tg~
else
FSBLOB_FILES := shell/build/eu/shell.bin fs/eu/arlogo3.bin fs/eu/arlogo3.pal fs/eu/tile1.tg~
endif
else
ifeq ($(VERSION),us)
FSBLOB_FILES := fs/us/shell.bin fs/us/gslogo3.bin fs/us/gslogo3.pal fs/us/tile1.tg~
else
FSBLOB_FILES := fs/eu/shell.bin fs/eu/arlogo3.bin fs/eu/arlogo3.pal fs/eu/tile1.tg~
endif
endif
ifeq ($(USE_BUILT_TRAINER),1)
ifeq ($(VERSION),us)
FSBLOB_FILES += trainer/build/us/trainer.bin
else
FSBLOB_FILES += trainer/build/eu/trainer.bin
endif
else
ifeq ($(VERSION),us)
FSBLOB_FILES += fs/us/trainer.bin
else
FSBLOB_FILES += fs/eu/trainer.bin
endif
endif
# Create build directories
$(shell mkdir -p build build/$(VERSION) $(foreach dir,$(SRC_DIRS) $(ASM_DIRS),build/$(VERSION)/$(dir)))
.PHONY: all clean distclean setup
all: $(TARGET)
ifeq ($(COMPARE),1)
@sha1sum $(TARGET)
@sha1sum -c $(NAME).sha1
endif
clean:
$(RM) -r build
$(MAKE) -C tools clean
distclean: clean
$(RM) -r expected
$(MAKE) -C tools distclean
setup:
$(MAKE) -C tools
$(MAKE) all COMPARE=1
ifeq (,$(wildcard $(NAME).bin))
cp $(TARGET) $(NAME).bin
endif
mkdir -p expected && cp -r build expected/build
$(TARGET): $(ELF)
$(OBJCOPY) -O binary $< $(@:.bin=.tmp)
dd if=$(@:.bin=.tmp) of=$@ bs=16K conv=sync status=none
@$(RM) $(@:.bin=.tmp)
$(ELF): $(O_FILES) $(NAME).ld
$(LD) -T $(NAME).ld --accept-unknown-input-arch -T undefined_syms_$(VERSION).txt -o $@ -Map $(@:.elf=.map)
build/$(VERSION):
mkdir $@
build/$(VERSION)/assets:
mkdir $@
build/$(VERSION)/assets/$(VERSION): build/$(VERSION)/assets
mkdir $@
build/$(VERSION)/assets/$(VERSION)/%.bin.o: assets/$(VERSION)/%.bin | build/$(VERSION)/assets/$(VERSION)
$(OBJCOPY) -I binary -O elf32-big $< $@
build/$(VERSION)/src/%.s.o: src/%.s
$(UNIX2DOS) $<
$(CC) -x assembler-with-cpp $(ASFLAGS) -mno-abicalls -c $< -o $@
@$(STRIP) -N dummy_symbol_ $@
@$(OBJDUMP) -drz $@ > $(@:.o=.s)
build/$(VERSION)/asm/$(VERSION)/%.s.o: asm/$(VERSION)/%.s
$(UNIX2DOS) $<
$(AS) $(ASFLAGS) -I include -I include/shared $< -o $@
build/$(VERSION)/src/%.c.o: build/$(VERSION)/src/%.c.obj
tools/psyq-obj-parser $< -o $@ -b -n > /dev/null
@$(STRIP) -N dummy_symbol_ $@
#@$(OBJDUMP) -drz $@ > $(@:.o=.s)
build/$(VERSION)/src/%.c.obj: src/%.c
$(UNIX2DOS) $<
$(CPP) $(CPPFLAGS) $(SNCPPFLAGS) $< -o $@.i
$(SNCC) $(CFLAGS) $(OPTFLAGS) $@.i -o $@.s
$(SNAS) $(SNASFLAGS) $@.s -o $@
build/$(VERSION)/assets/$(VERSION)/fsblob.bin: $(FSBLOB_FILES)
ifeq ($(COMPARE),1)
tools/fsblob/target/release/fsblob build -o $@ $(^:tile1.tg~=tile1.tg~@tile1.tg~\"\\u{00}\\u{6C}\") --pad 0x2B4E0
else
tools/fsblob/target/release/fsblob build -o $@ $^ --pad 0x2B4E0
endif
build/$(VERSION)/assets/$(VERSION)/%.bin.o: build/$(VERSION)/assets/$(VERSION)/%.bin
$(OBJCOPY) -I binary -O elf32-big $< $@
build/permute.c.o: build/permute.c.obj
tools/psyq-obj-parser $< -o $@ -b -n > /dev/null
@$(STRIP) -N dummy_symbol_ $@
@$(OBJDUMP) -drz $@ > $(@:.o=.s)
build/permute.c.obj: permute.c
$(UNIX2DOS) $<
$(CPP) $(CPPFLAGS) $< -o $@.i
$(SNCC) $(CFLAGS) $(OPTFLAGS) $@.i -o $@.s
$(SNAS) $(SNASFLAGS) $@.s -o $@