diff options
| author | Derek Hensley <hensley.derek58@gmail.com> | 2024-02-26 07:18:26 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-26 08:18:26 -0700 |
| commit | c632d1d20b680081c8b1ced4877a32d50d917730 (patch) | |
| tree | b7491ee1b79939ab9c541a0b4162c38bb3372b16 /lib/ultralib/Makefile | |
| parent | a10bb11ed6784c6a16a09b7eb17657d2e1bb303c (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/Makefile | 136 |
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: |
