Files
af/Makefile
T
emilybrooks 93fa8a0e9e Implement asset extraction (#131)
* got stuff to extract properly

* je and bs extensions done

* got symbols named correctly

* extensions done, symbol naming done

* fixed some errors

* fixed more of them

* stuff

* started editing make file

* makefile works

* ci4 and palette extensions done

* cleaned up ckf_je extension

* fixed vertex problem

* cleaned up asset yaml

* cleaned up extensions

* added tol_cracker_1

* builds properly

* finished obj_s_yamishop and obj_w_yamishop

* updated to work with latest splat

* fixes

* makefile asset dir

* remove old codes from af_ci4.py
2024-01-08 13:00:03 -07:00

359 lines
12 KiB
Makefile

# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'.
# It is also possible to override the settings in Defaults in a file called .make_options as 'SETTING=value'.
-include .make_options
MAKEFLAGS += --no-builtin-rules
SHELL = /bin/bash
.SHELLFLAGS = -o pipefail -c
#### Defaults ####
# If COMPARE is 1, check the output md5sum after building
COMPARE ?= 1
# If NON_MATCHING is 1, define the NON_MATCHING C flag when building
NON_MATCHING ?= 0
# if WERROR is 1, pass -Werror to CC_CHECK, so warnings would be treated as errors
WERROR ?= 0
# Keep .mdebug section in build
KEEP_MDEBUG ?= 0
# Check code syntax with host compiler
RUN_CC_CHECK ?= 1
CC_CHECK_COMP ?= gcc
# Dump build object files
OBJDUMP_BUILD ?= 0
# Number of threads to compress with
N_THREADS ?= $(shell nproc)
# Not meant to be used by normal users. Toggles some options to improve the use of the warning checker system
WARNINGS_CHECK ?= 0
# Disassembles matched functions and migrated data as well
FULL_DISASM ?= 0
# Set prefix to mips binutils binaries (mips-linux-gnu-ld => 'mips-linux-gnu-') - Change at your own risk!
# In nearly all cases, not having 'mips-linux-gnu-*' binaries on the PATH is indicative of missing dependencies
MIPS_BINUTILS_PREFIX ?= mips-linux-gnu-
VERSION ?= jp
BASEROM := baserom.$(VERSION).z64
BASEROM_UNCOMPRESSED := baserom_uncompressed.$(VERSION).z64
TARGET := animalforest
### Output ###
BUILD_DIR := build
ROM := $(BUILD_DIR)/$(TARGET)_uncompressed.$(VERSION).z64
ELF := $(BUILD_DIR)/$(TARGET).$(VERSION).elf
LD_MAP := $(BUILD_DIR)/$(TARGET).$(VERSION).map
LD_SCRIPT := linker_scripts/$(VERSION)/$(TARGET).ld
ROMC := $(BUILD_DIR)/$(TARGET).$(VERSION).z64
#### Setup ####
BUILD_DEFINES ?=
ifeq ($(VERSION),jp)
BUILD_DEFINES += -DVERSION_JP=1
else
ifeq ($(VERSION),cn)
BUILD_DEFINES += -DVERSION_CN=1 -DBBPLAYER=1
else
$(error Invalid VERSION variable detected. Please use either 'jp' or 'cn')
endif
endif
ifeq ($(NON_MATCHING),1)
BUILD_DEFINES += -DNON_MATCHING -DAVOID_UB
COMPARE := 0
endif
MAKE = make
CPPFLAGS += -fno-dollars-in-identifiers -P
LDFLAGS := --no-check-sections --accept-unknown-input-arch --emit-relocs
UNAME_S := $(shell uname -s)
ifeq ($(OS),Windows_NT)
$(error Native Windows is currently unsupported for building this repository, use WSL instead c:)
else ifeq ($(UNAME_S),Linux)
DETECTED_OS := linux
else ifeq ($(UNAME_S),Darwin)
DETECTED_OS := macos
MAKE := gmake
CPPFLAGS += -xc++
endif
#### Tools ####
ifneq ($(shell type $(MIPS_BINUTILS_PREFIX)ld >/dev/null 2>/dev/null; echo $$?), 0)
$(error Unable to find $(MIPS_BINUTILS_PREFIX)ld. Please install or build MIPS binutils, commonly mips-linux-gnu. (or set MIPS_BINUTILS_PREFIX if your MIPS binutils install uses another prefix))
endif
CC := tools/ido/$(DETECTED_OS)/7.1/cc
CC_OLD := tools/ido/$(DETECTED_OS)/5.3/cc
AS := $(MIPS_BINUTILS_PREFIX)as
LD := $(MIPS_BINUTILS_PREFIX)ld
OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy
OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump
CPP := cpp
ICONV := iconv
ASM_PROC := python3 tools/asm-processor/build.py
CAT := cat
ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=global-with-filename
SPLAT ?= python3 -m splat split
SPLAT_YAML ?= $(TARGET).$(VERSION).yaml
PIGMENT ?=tools/pigment64/pigment64
IINC := -Iinclude -Isrc -Iassets/$(VERSION) -I. -I$(BUILD_DIR)
IINC += -Ilib/ultralib/include -Ilib/ultralib/include/PR -Ilib/ultralib/include/ido
ifeq ($(KEEP_MDEBUG),0)
RM_MDEBUG = $(OBJCOPY) --remove-section .mdebug $@
else
RM_MDEBUG = @:
endif
# Check code syntax with host compiler
CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label
# 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
ifneq ($(RUN_CC_CHECK),0)
# The -MMD flags additionaly creates a .d file with the same name as the .o file.
CC_CHECK := $(CC_CHECK_COMP)
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)
CHECK_WARNINGS += -Werror
endif
else
CC_CHECK := @:
endif
CFLAGS += -G 0 -non_shared -Xcpluscomm -nostdinc -Wab,-r4300_mul
WARNINGS := -fullwarn -verbose -woff 624,649,838,712,516,513,596,564,594
ASFLAGS := -march=vr4300 -32 -G0
COMMON_DEFINES := -D_MIPS_SZLONG=32
GBI_DEFINES := -DF3DEX_GBI_2
RELEASE_DEFINES := -DNDEBUG -D_FINALROM
AS_DEFINES := -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_ULTRA64
C_DEFINES := -DLANGUAGE_C -D_LANGUAGE_C
ENDIAN := -EB
OPTFLAGS := -O2 -g3
MIPS_VERSION := -mips2
ICONV_FLAGS := --from-code=UTF-8 --to-code=EUC-JP
# Use relocations and abi fpr names in the dump
OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32 -Mno-aliases
ifneq ($(OBJDUMP_BUILD), 0)
OBJDUMP_CMD = $(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.dump.s)
OBJCOPY_BIN = $(OBJCOPY) -O binary $@ $@.bin
else
OBJDUMP_CMD = @:
OBJCOPY_BIN = @:
endif
# rom compression flags
COMPFLAGS := --threads $(N_THREADS)
ifeq ($(NON_MATCHING),0)
COMPFLAGS += --matching
endif
SPLAT_FLAGS ?=
ifneq ($(WARNINGS_CHECK), 0)
SPLAT_FLAGS += --stdout-only
endif
ifneq ($(FULL_DISASM), 0)
SPLAT_FLAGS += --disassemble-all
endif
#### Files ####
$(shell mkdir -p asm/$(VERSION) assets/$(VERSION) linker_scripts/$(VERSION)/auto)
SRC_DIRS := $(shell find src -type d)
ASM_DIRS := $(shell find asm/$(VERSION) -type d -not -path "asm/$(VERSION)/nonmatchings/*" -not -path "asm/$(VERSION)/lib/*")
ASSET_DIRS := $(shell find assets/$(VERSION) -type d)
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
S_FILES := $(foreach dir,$(ASM_DIRS) $(SRC_DIRS),$(wildcard $(dir)/*.s))
BIN_FILES := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.bin))
O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \
$(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \
$(foreach f,$(BIN_FILES:.bin=.o),$(BUILD_DIR)/$f)
ASSET_PNGS := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.png))
ASSET_BINS := $(foreach f,$(ASSET_PNGS:.png=.bin),$(BUILD_DIR)/$f)
ASSET_INC_C := $(foreach f,$(ASSET_PNGS:.png=.inc.c),$(BUILD_DIR)/$f)
LIBULTRA_DIRS := $(shell find lib/ultralib/src -type d \
-not -path "lib/ultralib/src/audio" \
-not -path "lib/ultralib/src/error" \
-not -path "lib/ultralib/src/gio" \
-not -path "lib/ultralib/src/gt" \
-not -path "lib/ultralib/src/host" \
-not -path "lib/ultralib/src/log" \
-not -path "lib/ultralib/src/rg" \
-not -path "lib/ultralib/src/rmon" \
-not -path "lib/ultralib/src/sched" \
-not -path "lib/ultralib/src/voice")
LIBULTRA_C := $(foreach dir,$(LIBULTRA_DIRS),$(wildcard $(dir)/*.c))
LIBULTRA_S := $(foreach dir,$(LIBULTRA_DIRS),$(wildcard $(dir)/*.s))
LIBULTRA_O := $(foreach f,$(LIBULTRA_C:.c=.o),$(BUILD_DIR)/$f) \
$(foreach f,$(LIBULTRA_S:.s=.o),$(BUILD_DIR)/$f)
# Automatic dependency files
DEP_FILES := $(O_FILES:.o=.d) \
$(O_FILES:.o=.asmproc.d)
# create build directories
$(shell mkdir -p $(BUILD_DIR)/linker_scripts/$(VERSION) $(BUILD_DIR)/linker_scripts/$(VERSION)/auto $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_DIRS),$(BUILD_DIR)/$(dir)))
# directory flags
build/src/boot/O2/%.o: OPTFLAGS := -O2
build/src/boot/libc/%.o: OPTFLAGS := -O2
build/src/boot/libc64/%.o: OPTFLAGS := -O2
build/src/boot/libm/%.o: OPTFLAGS := -O2
build/src/boot/libu64/%.o: OPTFLAGS := -O2
# per-file flags
build/src/boot/fault.o: CFLAGS += -trapuv
build/src/boot/fault_drawer.o: CFLAGS += -trapuv
# cc & asm-processor
build/src/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) --
#### Main Targets ###
all: uncompressed compressed
uncompressed: $(ROM)
ifneq ($(COMPARE),0)
@md5sum $(ROM)
@md5sum -c $(TARGET)_uncompressed.$(VERSION).md5
endif
compressed: $(ROMC)
ifneq ($(COMPARE),0)
@md5sum $(ROMC)
@md5sum -c $(TARGET).$(VERSION).md5
endif
clean:
$(RM) -r $(BUILD_DIR)/asm $(BUILD_DIR)/assets $(BUILD_DIR)/src $(ROM) $(ROMC) $(ELF)
libclean:
$(MAKE) -C lib clean
distclean: clean
$(RM) -r $(BUILD_DIR) asm/ assets/ .splat/
$(RM) -r linker_scripts/$(VERSION)/auto $(LD_SCRIPT)
$(MAKE) -C tools distclean
$(MAKE) -C lib distclean
setup:
$(MAKE) -C tools WARNINGS_CHECK=$(WARNINGS_CHECK)
python3 tools/decompress_baserom.py
extract:
$(RM) -r asm/$(VERSION) assets/$(VERSION)
$(CAT) yamls/$(VERSION)/header.yaml yamls/$(VERSION)/makerom.yaml yamls/$(VERSION)/boot.yaml yamls/$(VERSION)/code.yaml yamls/$(VERSION)/overlays.yaml yamls/$(VERSION)/assets.yaml > $(SPLAT_YAML)
$(SPLAT) $(SPLAT_FLAGS) $(SPLAT_YAML)
lib:
$(MAKE) -C lib
diff-init: uncompressed
$(RM) -rf expected/
mkdir -p expected/
cp -r $(BUILD_DIR) expected/$(BUILD_DIR)
init:
$(MAKE) distclean
$(MAKE) setup
$(MAKE) lib
$(MAKE) extract
$(MAKE) all
$(MAKE) diff-init
.PHONY: all compressed uncompressed clean libclean distclean setup extract lib diff-init init
.DEFAULT_GOAL := uncompressed
# Prevent removing intermediate files
.SECONDARY:
#### Various Recipes ####
$(ROM): $(ELF)
$(OBJCOPY) -O binary --pad-to=0x1914000 --gap-fill=0x00 $< $@
# TODO: update rom header checksum
$(ROMC): $(ROM)
python3 tools/z64compress_wrapper.py $(COMPFLAGS) $< $@ $(ELF) $(SPLAT_YAML)
# TODO: avoid using auto/undefined
$(ELF): $(LIBULTRA_O) $(O_FILES) $(LD_SCRIPT) $(BUILD_DIR)/linker_scripts/$(VERSION)/hardware_regs.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/undefined_syms.ld $(BUILD_DIR)/linker_scripts/common_undef_syms.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_syms_auto.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_funcs_auto.ld
$(LD) $(LDFLAGS) -T $(LD_SCRIPT) \
-T $(BUILD_DIR)/linker_scripts/$(VERSION)/hardware_regs.ld -T $(BUILD_DIR)/linker_scripts/$(VERSION)/undefined_syms.ld -T $(BUILD_DIR)/linker_scripts/common_undef_syms.ld \
-T $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_syms_auto.ld -T $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_funcs_auto.ld \
-Map $(LD_MAP) -o $@
$(BUILD_DIR)/%.ld: %.ld
$(CPP) $(CPPFLAGS) $(BUILD_DEFINES) $(IINC) $< > $@
$(BUILD_DIR)/%.o: %.bin
$(OBJCOPY) -I binary -O elf32-big $< $@
$(BUILD_DIR)/%.o: %.s
$(ICONV) $(ICONV_FLAGS) $< | $(AS) $(ASFLAGS) $(ENDIAN) $(IINC) -I $(dir $*) -o $@
$(OBJDUMP_CMD)
$(BUILD_DIR)/%.o: %.c
$(CC_CHECK) $(CC_CHECK_FLAGS) $(IINC) -I $(dir $*) $(CHECK_WARNINGS) $(BUILD_DEFINES) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $<
$(CC) -c $(CFLAGS) $(BUILD_DEFINES) $(IINC) $(WARNINGS) $(MIPS_VERSION) $(ENDIAN) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(C_DEFINES) $(OPTFLAGS) -o $@ $<
$(OBJDUMP_CMD)
$(RM_MDEBUG)
$(BUILD_DIR)/lib/%.o:
ifneq ($(PERMUTER), 1)
$(error Library files has not been built, please run `$(MAKE) lib` first)
endif
# Build C files from assets
$(BUILD_DIR)/%.bin: %.png
# file names are formatted as <file name>.<image format>.png
# The <image format> part is passed into pigment's format argument
$(PIGMENT) to-bin -f $(subst .,,$(suffix $*)) -o $@ $<
%.inc.c: %.bin
# The C name argument uses just the <file name> part, with .<image format>.bin removed
python3 tools/bin_inc_c.py $< $@ $(basename $(basename $(notdir $<)))
# Add these as a dependency for .o files
asset_files: $(ASSET_INC_C)
$(O_FILES): | asset_files
.PHONY: asset_files
-include $(DEP_FILES)
# Print target for debugging
print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true