@@ -6,37 +6,39 @@ default: all
6
6
7
7
# ## Build Options ###
8
8
9
+ # These options can either be changed by modifying the makefile, or
10
+ # by building with 'make SETTING=value'. 'make clean' may be required.
11
+
9
12
# Version of the game to build
10
13
VERSION ?= us
11
14
# Graphics microcode used
12
15
GRUCODE ?= f3d_old
13
16
# If COMPARE is 1, check the output sha1sum when building 'all'
14
17
COMPARE ?= 1
15
- # If NON_MATCHING is 1, define the NON_MATCHING macro when building
18
+ # If NON_MATCHING is 1, define the NON_MATCHING and AVOID_UB macros when building (recommended)
16
19
NON_MATCHING ?= 0
17
- # If ENDIAN_IND is 1, enable non-matching code changes that try to ensure
18
- # endianness independence
19
- ENDIAN_IND ?= 0
20
+ # Build for the N64 (turn this off for ports)
21
+ TARGET_N64 ?= 1
20
22
21
23
# Release
22
24
23
25
ifeq ($(VERSION ) ,jp)
24
- VERSION_CFLAGS := -DVERSION_JP=1
26
+ VERSION_CFLAGS := -DVERSION_JP
25
27
VERSION_ASFLAGS := --defsym VERSION_JP=1
26
28
GRUCODE_CFLAGS := -DF3D_OLD
27
29
GRUCODE_ASFLAGS := --defsym F3D_OLD=1
28
30
TARGET := sm64.jp
29
31
else
30
32
ifeq ($(VERSION ) ,us)
31
- VERSION_CFLAGS := -DVERSION_US=1
33
+ VERSION_CFLAGS := -DVERSION_US
32
34
VERSION_ASFLAGS := --defsym VERSION_US=1
33
35
GRUCODE_CFLAGS := -DF3D_OLD
34
36
GRUCODE_ASFLAGS := --defsym F3D_OLD=1
35
37
TARGET := sm64.us
36
38
else
37
39
ifeq ($(VERSION ) ,eu)
38
40
$(warning Building EU is experimental and is prone to breaking. Try at your own risk.)
39
- VERSION_CFLAGS := -DVERSION_EU=1
41
+ VERSION_CFLAGS := -DVERSION_EU
40
42
VERSION_ASFLAGS := --defsym VERSION_EU=1
41
43
GRUCODE_CFLAGS := -DF3D_NEW
42
44
GRUCODE_ASFLAGS := --defsym F3D_NEW=1
@@ -50,13 +52,13 @@ endif
50
52
# Microcode
51
53
52
54
ifeq ($(GRUCODE ) ,f3dex) # Fast3DEX
53
- GRUCODE_CFLAGS := -DF3DEX_GBI=1
55
+ GRUCODE_CFLAGS := -DF3DEX_GBI
54
56
GRUCODE_ASFLAGS := --defsym F3DEX_GBI_SHARED=1 --defsym F3DEX_GBI=1
55
57
TARGET := $(TARGET ) .f3dex
56
58
COMPARE := 0
57
59
else
58
60
ifeq ($(GRUCODE ) , f3dex2) # Fast3DEX2
59
- GRUCODE_CFLAGS := -DF3DEX_GBI_2=1
61
+ GRUCODE_CFLAGS := -DF3DEX_GBI_2
60
62
GRUCODE_ASFLAGS := --defsym F3DEX_GBI_SHARED=1 --defsym F3DEX_GBI_2=1
61
63
TARGET := $(TARGET ) .f3dex2
62
64
COMPARE := 0
@@ -69,7 +71,7 @@ ifeq ($(GRUCODE),f3d_new) # Fast3D 2.0H (Shindou)
69
71
else
70
72
ifeq ($(GRUCODE ) ,f3dzex) # Fast3DZEX (2.0J / Animal Forest - Dōbutsu no Mori)
71
73
$(warning Fast3DZEX is experimental. Try at your own risk.)
72
- GRUCODE_CFLAGS := -DF3DEX_GBI_2=1
74
+ GRUCODE_CFLAGS := -DF3DEX_GBI_2
73
75
GRUCODE_ASFLAGS := --defsym F3DEX_GBI_SHARED=1 --defsym F3DZEX_GBI=1
74
76
TARGET := $(TARGET ) .f3dzex
75
77
COMPARE := 0
@@ -78,13 +80,12 @@ endif
78
80
endif
79
81
endif
80
82
81
- ifeq ($(NON_MATCHING ) ,1)
82
- VERSION_CFLAGS := $(VERSION_CFLAGS ) -DNON_MATCHING=1
83
- COMPARE := 0
83
+ ifeq ($(TARGET_N64 ) ,0)
84
+ NON_MATCHING := 1
84
85
endif
85
86
86
- ifeq ($(ENDIAN_IND ) ,1)
87
- VERSION_CFLAGS := $(VERSION_CFLAGS ) -DENDIAN_IND=1
87
+ ifeq ($(NON_MATCHING ) ,1)
88
+ VERSION_CFLAGS := $(VERSION_CFLAGS ) -DNON_MATCHING -DAVOID_UB
88
89
COMPARE := 0
89
90
endif
90
91
@@ -132,8 +133,8 @@ ACTOR_DIR := actors
132
133
LEVEL_DIRS := $(patsubst levels/% ,% ,$(dir $(wildcard levels/* /header.h) ) )
133
134
134
135
# Directories containing source files
135
- SRC_DIRS := src src/engine src/game src/audio src/menu src/buffers actors levels text bin data assets
136
- ASM_DIRS := asm lib sound
136
+ SRC_DIRS := src src/engine src/game src/audio src/menu src/buffers actors levels bin data assets
137
+ ASM_DIRS := asm lib
137
138
BIN_DIRS := bin bin/$(VERSION )
138
139
139
140
ULTRA_SRC_DIRS := lib/src lib/src/math
@@ -191,10 +192,10 @@ GODDARD_O_FILES := $(foreach file,$(GODDARD_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
191
192
# Automatic dependency files
192
193
DEP_FILES := $(O_FILES:.o=.d ) $(ULTRA_O_FILES:.o=.d ) $(GODDARD_O_FILES:.o=.d ) $(BUILD_DIR ) /$(LD_SCRIPT ) .d
193
194
194
- # Files with NON_MATCHING ifdefs
195
- NON_MATCHING_C_FILES != grep -rl NON_MATCHING $(wildcard src/audio/*.c) $(wildcard src/game/*.c)
196
- NON_MATCHING_O_FILES = $(foreach file,$(NON_MATCHING_C_FILES ) ,$(BUILD_DIR ) /$(file:.c=.o ) )
197
- NON_MATCHING_DEP = $(BUILD_DIR ) /src/audio/non_matching_dep
195
+ # Files with GLOBAL_ASM blocks
196
+ GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $(wildcard src/audio/*.c) $(wildcard src/game/*.c)
197
+ GLOBAL_ASM_O_FILES = $(foreach file,$(GLOBAL_ASM_C_FILES ) ,$(BUILD_DIR ) /$(file:.c=.o ) )
198
+ GLOBAL_ASM_DEP = $(BUILD_DIR ) /src/audio/non_matching_dep
198
199
199
200
# Segment elf files
200
201
SEG_FILES := $(SEGMENT_ELF_FILES ) $(ACTOR_ELF_FILES ) $(LEVEL_ELF_FILES )
@@ -218,23 +219,29 @@ endif
218
219
219
220
AS := $(CROSS ) as
220
221
CC := $(QEMU_IRIX ) -silent -L $(IRIX_ROOT ) $(IRIX_ROOT ) /usr/bin/cc
221
- CPP := cpp -P
222
+ CPP := cpp -P -Wno-trigraphs
222
223
LD := $(CROSS ) ld
223
224
AR := $(CROSS ) ar
224
225
OBJDUMP := $(CROSS ) objdump
225
226
OBJCOPY := $(CROSS ) objcopy
226
227
PYTHON := python3
227
228
228
- INCLUDE_CFLAGS := -I include -I include/libc -I $(BUILD_DIR ) -I $(BUILD_DIR ) /include -I src -I .
229
+ ifeq ($(TARGET_N64 ) ,1)
230
+ TARGET_CFLAGS := -nostdinc -I include/libc -DTARGET_N64
231
+ CC_CFLAGS := -fno-builtin
232
+ endif
233
+
234
+ INCLUDE_CFLAGS := -I include -I $(BUILD_DIR ) -I $(BUILD_DIR ) /include -I src -I .
229
235
230
236
# Check code syntax with host compiler
231
- CC_CHECK := gcc -fsyntax-only -fsigned-char -nostdinc -fno-builtin $(INCLUDE_CFLAGS ) -std=gnu90 -Wall -Wextra -Wno-format-security -DNON_MATCHING $(VERSION_CFLAGS ) $(GRUCODE_CFLAGS ) -DTARGET_N64
237
+ CC_CHECK := gcc -fsyntax-only -fsigned-char $( CC_CFLAGS ) $( TARGET_CFLAGS ) $(INCLUDE_CFLAGS ) -std=gnu90 -Wall -Wextra -Wno-format-security -DNON_MATCHING -DAVOID_UB $(VERSION_CFLAGS ) $(GRUCODE_CFLAGS )
232
238
233
239
ASFLAGS := -march=vr4300 -mabi=32 -I include -I $(BUILD_DIR ) $(VERSION_ASFLAGS ) $(GRUCODE_ASFLAGS )
234
- CFLAGS = -Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -Xfullwarn $(OPT_FLAGS ) -signed $(INCLUDE_CFLAGS ) $(VERSION_CFLAGS ) $(MIPSISET ) $(GRUCODE_CFLAGS ) -DTARGET_N64
240
+ CFLAGS = -Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -Xfullwarn -signed $(OPT_FLAGS ) $( TARGET_CFLAGS ) $(INCLUDE_CFLAGS ) $(VERSION_CFLAGS ) $(MIPSISET ) $(GRUCODE_CFLAGS )
235
241
OBJCOPYFLAGS := --pad-to=0x800000 --gap-fill=0xFF
236
242
SYMBOL_LINKING_FLAGS := $(addprefix -R ,$(SEG_FILES ) )
237
243
LDFLAGS := -T undefined_syms.txt -T $(BUILD_DIR ) /$(LD_SCRIPT ) -Map $(BUILD_DIR ) /sm64.$(VERSION ) .map --no-check-sections $(SYMBOL_LINKING_FLAGS )
244
+ ENDIAN_BITWIDTH := $(BUILD_DIR ) /endian-and-bitwidth
238
245
239
246
ifeq ($(shell getconf LONG_BIT) , 32)
240
247
# Work around memory allocation bug in QEMU
@@ -306,21 +313,26 @@ $(BUILD_DIR)/include/text_strings.h: include/text_strings.h.in
306
313
$(BUILD_DIR ) /include/text_menu_strings.h : include/text_menu_strings.h.in
307
314
$(TEXTCONV ) charmap_menu.txt $< $@
308
315
309
- $(BUILD_DIR ) /text/% .inc.c : text/$(VERSION ) /% .c.in
310
- $(TEXTCONV ) charmap.txt $< $@
311
-
312
316
ifeq ($(VERSION ) ,eu)
313
- SRC_DIRS += text/de text/en text/fr
317
+ TEXT_DIRS := text/de text/us text/fr
318
+
314
319
# EU encoded text inserted into individual segment 0x19 files
315
- $(BUILD_DIR ) /bin/$(VERSION ) /translation_de.o : $(BUILD_DIR ) /text/de/dialog.inc.c $(BUILD_DIR ) /text/de/level.inc.c $(BUILD_DIR ) /text/de/star.inc.c
316
- $(BUILD_DIR ) /bin/$(VERSION ) /translation_en.o : $(BUILD_DIR ) /text/en/dialog.inc.c $(BUILD_DIR ) /text/en/level.inc.c $(BUILD_DIR ) /text/en/star.inc.c
317
- $(BUILD_DIR ) /bin/$(VERSION ) /translation_fr.o : $(BUILD_DIR ) /text/fr/dialog.inc.c $(BUILD_DIR ) /text/fr/level.inc.c $(BUILD_DIR ) /text/fr/star.inc.c
320
+ $(BUILD_DIR ) /bin/eu/translation_en.o : $(BUILD_DIR ) /text/us/define_text.inc.c
321
+ $(BUILD_DIR ) /bin/eu/translation_de.o : $(BUILD_DIR ) /text/de/define_text.inc.c
322
+ $(BUILD_DIR ) /bin/eu/translation_fr.o : $(BUILD_DIR ) /text/fr/define_text.inc.c
323
+
318
324
else
325
+ TEXT_DIRS := text/$(VERSION )
326
+
319
327
# non-EU encoded text inserted into segment 0x02
320
- $(BUILD_DIR ) /bin/segment2.o : $(BUILD_DIR ) /text/debug.inc.c $( BUILD_DIR ) /text/dialog.inc.c $( BUILD_DIR ) /text/level.inc.c $( BUILD_DIR ) /text/star .inc.c
328
+ $(BUILD_DIR ) /bin/segment2.o : $(BUILD_DIR ) /text/$( VERSION ) /define_text .inc.c
321
329
endif
322
330
323
- ALL_DIRS := $(BUILD_DIR ) $(addprefix $(BUILD_DIR ) /,$(SRC_DIRS ) $(ASM_DIRS ) $(GODDARD_SRC_DIRS ) $(ULTRA_SRC_DIRS ) $(ULTRA_ASM_DIRS ) $(ULTRA_BIN_DIRS ) $(BIN_DIRS ) $(TEXTURE_DIRS ) $(SOUND_SAMPLE_DIRS ) $(addprefix levels/,$(LEVEL_DIRS ) ) include) $(MIO0_DIR ) $(addprefix $(MIO0_DIR ) /,$(VERSION ) ) $(SOUND_BIN_DIR ) $(SOUND_BIN_DIR ) /sequences/$(VERSION )
331
+ $(BUILD_DIR ) /text/% /define_text.inc.c : text/define_text.inc.c text/% /courses.h text/% /dialogs.h
332
+ $(CPP ) $(VERSION_CFLAGS ) $< -o $@ -I text/$* /
333
+ $(TEXTCONV ) charmap.txt $@ $@
334
+
335
+ ALL_DIRS := $(BUILD_DIR ) $(addprefix $(BUILD_DIR ) /,$(SRC_DIRS ) $(ASM_DIRS ) $(GODDARD_SRC_DIRS ) $(ULTRA_SRC_DIRS ) $(ULTRA_ASM_DIRS ) $(ULTRA_BIN_DIRS ) $(BIN_DIRS ) $(TEXTURE_DIRS ) $(TEXT_DIRS ) $(SOUND_SAMPLE_DIRS ) $(addprefix levels/,$(LEVEL_DIRS ) ) include) $(MIO0_DIR ) $(addprefix $(MIO0_DIR ) /,$(VERSION ) ) $(SOUND_BIN_DIR ) $(SOUND_BIN_DIR ) /sequences/$(VERSION )
324
336
325
337
# Make sure build directory exists before compiling anything
326
338
DUMMY != mkdir -p $(ALL_DIRS)
@@ -390,17 +402,24 @@ $(BUILD_DIR)/%.table: %.aiff
390
402
$(BUILD_DIR ) /% .aifc : $(BUILD_DIR ) /% .table % .aiff
391
403
$(VADPCM_ENC ) -c $^ $@
392
404
393
- $(SOUND_BIN_DIR ) /sound_data.ctl : sound/sound_banks/ $(SOUND_BANK_FILES ) $(SOUND_SAMPLE_AIFCS )
394
- $(PYTHON ) tools/assemble_sound.py $(BUILD_DIR ) /sound/samples/ sound/sound_banks/ $(SOUND_BIN_DIR ) /sound_data.ctl $(SOUND_BIN_DIR ) /sound_data.tbl $(VERSION_CFLAGS )
405
+ $(ENDIAN_BITWIDTH ) : tools/determine-endian-bitwidth.c
406
+ $(CC ) -c $(CFLAGS ) -o $@ .dummy2 $< 2> $@ .dummy1; true
407
+ grep -o ' msgbegin --endian .* --bitwidth .* msgend' $@ .dummy1 > $@ .dummy2
408
+ head -n1 < $@ .dummy2 | cut -d' ' -f2-5 > $@
409
+ @rm $@ .dummy1
410
+ @rm $@ .dummy2
411
+
412
+ $(SOUND_BIN_DIR ) /sound_data.ctl : sound/sound_banks/ $(SOUND_BANK_FILES ) $(SOUND_SAMPLE_AIFCS ) $(ENDIAN_BITWIDTH )
413
+ $(PYTHON ) tools/assemble_sound.py $(BUILD_DIR ) /sound/samples/ sound/sound_banks/ $(SOUND_BIN_DIR ) /sound_data.ctl $(SOUND_BIN_DIR ) /sound_data.tbl $(VERSION_CFLAGS ) $$(cat $(ENDIAN_BITWIDTH ) )
395
414
396
415
$(SOUND_BIN_DIR ) /sound_data.tbl : $(SOUND_BIN_DIR ) /sound_data.ctl
397
- touch $@
416
+ @true
398
417
399
- $(SOUND_BIN_DIR ) /sequences.bin : $(SOUND_BANK_FILES ) sound/sequences.json sound/sequences/ sound/sequences/$(VERSION ) / $(SOUND_SEQUENCE_FILES )
400
- $(PYTHON ) tools/assemble_sound.py --sequences $@ $(SOUND_BIN_DIR ) /bank_sets sound/sound_banks/ sound/sequences.json $(SOUND_SEQUENCE_FILES ) $(VERSION_CFLAGS )
418
+ $(SOUND_BIN_DIR ) /sequences.bin : $(SOUND_BANK_FILES ) sound/sequences.json sound/sequences/ sound/sequences/$(VERSION ) / $(SOUND_SEQUENCE_FILES ) $( ENDIAN_BITWIDTH )
419
+ $(PYTHON ) tools/assemble_sound.py --sequences $@ $(SOUND_BIN_DIR ) /bank_sets sound/sound_banks/ sound/sequences.json $(SOUND_SEQUENCE_FILES ) $(VERSION_CFLAGS ) $$( cat $( ENDIAN_BITWIDTH ) )
401
420
402
421
$(SOUND_BIN_DIR ) /bank_sets : $(SOUND_BIN_DIR ) /sequences.bin
403
- touch $@
422
+ @true
404
423
405
424
$(SOUND_BIN_DIR ) /% .m64 : $(SOUND_BIN_DIR ) /% .o
406
425
$(OBJCOPY ) -j .rodata $< -O binary $@
@@ -411,6 +430,11 @@ $(SOUND_BIN_DIR)/%.o: $(SOUND_BIN_DIR)/%.s
411
430
$(SOUND_BIN_DIR ) /% .s : $(SOUND_BIN_DIR ) /%
412
431
printf " .section .data\n\n.incbin \" $<\" \n" > $@
413
432
433
+ $(BUILD_DIR ) /levels/scripts.o : $(BUILD_DIR ) /include/level_headers.h
434
+
435
+ $(BUILD_DIR ) /include/level_headers.h : levels/level_headers.h.in
436
+ $(CPP ) -I . levels/level_headers.h.in | $(PYTHON ) tools/output_level_headers.py > $(BUILD_DIR ) /include/level_headers.h
437
+
414
438
$(BUILD_DIR ) /assets/mario_anim_data.c : $(wildcard assets/anims/* .inc.c)
415
439
$(PYTHON ) tools/mario_anims_converter.py > $@
416
440
@@ -420,7 +444,6 @@ $(BUILD_DIR)/assets/demo_data.c: assets/demo_data.json $(wildcard assets/demos/*
420
444
# Source code
421
445
$(BUILD_DIR ) /src/goddard/% .o : OPT_FLAGS := -g
422
446
$(BUILD_DIR ) /src/goddard/% .o : MIPSISET := -mips1
423
- $(NON_MATCHING_O_FILES ) : CC := $(PYTHON ) tools/asm_processor/build.py $(CC ) -- $(AS ) $(ASFLAGS ) --
424
447
$(BUILD_DIR ) /src/audio/% .o : OPT_FLAGS := -O2 -Wo,-loopunroll,0
425
448
$(BUILD_DIR ) /src/audio/load.o : OPT_FLAGS := -O2 -framepointer -Wo,-loopunroll,0
426
449
$(BUILD_DIR ) /lib/src/% .o : OPT_FLAGS :=
@@ -438,16 +461,20 @@ $(BUILD_DIR)/lib/src/_Ldtob.o: OPT_FLAGS := -O3
438
461
$(BUILD_DIR ) /lib/src/_Printf.o : OPT_FLAGS := -O3
439
462
endif
440
463
441
- # Rebuild files with '#ifdef NON_MATCHING' when that macro changes.
442
- $(NON_MATCHING_O_FILES ) : $(NON_MATCHING_DEP ) .$(NON_MATCHING )
443
- $(NON_MATCHING_DEP ) .$(NON_MATCHING ) :
444
- @rm -f $(NON_MATCHING_DEP ) .*
464
+ ifeq ($(NON_MATCHING ) ,0)
465
+ $(GLOBAL_ASM_O_FILES ) : CC := $(PYTHON ) tools/asm_processor/build.py $(CC ) -- $(AS ) $(ASFLAGS ) --
466
+ endif
467
+
468
+ # Rebuild files with 'GLOBAL_ASM' if the NON_MATCHING flag changes.
469
+ $(GLOBAL_ASM_O_FILES ) : $(GLOBAL_ASM_DEP ) .$(NON_MATCHING )
470
+ $(GLOBAL_ASM_DEP ) .$(NON_MATCHING ) :
471
+ @rm -f $(GLOBAL_ASM_DEP ) .*
445
472
touch $@
446
473
447
474
$(BUILD_DIR ) /lib/src/math/% .o : lib/src/math/% .c
448
475
@$(CC_CHECK ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /lib/src/math/$* .d $<
449
476
$(CC ) -c $(CFLAGS ) -o $@ $<
450
- tools/patch_libultra_math $@ || rm $@
477
+ tools/patch_libultra_math $@
451
478
452
479
$(BUILD_DIR ) /% .o : % .c
453
480
@$(CC_CHECK ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /$* .d $<
@@ -462,7 +489,7 @@ $(BUILD_DIR)/%.o: %.s
462
489
$(AS ) $(ASFLAGS ) -MD $(BUILD_DIR ) /$* .d -o $@ $<
463
490
464
491
$(BUILD_DIR ) /$(LD_SCRIPT ) : $(LD_SCRIPT )
465
- $(CPP ) $(VERSION_CFLAGS ) -MMD -MP -MT $@ -MF $@ .d -I include/ -DBUILD_DIR=$(BUILD_DIR ) -o $@ $<
492
+ $(CPP ) $(VERSION_CFLAGS ) -MMD -MP -MT $@ -MF $@ .d -I include/ -I . - DBUILD_DIR=$(BUILD_DIR ) -o $@ $<
466
493
467
494
$(BUILD_DIR ) /libultra.a : $(ULTRA_O_FILES )
468
495
$(AR ) rcs -o $@ $(ULTRA_O_FILES )
@@ -483,7 +510,7 @@ $(BUILD_DIR)/$(TARGET).objdump: $(ELF)
483
510
484
511
485
512
.PHONY : all clean distclean default diff test load libultra
486
- .PRECIOUS : $(BUILD_DIR ) /bin/% .elf $(SOUND_BIN_DIR ) /% .ctl $(SOUND_BIN_DIR ) /% .tbl $(SOUND_SAMPLE_TABLES ) $(SOUND_BIN_DIR ) /% .s $(BUILD_DIR ) /%
513
+ .PRECIOUS : $(BUILD_DIR ) /bin/% .elf $(SOUND_BIN_DIR ) /% .ctl $(SOUND_BIN_DIR ) /% .tbl $(SOUND_SAMPLE_TABLES ) $(SOUND_BIN_DIR ) /% .s $(BUILD_DIR ) /%
487
514
.DELETE_ON_ERROR :
488
515
489
516
# Remove built-in rules, to improve performance
0 commit comments