007/Makefile

500 lines
18 KiB
Makefile

# Makefile to build Goldeneye 007
### Default target ###
default: all
### Default Build Options ###
# Version of the game to build
FINAL := YES
VERSION := US
IDO_RECOMP := YES
VERBOSE := 2
# If COMPARE is 1, check the output sha1sum when building 'all', and if fail to match
# then compare ELF sections to known md5 checksums.
COMPARE := 1
# Include Terminal Codes for colourising text.
include include/make/VT100Codes.make
include include/make/Gui.make
# set tooolchain based on current OS
ifeq ($(shell type mips-linux-gnu-ld >/dev/null 2>/dev/null; echo $$?), 0)
TOOLCHAIN := mips-linux-gnu-
else ifeq ($(shell type mips64-linux-gnu-ld >/dev/null 2>/dev/null; echo $$?), 0)
TOOLCHAIN := mips64-linux-gnu-
else
TOOLCHAIN := mips64-elf-
endif
# Use IDO Recomp UNLESS specified otherwise
ifeq ($(IDO_RECOMP), NO)
QEMU_IRIX := $(shell which qemu-irix 2>/dev/null)
ifeq (, $(QEMU_IRIX))
$(error Using the IDO compiler requires qemu-irix. Please install qemu-irix package or set the QEMU_IRIX environment variable to the full qemu-irix binary path)
endif
IRIX_ROOT := tools/irix/root
else
IRIX_ROOT := tools/ido5.3_recomp
endif
# other tools
TOOLS_DIR := tools
DATASEG_COMP := $(TOOLS_DIR)/data_compress.sh
RZ_COMP := $(TOOLS_DIR)/1172compress.sh
N64CKSUM := $(TOOLS_DIR)/n64cksum
ifeq ($(VERBOSE), 1)
SHA1SUM = sha1sum
else
SHA1SUM = sha1sum --quiet
endif
# Convert AI Print commands from readable strings to byte arrays automatically.
ConvertAIPRINT = sed -E -e ':loop s/PRINT\("(..*?)(.)"/PRINT\("\1",\x27\2\x27/g; tloop; \
s/(PRINT\(.*?)\x27\\\x27,\x27(.)\x27(.*)\)/\1\x27\\\2\x27\3\)/g; \
s/(PRINT\()"(.)"(.*)\)/\1\x27\2\x27\3\)/g; \
s/PRINT\((.*)\)/PRINT\(\1,\x27\\0\x27\,)/g; \
s/PRINT\((.*)\)/AI_PRINT,\1/g'
# per VERSION flags
ifeq ($(FINAL), YES)
OPTIMIZATION := -O2
LCDEFS :=
CFLAGWARNING :=
else
OPTIMIZATION := -g
LCDEFS := -DDEBUG
CFLAGWARNING :=-fullwarn -wlint
endif
ifeq ($(VERSION), US)
COUNTRYCODE := u
OUTCODE := $(COUNTRYCODE)
LANG := US
LCDEFS := -DVERSION_US -DLANG_US -DREFRESH_NTSC -DLEFTOVERDEBUG -DLEFTOVERSPECTRUM -DBUGFIX_R0 -DBYTEMATCH
ASMDEFS := --defsym VERSION_US=1 --defsym LANG_US=1 --defsym REFRESH_NTSC=1 --defsym LEFTOVERDEBUG=1 --defsym LEFTOVERSPECTRUM=1 --defsym BUGFIX_R0=1 --defsym BYTEMATCH=1
LDFILEOPTS := -DVERSION_$(LANG) -DOUTCODE=$(OUTCODE)
endif
ifeq ($(VERSION), EU)
COUNTRYCODE := e
OUTCODE := $(COUNTRYCODE)
LANG := EU
LCDEFS := -DVERSION_EU -DLANG_EU -DREFRESH_PAL -DBUGFIX_R1 -DBUGFIX_R2 -DBYTEMATCH
ASMDEFS := --defsym VERSION_EU=1 --defsym LANG_EU=1 --defsym REFRESH_PAL=1 --defsym BUGFIX_R1=1 --defsym BUGFIX_R2=1 --defsym BYTEMATCH=1
LDFILEOPTS := -DVERSION_$(LANG) -DOUTCODE=$(OUTCODE)
endif
ifeq ($(VERSION), JP)
COUNTRYCODE := j
OUTCODE := $(COUNTRYCODE)
LANG := JP
LCDEFS := -DVERSION_JP -DLANG_JP -DREFRESH_NTSC -DBUGFIX_R1 -DLEFTOVERDEBUG -DLEFTOVERSPECTRUM -DBYTEMATCH
ASMDEFS := --defsym VERSION_JP=1 --defsym LANG_JP=1 --defsym REFRESH_NTSC=1 --defsym BUGFIX_R1=1 --defsym LEFTOVERDEBUG=1 --defsym LEFTOVERSPECTRUM=1 --defsym BYTEMATCH=1
LDFILEOPTS := -DVERSION_$(LANG) -DOUTCODE=$(OUTCODE)
endif
ifeq ($(VERSION), DEBUG)
COUNTRYCODE := u
OUTCODE := d
LANG := US
LCDEFS := -DVERSION_US -DLANG_US -DREFRESH_NTSC -DLEFTOVERDEBUG -DLEFTOVERSPECTRUM -DBUGFIX_R0 -DDEBUGMENU -DVERSION_DEBUG
ASMDEFS := --defsym VERSION_DEBUG=1 --defsym LANG_US=1 --defsym REFRESH_NTSC=1 --defsym LEFTOVERDEBUG=1 --defsym LEFTOVERSPECTRUM=1 --defsym BUGFIX_R0=1 --defsym DEBUGMENU=1
COMPARE := 0
LDFILEOPTS := -DVERSION_$(LANG) -DOUTCODE=$(OUTCODE)
endif
ifeq ($(VERSION), USB)
COUNTRYCODE := u
OUTCODE := usb
LANG := US
LCDEFS := -DVERSION_US -DLANG_US -DREFRESH_NTSC -DLEFTOVERDEBUG -DLEFTOVERSPECTRUM -DBUGFIX_R0 -DDEBUGMENU -DENABLE_USB
ASMDEFS := --defsym VERSION_US=1 --defsym LANG_US=1 --defsym REFRESH_NTSC=1 --defsym LEFTOVERDEBUG=1 --defsym LEFTOVERSPECTRUM=1 --defsym BUGFIX_R0=1 --defsym DEBUGMENU=1 --defsym ENABLE_USB=1
COMPARE := 0
LDFILEOPTS := -DVERSION_$(LANG) -DOUTCODE=$(OUTCODE) -DENABLE_USB
endif
ALLOWED_VERSIONS := US EU JP DEBUG USB
ALLOWED_COUNTRYCODE := u e j
BUILD_DIR_BASE := build
# BUILD_DIR is the location where all build artefacts are placed
BUILD_DIR := $(BUILD_DIR_BASE)/$(OUTCODE)
# this file references variables defined above: BUILD_DIR, RZ_COMP
# this file defines and builds $(MUSIC_RZ_FILES)
include assets/Makefile.obseg
# this file references variables defined above: BUILD_DIR, RZ_COMP, COUNTRYCODE, LD, CC, CFLAGS, OBJCOPY, ConvertAIPRINT, OPTIMIZATION
# this file defines and builds OBSEGMENT, BG_SEG_FILES, BRIEF_RZ_FILES, CHR_RZ_FILES, GUN_RZ_FILES, PROP_RZ_FILES, ,SETUP_BUILD_FILES, STAN_BUILD_FILES, TEXT_RZ_FILES
include assets/Makefile.music
## Collect Objects ##
APPELF := $(BUILD_DIR)/ge007.$(OUTCODE).elf
APPROM := $(BUILD_DIR)/ge007.$(OUTCODE).z64
APPBIN := $(BUILD_DIR)/ge007.$(OUTCODE).bin
HEADERFILES := $(foreach dir,src,$(wildcard $(dir)/*.s))
HEADEROBJECTS := $(foreach file,$(HEADERFILES),$(BUILD_DIR)/$(file:.s=.o))
RSPCODE := $(foreach dir,rsp,$(wildcard $(dir)/*.s))
RSPOBJECTS := $(foreach file,$(RSPCODE),$(BUILD_DIR)/$(file:.s=.bin))
CODEFILES := $(foreach dir,src,$(wildcard $(dir)/*.c))
CODEOBJECTS := $(foreach file,$(CODEFILES),$(BUILD_DIR)/$(file:.c=.o))
GAMEFILES_C := $(foreach dir,src/game,$(wildcard $(dir)/*.c))
GAMEFILES_S := $(foreach dir,src/game,$(wildcard $(dir)/*.s))
GAMEOBJECTS := $(foreach file,$(GAMEFILES_S),$(BUILD_DIR)/$(file:.s=.o)) \
$(foreach file,$(GAMEFILES_C),$(BUILD_DIR)/$(file:.c=.o))
ASSET_DATAFILES := assets/GlobalImageTable.c assets/animationtable_data.c assets/animationtable_entries.c assets/font_dl.c assets/font_chardataj.c assets/font_chardatae.c assets/rarewarelogo.c
ASSET_DATAOBJECTS := $(foreach file,$(ASSET_DATAFILES),$(BUILD_DIR)/$(file:.c=.o))
ROMFILES2 := assets/romfiles2.s
ROMOBJECTS2 := $(BUILD_DIR)/assets/romfiles2.o
RAMROM_FILES := assets/ramrom/ramrom.s
RAMROM_OBJECTS := $(BUILD_DIR)/assets/ramrom/ramrom.o
FONTFILES_C := $(foreach dir,assets/font,$(wildcard $(dir)/*.c))
FONTOBJECTS := $(foreach file,$(FONTFILES_C),$(BUILD_DIR)/$(file:.c=.o))
MUSIC_FILES := $(foreach dir,assets/music,$(wildcard $(dir)/*.s))
MUSIC_OBJECTS := $(foreach file,$(MUSIC_FILES),$(BUILD_DIR)/$(file:.s=.o))
OBSEG_FILES := assets/obseg/ob_seg.s
OBSEG_OBJECTS := $(BUILD_DIR)/assets/obseg/ob_seg.o
OBSEG_RZ := $(BG_SEG_FILES) $(CHR_RZ_FILES) $(GUN_RZ_FILES) $(PROP_RZ_FILES) $(STAN_RZ_FILES) $(BRIEF_RZ_FILES) $(SETUP_RZ_FILES) $(TEXT_RZ_FILES)
IMAGE_BINS := $(foreach dir,assets/images/split,$(wildcard $(dir)/*.bin))
IMAGE_OBJS := $(foreach file,$(IMAGE_BINS),$(BUILD_DIR)/$(file:.bin=.o))
RZFILES := inflate/inflate.c
RZOBJECTS := $(foreach file,$(RZFILES),$(BUILD_DIR)/src/$(file:.c=.o))
OBJECTS := $(RSPOBJECTS) $(CODEOBJECTS) $(GAMEOBJECTS) $(RZOBJECTS) $(OBSEGMENT) $(ROMOBJECTS) $(RAMROM_OBJECTS) $(FONTOBJECTS) $(MUSIC_OBJECTS) $(IMAGE_OBJS)
## Command Line args for builders ##
MIPSISET := -mips2 -32
INCLUDE := -I . -I include -I include/ultra64 -I include/PR -I src -I src/game -I src/inflate
# ignore warnings:
# 609 : The number of arguments in the macro invocation does not match the definition - disabled because CPPLib uses "VarArgs" which wasnt invented till c99
# 649 : Missing member name in structure / union - used for "Inheritance"
# 709 : Incompatible pointer type assignment - could be fixed by casting, but implicit is fine.
# 712 : illegal combination of pointer and integer - could be fixed by casting, but implicit is fine.
# 807 : member cannot be of function or incomplete type - Variable length structs
# 838 : Microsoft extension (unnamed structs) - used for "Inheritance" and member/array call swapping
# 763 : Max Float
WOFF := -woff 609,649,709,712,807,838,763
ifeq ($(IDO_RECOMP), NO)
CC := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc
else
CC := $(IRIX_ROOT)/cc
endif
CFLAGS := -Wab,-r4300_mul -non_shared -Olimit 2000 -G 0 -Xcpluscomm $(CFLAGWARNING) $(WOFF) $(INCLUDE) $(MIPSISET) $(LCDEFS) -DTARGET_N64
LD := $(TOOLCHAIN)ld
LD_SCRIPT := $(BUILD_DIR)/ge007.$(OUTCODE).ld
# --no-warn-mismatch is needed to link -mips3 object files (some libultra math) with the regular files compiled with -mips2
LDFLAGS := -T $(LD_SCRIPT) -Map $(BUILD_DIR)/ge007.$(OUTCODE).map --no-warn-mismatch
AS := $(TOOLCHAIN)as
ASFLAGS := -march=vr4300 -mabi=32 $(INCLUDE) $(ASMDEFS)
# Use the system installed armips if available. Otherwise use the one provided with this repository.
ifneq (,$(shell which armips 2>/dev/null))
ARMIPS := armips
else
ARMIPS := $(TOOLS_DIR)/armips
endif
ASM_PROCESSOR_DIR := tools/asm-processor
ASM_PREPROC := python3 $(ASM_PROCESSOR_DIR)/asm_processor.py
OBJCOPY := $(TOOLCHAIN)objcopy
## Build Recipes ##
# Dont delete intermediate files from these targets on make completion.
.SECONDARY:
$(APPELF) $(APPROM) $(APPBIN) $(ULTRAOBJECTS) $(BUILD_DIR)/ge007.$(OUTCODE).map \
$(HEADEROBJECTS) $(BOOTOBJECTS) $(CODEOBJECTS) $(GAMEOBJECTS) $(RZOBJECTS) \
$(OBSEG_OBJECTS) $(OBSEG_RZ) $(ROMOBJECTS) $(RAMROM_OBJECTS) $(FONTOBJECTS) $(MUSIC_OBJECTS) $(IMAGE_OBJS) $(MUSIC_RZ_FILES)
# Dont delete these intermediate targets on make cancelation.
.PRECIOUS: %.bin %.o
# Run the following targets sequentialy in this order (unnamed targets will still run in parallel)
.NOTPARALLEL: print_info create_directories $(APPROM) checksum
# Phony Recipes - These targets are not files, Get Make to do something
.PHONY: print_info create_directories build_tools prerequisites checksum all_p1 all default commonclean setupclean stanclean dataclean libultraclean codeclean clean nuke help cmdbuidler test context extractassets textures
# this file references variables defined above: BUILD_DIR, CFLAGWARNING, INCLUDE, LCDEFS
# this file defines and builds $(ULTRAOBJECTS)
include src/libultrare/Makefile.libultrare
# Build RSP
$(BUILD_DIR)/rsp/%.bin: rsp/*.s
$(ARMIPS) -sym $@.sym -strequ CODE_FILE $(BUILD_DIR)/rsp/$*.bin -strequ DATA_FILE $(BUILD_DIR)/rsp/$*_data.bin $<
$(BUILD_DIR)/src/rspboot.o: $(BUILD_DIR)/rsp/rspboot.bin
#Build asm files in root
$(BUILD_DIR)/%.o: src/%.s
$(AS) $(ASFLAGS) -o $@ $<
#Build asm files in src/
$(BUILD_DIR)/src/%.o: src/%.s
$(AS) $(ASFLAGS) -o $@ $<
#Build Images
$(BUILD_DIR)/assets/images/split/%.o: assets/images/split/%.bin
$(LD) -r -b binary $< -o $@
#Compress Obseg
$(BUILD_DIR)/$(OBSEGMENT): $(OBSEG_RZ) $(IMAGE_OBJS)
#Build C files in src/
# convert AI_PRINT commands from readable to byte-array
$(BUILD_DIR)/src/%.o: src/%.c
@if grep -q 'GLOBAL_ASM(' $<; then \
$(ASM_PREPROC) $(OPTIMIZATION) $< | $(CC) -c $(CFLAGS) $(ASM_PROCESSOR_DIR)/include-stdin.c -o $@ $(OPTIMIZATION); \
$(ASM_PREPROC) $(OPTIMIZATION) $< --post-process $@ --assembler "$(AS) $(ASFLAGS)" --asm-prelude $(ASM_PROCESSOR_DIR)/prelude.inc; \
elif [ "$$(basename $<)" = "chraidata.c" ]; then \
$(ConvertAIPRINT) $< | $(CC) -c $(CFLAGS) $(ASM_PROCESSOR_DIR)/include-stdin.c -o $@ $(OPTIMIZATION); \
else \
$(CC) -c $(CFLAGS) -o $@ $(OPTIMIZATION) $<; \
fi
#Build RamRom
$(BUILD_DIR)/assets/ramrom/%.o: assets/ramrom/%.s
$(AS) $(ASFLAGS) -o $@ $<
#Build fonts
$(BUILD_DIR)/assets/font/%.o: assets/font/%.c
$(CC) -c $(CFLAGS) -o $@ $(OPTIMIZATION) $<
#Build asm files in assets/
$(BUILD_DIR)/assets/%.o: assets/%.s
$(AS) $(ASFLAGS) -o $@ $<
#Build Obseg
$(BUILD_DIR)/assets/obseg/%.o: assets/obseg/%.s $(OBSEG_RZ)
$(AS) $(ASFLAGS) -o $@ $<
#Build C files in assets/
$(BUILD_DIR)/assets/%.o: assets/%.c
ifeq ($(filter-out %setup%,$<),)
$(ConvertAIPRINT) $< | $(CC) -c $(CFLAGS) $(ASM_PROCESSOR_DIR)/include-stdin.c -o $@ $(OPTIMIZATION)
else
$(CC) -c $(CFLAGS) -o $@ $(OPTIMIZATION) $<
endif
#$(BUILD_DIR)/src/random.o: OPTIMIZATION := -O3
#$(BUILD_DIR)/src/random.o: INCLUDE := -I . -I include -I include/PR
#$(BUILD_DIR)/src/random.o: MIPSISET := -mips3 -o32
#$(BUILD_DIR)/src/random.o: src/random.c
# $(CC) -c -Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm $(CFLAGWARNING) -woff 819,820,852,821,838,649 -signed $(INCLUDE) $(MIPSISET) $(LCDEFS) -DTARGET_N64 $(OPTIMIZATION) -o $@ $<
#Link Files
$(APPELF): $(RSPOBJECTS) $(ULTRAOBJECTS) $(HEADEROBJECTS) $(OBSEG_RZ) $(BUILD_DIR)/$(OBSEGMENT) $(MUSIC_RZ_FILES) $(BOOTOBJECTS) $(CODEOBJECTS) $(GAMEOBJECTS) $(RZOBJECTS) $(ROMOBJECTS) $(ASSET_DATAOBJECTS) $(ROMOBJECTS2) $(RAMROM_OBJECTS) $(FONTOBJECTS) $(MUSIC_OBJECTS) $(OBSEG_OBJECTS) ge007.ld
cpp $(LDFILEOPTS) -P ge007.ld -o $(BUILD_DIR)/ge007.$(OUTCODE).ld
@echo "Linking Files into ELF"
$(LD) $(LDFLAGS) -o $@
$(APPBIN): $(APPELF)
@echo "Building ROM"
$(OBJCOPY) $< $@ -O binary --gap-fill=0xff
$(APPROM): $(APPBIN)
@echo "Compressing ROM"
$(DATASEG_COMP) $< $(OUTCODE)
@echo "Finalizing ROM"
$(N64CKSUM) $< $@
## Phony Recipes below - Get Make to do something ##
print_info:
$(info VERSION=$(VERSION))
$(info Building $(VERSION) ROM...)
create_directories:
scripts/make/create_directories.sh "$(BUILD_DIR)" "$(COUNTRYCODE)"
build_tools:
$(info Building tools...)
scripts/make/build_tools.sh "$(MAKE)"
prerequisites: print_info create_directories build_tools extractassets
checksum: $(APPROM)
ifeq ($(COMPARE), 1)
scripts/make/checksum.sh "$(SHA1SUM)" "$(OUTCODE)" "$(BUILD_DIR)"
endif
all_p1: prerequisites
all: all_p1 $(APPROM) checksum
@echo "Rom File Generated in Build Directory."
commonclean:
rm -f $(APPELF) $(APPROM) $(APPBIN) $(BUILD_DIR)/ge007.$(OUTCODE).map
setupclean: commonclean
rm -f $(SETUP_BUILD_FILES)
stanclean: commonclean
rm -f $(STAN_BUILD_FILES)
dataclean: commonclean stanclean setupclean
rm -f $(OBSEG_OBJECTS) $(OBSEG_RZ) $(ROMOBJECTS) $(RAMROM_OBJECTS) $(FONTOBJECTS) $(MUSIC_OBJECTS) $(IMAGE_OBJS) $(MUSIC_RZ_FILES)
libultraclean: commonclean
rm -f $(ULTRAOBJECTS)
codeclean: commonclean libultraclean
rm -f $(HEADEROBJECTS) $(BOOTOBJECTS) $(CODEOBJECTS) $(GAMEOBJECTS) $(RZOBJECTS) $(RSPOBJECTS)
clean: codeclean dataclean
@echo "\nAll Code and Asset Binaries Cleared! Make will Re-Build these next time.\n"
nuke: clean
scripts/make/clean_nuke.sh "$(ALLOWED_COUNTRYCODE)" "$(BUILD_DIR_BASE)"
help:
@echo "mmakefile help"
@echo ""
@echo " supported targets:"
@echo ""
@echo " all Build all (default)"
@echo " clean Delete all known build artifacts"
@echo " nuke Delete all files explicitly listed in Makefile (same as make clean),"
@echo " all build output for all versions, any .bin file in assets folders,"
@echo " and asp/rsp bin."
@echo " dataclean Delete only asset build artifacts"
@echo " codeclean Delete only code (asm, .c) build artifacts"
@echo " libultraclean Delete only code (asm, .c) build artifacts "
@echo " from Rare's libultra files"
@echo " stanclean Delete only stan build artifacts"
@echo " setupclean Delete only setup build artifacts"
@echo " cmdbuidler BuildAI Commands"
@echo " context [file] BuildContext File from [file]"
@echo " eg make context src/game/chrai.c"
@echo " test Re-Run Data Verification "
@echo ""
@echo ""
@echo " options:"
@echo ""
@echo " VERSION=v Region version. (US is default)"
@echo " Supported values: ${ALLOWED_VERSIONS}\n"
include include/make/cmd.make
test: checksum
ifneq ($(filter-out context,$(MAKECMDGOALS)),)
CONTEXTFILE := $(filter-out context ,$(MAKECMDGOALS))
else
CONTEXTFILE := build/ctx.c
endif
context:
@clear
@echo Building Context File [ctx.h] from $(CONTEXTFILE)
@echo "#define TRUE 1" > build/ctx.h
@echo "#define FALSE 0" >> build/ctx.h
ifeq ($(CONTEXTFILE),build/ctx.c)
@echo "#include <bondtypes.h>" > build/ctx.c
endif
@sed -n -E ':x /\\$$/ { N; s/\\\n//g ; bx };''/(^\s*#define)|(\\$$)/p; /(\\$$)/p;' src/bondconstants.h src/bondtypes.h $(CONTEXTFILE) >> build/ctx.h
@$(CC) -c $(CFLAGS) $(CONTEXTFILE) -E > build/ctx2.h 2> /dev/null || (rm build/ctx2.h && exit 1)
@sed -E '/^\s*$$/d' build/ctx2.h >> build/ctx.h
@rm build/ctx.c build/ctx2.h || exit 0
@echo You can find it in Build [build/ctx.h].
extractassets: extract_u extract_e extract_j
extract_u:
@if [ ! -f assets/obseg/ob__ob_end.seg ]; then \
echo "Extracting assets for u..."; \
if [ -f baserom.u.z64 ]; then \
scripts/extract_baserom.u.sh; \
else \
echo "Error: baserom.u.z64 not found."; \
fi \
else \
echo "Assets for u already extracted."; \
fi
extract_e:
@if [ ! -f assets/obseg/text/e/LwaxP.bin ]; then \
echo "Extracting assets for e..."; \
if [ -f baserom.e.z64 ]; then \
scripts/extract_diff.e.sh; \
else \
echo "Error: baserom.e.z64 not found."; \
fi \
else \
echo "Assets for e already extracted."; \
fi
extract_j:
@if [ ! -f assets/obseg/text/j/LstatJ.bin ]; then \
echo "Extracting assets for j..."; \
if [ -f baserom.j.z64 ]; then \
scripts/extract_diff.j.sh; \
else \
echo "Error: baserom.j.z64 not found."; \
fi \
else \
echo "Assets for j already extracted."; \
fi
extract_rsp:
@if [ ! -f build/u/rsp/rspboot.bin ]; then \
echo "Extracting rsp assets..."; \
if [ -f baserom.u.z64 ]; then \
scripts/extract_asp_gsp_rsp.sh; \
else \
echo "Error: baserom.u.z64 not found."; \
fi \
else \
echo "RSP assets for already extracted."; \
fi
textures: tools/mktex/build/tex2png
@echo "Processing textures..."
mkdir -p assets/images/out
$(foreach x,$(IMAGE_BINS),tools/mktex/build/tex2png $(x) assets/images/out ${\n})
tools/mktex/build/tex2png:
@if [ ! -f tools/mktex/build/tex2png ]; then \
echo "Building tex2png..."; \
cd tools/mktex && $(MAKE); \
fi