1- # Modified SM64 makefile
1+ # Makefile to rebuild SM64 split image
22
33# ## Default target ###
44
5- # don't touch
6- default : libultra
7- # which sm64 release of libultra to use. eu release type provides the most libultra code
8- VERSION ?= eu
5+ default : all
96
10- # If ENDIAN_IND is 1, enable non-matching code changes that try to ensure
11- # endianness independence
12- ENDIAN_IND ?= 0
7+ # ## Build Options ###
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+
12+ # Version of the game to build
13+ VERSION ?= 2.0I
14+ # If COMPARE is 1, check the output sha1sum when building 'all'
15+ COMPARE ?= 1
16+ # If NON_MATCHING is 1, define the NON_MATCHING and AVOID_UB macros when building (recommended)
17+ NON_MATCHING ?= 0
18+ # Build for the N64 (turn this off for ports)
19+ TARGET_N64 ?= 1
1320
1421# Release
15- ifeq ($(VERSION ) ,jp)
16- VERSION_CFLAGS := -DVERSION_JP=1
17- VERSION_ASFLAGS := --defsym VERSION_JP=1
18- else
19- ifeq ($(VERSION ) ,us)
20- VERSION_CFLAGS := -DVERSION_US=1
21- VERSION_ASFLAGS := --defsym VERSION_US=1
22- else
23- ifeq ($(VERSION ) ,eu)
24- VERSION_CFLAGS := -DVERSION_EU=1
25- VERSION_ASFLAGS := --defsym VERSION_EU=1
26- else
27- $(error unknown version "$(VERSION)")
28- endif
29- endif
30- endif
3122
32- ifeq ($(ENDIAN_IND ) ,1)
33- VERSION_CFLAGS := $(VERSION_CFLAGS ) -DENDIAN_IND=1
34- COMPARE := 0
35- endif
3623
3724# ############### Target Executable and Sources ###############
3825
3926# BUILD_DIR is location where all build artifacts are placed
4027BUILD_DIR_BASE := build
4128BUILD_DIR := $(BUILD_DIR_BASE ) /$(VERSION )
4229
43- LIBULTRA := $(BUILD_DIR ) /libultra.a
30+ # LIBULTRA := $(BUILD_DIR)/libultra.a
31+ # ROM := $(BUILD_DIR)/$(TARGET).z64
32+ # ELF := $(BUILD_DIR)/$(TARGET).elf
33+
4434
4535# Directories containing source files
46- ULTRA_SRC_DIRS := lib/src lib/src/math
47- ULTRA_ASM_DIRS := lib/asm lib/data
48- ULTRA_BIN_DIRS := lib/bin
36+ SRC_DIRS := src src/audio src/gt src/gu src/io src/libc src/os src/rg src/sched src/sp
37+ # ASM_DIRS := asm lib
38+ # BIN_DIRS := bin bin/$(VERSION)
39+
40+ # ULTRA_SRC_DIRS := lib/src lib/src/math
41+ # ULTRA_ASM_DIRS := lib/asm lib/data
42+ # ULTRA_BIN_DIRS := lib/bin
43+
44+ # GODDARD_SRC_DIRS := src/goddard src/goddard/dynlists
4945
5046
5147MIPSISET := -mips2 -32
52- OPT_FLAGS := -O2
5348
54- # Source code files
55- ULTRA_C_FILES := $(foreach dir,$(ULTRA_SRC_DIRS ) ,$(wildcard $(dir ) /* .c) )
56- ULTRA_S_FILES := $(foreach dir,$(ULTRA_ASM_DIRS ) ,$(wildcard $(dir ) /* .s) )
49+ OPT_FLAGS := -O1
50+
51+ C_FILES := $(foreach dir,$(SRC_DIRS ) ,$(wildcard $(dir ) /* .c) )
52+ S_FILES := $(foreach dir,$(SRC_DIRS ) ,$(wildcard $(dir ) /* .s) )
5753
5854# Object files
59- ULTRA_O_FILES := $(foreach file,$(ULTRA_S_FILES ) ,$(BUILD_DIR ) /$(file:.s =.o ) ) \
60- $(foreach file,$(ULTRA_C_FILES ) ,$(BUILD_DIR ) /$(file:.c =.o ) )
55+ O_FILES := $(foreach file,$(C_FILES ) ,$(BUILD_DIR ) /$(file:.c =.o ) ) \
56+ $(foreach file,$(S_FILES ) ,$(BUILD_DIR ) /$(file:.s =.o ) )
6157
6258# Automatic dependency files
63- DEP_FILES := $(O_FILES:.o=.d ) $( ULTRA_O_FILES:.o=.d )
59+ DEP_FILES := $(O_FILES:.o=.d )
6460
65- # Files with NON_MATCHING ifdefs
66- NON_MATCHING_C_FILES != grep -rl NON_MATCHING $(wildcard src/audio/*.c)
67- NON_MATCHING_O_FILES = $( foreach file, $( NON_MATCHING_C_FILES ) , $( BUILD_DIR ) / $( file:.c=.o ) )
68- NON_MATCHING_DEP = $( BUILD_DIR ) /src/audio/non_matching_dep
61+ ALL_DIRS := $( BUILD_DIR ) $( addprefix $( BUILD_DIR ) /, $( SRC_DIRS ) )
62+
63+ # Make sure build directory exists before compiling anything
64+ DUMMY != mkdir -p $(ALL_DIRS)
6965
7066# #################### Compiler Options #######################
71- IRIX_ROOT := tools/ido5.3_compiler
67+ IRIX_ROOT := tools/ido
7268
7369ifeq ($(shell type mips-linux-gnu-ld >/dev/null 2>/dev/null; echo $$? ) , 0)
7470 CROSS := mips-linux-gnu-
7571else
7672 CROSS := mips64-elf-
7773endif
7874
79- AS := $(CROSS ) as
80- CC := ./qemu-irix -silent -L $(IRIX_ROOT ) $(IRIX_ROOT ) /usr/bin/cc # Original compiler
75+ # check that either QEMU_IRIX is set or qemu-irix package installed
76+ ifndef QEMU_IRIX
77+ QEMU_IRIX := $(shell which qemu-irix)
78+ ifeq (, $(QEMU_IRIX))
79+ $(error Please install qemu-irix package or set QEMU_IRIX env var to the full qemu-irix binary path)
80+ endif
81+ endif
82+
83+ AS := $(QEMU_IRIX ) -silent -L $(IRIX_ROOT ) $(IRIX_ROOT ) /usr/bin/as
84+ # AS := $(CROSS)as
85+ CC := $(QEMU_IRIX ) -silent -L $(IRIX_ROOT ) $(IRIX_ROOT ) /usr/bin/cc
86+ # AR := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/ar
8187CPP := cpp -P
8288LD := $(CROSS ) ld
8389AR := $(CROSS ) ar
8490OBJDUMP := $(CROSS ) objdump
8591OBJCOPY := $(CROSS ) objcopy
8692
93+ ASM_OPT_FLAGS := -O1
94+
95+ $(BUILD_DIR ) /src/gu/% .o : OPT_FLAGS := -O3
96+ $(BUILD_DIR ) /src/gt/% .o : OPT_FLAGS := -O3
97+ $(BUILD_DIR ) /src/rg/% .o : OPT_FLAGS := -O3
98+ $(BUILD_DIR ) /src/sp/% .o : OPT_FLAGS := -O3
99+ $(BUILD_DIR ) /src/sched/% .o : OPT_FLAGS := -O3
100+ $(BUILD_DIR ) /src/audio/% .o : OPT_FLAGS := -O3
101+ $(BUILD_DIR ) /src/libc/% .o : OPT_FLAGS := -O3
102+ $(BUILD_DIR ) /src/libc/b% .o : ASM_OPT_FLAGS := -O2
103+ $(BUILD_DIR ) /src/libc/ll.o : MIPSISET := -mips3 -o32
104+ $(BUILD_DIR ) /src/libc/ll% .o : MIPSISET := -mips3 -o32
105+ $(BUILD_DIR ) /src/libc/ll.o : OPT_FLAGS := -O1
106+ $(BUILD_DIR ) /src/libc/ll% .o : OPT_FLAGS := -O1
107+ $(BUILD_DIR ) /src/os/exceptasm.o : MIPSISET := -mips3 -o32
108+
109+
110+ # ifeq ($(TARGET_N64),1)
111+ TARGET_CFLAGS := -nostdinc -I include/2.0I -I include/2.0I/PR -DTARGET_N64 -D_FINALROM -DF3DEX_GBI -DNDEBUG
112+ CC_CFLAGS := -fno-builtin
113+ # endif
114+
115+ INCLUDE_CFLAGS := -I include/2.0I -I include/2.0I/PR
116+
87117# Check code syntax with host compiler
88- CC_CHECK := gcc -fsyntax-only -fsigned-char -nostdinc -I include -I $( BUILD_DIR ) /include -std=gnu90 -Wall -Wextra -Wno-format-security -D_LANGUAGE_C $(VERSION_CFLAGS ) $(GRUCODE_CFLAGS )
89- ASFLAGS : = -march=vr4300 -mabi=32 -I include -I $( BUILD_DIR ) $(VERSION_ASFLAGS ) $(GRUCODE_ASFLAGS )
90- CFLAGS = -Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -Xfullwarn $(OPT_FLAGS ) -signed -I include -I $( BUILD_DIR ) /include -D_LANGUAGE_C $( VERSION_CFLAGS ) $(MIPSISET ) $(GRUCODE_CFLAGS )
118+ CC_CHECK := gcc -fsyntax-only $( CC_CFLAGS ) $( TARGET_CFLAGS ) $( INCLUDE_CFLAGS ) -std=gnu90 -Wall -Wextra -Wno-format-security -DNON_MATCHING -DAVOID_UB $(VERSION_CFLAGS ) $(GRUCODE_CFLAGS ) -D_LANGUAGE_C -D_MIPS_SZINT=32 -D_MIPS_SZLONG=32
119+ ASFLAGS = -v -Wab,-r4300_mul -non_shared -G 0 $( TARGET_CFLAGS ) $(INCLUDE_CFLAGS ) $(VERSION_CFLAGS ) $( MIPSISET ) $( ASM_OPT_FLAGS )
120+ CFLAGS = -Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -fullwarn $(OPT_FLAGS ) $( TARGET_CFLAGS ) $( INCLUDE_CFLAGS ) $(VERSION_CFLAGS ) $(MIPSISET )
91121OBJCOPYFLAGS := --pad-to=0x800000 --gap-fill=0xFF
122+ SYMBOL_LINKING_FLAGS := $(addprefix -R ,$(SEG_FILES ) )
123+ LDFLAGS := -T undefined_syms.txt -T $(BUILD_DIR ) /$(LD_SCRIPT ) -Map $(BUILD_DIR ) /sm64.$(VERSION ) .map --no-check-sections $(SYMBOL_LINKING_FLAGS )
124+ ENDIAN_BITWIDTH := $(BUILD_DIR ) /endian-and-bitwidth
92125
93126ifeq ($(shell getconf LONG_BIT) , 32)
94127 # Work around memory allocation bug in QEMU
@@ -100,11 +133,7 @@ endif
100133
101134# ###################### Other Tools #########################
102135
103- # N64 tools
104- TOOLS_DIR = tools
105-
106- # Make tools if out of date
107- DUMMY != make -s -C tools >&2
136+ SHA1SUM = sha1sum
108137
109138# ##################### Dependency Check #####################
110139
@@ -115,66 +144,41 @@ ifeq ($(BINUTILS_DEPEND),0)
115144$(error binutils version 2.27 required, version $(BINUTILS_VER_MAJOR).$(BINUTILS_VER_MINOR) detected)
116145endif
117146
118- ifndef QEMU_IRIX
119- $(error env variable QEMU_IRIX should point to the qemu-mips binary)
120- endif
121-
122147# ####################### Targets #############################
123148
124- all : $(ROM )
149+ # all: $(ROM)
150+ # ifeq ($(COMPARE),1)
151+ # @$(SHA1SUM) -c $(TARGET).sha1 || (echo 'The build succeeded, but did not match the official ROM. This is expected if you are making changes to the game.\nTo silence this message, use "make COMPARE=0"'. && false)
152+ # endif
125153
126154clean :
127155 $(RM ) -r $(BUILD_DIR_BASE )
128156
129- libultra : $(BUILD_DIR ) /libultra.a
130-
131- $(BUILD_DIR ) /lib/bin/ipl3_font.bin : lib/ipl3_font.png | $(BUILD_DIR )
132- $(IPLFONTUTIL ) e $< $@
133-
134- ALL_DIRS := $(BUILD_DIR ) $(addprefix $(BUILD_DIR ) /,$(SRC_DIRS ) $(ASM_DIRS ) $(ULTRA_SRC_DIRS ) $(ULTRA_ASM_DIRS ) $(ULTRA_BIN_DIRS ) $(BIN_DIRS ) $(TEXTURE_DIRS ) include)
157+ distclean :
158+ $(RM ) -r $(BUILD_DIR_BASE )
159+ ./extract_assets.py --clean
135160
136- # Make sure build directory exists before compiling anything
137- DUMMY != mkdir -p $(ALL_DIRS)
138161
139- # Source code
140- $(BUILD_DIR ) /lib/src/% .o : OPT_FLAGS :=
141- $(BUILD_DIR ) /lib/src/math/ll% .o : MIPSISET := -mips3 -32
142- $(BUILD_DIR ) /lib/src/math/% .o : OPT_FLAGS := -O2
143- $(BUILD_DIR ) /lib/src/math/ll% .o : OPT_FLAGS :=
144- $(BUILD_DIR ) /lib/src/ldiv.o : OPT_FLAGS := -O2
145- $(BUILD_DIR ) /lib/src/string.o : OPT_FLAGS := -O2
146- $(BUILD_DIR ) /lib/src/gu% .o : OPT_FLAGS := -O3
147- $(BUILD_DIR ) /lib/src/al% .o : OPT_FLAGS := -O3
148-
149- ifeq ($(VERSION ) ,eu)
150- $(BUILD_DIR ) /lib/src/_Litob.o : OPT_FLAGS := -O3
151- $(BUILD_DIR ) /lib/src/_Ldtob.o : OPT_FLAGS := -O3
152- $(BUILD_DIR ) /lib/src/_Printf.o : OPT_FLAGS := -O3
153- endif
162+ $(BUILD_DIR ) /% .o : % .c
163+ @$(CC_CHECK ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /$* .d $<
164+ $(CC ) -c $(CFLAGS ) -o $@ $<
154165
155166
156- # Rebuild files with '#ifdef NON_MATCHING' when that macro changes.
157- $(NON_MATCHING_O_FILES ) : $(NON_MATCHING_DEP ) .$(NON_MATCHING )
158- $(NON_MATCHING_DEP ) .$(NON_MATCHING ) :
159- @rm -f $(NON_MATCHING_DEP ) .*
160- touch $@
167+ $(BUILD_DIR ) /% .o : % .s
168+ $(AS ) $(ASFLAGS ) -o $@ $<
161169
162- $(BUILD_DIR ) /lib/src/math/% .o : lib/src/math/% .c
163- @$(CC_CHECK ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /lib/src/math/$* .d $<
164- $(CC ) -c $(CFLAGS ) -o $@ $<
165- tools/patch_libultra_math $@ || rm $@
170+ $(BUILD_DIR ) /libultra_rom.a : $(O_FILES )
171+ $(AR ) rcs -o $@ $(O_FILES )
166172
167- $(BUILD_DIR ) /% .o : % .c
168- @ $( CC_CHECK ) -MMD -MP -MT $@ -MF $( BUILD_DIR ) / $* .d $<
169- $( CC ) -c $( CFLAGS ) -o $@ $<
173+ # $(BUILD_DIR)/libultra.a: $(O_FILES)
174+ # $(LD) $()
175+ default : $( BUILD_DIR ) /libultra_rom.a
170176
171- $(BUILD_DIR ) /% .o : % .s $(MIO0_FILES )
172- $(AS ) $(ASFLAGS ) -MD $(BUILD_DIR ) /$* .d -o $@ $<
173177
174- $(BUILD_DIR ) /libultra.a : $(ULTRA_O_FILES )
175- $(AR ) rcs -o $@ $(ULTRA_O_FILES )
176178
177- .PHONY : all clean default diff test load libultra
179+ .PHONY : all clean distclean default diff test load libultra
180+ .PRECIOUS : $(BUILD_DIR ) /bin/% .elf $(SOUND_BIN_DIR ) /% .ctl $(SOUND_BIN_DIR ) /% .tbl $(SOUND_SAMPLE_TABLES ) $(SOUND_BIN_DIR ) /% .s $(BUILD_DIR ) /%
181+ .DELETE_ON_ERROR :
178182
179183# Remove built-in rules, to improve performance
180184MAKEFLAGS += --no-builtin-rules
0 commit comments