summaryrefslogtreecommitdiff
path: root/lib/ultralib/Makefile
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2024-02-26 07:18:26 -0800
committerGitHub <noreply@github.com>2024-02-26 08:18:26 -0700
commitc632d1d20b680081c8b1ced4877a32d50d917730 (patch)
treeb7491ee1b79939ab9c541a0b4162c38bb3372b16 /lib/ultralib/Makefile
parenta10bb11ed6784c6a16a09b7eb17657d2e1bb303c (diff)
Link libultra archive (#149)
* git subrepo pull --force lib/ultralib subrepo: subdir: "lib/ultralib" merged: "34e07ce" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "34e07ce" git-subrepo: version: "0.4.6" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "110b9eb" * Link in libultra archive * git subrepo pull (merge) lib/ultralib subrepo: subdir: "lib/ultralib" merged: "ce7b219" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "caf88de" git-subrepo: version: "0.4.6" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "110b9eb" * Update paths in lib warnings * git subrepo pull (merge) lib/ultralib subrepo: subdir: "lib/ultralib" merged: "4f49c1e" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "299d7fa" git-subrepo: version: "0.4.6" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "110b9eb" * FIXUPS
Diffstat (limited to 'lib/ultralib/Makefile')
-rw-r--r--lib/ultralib/Makefile136
1 files changed, 100 insertions, 36 deletions
diff --git a/lib/ultralib/Makefile b/lib/ultralib/Makefile
index cf87da4..a4714b6 100644
--- a/lib/ultralib/Makefile
+++ b/lib/ultralib/Makefile
@@ -1,15 +1,21 @@
-NON_MATCHING ?= 0
+COMPARE ?= 1
+FIXUPS ?= 0
+
+ifneq ($(FIXUPS),0)
+COMPARE := 0
+endif
# One of:
# libgultra_rom, libgultra_d, libgultra
# libultra_rom, libultra_d, libultra
TARGET ?= libgultra_rom
+VERSION ?= L
CROSS ?= mips-linux-gnu-
-BASE_DIR := base_$(TARGET)
-BASE_AR := $(TARGET).a
+BASE_DIR := extracted/$(VERSION)/$(TARGET)
+BASE_AR := base/$(VERSION)/$(TARGET).a
BUILD_ROOT := build
-BUILD_DIR := $(BUILD_ROOT)/$(TARGET)
+BUILD_DIR := $(BUILD_ROOT)/$(VERSION)/$(TARGET)
BUILD_AR := $(BUILD_DIR)/$(TARGET).a
WORKING_DIR := $(shell pwd)
@@ -17,6 +23,24 @@ WORKING_DIR := $(shell pwd)
CPP := cpp -P
AR := ar
+VERSION_D := 1
+VERSION_E := 2
+VERSION_F := 3
+VERSION_G := 4
+VERSION_H := 5
+VERSION_I := 6
+VERSION_J := 7
+VERSION_K := 8
+VERSION_L := 9
+
+VERSION_DEFINE := -DBUILD_VERSION=$(VERSION_$(VERSION)) -DBUILD_VERSION_STRING=\"2.0$(VERSION)\"
+
+ifeq ($(findstring _d,$(TARGET)),_d)
+DEBUGFLAG := -D_DEBUG
+else
+DEBUGFLAG := -DNDEBUG
+endif
+
ifeq ($(findstring libgultra,$(TARGET)),libgultra)
-include Makefile.gcc
else ifeq ($(findstring libultra,$(TARGET)),libultra)
@@ -25,28 +49,33 @@ else
$(error Invalid Target)
endif
-ifeq ($(findstring _d,$(TARGET)),_d)
-CPPFLAGS += -D_DEBUG
-else
-CPPFLAGS += -DNDEBUG
-endif
-
ifeq ($(findstring _rom,$(TARGET)),_rom)
CPPFLAGS += -D_FINALROM
endif
SRC_DIRS := $(shell find src -type d)
-ASM_DIRS := $(shell find asm -type d -not -path "asm/non_matchings*")
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
-S_FILES := $(foreach dir,$(SRC_DIRS) $(ASM_DIRS),$(wildcard $(dir)/*.s))
-O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \
- $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \
- $(foreach f,$(wildcard $(BASE_DIR)/*),$(BUILD_DIR)/$f)
+S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s))
+
+# Versions J and below used the C matrix math implementations
+MGU_MATRIX_FILES := mtxcatf normalize scale translate
+ifneq ($(filter $(VERSION),D E F G H I J),)
+S_FILES := $(filter-out $(addprefix src/mgu/,$(MGU_MATRIX_FILES:=.s)),$(S_FILES))
+else
+C_FILES := $(filter-out $(addprefix src/gu/,$(MGU_MATRIX_FILES:=.c)),$(C_FILES))
+endif
+
+C_O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f)
+S_O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f)
+O_FILES := $(S_O_FILES) $(C_O_FILES)
# Because we patch the object file timestamps, we can't use them as the targets since they'll always be older than the C file
# Therefore instead we use marker files that have actual timestamps as the dependencies for the archive
-MARKER_FILES := $(O_FILES:.o=.marker)
+C_MARKER_FILES := $(C_O_FILES:.o=.marker)
+S_MARKER_FILES := $(S_O_FILES:.o=.marker)
+S_MARKER_FILES := $(filter-out $(MDEBUG_FILES),$(S_MARKER_FILES))
+MARKER_FILES := $(C_MARKER_FILES) $(S_MARKER_FILES) $(MDEBUG_FILES)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
COMPARE_OBJ = cmp $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o) && echo "$(@:.marker=.o): OK"
COMPARE_AR = cmp $(BASE_AR) $@ && echo "$@: OK"
ifeq ($(COMPILER),ido)
@@ -61,22 +90,40 @@ AR_OLD := $(AR)
endif
BASE_OBJS := $(wildcard $(BASE_DIR)/*.o)
-# Try to find a file corresponding to an archive file in any of src/ asm/ or the base directory, prioritizing src then asm then the original file
-AR_ORDER = $(foreach f,$(shell $(AR) t $(BASE_AR)),$(shell find $(BUILD_DIR)/src $(BUILD_DIR)/asm $(BUILD_DIR)/$(BASE_DIR) -iname $f -type f -print -quit))
-MATCHED_OBJS = $(filter-out $(BUILD_DIR)/$(BASE_DIR)/%,$(AR_ORDER))
+
+# Check to make sure the current version has been set up
+ifneq ($(COMPARE),0)
+ifeq ($(BASE_OBJS),)
+# Ignore this check if the user is currently running setup, clean or distclean
+ifeq ($(filter $(MAKECMDGOALS),setup clean distclean),)
+$(error Current version ($(TARGET) 2.0$(VERSION)) has not been setup!)
+endif
+endif
+endif
+
+AR_OBJECTS := $(shell cat base/$(VERSION)/$(TARGET).txt)
+# If the version and target doesn't have a text file yet, resort back to using the base archive to get objects
+ifeq ($(AR_OBJECTS),)
+AR_OBJECTS := $(shell ar t $(BASE_AR))
+endif
+
+
+# Try to find a file corresponding to an archive file in src/ or the base directory, prioritizing src then the original file
+AR_ORDER = $(foreach f,$(AR_OBJECTS),$(shell find $(BUILD_DIR)/src $(BASE_DIR) -iname $f -type f -print -quit))
+MATCHED_OBJS = $(filter-out $(BASE_DIR)/%,$(AR_ORDER))
UNMATCHED_OBJS = $(filter-out $(MATCHED_OBJS),$(AR_ORDER))
NUM_OBJS = $(words $(AR_ORDER))
NUM_OBJS_MATCHED = $(words $(MATCHED_OBJS))
NUM_OBJS_UNMATCHED = $(words $(UNMATCHED_OBJS))
-$(shell mkdir -p asm $(BASE_DIR) src $(BUILD_DIR)/$(BASE_DIR) $(foreach dir,$(ASM_DIRS) $(SRC_DIRS),$(BUILD_DIR)/$(dir)))
+$(shell mkdir -p $(BASE_DIR) src $(foreach dir,$(SRC_DIRS),$(BUILD_DIR)/$(dir)))
.PHONY: all clean distclean setup
all: $(BUILD_AR)
$(BUILD_AR): $(MARKER_FILES)
$(AR_OLD) rcs $@ $(AR_ORDER)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# patch archive creation time and individual files' ownership & permissions
dd bs=1 skip=24 seek=24 count=12 conv=notrunc if=$(BASE_AR) of=$@ status=none
python3 tools/patch_ar_meta.py $@ $(BASE_AR) $(PATCH_AR_FLAGS)
@@ -85,30 +132,32 @@ ifneq ($(NON_MATCHING),1)
endif
clean:
- $(RM) -rf $(BUILD_ROOT)
+ $(RM) -rf $(BUILD_DIR)
-distclean: clean
+distclean:
$(MAKE) -C tools distclean
- $(RM) -rf $(BASE_DIR)
+ $(RM) -rf extracted/ $(BUILD_ROOT)
setup:
$(MAKE) -C tools
- cd $(BASE_DIR) && $(AR) xo ../$(BASE_AR)
+ifneq ($(COMPARE),0)
+ cd $(BASE_DIR) && $(AR) xo $(WORKING_DIR)/$(BASE_AR)
chmod -R +rw $(BASE_DIR)
ifeq ($(COMPILER),ido)
export CROSS=$(CROSS) && ./tools/strip_debug.sh $(BASE_DIR)
endif
+endif
$(BUILD_DIR)/$(BASE_DIR)/%.marker: $(BASE_DIR)/%.o
cp $< $(@:.marker=.o)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# change file timestamps to match original
@touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o)
@$(COMPARE_OBJ)
@touch $@
endif
-GBIDEFINE := -DF3DEX_GBI_2
+GBIDEFINE := -DF3DEX_GBI
$(BUILD_DIR)/src/gu/parse_gbi.marker: GBIDEFINE := -DF3D_GBI
$(BUILD_DIR)/src/gu/us2dex_emu.marker: GBIDEFINE :=
@@ -119,9 +168,9 @@ $(BUILD_DIR)/src/sp/spriteex2.marker: GBIDEFINE :=
$(BUILD_DIR)/src/voice/%.marker: OPTFLAGS += -DLANG_JAPANESE -I$(WORKING_DIR)/src -I$(WORKING_DIR)/src/voice
$(BUILD_DIR)/src/voice/%.marker: CC := tools/compile_sjis.py -D__CC=$(WORKING_DIR)/$(CC) -D__BUILD_DIR=$(BUILD_DIR)
-$(BUILD_DIR)/%.marker: %.c
+$(C_MARKER_FILES): $(BUILD_DIR)/%.marker: %.c
cd $(<D) && $(WORKING_DIR)/$(CC) $(CFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(OPTFLAGS) $(<F) $(IINC) -o $(WORKING_DIR)/$(@:.marker=.o)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# check if this file is in the archive; patch corrupted bytes and change file timestamps to match original if so
@$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) $(STRIP) && \
@@ -129,13 +178,18 @@ ifneq ($(NON_MATCHING),1)
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
+endif
+ifneq ($(FIXUPS),0)
+ tools/set_o32abi_bit.py $(WORKING_DIR)/$(@:.marker=.o)
+ $(CROSS)strip $(WORKING_DIR)/$(@:.marker=.o) -N asdasdasdasd
+ $(CROSS)objcopy --remove-section .mdebug $(WORKING_DIR)/$(@:.marker=.o)
+endif
# create or update the marker file
@touch $@
-endif
-$(BUILD_DIR)/%.marker: %.s
+$(S_MARKER_FILES): $(BUILD_DIR)/%.marker: %.s
cd $(<D) && $(WORKING_DIR)/$(CC) $(ASFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(ASOPTFLAGS) $(<F) $(IINC) -o $(WORKING_DIR)/$(@:.marker=.o)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# check if this file is in the archive; patch corrupted bytes and change file timestamps to match original if so
@$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) $(STRIP) && \
@@ -143,9 +197,14 @@ ifneq ($(NON_MATCHING),1)
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
+endif
+ifneq ($(FIXUPS),0)
+ tools/set_o32abi_bit.py $(WORKING_DIR)/$(@:.marker=.o)
+ $(CROSS)strip $(WORKING_DIR)/$(@:.marker=.o) -N asdasdasdasd
+ $(CROSS)objcopy --remove-section .mdebug $(WORKING_DIR)/$(@:.marker=.o)
+endif
# create or update the marker file
@touch $@
-endif
# Rule for building files that require specific file paths in the mdebug section
$(MDEBUG_FILES): $(BUILD_DIR)/src/%.marker: src/%.s
@@ -153,7 +212,7 @@ $(MDEBUG_FILES): $(BUILD_DIR)/src/%.marker: src/%.s
mkdir -p $(@:.marker=)
export USR_INCLUDE=$(WORKING_DIR)/include && cd $(@:.marker=) && $(WORKING_DIR)/$(CC) $(ASFLAGS) $(CPPFLAGS) ../$(<F) -I/usr/include -o $(notdir $(<:.s=.o))
mv $(@:.marker=)/$(<F:.s=.o) $(@:.marker=)/..
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# check if this file is in the archive; patch corrupted bytes and change file timestamps to match original if so
@$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) && \
@@ -161,9 +220,14 @@ ifneq ($(NON_MATCHING),1)
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
+endif
+ifneq ($(FIXUPS),0)
+ tools/set_o32abi_bit.py $(WORKING_DIR)/$(@:.marker=.o)
+ $(CROSS)strip $(WORKING_DIR)/$(@:.marker=.o) -N asdasdasdasd
+ $(CROSS)objcopy --remove-section .mdebug $(WORKING_DIR)/$(@:.marker=.o)
+endif
# create or update the marker file
@touch $@
-endif
# Disable built-in rules
.SUFFIXES: