summaryrefslogtreecommitdiff
path: root/lib/ultralib/Makefile
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2023-07-31 17:42:21 -0700
committerGitHub <noreply@github.com>2023-07-31 20:42:21 -0400
commit33ec543467f17900516d93dd4b7964b8f49d1951 (patch)
tree426bd326b52d2a609d6f45cdf17a50162cbdc01b /lib/ultralib/Makefile
parent6d0c9276e8fc93e679d295b4e5f968da4b966a9b (diff)
Libultra OK (#20)
* Identify last 2 libultra files * BSS left * Update not built files * libultra OK * Makefile formating * Identify last couple data files * libultra section headers * Paddings * Fix one padding * move non_shared to CLFAGS and ASFLAGS * git subrepo pull --force lib/ultralib subrepo: subdir: "lib/ultralib" merged: "b376559" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "b376559" git-subrepo: version: "0.4.6" origin: "https://github.com/ingydotnet/git-subrepo" commit: "110b9eb" * Remove duplicate -non_shared * .hasm * Jenkins * GBIDEFINE
Diffstat (limited to 'lib/ultralib/Makefile')
-rw-r--r--lib/ultralib/Makefile115
1 files changed, 62 insertions, 53 deletions
diff --git a/lib/ultralib/Makefile b/lib/ultralib/Makefile
index 3700641..cf87da4 100644
--- a/lib/ultralib/Makefile
+++ b/lib/ultralib/Makefile
@@ -1,32 +1,38 @@
NON_MATCHING ?= 0
-TARGET := libgultra_rom
+# One of:
+# libgultra_rom, libgultra_d, libgultra
+# libultra_rom, libultra_d, libultra
+TARGET ?= libgultra_rom
+CROSS ?= mips-linux-gnu-
+
BASE_DIR := base_$(TARGET)
BASE_AR := $(TARGET).a
-BUILD_DIR := build
+BUILD_ROOT := build
+BUILD_DIR := $(BUILD_ROOT)/$(TARGET)
BUILD_AR := $(BUILD_DIR)/$(TARGET).a
WORKING_DIR := $(shell pwd)
CPP := cpp -P
AR := ar
-AS := tools/gcc/as
-CC := tools/gcc/gcc
-AR_OLD := tools/gcc/ar
-
-export COMPILER_PATH := $(WORKING_DIR)/tools/gcc
-CFLAGS := -w -nostdinc -c -G 0 -mgp32 -mfp32 -mips3 -D_LANGUAGE_C
-ASFLAGS := -w -nostdinc -c -G 0 -mgp32 -mfp32 -mips3 -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_MIPS_SIM=1 -D_ULTRA64 -x assembler-with-cpp
-GBIDEFINE := -DF3DEX_GBI_2
-CPPFLAGS = -D_MIPS_SZLONG=32 -D__USE_ISOC99 -I $(WORKING_DIR)/include -I $(WORKING_DIR)/include/gcc -I $(WORKING_DIR)/include/PR $(GBIDEFINE)
+ifeq ($(findstring libgultra,$(TARGET)),libgultra)
+-include Makefile.gcc
+else ifeq ($(findstring libultra,$(TARGET)),libultra)
+-include Makefile.ido
+else
+$(error Invalid Target)
+endif
ifeq ($(findstring _d,$(TARGET)),_d)
CPPFLAGS += -D_DEBUG
-OPTFLAGS := -O0
else
-CPPFLAGS += -DNDEBUG -D_FINALROM
-OPTFLAGS := -O3
+CPPFLAGS += -DNDEBUG
+endif
+
+ifeq ($(findstring _rom,$(TARGET)),_rom)
+CPPFLAGS += -D_FINALROM
endif
SRC_DIRS := $(shell find src -type d)
@@ -43,6 +49,11 @@ MARKER_FILES := $(O_FILES:.o=.marker)
ifneq ($(NON_MATCHING),1)
COMPARE_OBJ = cmp $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o) && echo "$(@:.marker=.o): OK"
COMPARE_AR = cmp $(BASE_AR) $@ && echo "$@: OK"
+ifeq ($(COMPILER),ido)
+COMPARE_OBJ = $(CROSS)objcopy -p --strip-debug $(WORKING_DIR)/$(@:.marker=.o) $(WORKING_DIR)/$(@:.marker=.cmp.o) && \
+ cmp $(BASE_DIR)/.cmp/$(@F:.marker=.cmp.o) $(WORKING_DIR)/$(@:.marker=.cmp.o) && echo "$(@:.marker=.o): OK"
+COMPARE_AR = echo "$@: Cannot compare archive currently"
+endif
else
COMPARE_OBJ :=
COMPARE_AR :=
@@ -51,7 +62,7 @@ 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) -name $f -type f -print -quit))
+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))
UNMATCHED_OBJS = $(filter-out $(MATCHED_OBJS),$(AR_ORDER))
NUM_OBJS = $(words $(AR_ORDER))
@@ -68,13 +79,13 @@ $(BUILD_AR): $(MARKER_FILES)
ifneq ($(NON_MATCHING),1)
# 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 $@
+ python3 tools/patch_ar_meta.py $@ $(BASE_AR) $(PATCH_AR_FLAGS)
@$(COMPARE_AR)
@echo "Matched: $(NUM_OBJS_MATCHED)/$(NUM_OBJS)"
endif
clean:
- $(RM) -rf $(BUILD_DIR)
+ $(RM) -rf $(BUILD_ROOT)
distclean: clean
$(MAKE) -C tools distclean
@@ -84,73 +95,71 @@ setup:
$(MAKE) -C tools
cd $(BASE_DIR) && $(AR) xo ../$(BASE_AR)
chmod -R +rw $(BASE_DIR)
-
-# KMC gcc has a custom flag, N64ALIGN, which forces 8 byte alignment on arrays. This can be used to match, but
-# an explicit aligned(8) attribute can be used instead. We opted for the latter for better compatibilty with
-# other versions of GCC that do not have this flag.
-# export N64ALIGN := ON
-export VR4300MUL := ON
+ifeq ($(COMPILER),ido)
+ export CROSS=$(CROSS) && ./tools/strip_debug.sh $(BASE_DIR)
+endif
$(BUILD_DIR)/$(BASE_DIR)/%.marker: $(BASE_DIR)/%.o
cp $< $(@:.marker=.o)
ifneq ($(NON_MATCHING),1)
-# @$(COMPARE_OBJ)
# change file timestamps to match original
@touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o)
@$(COMPARE_OBJ)
@touch $@
endif
-ifeq ($(findstring _d,$(TARGET)),_d)
-$(BUILD_DIR)/src/rmon/%.marker: OPTFLAGS := -O0
-endif
+GBIDEFINE := -DF3DEX_GBI_2
-STRIP =
-
-$(BUILD_DIR)/src/os/initialize_isv.marker: OPTFLAGS := -O2
-$(BUILD_DIR)/src/os/initialize_isv.marker: STRIP = && tools/gcc/strip-2.7 -N initialize_isv.c $(WORKING_DIR)/$(@:.marker=.o) $(WORKING_DIR)/$(@:.marker=.o)
-$(BUILD_DIR)/src/os/assert.marker: OPTFLAGS := -O0
-$(BUILD_DIR)/src/os/ackramromread.marker: OPTFLAGS := -O0
-$(BUILD_DIR)/src/os/ackramromwrite.marker: OPTFLAGS := -O0
-$(BUILD_DIR)/src/os/exit.marker: OPTFLAGS := -O0
-$(BUILD_DIR)/src/os/seterrorhandler.marker: OPTFLAGS := -O0
-$(BUILD_DIR)/src/gu/us2dex_emu.marker: GBIDEFINE := -DF3DEX_GBI
-$(BUILD_DIR)/src/sp/sprite.marker: GBIDEFINE :=
-$(BUILD_DIR)/src/sp/spriteex.marker: GBIDEFINE :=
-$(BUILD_DIR)/src/sp/spriteex2.marker: GBIDEFINE :=
-$(BUILD_DIR)/src/sp/spriteex2.marker: GBIDEFINE :=
-$(BUILD_DIR)/src/mgu/%.marker: export VR4300MUL := OFF
-$(BUILD_DIR)/src/mgu/rotate.marker: export VR4300MUL := ON
-$(BUILD_DIR)/src/os/%.marker: ASFLAGS += -P
-$(BUILD_DIR)/src/gu/%.marker: ASFLAGS += -P
-$(BUILD_DIR)/src/libc/%.marker: ASFLAGS += -P
-$(BUILD_DIR)/src/rmon/%.marker: ASFLAGS += -P
+$(BUILD_DIR)/src/gu/parse_gbi.marker: GBIDEFINE := -DF3D_GBI
+$(BUILD_DIR)/src/gu/us2dex_emu.marker: GBIDEFINE :=
+$(BUILD_DIR)/src/gu/us2dex2_emu.marker: GBIDEFINE :=
+$(BUILD_DIR)/src/sp/sprite.marker: GBIDEFINE := -DF3D_GBI
+$(BUILD_DIR)/src/sp/spriteex.marker: GBIDEFINE :=
+$(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)
+$(BUILD_DIR)/src/voice/%.marker: CC := tools/compile_sjis.py -D__CC=$(WORKING_DIR)/$(CC) -D__BUILD_DIR=$(BUILD_DIR)
$(BUILD_DIR)/%.marker: %.c
- cd $(<D) && $(WORKING_DIR)/$(CC) $(CFLAGS) $(CPPFLAGS) $(OPTFLAGS) $(<F) -o $(WORKING_DIR)/$(@:.marker=.o)
+ cd $(<D) && $(WORKING_DIR)/$(CC) $(CFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(OPTFLAGS) $(<F) $(IINC) -o $(WORKING_DIR)/$(@:.marker=.o)
ifneq ($(NON_MATCHING),1)
# 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)), \
+ @$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) $(STRIP) && \
$(COMPARE_OBJ) && \
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
- echo "Object file $(<F:.marker=.o) is not in the current archive" \
+ echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
# create or update the marker file
@touch $@
endif
$(BUILD_DIR)/%.marker: %.s
- cd $(<D) && $(WORKING_DIR)/$(CC) $(ASFLAGS) $(CPPFLAGS) -I. $(OPTFLAGS) $(<F) -o $(WORKING_DIR)/$(@:.marker=.o)
+ cd $(<D) && $(WORKING_DIR)/$(CC) $(ASFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(ASOPTFLAGS) $(<F) $(IINC) -o $(WORKING_DIR)/$(@:.marker=.o)
+ifneq ($(NON_MATCHING),1)
+# 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) && \
+ $(COMPARE_OBJ) && \
+ touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
+ echo "Object file $(@F:.marker=.o) is not in the current archive" \
+ )
+# 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
+ cp $(<:.marker=.s) $(dir $@)
+ 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)
# 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) && \
$(COMPARE_OBJ) && \
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
- echo "Object file $(<F:.marker=.o) is not in the current archive" \
+ echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
# create or update the marker file
@touch $@