diff --git a/Makefile b/Makefile index 7f1d1159d8..30a272dca6 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ KEEP_MDEBUG ?= 0 FULL_DISASM ?= 0 # Check code syntax with host compiler RUN_CC_CHECK ?= 1 +CC_CHECK_COMP ?= gcc # Dump build object files OBJDUMP_BUILD ?= 0 # Force asm processor to run on every file @@ -119,13 +120,6 @@ NM := $(MIPS_BINUTILS_PREFIX)nm OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump -ASM_PROC := $(PYTHON) tools/asm-processor/build.py -ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=global-with-filename --encode-cutscene-data-floats - -ifneq ($(ASM_PROC_FORCE), 0) - ASM_PROC_FLAGS += --force -endif - IINC := -Iinclude -Isrc -Iassets -I$(BUILD_DIR) -I. ifeq ($(KEEP_MDEBUG),0) @@ -135,14 +129,18 @@ else endif # Check code syntax with host compiler -ifneq ($(RUN_CC_CHECK),0) - CHECK_WARNINGS := -Wall -Wextra -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-unused-but-set-variable -Wno-unused-label -Wno-sign-compare -Wno-tautological-compare - CC_CHECK := gcc -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -D _LANGUAGE_C -D NON_MATCHING $(IINC) -nostdinc $(CHECK_WARNINGS) - ifneq ($(WERROR), 0) - CC_CHECK += -Werror - endif -else - CC_CHECK := @: +CC_CHECK_WARNINGS := -Wall -Wextra -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-unused-but-set-variable -Wno-unused-label -Wno-sign-compare -Wno-tautological-compare +# Have CC_CHECK pretend to be a MIPS compiler +MIPS_BUILTIN_DEFS := -DMIPSEB -D_MIPS_FPSET=16 -D_MIPS_ISA=2 -D_ABIO32=1 -D_MIPS_SIM=_ABIO32 -D_MIPS_SZINT=32 -D_MIPS_SZPTR=32 +# The -MMD flags additionaly creates a .d file with the same name as the .o file. +CC_CHECK_FLAGS := -MMD -MP -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -m32 -DNON_MATCHING -DAVOID_UB -DCC_CHECK=1 + +ifneq ($(WERROR), 0) + CC_CHECK_WARNINGS += -Werror +endif + +ifeq ($(RUN_CC_CHECK),0) + CC_CHECK_COMP := @: endif CPP := cpp @@ -153,20 +151,31 @@ FADO := tools/fado/fado.elf MAKEYAR := $(PYTHON) tools/buildtools/makeyar.py CHECKSUMMER := $(PYTHON) tools/buildtools/checksummer.py SHIFTJIS_CONV := $(PYTHON) tools/buildtools/shiftjis_conv.py -SCHC := $(PYTHON) tools/buildtools/schc.py +ASM_PROC := $(PYTHON) tools/asm-processor/build.py +ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=global-with-filename --encode-cutscene-data-floats +ifneq ($(ASM_PROC_FORCE), 0) + ASM_PROC_FLAGS += --force +endif + +SCHC := $(PYTHON) tools/buildtools/schc.py SCHC_FLAGS := # Command to replace path variables in the spec file. We can't use the C # preprocessor for this because it won't substitute inside string literals. SPEC_REPLACE_VARS := sed -e 's|$$(BUILD_DIR)|$(BUILD_DIR)|g' -OPTFLAGS := -O2 -g3 -ASFLAGS := -march=vr4300 -32 -Iinclude -MIPS_VERSION := -mips2 +CFLAGS += -G 0 -non_shared -Xcpluscomm -nostdinc -Wab,-r4300_mul -# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Suppress the warnings with -woff. -CFLAGS += -G 0 -non_shared -fullwarn -verbose -Xcpluscomm $(IINC) -nostdinc -Wab,-r4300_mul -woff 649,838,712,516 +WARNINGS := -fullwarn -verbose -woff 624,649,838,712,516,513,596,564,594 +ASFLAGS := -march=vr4300 -32 -G0 +COMMON_DEFINES := -D_MIPS_SZLONG=32 +AS_DEFINES := $(COMMON_DEFINES) -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_ULTRA64 +C_DEFINES := $(COMMON_DEFINES) -DLANGUAGE_C -D_LANGUAGE_C +ENDIAN := -EB + +OPTFLAGS := -O2 -g3 +MIPS_VERSION := -mips2 # Use relocations and abi fpr names in the dump OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32 @@ -182,9 +191,6 @@ endif ifeq ($(shell getconf LONG_BIT), 32) # Work around memory allocation bug in QEMU export QEMU_GUEST_BASE := 1 -else ifneq ($(RUN_CC_CHECK),0) - # Ensure that gcc treats the code as 32-bit - CC_CHECK += -m32 endif @@ -210,6 +216,7 @@ ASSET_BIN_DIRS := $(shell find assets/* -type d -not -path "assets/xml*" -not -p # Prevents building C files that will be #include'd ASSET_BIN_DIRS_C_FILES := $(shell find assets/* -type d -not -path "assets/xml*" -not -path "assets/code*" -not -path "assets/overlays*") + ASSET_FILES_BIN := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.bin)) ASSET_FILES_OUT := $(foreach f,$(ASSET_FILES_BIN:.bin=.bin.inc.c),$(BUILD_DIR)/$f) @@ -218,19 +225,19 @@ TEXTURE_FILES_JPG := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.jpg)) TEXTURE_FILES_OUT := $(foreach f,$(TEXTURE_FILES_PNG:.png=.inc.c),$(BUILD_DIR)/$f) \ $(foreach f,$(TEXTURE_FILES_JPG:.jpg=.jpg.inc.c),$(BUILD_DIR)/$f) \ -C_FILES := $(foreach dir,$(SRC_DIRS) $(ASSET_BIN_DIRS_C_FILES),$(wildcard $(dir)/*.c)) -S_FILES := $(shell grep -F "\$$(BUILD_DIR)/asm" spec | sed 's/.*$$(BUILD_DIR)\/// ; s/\.o\".*/.s/') \ - $(shell grep -F "\$$(BUILD_DIR)/data" spec | sed 's/.*$$(BUILD_DIR)\/// ; s/\.o\".*/.s/') -SCHEDULE_FILES:= $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.schl)) -BASEROM_FILES := $(shell grep -F "\$$(BUILD_DIR)/baserom" spec | sed 's/.*$$(BUILD_DIR)\/// ; s/\.o\".*//') -ARCHIVES_O := $(shell grep -F ".yar.o" spec | sed 's/.*include "// ; s/.*$$(BUILD_DIR)\/// ; s/\.o\".*/.o/') -O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \ - $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \ - $(foreach f,$(BASEROM_FILES),$(BUILD_DIR)/$f.o) \ - $(foreach f,$(ARCHIVES_O),$(BUILD_DIR)/$f) +C_FILES := $(foreach dir,$(SRC_DIRS) $(ASSET_BIN_DIRS_C_FILES),$(wildcard $(dir)/*.c)) +S_FILES := $(shell grep -F "\$$(BUILD_DIR)/asm" spec | sed 's/.*$$(BUILD_DIR)\/// ; s/\.o\".*/.s/') \ + $(shell grep -F "\$$(BUILD_DIR)/data" spec | sed 's/.*$$(BUILD_DIR)\/// ; s/\.o\".*/.s/') +SCHEDULE_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.schl)) +BASEROM_FILES := $(shell grep -F "\$$(BUILD_DIR)/baserom" spec | sed 's/.*$$(BUILD_DIR)\/// ; s/\.o\".*//') +ARCHIVES_O := $(shell grep -F ".yar.o" spec | sed 's/.*include "// ; s/.*$$(BUILD_DIR)\/// ; s/\.o\".*/.o/') +O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \ + $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \ + $(foreach f,$(BASEROM_FILES),$(BUILD_DIR)/$f.o) \ + $(foreach f,$(ARCHIVES_O),$(BUILD_DIR)/$f) -SHIFTJIS_C_FILES := src/libultra/voice/voicecheckword.c src/audio/voice_external.c src/code/z_message.c src/code/z_message_nes.c -SHIFTJIS_O_FILES := $(foreach f,$(SHIFTJIS_C_FILES:.c=.o),$(BUILD_DIR)/$f) +SHIFTJIS_C_FILES := src/libultra/voice/voicecheckword.c src/audio/voice_external.c src/code/z_message.c src/code/z_message_nes.c +SHIFTJIS_O_FILES := $(foreach f,$(SHIFTJIS_C_FILES:.c=.o),$(BUILD_DIR)/$f) OVL_RELOC_FILES := $(shell $(CPP) $(CPPFLAGS) $(SPEC) | $(SPEC_REPLACE_VARS) | grep -o '[^"]*_reloc.o' ) @@ -240,9 +247,10 @@ SCHEDULE_INC_FILES := $(foreach f,$(SCHEDULE_FILES:.schl=.schl.inc),$(BUILD_DIR) # (Only asm_processor dependencies and reloc dependencies are handled for now) DEP_FILES := $(O_FILES:.o=.asmproc.d) $(OVL_RELOC_FILES:.o=.d) -# create build directories -OTHER_DIRS := baserom linker_scripts +# Other directories that need to be created in the build directory +OTHER_DIRS := baserom dmadata linker_scripts +# create build directories $(shell mkdir -p $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_BIN_DIRS) $(ASSET_BIN_DIRS_C_FILES) $(OTHER_DIRS),$(BUILD_DIR)/$(dir))) # directory flags @@ -286,7 +294,6 @@ $(BUILD_DIR)/src/code/osFlash.o: MIPS_VERSION := -mips1 $(BUILD_DIR)/src/libultra/%.o: CC := $(CC_OLD) $(BUILD_DIR)/src/boot/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- -$(BUILD_DIR)/src/boot/O2/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- $(BUILD_DIR)/src/code/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- $(BUILD_DIR)/src/audio/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- @@ -296,7 +303,7 @@ $(BUILD_DIR)/src/overlays/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS $(BUILD_DIR)/assets/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- -$(SHIFTJIS_O_FILES): CC_CHECK += -Wno-multichar -Wno-type-limits -Wno-overflow +$(SHIFTJIS_O_FILES): CC_CHECK_WARNINGS += -Wno-multichar -Wno-type-limits -Wno-overflow #### Main Targets ### @@ -317,8 +324,8 @@ $(ROM): $(ELF) $(OBJCOPY) --gap-fill=0x00 -O binary $< $@ $(CHECKSUMMER) $@ -$(ROMC): $(ROM) $(ELF) $(BUILD_DIR)/compress_ranges.txt - $(PYTHON) tools/buildtools/compress.py --in $(ROM) --out $@ --dma-start `tools/buildtools/dmadata_start.sh $(NM) $(ELF)` --compress `cat $(BUILD_DIR)/compress_ranges.txt` --threads $(N_THREADS) +$(ROMC): $(ROM) $(ELF) $(BUILD_DIR)/dmadata/compress_ranges.txt + $(PYTHON) tools/buildtools/compress.py --in $(ROM) --out $@ --dma-start `tools/buildtools/dmadata_start.sh $(NM) $(ELF)` --compress `cat $(BUILD_DIR)/dmadata/compress_ranges.txt` --threads $(N_THREADS) $(PYTHON) -m ipl3checksum sum --cic 6105 --update $@ $(ELF): $(TEXTURE_FILES_OUT) $(ASSET_FILES_OUT) $(O_FILES) $(OVL_RELOC_FILES) $(LDSCRIPT) $(BUILD_DIR)/linker_scripts/undefined_syms.ld $(BUILD_DIR)/linker_scripts/extra.ld @@ -357,7 +364,7 @@ distclean: assetclean clean $(MAKE) -C tools clean venv: - test -d $(VENV) || python3 -m venv $(VENV) + test -d $(VENV) || python3 -m venv $(VENV) || { rm -rf $(VENV); false; } $(PYTHON) -m pip install -U pip $(PYTHON) -m pip install -U -r requirements.txt @@ -403,7 +410,7 @@ all: rom compress #### Various Recipes #### $(BUILD_DIR)/%.ld: %.ld - $(CPP) $(CPPFLAGS) $< > $@ + $(CPP) $(CPPFLAGS) $(IINC) $< > $@ $(BUILD_DIR)/$(SPEC): $(SPEC) $(CPP) $(CPPFLAGS) $< | $(SPEC_REPLACE_VARS) > $@ @@ -411,18 +418,18 @@ $(BUILD_DIR)/$(SPEC): $(SPEC) $(LDSCRIPT): $(BUILD_DIR)/$(SPEC) $(MKLDSCRIPT) $< $@ -$(BUILD_DIR)/dmadata_table_spec.h $(BUILD_DIR)/compress_ranges.txt: $(BUILD_DIR)/$(SPEC) - $(MKDMADATA) $< $(BUILD_DIR)/dmadata_table_spec.h $(BUILD_DIR)/compress_ranges.txt +$(BUILD_DIR)/dmadata/dmadata_table_spec.h $(BUILD_DIR)/dmadata/compress_ranges.txt &: $(BUILD_DIR)/$(SPEC) + $(MKDMADATA) $< $(BUILD_DIR)/dmadata/dmadata_table_spec.h $(BUILD_DIR)/dmadata/compress_ranges.txt # Dependencies for files that may include the dmadata header automatically generated from the spec file -$(BUILD_DIR)/src/boot/z_std_dma.o: $(BUILD_DIR)/dmadata_table_spec.h -$(BUILD_DIR)/src/dmadata/dmadata.o: $(BUILD_DIR)/dmadata_table_spec.h +$(BUILD_DIR)/src/boot/z_std_dma.o: $(BUILD_DIR)/dmadata/dmadata_table_spec.h +$(BUILD_DIR)/src/dmadata/dmadata.o: $(BUILD_DIR)/dmadata/dmadata_table_spec.h -$(BUILD_DIR)/asm/%.o: asm/%.s - $(CPP) $(CPPFLAGS) -Iinclude $< | $(AS) $(ASFLAGS) -o $@ +$(BUILD_DIR)/%.o: %.s + $(CPP) $(CPPFLAGS) $(IINC) $< | $(AS) $(ASFLAGS) $(IINC) $(ENDIAN) -o $@ $(BUILD_DIR)/assets/%.o: assets/%.c - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC) -c $(CFLAGS) $(IINC) $(WARNINGS) $(C_DEFINES) $(MIPS_VERSION) $(ENDIAN) $(OPTFLAGS) -o $@ $< $(OBJCOPY_BIN) $(RM_MDEBUG) @@ -433,56 +440,47 @@ $(BUILD_DIR)/%.yar.o: $(BUILD_DIR)/%.o $(BUILD_DIR)/baserom/%.o: $(EXTRACTED_DIR)/baserom/% $(OBJCOPY) -I binary -O elf32-big $< $@ -$(BUILD_DIR)/data/%.o: data/%.s - $(AS) $(ASFLAGS) $< -o $@ - $(BUILD_DIR)/assets/text/message_data.enc.h: assets/text/message_data.h - python3 tools/msg/nes/msgencNES.py -o $@ $< + $(PYTHON) tools/msg/nes/msgencNES.py -o $@ $< $(BUILD_DIR)/assets/text/staff_message_data.enc.h: assets/text/staff_message_data.h - python3 tools/msg/staff/msgencStaff.py -o $@ $< + $(PYTHON) tools/msg/staff/msgencStaff.py -o $@ $< $(BUILD_DIR)/assets/text/message_data_static.o: $(BUILD_DIR)/assets/text/message_data.enc.h $(BUILD_DIR)/assets/text/staff_message_data_static.o: $(BUILD_DIR)/assets/text/staff_message_data.enc.h $(BUILD_DIR)/src/code/z_message.o: $(BUILD_DIR)/assets/text/message_data.enc.h $(BUILD_DIR)/assets/text/staff_message_data.enc.h +$(BUILD_DIR)/src/overlays/%_reloc.o: $(BUILD_DIR)/$(SPEC) + $(FADO) $$(tools/buildtools/reloc_prereq $< $(*F)) -n $(*F) -o $(@:.o=.s) -M $(@:.o=.d) + $(AS) $(ASFLAGS) $(ENDIAN) $(IINC) $(@:.o=.s) -o $@ + $(SHIFTJIS_O_FILES): $(BUILD_DIR)/src/%.o: src/%.c $(SHIFTJIS_CONV) -o $(@:.o=.enc.c) $< - $(CC_CHECK) $(@:.o=.enc.c) - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $(@:.o=.enc.c) - $(OBJDUMP_CMD) - $(RM_MDEBUG) - -$(BUILD_DIR)/src/overlays/%.o: src/overlays/%.c - $(CC_CHECK) $< - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< - $(OBJDUMP_CMD) - $(RM_MDEBUG) - -$(BUILD_DIR)/src/overlays/%_reloc.o: $(BUILD_DIR)/$(SPEC) - $(FADO) $$(tools/buildtools/reloc_prereq $< $(notdir $*)) -n $(notdir $*) -o $(@:.o=.s) -M $(@:.o=.d) - $(AS) $(ASFLAGS) $(@:.o=.s) -o $@ - -$(BUILD_DIR)/src/%.o: src/%.c - $(CC_CHECK) $< - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK_COMP) $(CC_CHECK_FLAGS) $(IINC) $(CC_CHECK_WARNINGS) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $(@:.o=.enc.c) + $(CC) -c $(CFLAGS) $(IINC) $(WARNINGS) $(C_DEFINES) $(MIPS_VERSION) $(ENDIAN) $(OPTFLAGS) -o $@ $(@:.o=.enc.c) $(OBJDUMP_CMD) $(RM_MDEBUG) $(BUILD_DIR)/src/libultra/libc/ll.o: src/libultra/libc/ll.c - $(CC_CHECK) $< - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK_COMP) $(CC_CHECK_FLAGS) $(IINC) $(CC_CHECK_WARNINGS) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $< + $(CC) -c $(CFLAGS) $(IINC) $(WARNINGS) $(C_DEFINES) $(MIPS_VERSION) $(ENDIAN) $(OPTFLAGS) -o $@ $< $(PYTHON) tools/set_o32abi_bit.py $@ $(OBJDUMP_CMD) $(RM_MDEBUG) $(BUILD_DIR)/src/libultra/libc/llcvt.o: src/libultra/libc/llcvt.c - $(CC_CHECK) $< - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK_COMP) $(CC_CHECK_FLAGS) $(IINC) $(CC_CHECK_WARNINGS) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $< + $(CC) -c $(CFLAGS) $(IINC) $(WARNINGS) $(C_DEFINES) $(MIPS_VERSION) $(ENDIAN) $(OPTFLAGS) -o $@ $< $(PYTHON) tools/set_o32abi_bit.py $@ $(OBJDUMP_CMD) $(RM_MDEBUG) +$(BUILD_DIR)/%.o: %.c + $(CC_CHECK_COMP) $(CC_CHECK_FLAGS) $(IINC) $(CC_CHECK_WARNINGS) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $< + $(CC) -c $(CFLAGS) $(IINC) $(WARNINGS) $(C_DEFINES) $(MIPS_VERSION) $(ENDIAN) $(OPTFLAGS) -o $@ $< + $(OBJDUMP_CMD) + $(RM_MDEBUG) + # Build C files from assets $(BUILD_DIR)/%.inc.c: %.png diff --git a/include/tables/dmadata_table.h b/include/tables/dmadata_table.h index a5ad2a21f0..31d97ecb63 100644 --- a/include/tables/dmadata_table.h +++ b/include/tables/dmadata_table.h @@ -3,7 +3,7 @@ */ #ifdef NON_MATCHING // For non-matching builds, dmadata is generated from the specfile segments -#include "dmadata_table_spec.h" +#include "dmadata/dmadata_table_spec.h" #else #include "dmadata/dmadata_table_us.h" #endif