@@ -20,6 +20,8 @@ ifeq ($(VERBOSE),0)
2020 V := @
2121endif
2222
23+ RECOMP_BUILD ?= 0
24+
2325# ------------------------------------------------------------------------------
2426# Toolchain
2527# ------------------------------------------------------------------------------
3638 $(error Unable to detect a suitable MIPS toolchain installed.)
3739endif
3840
41+ # Prefer clang as C preprocessor if installed on the system
42+ ifneq (,$(call find-command,clang) )
43+ CPP := clang
44+ CPPFLAGS := -E -P -x c -Wno-trigraphs -Wmissing-prototypes -Wstrict-prototypes -D_LANGUAGE_ASSEMBLY
45+ else
46+ CPP := cpp
47+ CPPFLAGS := -P -Wno-trigraphs -Wmissing-prototypes -Wstrict-prototypes -D_LANGUAGE_ASSEMBLY
48+ endif
49+
3950TOOLS_DIR = tools
4051
4152AS := $(CROSS ) as
4253LD := $(CROSS ) ld
4354OBJCOPY := $(CROSS ) objcopy
4455PYTHON := python3
45- GCC_HOST := gcc
4656GREP := grep -rl
57+ # prefer clang as host compiler if installed on the system.
58+ # this allows certain 32-bit CC_CHECK flags to work on arm hosts
59+ ifneq (,$(call find-command,clang) )
60+ CC_CHECK := clang
61+ else
62+ CC_CHECK := gcc
63+ endif
4764
4865CC := $(TOOLS_DIR ) /ido-static-recomp/build/5.3/out/cc
4966
@@ -96,6 +113,9 @@ CRC := $(TOOLS_DIR)/n64crc
96113OPT_FLAGS = -O2
97114LOOP_UNROLL =
98115
116+ ASM_PROC_FLAGS = $(OPT_FLAGS )
117+ ASM_DEFINES = -D_LANGUAGE_ASSEMBLY
118+
99119MIPSISET = -mips2 -32
100120
101121INCLUDE_CFLAGS = -I. -Isrc -Iinclude -Iinclude/libultra -Iinclude/libultra/PR -Iinclude/libultra/compiler/ido -Ibin
@@ -109,6 +129,11 @@ GLOBAL_ASM_O_FILES := $(foreach file,$(GLOBAL_ASM_C_FILES:.c=.o),$(BUILD_DIR)/$(
109129
110130DEFINES := -D_LANGUAGE_C -D_FINALROM -DWIN32 -DNDEBUG -DTARGET_N64 -DCOMPILING_LIBULTRA
111131DEFINES += -DVERSION_US
132+ DEFINES += -DBUILD_VERSION=VERSION_I
133+
134+ ifneq ($(RECOMP_BUILD ) ,0)
135+ DEFINES += -DRECOMP_BUILD
136+ endif
112137
113138VERIFY = verify
114139
@@ -118,8 +143,13 @@ CFLAGS += $(DEFINES)
118143CFLAGS += -woff 624,649,838,712,516,513,596,564,594,709,807
119144CFLAGS += $(INCLUDE_CFLAGS )
120145
146+ # -m32 has compiler treat code as 32-bit, but only works on clang and x86_64 gcc
147+ # other architectures may need to rely on clang or a cross-compiler
148+ ifeq ($(shell getconf LONG_BIT) ,64)
149+ CHECK_ARCH := -m32
150+ endif
121151CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wunused-function -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-multichar
122- CC_CHECK := $( GCC_HOST ) -fsyntax-only -fno-builtin -fsigned-char -std=gnu90 -m32 $(CHECK_WARNINGS ) $(INCLUDE_CFLAGS ) $(DEFINES )
152+ CHECK_CFLAGS := -fsyntax-only -fno-builtin -fsigned-char -std=gnu90 $( CHECK_ARCH ) $(CHECK_WARNINGS ) $(INCLUDE_CFLAGS ) $(DEFINES )
123153
124154LD_FLAGS := -T $(LD_SCRIPT )
125155LD_FLAGS += -T config/$(VERSION ) /sym/hardware_regs.ld
@@ -144,6 +174,8 @@ endif
144174# $(BUILD_DIR)/src/libultra/gu/lookathil.o: OPT_FLAGS := -O2
145175# $(BUILD_DIR)/src/libultra/os/osVirtualtoPhysical.o: OPT_FLAGS := -O1
146176# $(BUILD_DIR)/src/libultra/io/%.o: OPT_FLAGS := -O1
177+ $(BUILD_DIR ) /src/libultra/libc/ll.o : OPT_FLAGS := -O1 -g0
178+ $(BUILD_DIR ) /src/libultra/libc/ll.o : MIPSISET := -mips3 -32
147179
148180# ------------------------------------------------------------------------------
149181# Targets
@@ -165,7 +197,7 @@ no_verify: $(ROM_Z64)
165197init : $(TOOLS_DIR )
166198 $(MAKE ) clean
167199 $(MAKE ) extract
168- $(MAKE ) -j
200+ $(MAKE ) -j$( nproc )
169201
170202extract : $(TOOLS_DIR )
171203 rm -rf asm
@@ -200,20 +232,29 @@ $(ROM_ELF): $(LD_SCRIPT) $(BUILD_DIR)/$(LIBULTRA) $(O_FILES) $(LANG_RNC_O_FILES)
200232ifndef PERMUTER
201233$(GLOBAL_ASM_O_FILES ) : $(BUILD_DIR ) /% .o: % .c
202234 @printf " [$( YELLOW) syntax $( NO_COL) ] $<\n"
203- $(V )$(CC_CHECK ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /$* .d $<
235+ $(V )$(CC_CHECK ) $( CHECK_CFLAGS ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /$* .d $<
204236 @printf " [$( GREEN) ido5.3 $( NO_COL) ] $<\n"
205- $(V )$(ASM_PROCESSOR ) $(OPT_FLAGS ) $< > $(BUILD_DIR ) /$<
237+ $(V )$(ASM_PROCESSOR ) $(ASM_PROC_FLAGS ) $< > $(BUILD_DIR ) /$<
206238 $(V )$(CC ) -c $(CFLAGS ) $(OPT_FLAGS ) $(LOOP_UNROLL ) $(MIPSISET ) -o $@ $(BUILD_DIR ) /$<
207- $(V )$(ASM_PROCESSOR ) $(OPT_FLAGS ) $< --post-process $@ \
239+ $(V )$(ASM_PROCESSOR ) $(ASM_PROC_FLAGS ) $< --post-process $@ \
208240 --assembler " $( AS) $( ASFLAGS) " --asm-prelude $(ASM_PROCESSOR_DIR ) /prelude.inc
209241endif
210242
211243# non asm-processor recipe
212244$(BUILD_DIR ) /% .o : % .c
213245 @printf " [$( YELLOW) syntax $( NO_COL) ] $<\n"
214- $(V )$(CC_CHECK ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /$* .d $<
246+ $(V )$(CC_CHECK ) $(CHECK_CFLAGS ) -MMD -MP -MT $@ -MF $(BUILD_DIR ) /$* .d $<
247+ @printf " [$( GREEN) ido5.3 $( NO_COL) ] $<\n"
248+ $(V )$(CC ) -c $(CFLAGS ) $(OPT_FLAGS ) $(LOOP_UNROLL ) $(MIPSISET ) -o $@ $<
249+
250+ # Patch ll.o
251+ $(BUILD_DIR ) /src/libultra/libc/ll.o : src/libultra/libc/ll.c
252+ @printf " [$( YELLOW) syntax $( NO_COL) ] $<\n"
253+ $(V )$(CC_CHECK ) $(CHECK_CFLAGS ) -MMD -MP -MT $@ -MF $* .d $<
215254 @printf " [$( GREEN) ido5.3 $( NO_COL) ] $<\n"
216255 $(V )$(CC ) -c $(CFLAGS ) $(OPT_FLAGS ) $(LOOP_UNROLL ) $(MIPSISET ) -o $@ $<
256+ @printf " [$( CYAN) patch $( NO_COL) ] $<\n"
257+ $(V )$(PYTHON ) $(TOOLS_DIR ) /set_o32abi_bit.py $@
217258
218259$(BUILD_DIR ) /$(LIBULTRA ) : $(LIBULTRA )
219260 $(V ) mkdir -p $$(dirname $@ )
@@ -222,7 +263,7 @@ $(BUILD_DIR)/$(LIBULTRA): $(LIBULTRA)
222263
223264$(BUILD_DIR ) /% .o : % .s
224265 @printf " [$( GREEN) as $( NO_COL) ] $<\n"
225- $(V )$(AS ) $(ASFLAGS ) -o $@ $<
266+ $(V )$(CPP ) $( CPPFLAGS ) $( INCLUDE_CFLAGS ) -I $( dir $* ) $( ASM_DEFINES ) $< | $( AS ) $(ASFLAGS ) $( INCLUDE_CFLAGS ) -o $@ -
226267
227268$(BUILD_DIR ) /% .o : % .bin
228269 @printf " [$( PINK) linker $( NO_COL) ] $<\n"
0 commit comments