2019-08-25 06:46:40 +02:00
# Makefile to rebuild SM64 split image
2022-03-13 09:17:10 +01:00
i n c l u d e u t i l . m k
# Dynos
i n c l u d e d y n o s . m k
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# Default target
2019-08-25 06:46:40 +02:00
default : all
2022-03-13 09:17:10 +01:00
# Preprocessor definitions
DEFINES :=
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Build Options #
#==============================================================================#
# These options can either be set by building with 'make SETTING=value'.
# 'make clean' may be required first.
2019-12-02 03:52:53 +01:00
2020-06-20 03:32:12 +02:00
# Build debug version
DEBUG ?= 0
2022-03-13 09:17:10 +01:00
# Enable development/testing flags
DEVELOPMENT ?= 0
# Build for the N64 (turn this off for ports)
TARGET_N64 = 0
2020-05-10 10:11:27 +02:00
2020-05-08 09:38:50 +02:00
# Build and optimize for Raspberry Pi(s)
TARGET_RPI ?= 0
2020-05-16 21:30:27 +02:00
2020-05-19 21:22:52 +02:00
# Build for Emscripten/WebGL
TARGET_WEB ?= 0
2020-05-16 21:30:27 +02:00
# Makeflag to enable OSX fixes
OSX_BUILD ?= 0
2020-04-03 20:57:26 +02:00
2020-05-19 21:22:52 +02:00
# Specify the target you are building for, TARGET_BITS=0 means native
TARGET_ARCH ?= native
TARGET_BITS ?= 0
2020-09-01 08:52:36 +02:00
# Enable immediate load by default
IMMEDIATELOAD ?= 1
# Enable better camera by default
BETTERCAMERA ?= 1
# Enable no drawing distance by default
NODRAWINGDISTANCE ?= 1
2020-05-16 14:41:57 +02:00
# Disable texture fixes by default (helps with them purists)
2020-10-16 12:00:48 +02:00
TEXTURE_FIX ?= 1
2020-05-13 23:33:12 +02:00
# Enable extended options menu by default
EXT_OPTIONS_MENU ?= 1
2020-05-18 10:45:28 +02:00
# Disable text-based save-files by default
TEXTSAVES ?= 0
2020-06-01 11:13:05 +02:00
# Load resources from external files
EXTERNAL_DATA ?= 0
2020-09-19 09:51:40 +02:00
# Enable Discord Rich Presence (outdated, no longer supported)
2020-06-08 22:48:23 +02:00
DISCORDRPC ?= 0
2020-09-19 09:51:40 +02:00
# Enable Discord Game SDK (used for Discord server hosting)
DISCORD_SDK ?= 1
2020-09-05 02:02:09 +02:00
# Enable docker build workarounds
DOCKERBUILD ?= 0
2020-05-08 03:24:42 +02:00
2020-05-19 21:22:52 +02:00
# Various workarounds for weird toolchains
2020-05-08 03:24:42 +02:00
2020-05-19 21:22:52 +02:00
NO_BZERO_BCOPY ?= 0
NO_LDIV ?= 0
2020-06-11 02:44:08 +02:00
# Backend selection
2020-05-20 05:58:35 +02:00
2022-01-22 04:13:41 +01:00
# Renderers: GL, GL_LEGACY, D3D11, D3D12, DUMMY
2020-06-11 02:44:08 +02:00
RENDER_API ?= GL
2022-01-22 04:13:41 +01:00
# Window managers: SDL1, SDL2, DXGI (forced if D3D11 or D3D12 in RENDER_API), DUMMY (forced if RENDER_API is DUMMY)
2020-06-11 02:44:08 +02:00
WINDOW_API ?= SDL2
2022-01-22 04:13:41 +01:00
# Audio backends: SDL1, SDL2, DUMMY
2020-06-11 02:44:08 +02:00
AUDIO_API ?= SDL2
2020-08-30 15:06:22 +02:00
# Controller backends (can have multiple, space separated): SDL2, SDL1
2020-06-11 02:44:08 +02:00
CONTROLLER_API ?= SDL2
2020-05-20 05:58:35 +02:00
2020-06-07 20:05:26 +02:00
# Misc settings for EXTERNAL_DATA
BASEDIR ?= res
BASEPACK ?= base.zip
2020-05-19 21:22:52 +02:00
# Automatic settings for PC port(s)
WINDOWS_BUILD ?= 0
2022-02-11 03:03:44 +01:00
WINDOWS_AUTO_BUILDER ?= 0
2022-03-13 09:17:10 +01:00
# COMPILER - selects the C compiler to use
# gcc - uses the GNU C Compiler
COMPILER = gcc
$( eval $ ( call validate -option ,COMPILER ,ido gcc ) )
2022-02-12 03:38:25 +01:00
2022-02-11 03:03:44 +01:00
i f e q ( $( WINDOWS_AUTO_BUILDER ) , 1 )
export SHELL = sh.exe
2022-03-13 09:17:10 +01:00
EXTRA_INCLUDES := ../include/1 ../include/2 ../include/3 ../include/4
2022-02-11 03:03:44 +01:00
EXTRA_CFLAGS := -Wno-expansion-to-defined
2022-03-01 06:33:52 +01:00
2022-03-13 09:17:10 +01:00
EXTRA_CPP_INCLUDES := ../include/cpp
2022-03-01 06:33:52 +01:00
EXTRA_CPP_FLAGS := -Wno-class-conversion -Wno-packed-not-aligned
2022-02-11 03:03:44 +01:00
e l s e
2022-02-21 05:02:48 +01:00
EXTRA_INCLUDES ?=
EXTRA_CFLAGS ?=
2022-03-01 06:33:52 +01:00
EXTRA_CPP_INCLUDES ?=
EXTRA_CPP_FLAGS ?=
2022-02-11 03:03:44 +01:00
e n d i f
2020-06-02 21:37:43 +02:00
# Attempt to detect OS
2020-05-19 21:22:52 +02:00
i f e q ( $( OS ) , W i n d o w s _ N T )
2020-06-02 21:37:43 +02:00
HOST_OS ?= Windows
e l s e
HOST_OS ?= $( shell uname -s 2>/dev/null || echo Unknown)
# some weird MINGW/Cygwin env that doesn't define $OS
ifneq ( ,$( findstring MINGW,HOST_OS) )
HOST_OS := Windows
endif
e n d i f
i f e q ( $( TARGET_WEB ) , 0 )
2020-06-07 14:16:09 +02:00
ifeq ( $( HOST_OS) ,Windows)
WINDOWS_BUILD := 1
endif
2020-05-17 02:04:55 +02:00
e n d i f
2020-05-19 21:22:52 +02:00
# MXE overrides
2020-05-19 15:38:08 +02:00
i f e q ( $( WINDOWS_BUILD ) , 1 )
ifeq ( $( CROSS) ,i686-w64-mingw32.static-)
2020-05-19 21:22:52 +02:00
TARGET_ARCH = i386pe
2020-05-19 15:38:08 +02:00
TARGET_BITS = 32
2020-05-19 21:22:52 +02:00
NO_BZERO_BCOPY := 1
2020-05-19 15:38:08 +02:00
else ifeq ( $( CROSS) ,x86_64-w64-mingw32.static-)
2020-05-19 21:22:52 +02:00
TARGET_ARCH = i386pe
2020-05-19 15:38:08 +02:00
TARGET_BITS = 64
2020-05-19 21:22:52 +02:00
NO_BZERO_BCOPY := 1
2020-05-19 15:38:08 +02:00
endif
e n d i f
2020-05-07 20:21:22 +02:00
i f n e q ( $( TARGET_BITS ) , 0 )
BITS := -m$( TARGET_BITS)
e n d i f
2020-09-26 08:18:56 +02:00
# Determine default windows target bits
i f e q ( $( WINDOWS_BUILD ) , 1 )
ifeq ( $( TARGET_BITS) , 0)
CPU_TYPE := $( firstword $( subst -, ,$( shell $( CC) -dumpmachine) ) )
ifeq ( $( CPU_TYPE) , x86_64)
TARGET_BITS := 64
else ifeq ( $( CPU_TYPE) , i686)
TARGET_BITS := 32
else ifeq ( $( CPU_TYPE) , mingw32)
TARGET_BITS := 32
endif
endif
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# VERSION - selects the version of the game to build
# jp - builds the 1996 Japanese version
# us - builds the 1996 North American version
# eu - builds the 1997 PAL version
# sh - builds the 1997 Japanese Shindou version, with rumble pak support
VERSION ?= us
$( eval $ ( call validate -option ,VERSION ,jp us eu sh ) )
# Graphics microcode used
GRUCODE ?= f3dex2e
i f e q ( $( VERSION ) , j p )
DEFINES += VERSION_JP = 1
OPT_FLAGS := -g
#GRUCODE ?= f3d_old
VERSION_JP_US ?= true
e l s e i f e q ( $( VERSION ) , u s )
DEFINES += VERSION_US = 1
OPT_FLAGS := -g
#GRUCODE ?= f3d_old
VERSION_JP_US ?= true
e l s e i f e q ( $( VERSION ) , e u )
DEFINES += VERSION_EU = 1
OPT_FLAGS := -O2
#GRUCODE ?= f3d_new
VERSION_JP_US ?= false
e l s e i f e q ( $( VERSION ) , s h )
DEFINES += VERSION_SH = 1
OPT_FLAGS := -O2
#GRUCODE ?= f3d_new
VERSION_JP_US ?= false
2019-08-25 06:46:40 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_WEB ) , 1 )
OPT_FLAGS := -O2 -g4 --source-map-base http://localhost:8080/
2019-08-25 06:46:40 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_RPI ) , 1 )
machine = $( shell sh -c 'uname -m 2>/dev/null || echo unknown' )
# Raspberry Pi B+, Zero, etc
ifneq ( ,$( findstring armv6l,$( machine) ) )
OPT_FLAGS := -march= armv6zk+fp -mfpu= vfp -Ofast
endif
# Raspberry Pi 2 and 3 in ARM 32bit mode
ifneq ( ,$( findstring armv7l,$( machine) ) )
model = $( shell sh -c 'cat /sys/firmware/devicetree/base/model 2>/dev/null || echo unknown' )
ifneq ( ,$( findstring 3,$( model) ) )
OPT_FLAGS := -march= armv8-a+crc -mtune= cortex-a53 -mfpu= neon-fp-armv8 -O3
else
OPT_FLAGS := -march= armv7-a -mtune= cortex-a7 -mfpu= neon-vfpv4 -O3
endif
endif
# RPi3 or RPi4, in ARM64 (aarch64) mode. NEEDS TESTING 32BIT.
# DO NOT pass -mfpu stuff here, thats for 32bit ARM only and will fail for 64bit ARM.
ifneq ( ,$( findstring aarch64,$( machine) ) )
model = $( shell sh -c 'cat /sys/firmware/devicetree/base/model 2>/dev/null || echo unknown' )
ifneq ( ,$( findstring 3,$( model) ) )
OPT_FLAGS := -march= armv8-a+crc -mtune= cortex-a53 -O3
else ifneq ( ,$( findstring 4,$( model) ) )
OPT_FLAGS := -march= armv8-a+crc+simd -mtune= cortex-a72 -O3
endif
endif
2020-03-02 04:42:52 +01:00
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# Set BITS (32/64) to compile for
OPT_FLAGS += $( BITS)
2020-06-02 18:44:34 +02:00
TARGET := sm64.$( VERSION)
2020-05-21 19:19:20 +02:00
# Stuff for showing the git hash in the intro on nightly builds
# From https://stackoverflow.com/questions/44038428/include-git-commit-hash-and-or-branch-name-in-c-c-source
2020-09-12 01:07:45 +02:00
#ifeq ($(shell git rev-parse --abbrev-ref HEAD),nightly)
2022-03-13 09:17:10 +01:00
# GIT_HASH=`git rev-parse --short HEAD`
# COMPILE_TIME=`date -u +'%Y-%m-%d %H:%M:%S UTC'`
# DEFINES += -DNIGHTLY -DGIT_HASH="\"$(GIT_HASH)\"" -DCOMPILE_TIME="\"$(COMPILE_TIME)\""
2020-09-12 01:07:45 +02:00
#endif
2020-05-21 19:19:20 +02:00
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# GRUCODE - selects which RSP microcode to use.
# f3d_old - default for JP and US versions
# f3d_new - default for EU and Shindou versions
# f3dex -
# f3dex2 -
# f3dex2e -
# f3dzex - newer, experimental microcode used in Animal Crossing
$( eval $ ( call validate -option ,GRUCODE ,f 3d_old f 3dex f 3dex 2 f 3dex 2e f 3d_new f 3dzex ) )
i f e q ( $( GRUCODE ) , f 3 d _ o l d )
DEFINES += F3D_OLD = 1
e l s e i f e q ( $( GRUCODE ) , f 3 d _ n e w ) # Fast3D 2.0H
DEFINES += F3D_NEW = 1
e l s e i f e q ( $( GRUCODE ) , f 3 d e x ) # Fast3DEX
DEFINES += F3DEX_GBI = 1 F3DEX_GBI_SHARED = 1
e l s e i f e q ( $( GRUCODE ) , f 3 d e x 2 ) # Fast3DEX2
DEFINES += F3DEX_GBI_2 = 1 F3DEX_GBI_SHARED = 1
e l s e i f e q ( $( GRUCODE ) , f 3 d e x 2 e ) # Fast3DEX2 Extended (PC default)
DEFINES += F3DEX_GBI_2E = 1 F3DEX_GBI_SHARED = 1
e l s e i f e q ( $( GRUCODE ) , f 3 d z e x ) # Fast3DZEX (2.0J / Animal Forest - Dōbutsu no Mori)
2019-08-25 06:46:40 +02:00
$( warning Fast3DZEX is experimental. Try at your own risk.)
2022-03-13 09:17:10 +01:00
DEFINES += F3DZEX_GBI_2 = 1 F3DEX_GBI_2 = 1 F3DEX_GBI_SHARED = 1
2019-08-25 06:46:40 +02:00
e n d i f
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
# Check for certain target types.
2019-08-25 06:46:40 +02:00
2020-05-10 10:11:27 +02:00
i f e q ( $( TARGET_RPI ) , 1 ) # Define RPi to change SDL2 title & GLES2 hints
2022-03-13 09:17:10 +01:00
DEFINES += -DUSE_GLES
2019-08-25 06:46:40 +02:00
e n d i f
2020-05-16 21:30:27 +02:00
i f e q ( $( OSX_BUILD ) , 1 ) # Modify GFX & SDL2 for OSX GL
2022-03-13 09:17:10 +01:00
DEFINES += -DOSX_BUILD
2020-05-16 21:30:27 +02:00
e n d i f
2020-05-07 20:21:22 +02:00
i f e q ( $( TARGET_WEB ) , 1 )
2022-03-13 09:17:10 +01:00
DEFINES := $( DEFINES) -DTARGET_WEB -DUSE_GLES
2020-05-07 20:21:22 +02:00
e n d i f
2020-06-11 02:44:08 +02:00
# Check backends
i f n e q ( , $( filter $ ( RENDER_API ) ,D 3D 11 D 3D 12) )
ifneq ( $( WINDOWS_BUILD) ,1)
$( error DirectX is only supported on Windows)
endif
ifneq ( $( WINDOW_API) ,DXGI)
$( warning DirectX renderers require DXGI, forcing WINDOW_API value)
WINDOW_API := DXGI
endif
e l s e
ifeq ( $( WINDOW_API) ,DXGI)
$( error DXGI can only be used with DirectX renderers)
endif
2022-01-22 04:13:41 +01:00
ifneq ( $( WINDOW_API) ,DUMMY)
ifeq ( $( RENDER_API) ,DUMMY)
$( warning Dummy renderer requires dummy window API, forcing WINDOW_API value)
WINDOW_API := DUMMY
endif
else
ifneq ( $( RENDER_API) ,DUMMY)
$( warning Dummy window API requires dummy renderer, forcing RENDER_API value)
RENDER_API := DUMMY
endif
endif
2020-06-11 02:44:08 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
# NON_MATCHING - whether to build a matching, identical copy of the ROM
# 1 - enable some alternate, more portable code that does not produce a matching ROM
# 0 - build a matching ROM
NON_MATCHING ?= 0
$( eval $ ( call validate -option ,NON_MATCHING ,0 1) )
i f e q ( $( TARGET_N 64) , 0 )
NON_MATCHING := 1
e n d i f
i f e q ( $( NON_MATCHING ) , 1 )
DEFINES += NON_MATCHING = 1 AVOID_UB = 1
COMPARE := 0
e n d i f
# COMPARE - whether to verify the SHA-1 hash of the ROM after building
# 1 - verifies the SHA-1 hash of the selected version of the game
# 0 - does not verify the hash
COMPARE ?= 1
$( eval $ ( call validate -option ,COMPARE ,0 1) )
TARGET_STRING := sm64.$( VERSION) .$( GRUCODE)
# If non-default settings were chosen, disable COMPARE
i f e q ( $( filter $ ( TARGET_STRING ) , sm 64.jp .f 3d_old sm 64.us .f 3d_old sm 64.eu .f 3d_new sm 64.sh .f 3d_new ) , )
COMPARE := 0
e n d i f
# Whether to hide commands or not
VERBOSE ?= 0
i f e q ( $( VERBOSE ) , 0 )
V := @
e n d i f
# Whether to colorize build messages
COLOR ?= 1
# display selected options unless 'make clean' or 'make distclean' is run
i f e q ( $( filter clean distclean ,$ ( MAKECMDGOALS ) ) , )
$( info = = = = Build Options = = = = )
$( info Version: $( VERSION) )
$( info Microcode: $( GRUCODE) )
$( info Target: $( TARGET) )
ifeq ( $( COMPARE) ,1)
$( info Compare ROM: yes)
else
$( info Compare ROM: no)
endif
ifeq ( $( NON_MATCHING) ,1)
$( info Build Matching: no)
else
$( info Build Matching: yes)
endif
$( info = = = = = = = = = = = = = = = = = = = = = = = )
e n d i f
#==============================================================================#
# Universal Dependencies #
#==============================================================================#
TOOLS_DIR := tools
2019-08-25 06:46:40 +02:00
# (This is a bit hacky, but a lot of rules implicitly depend
# on tools and assets, and we use directory globs further down
# in the makefile that we want should cover assets.)
2022-03-13 09:17:10 +01:00
PYTHON := python3
i f e q ( $( filter clean distclean print -%,$ ( MAKECMDGOALS ) ) , )
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# Make sure assets exist
NOEXTRACT ?= 0
ifeq ( $( NOEXTRACT) ,0)
DUMMY != $( PYTHON) extract_assets.py $( VERSION) >& 2 || echo FAIL
ifeq ( $( DUMMY) ,FAIL)
$( error Failed to extract assets)
endif
2022-02-11 03:03:44 +01:00
endif
2022-03-13 09:17:10 +01:00
# Make tools if out of date
$( info Building tools...)
#DUMMY != $(MAKE) -s -C $(TOOLS_DIR) $(if $(filter-out ido0,$(COMPILER)$(USE_QEMU_IRIX)),all-except-recomp,) >&2 || echo FAIL
DUMMY != $( MAKE) -C $( TOOLS_DIR) >& 2 || echo FAIL
ifeq ( $( DUMMY) ,FAIL)
$( error Failed to build tools)
endif
$( info Building Game...)
2019-08-25 06:46:40 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Extra Source Files #
#==============================================================================#
2022-03-01 07:59:58 +01:00
# Luigi and wario sounds don't work on 32-bit right now
# And the audio code is so terrible I don't care enough to figure it out at the moment
i f e q ( $( TARGET_BITS ) , 3 2 )
2022-03-14 02:45:42 +01:00
_ := $( shell rm -rf sound/samples/sfx_custom_luigi/*.aiff)
_ := $( shell rm -rf sound/samples/sfx_custom_luigi_peach/*.aiff)
_ := $( shell rm -rf sound/samples/sfx_custom_wario/*.aiff)
_ := $( shell rm -rf sound/samples/sfx_custom_wario_peach/*.aiff)
2022-03-01 07:59:58 +01:00
e n d i f
2022-03-14 02:45:42 +01:00
# Copy missing character sounds from mario sound banks
_ := $( shell $( PYTHON) $( TOOLS_DIR) /copy_mario_sounds.py)
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Target Executable and Sources #
#==============================================================================#
2019-08-25 06:46:40 +02:00
BUILD_DIR_BASE := build
2022-03-13 09:17:10 +01:00
# BUILD_DIR is the location where all build artifacts are placed
2020-05-07 20:21:22 +02:00
i f e q ( $( TARGET_WEB ) , 1 )
BUILD_DIR := $( BUILD_DIR_BASE) /$( VERSION) _web
e l s e
BUILD_DIR := $( BUILD_DIR_BASE) /$( VERSION) _pc
e n d i f
2019-08-25 06:46:40 +02:00
2020-05-07 20:21:22 +02:00
i f e q ( $( TARGET_WEB ) , 1 )
2022-03-13 09:17:10 +01:00
EXE := $( BUILD_DIR) /$( TARGET_STRING) .html
e l s e
2020-05-10 10:11:27 +02:00
ifeq ( $( WINDOWS_BUILD) ,1)
2022-03-13 09:17:10 +01:00
EXE := $( BUILD_DIR) /$( TARGET_STRING) .exe
else # Linux builds/binary namer
2020-05-10 10:11:27 +02:00
ifeq ( $( TARGET_RPI) ,1)
2022-03-13 09:17:10 +01:00
EXE := $( BUILD_DIR) /$( TARGET_STRING) .arm
2020-05-10 10:11:27 +02:00
else
2022-03-13 09:17:10 +01:00
EXE := $( BUILD_DIR) /$( TARGET_STRING)
2020-05-10 10:11:27 +02:00
endif
endif
2020-05-08 09:38:50 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
ELF := $( BUILD_DIR) /$( TARGET) .elf
LIBULTRA := $( BUILD_DIR) /libultra.a
LD_SCRIPT := sm64.ld
MIO0_DIR := $( BUILD_DIR) /bin
SOUND_BIN_DIR := $( BUILD_DIR) /sound
TEXTURE_DIR := textures
ACTOR_DIR := actors
LEVEL_DIRS := $( patsubst levels/%,%,$( dir $( wildcard levels/*/header.h) ) )
2019-08-25 06:46:40 +02:00
# Directories containing source files
2022-03-13 09:17:10 +01:00
SRC_DIRS := src src/engine src/game src/audio src/menu src/buffers actors levels bin data assets asm lib sound
BIN_DIRS := bin bin/$( VERSION)
2020-05-10 10:11:27 +02:00
2022-03-13 09:17:10 +01:00
# PC files
SRC_DIRS += src/pc src/pc/gfx src/pc/audio src/pc/controller src/pc/fs src/pc/fs/packtypes src/pc/network src/pc/network/packets src/pc/network/socket src/pc/utils src/pc/djui src/pc/lua src/pc/lua/utils
2020-05-10 10:11:27 +02:00
2020-09-15 03:29:47 +02:00
#ifeq ($(DISCORDRPC),1)
# SRC_DIRS += src/pc/discord
#endif
2020-06-08 22:48:23 +02:00
2020-09-19 09:51:40 +02:00
i f e q ( $( DISCORD_SDK ) , 1 )
SRC_DIRS += src/pc/network/discord
e n d i f
2022-03-13 09:17:10 +01:00
ULTRA_SRC_DIRS := lib/src lib/src/math lib/asm lib/data
2019-08-25 06:46:40 +02:00
ULTRA_BIN_DIRS := lib/bin
GODDARD_SRC_DIRS := src/goddard src/goddard/dynlists
# File dependencies and variables for specific files
i n c l u d e M a k e f i l e . s p l i t
# Source code files
2022-03-13 09:17:10 +01:00
LEVEL_C_FILES := $( wildcard levels/*/leveldata.c) $( wildcard levels/*/script.c) $( wildcard levels/*/geo.c)
C_FILES := $( foreach dir,$( SRC_DIRS) ,$( wildcard $( dir) /*.c) ) $( LEVEL_C_FILES)
CPP_FILES := $( foreach dir,$( SRC_DIRS) ,$( wildcard $( dir) /*.cpp) )
S_FILES := $( foreach dir,$( SRC_DIRS) ,$( wildcard $( dir) /*.s) )
ULTRA_C_FILES := $( foreach dir,$( ULTRA_SRC_DIRS) ,$( wildcard $( dir) /*.c) )
GODDARD_C_FILES := $( foreach dir,$( GODDARD_SRC_DIRS) ,$( wildcard $( dir) /*.c) )
ULTRA_S_FILES := $( foreach dir,$( ULTRA_SRC_DIRS) ,$( wildcard $( dir) /*.s) )
GENERATED_C_FILES := $( BUILD_DIR) /assets/mario_anim_data.c $( BUILD_DIR) /assets/demo_data.c
i f e q ( $( TARGET_N 64) , 0 )
GENERATED_C_FILES += $( addprefix $( BUILD_DIR) /bin/,$( addsuffix _skybox.c,$( notdir $( basename $( wildcard textures/skyboxes/*.png) ) ) ) )
e n d i f
# "If we're N64, use the above"
i f e q ( $( TARGET_N 64) , 0 )
ULTRA_C_FILES := \
alBnkfNew.c \
guLookAtRef.c \
guMtxF2L.c \
guNormalize.c \
guOrthoF.c \
guPerspectiveF.c \
guRotateF.c \
guScaleF.c \
guTranslateF.c \
ldiv.c
C_FILES := $( filter-out src/game/main.c,$( C_FILES) )
ULTRA_C_FILES := $( addprefix lib/src/,$( ULTRA_C_FILES) )
e n d i f
# Sound files
SOUND_BANK_FILES := $( wildcard sound/sound_banks/*.json)
SOUND_SAMPLE_DIRS := $( wildcard sound/samples/*)
SOUND_SAMPLE_AIFFS := $( foreach dir,$( SOUND_SAMPLE_DIRS) ,$( wildcard $( dir) /*.aiff) )
2019-08-25 06:46:40 +02:00
SOUND_SAMPLE_TABLES := $( foreach file,$( SOUND_SAMPLE_AIFFS) ,$( BUILD_DIR) /$( file:.aiff= .table) )
2022-03-13 09:17:10 +01:00
SOUND_SAMPLE_AIFCS := $( foreach file,$( SOUND_SAMPLE_AIFFS) ,$( BUILD_DIR) /$( file:.aiff= .aifc) )
SOUND_SEQUENCE_DIRS := sound/sequences sound/sequences/$( VERSION)
# all .m64 files in SOUND_SEQUENCE_DIRS, plus all .m64 files that are generated from .s files in SOUND_SEQUENCE_DIRS
SOUND_SEQUENCE_FILES := \
$( foreach dir,$( SOUND_SEQUENCE_DIRS) ,\
$( wildcard $( dir) /*.m64) \
$( foreach file,$( wildcard $( dir) /*.s) ,$( BUILD_DIR) /$( file:.s= .m64) ) \
)
2019-08-25 06:46:40 +02:00
# Object files
O_FILES := $( foreach file,$( C_FILES) ,$( BUILD_DIR) /$( file:.c= .o) ) \
2022-03-13 09:17:10 +01:00
$( foreach file,$( CPP_FILES) ,$( BUILD_DIR) /$( file:.cpp= .o) ) \
2019-08-25 06:46:40 +02:00
$( foreach file,$( S_FILES) ,$( BUILD_DIR) /$( file:.s= .o) ) \
2019-11-03 20:36:27 +01:00
$( foreach file,$( GENERATED_C_FILES) ,$( file:.c= .o) )
2019-08-25 06:46:40 +02:00
ULTRA_O_FILES := $( foreach file,$( ULTRA_S_FILES) ,$( BUILD_DIR) /$( file:.s= .o) ) \
$( foreach file,$( ULTRA_C_FILES) ,$( BUILD_DIR) /$( file:.c= .o) )
GODDARD_O_FILES := $( foreach file,$( GODDARD_C_FILES) ,$( BUILD_DIR) /$( file:.c= .o) )
2020-06-08 22:48:23 +02:00
RPC_LIBS :=
2020-09-15 03:29:47 +02:00
#ifeq ($(DISCORDRPC),1)
# ifeq ($(WINDOWS_BUILD),1)
# RPC_LIBS := lib/discord/libdiscord-rpc.dll
# else ifeq ($(OSX_BUILD),1)
# # needs testing
# RPC_LIBS := lib/discord/libdiscord-rpc.dylib
# else
# RPC_LIBS := lib/discord/libdiscord-rpc.so
# endif
#endif
2020-06-08 22:48:23 +02:00
2020-09-13 06:16:10 +02:00
DISCORD_SDK_LIBS :=
2020-09-19 09:51:40 +02:00
i f e q ( $( DISCORD_SDK ) , 1 )
ifeq ( $( WINDOWS_BUILD) ,1)
2020-09-26 08:18:56 +02:00
ifeq ( $( TARGET_BITS) , 32)
DISCORD_SDK_LIBS := lib/discordsdk/x86/discord_game_sdk.dll
else
DISCORD_SDK_LIBS := lib/discordsdk/discord_game_sdk.dll
endif
2020-09-19 09:51:40 +02:00
else ifeq ( $( OSX_BUILD) ,1)
# needs testing
2021-08-02 11:59:45 +02:00
# HACKY! Instead of figuring out all of the dynamic library linking madness...
# I copied the library and gave it two names.
# This really shouldn't be required, but I got tired of trying to do it the "right way"
DISCORD_SDK_LIBS := lib/discordsdk/discord_game_sdk.dylib lib/discordsdk/libdiscord_game_sdk.dylib
2020-09-19 09:51:40 +02:00
else
DISCORD_SDK_LIBS := lib/discordsdk/libdiscord_game_sdk.so
endif
2020-09-13 06:16:10 +02:00
e n d i f
2022-01-17 03:07:45 +01:00
MOD_DIR := mods
2019-08-25 06:46:40 +02:00
# Automatic dependency files
DEP_FILES := $( O_FILES:.o= .d) $( ULTRA_O_FILES:.o= .d) $( GODDARD_O_FILES:.o= .d) $( BUILD_DIR) /$( LD_SCRIPT) .d
# Segment elf files
SEG_FILES := $( SEGMENT_ELF_FILES) $( ACTOR_ELF_FILES) $( LEVEL_ELF_FILES)
2022-03-13 09:17:10 +01:00
# Files with GLOBAL_ASM blocks
i f e q ( $( NON_MATCHING ) , 0 )
ifeq ( $( VERSION) ,sh)
GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $( wildcard src/**/*.c) $( wildcard lib/src/*.c)
else
GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $( wildcard src/**/*.c)
endif
GLOBAL_ASM_O_FILES = $( foreach file,$( GLOBAL_ASM_C_FILES) ,$( BUILD_DIR) /$( file:.c= .o) )
GLOBAL_ASM_DEP = $( BUILD_DIR) /src/audio/non_matching_dep
e n d i f
2020-05-07 20:21:22 +02:00
2022-01-16 17:51:29 +01:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Compiler Options #
#==============================================================================#
2020-05-07 20:21:22 +02:00
2022-03-13 09:17:10 +01:00
AS := $( CROSS) as
2020-05-10 10:11:27 +02:00
2020-05-16 21:30:27 +02:00
i f e q ( $( OSX_BUILD ) , 1 )
2022-03-13 09:17:10 +01:00
AS := i686-w64-mingw32-as
2020-05-16 21:30:27 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
i f e q ( $( COMPILER ) , g c c )
CC := $( CROSS) gcc
CXX := $( CROSS) g++
e l s e i f e q ( $( TARGET_WEB ) , 1 ) # As in, web PC port
CC := emcc
CXX := emcc
2020-05-07 20:21:22 +02:00
e l s e
2022-03-13 09:17:10 +01:00
ifeq ( $( USE_QEMU_IRIX) ,1)
IRIX_ROOT := $( TOOLS_DIR) /ido5.3_compiler
CC := $( QEMU_IRIX) -silent -L $( IRIX_ROOT) $( IRIX_ROOT) /usr/bin/cc
ACPP := $( QEMU_IRIX) -silent -L $( IRIX_ROOT) $( IRIX_ROOT) /usr/lib/acpp
COPT := $( QEMU_IRIX) -silent -L $( IRIX_ROOT) $( IRIX_ROOT) /usr/lib/copt
2020-09-19 09:51:40 +02:00
else
2022-03-13 09:17:10 +01:00
IDO_ROOT := $( TOOLS_DIR) /ido5.3_recomp
CC := $( IDO_ROOT) /cc
ACPP := $( IDO_ROOT) /acpp
COPT := $( IDO_ROOT) /copt
2020-09-19 09:51:40 +02:00
endif
e n d i f
2020-05-10 10:11:27 +02:00
2020-05-16 17:21:16 +02:00
i f e q ( $( WINDOWS_BUILD ) , 1 ) # fixes compilation in MXE on Linux and WSL
CPP := cpp -P
2020-05-16 17:56:58 +02:00
OBJCOPY := objcopy
2020-05-16 21:30:27 +02:00
OBJDUMP := $( CROSS) objdump
2020-05-19 21:22:52 +02:00
e l s e i f e q ( $( OSX_BUILD ) , 1 )
CPP := cpp-9 -P
OBJDUMP := i686-w64-mingw32-objdump
OBJCOPY := i686-w64-mingw32-objcopy
2022-03-13 09:17:10 +01:00
e l s e i f e q ( $( TARGET_N 64) , 0 ) # Linux & other builds
2020-05-16 18:01:23 +02:00
CPP := $( CROSS) cpp -P
2020-05-16 17:56:58 +02:00
OBJCOPY := $( CROSS) objcopy
2020-05-16 21:30:27 +02:00
OBJDUMP := $( CROSS) objdump
2022-03-13 09:17:10 +01:00
e l s e
# Prefer gcc's cpp if installed on the system
ifneq ( ,$( call find-command,cpp-10) )
CPP := cpp-10
else
CPP := cpp
endif
OBJDUMP := $( CROSS) objdump
OBJCOPY := $( CROSS) objcopy
2020-05-16 21:30:27 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
# thank you apple very cool
i f e q ( $( HOST_OS ) , D a r w i n )
CP := gcp
e l s e
CP := cp
e n d i f
2020-05-07 20:21:22 +02:00
2022-03-13 09:17:10 +01:00
#ifeq ($(DISCORDRPC),1)
i f e q ( $( DISCORD_SDK ) , 1 )
LD := $( CXX)
e l s e i f e q ( $( WINDOWS_BUILD ) , 1 )
ifeq ( $( CROSS) ,i686-w64-mingw32.static-) # fixes compilation in MXE on Linux and WSL
LD := $( CC)
else ifeq ( $( CROSS) ,x86_64-w64-mingw32.static-)
LD := $( CC)
else
LD := $( CXX)
endif
e l s e
LD := $( CROSS) ld
e n d i f
AR := $( CROSS) ar
i f e q ( $( TARGET_N 64) , 1 )
TARGET_CFLAGS := -nostdinc -DTARGET_N64 -D_LANGUAGE_C
CC_CFLAGS := -fno-builtin
e l s e
TARGET_CFLAGS := -D_LANGUAGE_C
e n d i f
INCLUDE_DIRS := include $( BUILD_DIR) $( BUILD_DIR) /include src .
i f e q ( $( TARGET_N 64) , 1 )
INCLUDE_DIRS += include/libc
e l s e
INCLUDE_DIRS += sound lib/lua/include $( EXTRA_INCLUDES)
e n d i f
# Connfigure backend flags
SDLCONFIG := $( CROSS) sdl2-config
2020-06-11 02:44:08 +02:00
BACKEND_CFLAGS := -DRAPI_$( RENDER_API) = 1 -DWAPI_$( WINDOW_API) = 1 -DAAPI_$( AUDIO_API) = 1
# can have multiple controller APIs
BACKEND_CFLAGS += $( foreach capi,$( CONTROLLER_API) ,-DCAPI_$( capi) = 1)
2020-08-15 06:15:28 +02:00
BACKEND_LDFLAG0S :=
SDL1_USED := 0
2020-06-11 02:44:08 +02:00
SDL2_USED := 0
2022-01-28 08:47:29 +01:00
# suppress warnings
2022-03-13 07:38:13 +01:00
BACKEND_CFLAGS += -Wno-format-security -Wno-trigraphs
2022-02-11 03:03:44 +01:00
BACKEND_CFLAGS += $( EXTRA_CFLAGS)
2022-01-28 08:47:29 +01:00
2020-06-11 02:44:08 +02:00
# for now, it's either SDL+GL or DXGI+DirectX, so choose based on WAPI
i f e q ( $( WINDOW_API ) , D X G I )
DXBITS := ` cat $( ENDIAN_BITWIDTH) | tr ' ' '\n' | tail -1`
2020-07-07 13:18:46 +02:00
ifeq ( $( RENDER_API) ,D3D12)
2020-06-11 05:11:11 +02:00
BACKEND_CFLAGS += -Iinclude/dxsdk
2020-06-11 02:44:08 +02:00
endif
BACKEND_LDFLAGS += -ld3dcompiler -ldxgi -ldxguid
BACKEND_LDFLAGS += -lsetupapi -ldinput8 -luser32 -lgdi32 -limm32 -lole32 -loleaut32 -lshell32 -lwinmm -lversion -luuid -static
2020-08-15 06:15:28 +02:00
e l s e i f e q ( $( findstring SDL ,$ ( WINDOW_API ) ) , S D L )
2020-06-11 02:44:08 +02:00
ifeq ( $( WINDOWS_BUILD) ,1)
BACKEND_LDFLAGS += -lglew32 -lglu32 -lopengl32
else ifeq ( $( TARGET_RPI) ,1)
BACKEND_LDFLAGS += -lGLESv2
else ifeq ( $( OSX_BUILD) ,1)
BACKEND_LDFLAGS += -framework OpenGL ` pkg-config --libs glew`
2022-03-13 07:38:13 +01:00
EXTRA_CPP_FLAGS += -stdlib= libc++ -std= c++0x
2020-06-11 02:44:08 +02:00
else
BACKEND_LDFLAGS += -lGL
2022-03-13 09:17:10 +01:00
endif
2020-06-11 02:44:08 +02:00
e n d i f
2020-08-15 06:15:28 +02:00
i f n e q ( , $( findstring SDL 2,$ ( AUDIO_API ) $ ( WINDOW_API ) $ ( CONTROLLER_API ) ) )
SDL2_USED := 1
e n d i f
i f n e q ( , $( findstring SDL 1,$ ( AUDIO_API ) $ ( WINDOW_API ) $ ( CONTROLLER_API ) ) )
SDL1_USED := 1
2020-06-11 02:44:08 +02:00
e n d i f
2020-08-15 06:15:28 +02:00
i f e q ( $( SDL 1_USED ) $( SDL 2_USED ) , 1 1 )
$( error Cannot link both SDL1 and SDL2 at the same time )
2020-06-11 02:44:08 +02:00
e n d i f
# SDL can be used by different systems, so we consolidate all of that shit into this
2022-03-13 09:17:10 +01:00
2020-08-15 06:15:28 +02:00
i f e q ( $( SDL 2_USED ) , 1 )
SDLCONFIG := $( CROSS) sdl2-config
BACKEND_CFLAGS += -DHAVE_SDL2= 1
e l s e i f e q ( $( SDL 1_USED ) , 1 )
SDLCONFIG := $( CROSS) sdl-config
BACKEND_CFLAGS += -DHAVE_SDL1= 1
e n d i f
i f n e q ( $( SDL 1_USED ) $( SDL 2_USED ) , 0 0 )
2022-02-11 03:06:59 +01:00
ifeq ( $( OSX_BUILD) ,1)
# on OSX at least the homebrew version of sdl-config gives include path as `.../include/SDL2` instead of `.../include`
OSX_PREFIX := $( shell $( SDLCONFIG) --prefix)
BACKEND_CFLAGS += -I$( OSX_PREFIX) /include $( shell $( SDLCONFIG) --cflags)
else
BACKEND_CFLAGS += ` $( SDLCONFIG) --cflags`
endif
2022-03-13 09:17:10 +01:00
2020-06-11 02:44:08 +02:00
ifeq ( $( WINDOWS_BUILD) ,1)
2020-06-12 23:53:01 +02:00
BACKEND_LDFLAGS += ` $( SDLCONFIG) --static-libs` -lsetupapi -luser32 -limm32 -lole32 -loleaut32 -lshell32 -lwinmm -lversion
2020-06-11 02:44:08 +02:00
else
BACKEND_LDFLAGS += ` $( SDLCONFIG) --libs`
endif
e n d i f
2022-03-13 09:17:10 +01:00
C_DEFINES := $( foreach d,$( DEFINES) ,-D$( d) )
DEF_INC_CFLAGS := $( foreach i,$( INCLUDE_DIRS) ,-I$( i) ) $( C_DEFINES)
# Check code syntax with host compiler
CC_CHECK := $( CC)
2020-05-07 20:21:22 +02:00
i f e q ( $( WINDOWS_BUILD ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS := -fsyntax-only -fsigned-char $( BACKEND_CFLAGS) $( DEF_INC_CFLAGS) -Wall -Wextra $( TARGET_CFLAGS) -DWINSOCK
CFLAGS := $( OPT_FLAGS) $( DEF_INC_CFLAGS) $( BACKEND_CFLAGS) $( TARGET_CFLAGS) -fno-strict-aliasing -fwrapv -DWINSOCK
2022-02-12 21:27:20 +01:00
ifeq ( $( TARGET_BITS) , 32)
BACKEND_LDFLAGS += -ldbghelp
endif
2020-05-07 20:21:22 +02:00
e l s e i f e q ( $( TARGET_WEB ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS := -fsyntax-only -fsigned-char $( BACKEND_CFLAGS) $( DEF_INC_CFLAGS) -Wall -Wextra -Wno-format-security $( TARGET_CFLAGS) -s USE_SDL = 2
CFLAGS := $( OPT_FLAGS) $( DEF_INC_CFLAGS) $( BACKEND_CFLAGS) $( TARGET_CFLAGS) -fno-strict-aliasing -fwrapv -s USE_SDL = 2
e l s e i f e q ( $( TARGET_N 64) , 0 ) # Linux / Other builds below
CC_CHECK_CFLAGS := -fsyntax-only -fsigned-char $( BACKEND_CFLAGS) $( DEF_INC_CFLAGS) -Wall -Wextra $( TARGET_CFLAGS)
CFLAGS := $( OPT_FLAGS) $( DEF_INC_CFLAGS) $( BACKEND_CFLAGS) $( TARGET_CFLAGS) -fno-strict-aliasing -fwrapv
e l s e # C compiler options for N64
CC_CHECK_CFLAGS := -fsyntax-only -fsigned-char $( CC_CFLAGS) $( TARGET_CFLAGS) -std= gnu90 -Wall -Wextra -Wno-main -DNON_MATCHING -DAVOID_UB $( DEF_INC_CFLAGS)
CFLAGS = -G 0 $( OPT_FLAGS) $( TARGET_CFLAGS) $( MIPSISET) $( DEF_INC_CFLAGS)
ifeq ( $( COMPILER) ,gcc)
CFLAGS += -mno-shared -march= vr4300 -mfix4300 -mabi= 32 -mhard-float -mdivide-breaks -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra
else
CFLAGS += -non_shared -Wab,-r4300_mul -Xcpluscomm -Xfullwarn -signed -32
endif
e n d i f
2020-05-10 10:11:27 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_N 64) , 1 )
ASFLAGS := -march= vr4300 -mabi= 32 $( foreach i,$( INCLUDE_DIRS) ,-I$( i) ) $( foreach d,$( DEFINES) ,--defsym $( d) )
RSPASMFLAGS := $( foreach d,$( DEFINES) ,-definelabel $( subst = , ,$( d) ) )
2020-05-07 20:21:22 +02:00
e l s e
2022-03-13 09:17:10 +01:00
ASFLAGS := $( foreach i,$( INCLUDE_DIRS) ,-I$( i) ) $( foreach d,$( DEFINES) ,--defsym $( d) )
RSPASMFLAGS :=
e n d i f
# C preprocessor flags
CPPFLAGS := -P -Wno-trigraphs $( DEF_INC_CFLAGS)
2020-06-11 02:44:08 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_N 64) , 1 )
ifeq ( $( shell getconf LONG_BIT) , 32)
# Work around memory allocation bug in QEMU
export QEMU_GUEST_BASE := 1
else
# Ensure that gcc treats the code as 32-bit
CC_CHECK_CFLAGS += -m32
endif
2020-05-07 20:21:22 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_WEB ) , 1 )
LDFLAGS := -lm -lGL -lSDL2 -no-pie -s TOTAL_MEMORY = 20MB -g4 --source-map-base http://localhost:8080/ -s "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']"
e l s e i f e q ( $( WINDOWS_BUILD ) , 1 )
LDFLAGS := $( BITS) -march= $( TARGET_ARCH) -Llib -lpthread $( BACKEND_LDFLAGS) -static
ifeq ( $( CROSS) ,)
LDFLAGS += -no-pie
endif
ifeq ( $( WINDOWS_CONSOLE) ,1)
LDFLAGS += -mconsole
endif
e l s e i f e q ( $( TARGET_RPI ) , 1 )
LDFLAGS := $( OPT_FLAGS) -lm $( BACKEND_LDFLAGS) -no-pie
e l s e i f e q ( $( OSX_BUILD ) , 1 )
LDFLAGS := -lm $( BACKEND_LDFLAGS) -lpthread
e l s e
LDFLAGS := $( BITS) -march= $( TARGET_ARCH) -lm $( BACKEND_LDFLAGS) -no-pie -lpthread
# ifeq ($(DISCORDRPC),1)
# LDFLAGS += -ldl -Wl,-rpath .
# endif
e n d i f
# Coop specific libraries
# Lua
i f e q ( $( WINDOWS_BUILD ) , 1 )
ifeq ( $( TARGET_BITS) , 32)
LDFLAGS += -Llib/lua/win32 -l:liblua53.a
else
LDFLAGS += -Llib/lua/win64 -l:liblua53.a
endif
e l s e i f e q ( $( OSX_BUILD ) , 1 )
LDFLAGS += -L./lib/lua/mac/ -l lua53
e l s e
LDFLAGS += -Llib/lua/linux -l:liblua53.a
e n d i f
# Network
i f e q ( $( WINDOWS_BUILD ) , 1 )
LDFLAGS += -L"ws2_32" -lwsock32
ifeq ( $( DISCORD_SDK) ,1)
LDFLAGS += -Wl,-Bdynamic -L./lib/discordsdk/ -ldiscord_game_sdk -Wl,-Bstatic
endif
e l s e
ifeq ( $( DISCORD_SDK) ,1)
LDFLAGS += -ldiscord_game_sdk -Wl,-rpath . -Wl,-rpath lib/discordsdk
endif
e n d i f
# Prevent a crash with -sopt
export LANG := C
#==============================================================================#
# Extra CC Flags #
#==============================================================================#
2020-09-04 06:48:50 +02:00
# Identify that this is a coop build so that one patch can be applied to EX
# and/or COOP. They can choose to ifdef entity synchronization out.
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DCOOP
2020-09-04 06:48:50 +02:00
CFLAGS += -DCOOP
2020-09-04 11:04:37 +02:00
# Enforce -Werror in strict mode
i f e q ( $( STRICT ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -Werror
2021-08-20 03:16:16 +02:00
CFLAGS += -Werror
2020-09-04 10:55:54 +02:00
e n d i f
2020-05-13 23:33:12 +02:00
2020-09-02 07:06:36 +02:00
# Check for debug option
i f e q ( $( DEBUG ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DDEBUG
2020-09-02 07:06:36 +02:00
CFLAGS += -DDEBUG
e n d i f
2020-09-04 10:55:54 +02:00
# Check for enhancement options
2020-07-31 05:42:39 +02:00
# Check for immediate load option
i f e q ( $( IMMEDIATELOAD ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DIMMEDIATELOAD
2020-07-31 05:42:39 +02:00
CFLAGS += -DIMMEDIATELOAD
e n d i f
2020-09-05 02:02:09 +02:00
# Check for docker build workaround option
i f e q ( $( DOCKERBUILD ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DDOCKERBUILD
2020-09-05 02:02:09 +02:00
CFLAGS += -DDOCKERBUILD
e n d i f
2020-05-13 23:33:12 +02:00
# Check for Puppycam option
2020-05-08 03:24:42 +02:00
i f e q ( $( BETTERCAMERA ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DBETTERCAMERA
2020-05-13 23:33:12 +02:00
CFLAGS += -DBETTERCAMERA
EXT_OPTIONS_MENU := 1
2020-05-08 03:24:42 +02:00
e n d i f
2020-09-15 03:29:47 +02:00
#ifeq ($(TEXTSAVES),1)
2022-03-13 09:17:10 +01:00
# CC_CHECK_CFLAGS += -DTEXTSAVES
2020-09-15 03:29:47 +02:00
# CFLAGS += -DTEXTSAVES
#endif
2020-05-18 10:45:28 +02:00
2020-05-12 09:26:16 +02:00
# Check for no drawing distance option
2020-09-15 03:29:47 +02:00
#ifeq ($(NODRAWINGDISTANCE),1)
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DNODRAWINGDISTANCE
2020-05-13 23:33:12 +02:00
CFLAGS += -DNODRAWINGDISTANCE
2020-09-15 03:29:47 +02:00
#endif
2020-05-12 09:26:16 +02:00
2020-06-08 22:48:23 +02:00
# Check for Discord Rich Presence option
2020-09-15 03:29:47 +02:00
#ifeq ($(DISCORDRPC),1)
2022-03-13 09:17:10 +01:00
# CC_CHECK_CFLAGS += -DDISCORDRPC
2020-09-15 03:29:47 +02:00
# CFLAGS += -DDISCORDRPC
#endif
2020-06-08 22:48:23 +02:00
2020-09-19 09:51:40 +02:00
# Check for Discord SDK option
i f e q ( $( DISCORD_SDK ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DDISCORD_SDK
2020-09-19 09:51:40 +02:00
CFLAGS += -DDISCORD_SDK
e n d i f
2020-09-19 11:12:49 +02:00
# Check for development option
i f e q ( $( DEVELOPMENT ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DDEVELOPMENT
2020-09-19 11:12:49 +02:00
CFLAGS += -DDEVELOPMENT
e n d i f
2020-05-16 14:41:57 +02:00
# Check for texture fix option
i f e q ( $( TEXTURE_FIX ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DTEXTURE_FIX
2020-05-13 23:33:12 +02:00
CFLAGS += -DTEXTURE_FIX
e n d i f
# Check for extended options menu option
i f e q ( $( EXT_OPTIONS_MENU ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DEXT_OPTIONS_MENU
2020-05-13 23:33:12 +02:00
CFLAGS += -DEXT_OPTIONS_MENU
2020-05-16 14:41:57 +02:00
e n d i f
2020-05-19 15:32:01 +02:00
# Check for no bzero/bcopy workaround option
i f e q ( $( NO_BZERO_BCOPY ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DNO_BZERO_BCOPY
2020-05-19 15:32:01 +02:00
CFLAGS += -DNO_BZERO_BCOPY
e n d i f
2020-05-19 21:22:52 +02:00
# Use internal ldiv()/lldiv()
i f e q ( $( NO_LDIV ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DNO_LDIV
2020-05-19 21:22:52 +02:00
CFLAGS += -DNO_LDIV
e n d i f
2020-05-20 05:58:35 +02:00
# Use OpenGL 1.3
i f e q ( $( LEGACY_GL ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DLEGACY_GL
2020-05-20 05:58:35 +02:00
CFLAGS += -DLEGACY_GL
e n d i f
2020-05-25 03:21:36 +02:00
# Load external textures
2020-06-01 11:13:05 +02:00
i f e q ( $( EXTERNAL_DATA ) , 1 )
2022-03-13 09:17:10 +01:00
CC_CHECK_CFLAGS += -DEXTERNAL_DATA -DFS_BASEDIR= " \" $( BASEDIR) \" "
2020-06-07 20:05:26 +02:00
CFLAGS += -DEXTERNAL_DATA -DFS_BASEDIR= " \" $( BASEDIR) \" "
2020-05-25 03:21:36 +02:00
# tell skyconv to write names instead of actual texture data and save the split tiles so we can use them later
2020-06-07 21:00:57 +02:00
SKYTILE_DIR := $( BUILD_DIR) /textures/skybox_tiles
SKYCONV_ARGS := --store-names --write-tiles " $( SKYTILE_DIR) "
2022-03-13 09:17:10 +01:00
$( shell mkdir -p $( SKYTILE_DIR) )
e n d i f
#==============================================================================#
# Miscellaneous Tools #
#==============================================================================#
# N64 tools
MIO0TOOL := $( TOOLS_DIR) /mio0
N64CKSUM := $( TOOLS_DIR) /n64cksum
N64GRAPHICS := $( TOOLS_DIR) /n64graphics
N64GRAPHICS_CI := $( TOOLS_DIR) /n64graphics_ci
TEXTCONV := $( TOOLS_DIR) /textconv
AIFF_EXTRACT_CODEBOOK := $( TOOLS_DIR) /aiff_extract_codebook
VADPCM_ENC := $( TOOLS_DIR) /vadpcm_enc
EXTRACT_DATA_FOR_MIO := $( TOOLS_DIR) /extract_data_for_mio
SKYCONV := $( TOOLS_DIR) /skyconv
# Use the system installed armips if available. Otherwise use the one provided with this repository.
i f n e q ( , $( call find -command ,armips ) )
RSPASM := armips
2020-05-16 21:30:27 +02:00
e l s e
2022-03-13 09:17:10 +01:00
RSPASM := $( TOOLS_DIR) /armips
2020-09-13 06:16:10 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
ENDIAN_BITWIDTH := $( BUILD_DIR) /endian-and-bitwidth
2019-08-25 06:46:40 +02:00
EMULATOR = mupen64plus
EMU_FLAGS = --noosd
LOADER = loader64
LOADER_FLAGS = -vwf
SHA1SUM = sha1sum
2022-03-13 09:17:10 +01:00
PRINT = printf
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( COLOR ) , 1 )
NO_COL := \0 33[ 0m
RED := \0 33[ 0; 31m
GREEN := \0 33[ 0; 32m
BLUE := \0 33[ 0; 34m
YELLOW := \0 33[ 0; 33m
BLINK := \0 33[ 33; 5m
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# Use Objcopy instead of extract_data_for_mio
i f e q ( $( COMPILER ) , g c c )
EXTRACT_DATA_FOR_MIO := $( OBJCOPY) -O binary --only-section= .data
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# Common build print status function
d e f i n e p r i n t
@$( PRINT) " $( GREEN) $( 1) $( YELLOW) $( 2) $( GREEN) -> $( BLUE) $( 3) $( NO_COL) \n "
e n d e f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Main Targets #
#==============================================================================#
2020-06-02 21:37:43 +02:00
2020-06-09 17:15:49 +02:00
i f e q ( $( EXTERNAL_DATA ) , 1 )
2020-06-07 20:05:26 +02:00
BASEPACK_PATH := $( BUILD_DIR) /$( BASEDIR) /$( BASEPACK)
BASEPACK_LST := $( BUILD_DIR) /basepack.lst
2020-06-02 21:37:43 +02:00
2020-05-26 01:18:09 +02:00
# depend on resources as well
2020-06-07 20:05:26 +02:00
all : $( BASEPACK_PATH )
# phony target for building resources
res : $( BASEPACK_PATH )
# prepares the basepack.lst
$(BASEPACK_LST) : $( EXE )
2022-03-13 09:17:10 +01:00
@$( PRINT) " $( GREEN) Making basepack list. $( NO_COL) \n "
2020-06-07 20:05:26 +02:00
@mkdir -p $( BUILD_DIR) /$( BASEDIR)
@echo -n > $( BASEPACK_LST)
@echo " $( BUILD_DIR) /sound/bank_sets sound/bank_sets " >> $( BASEPACK_LST)
@echo " $( BUILD_DIR) /sound/sequences.bin sound/sequences.bin " >> $( BASEPACK_LST)
@echo " $( BUILD_DIR) /sound/sound_data.ctl sound/sound_data.ctl " >> $( BASEPACK_LST)
@echo " $( BUILD_DIR) /sound/sound_data.tbl sound/sound_data.tbl " >> $( BASEPACK_LST)
2020-06-07 21:00:57 +02:00
@$( foreach f, $( wildcard $( SKYTILE_DIR) /*) , echo $( f) gfx/$( f:$( BUILD_DIR) /%= %) >> $( BASEPACK_LST) ; )
2020-06-07 20:05:26 +02:00
@find actors -name \* .png -exec echo "{} gfx/{}" >> $( BASEPACK_LST) \;
@find levels -name \* .png -exec echo "{} gfx/{}" >> $( BASEPACK_LST) \;
@find textures -name \* .png -exec echo "{} gfx/{}" >> $( BASEPACK_LST) \;
# prepares the resource ZIP with base data
$(BASEPACK_PATH) : $( BASEPACK_LST )
2022-03-13 09:17:10 +01:00
@$( PRINT) " $( GREEN) Packing basepack zip file. $( NO_COL) \n "
$( V) $( PYTHON) $( TOOLS_DIR) /mkzip.py $( BASEPACK_LST) $( BASEPACK_PATH)
2020-06-02 16:57:23 +02:00
2020-05-25 03:21:36 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
#all: $(ROM)
all : $( EXE )
i f e q ( $( COMPARE ) , 1 )
@$( PRINT) " $( GREEN) Checking if ROM matches.. $( NO_COL) \n "
@$( SHA1SUM) --quiet -c $( TARGET) .sha1 && $( PRINT) " $( TARGET) : $( GREEN) OK $( NO_COL) \n " || ( $( PRINT) " $( YELLOW) Building the ROM file has succeeded, but does not match the original ROM.\nThis is expected, and not an error, if you are making modifications.\nTo silence this message, use 'make COMPARE=0.' $( NO_COL) \n " && false )
e n d i f
2019-08-25 06:46:40 +02:00
clean :
$( RM) -r $( BUILD_DIR_BASE)
2022-03-13 09:17:10 +01:00
2020-05-07 20:21:22 +02:00
cleantools :
2022-03-13 09:17:10 +01:00
$( MAKE) -s -C $( TOOLS_DIR) clean
2020-05-07 20:21:22 +02:00
2022-03-13 09:17:10 +01:00
distclean : clean
$( PYTHON) extract_assets.py --clean
cleantools
2019-08-25 06:46:40 +02:00
test : $( ROM )
$( EMULATOR) $( EMU_FLAGS) $<
load : $( ROM )
$( LOADER) $( LOADER_FLAGS) $<
2022-03-13 09:17:10 +01:00
libultra : $( BUILD_DIR ) /libultra .a
2020-06-09 17:15:49 +02:00
$(BUILD_DIR)/$(RPC_LIBS) :
@$( CP) -f $( RPC_LIBS) $( BUILD_DIR)
2022-03-13 09:17:10 +01:00
2020-09-13 06:16:10 +02:00
$(BUILD_DIR)/$(DISCORD_SDK_LIBS) :
@$( CP) -f $( DISCORD_SDK_LIBS) $( BUILD_DIR)
2022-01-17 03:07:45 +01:00
$(BUILD_DIR)/$(MOD_DIR) :
@$( CP) -f -r $( MOD_DIR) $( BUILD_DIR)
2022-03-13 09:17:10 +01:00
# Extra object file dependencies
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_N 64) , 1 )
$( BUILD_DIR) /asm/boot.o: $( IPL3_RAW_FILES)
$( BUILD_DIR) /src/game/crash_screen.o: $( CRASH_TEXTURE_C_FILES)
$( BUILD_DIR) /lib/rsp.o: $( BUILD_DIR) /rsp/rspboot.bin $( BUILD_DIR) /rsp/fast3d.bin $( BUILD_DIR) /rsp/audio.bin
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/sound_data.o : $( SOUND_BIN_DIR ) /sound_data .ctl .inc .c $( SOUND_BIN_DIR ) /sound_data .tbl .inc .c $( SOUND_BIN_DIR ) /sequences .bin .inc .c $( SOUND_BIN_DIR ) /bank_sets .inc .c
$(BUILD_DIR)/levels/scripts.o : $( BUILD_DIR ) /include /level_headers .h
2020-05-10 10:11:27 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( VERSION ) , s h )
$( BUILD_DIR) /src/audio/load.o: $( SOUND_BIN_DIR) /bank_sets.inc.c $( SOUND_BIN_DIR) /sequences_header.inc.c $( SOUND_BIN_DIR) /ctl_header.inc.c $( SOUND_BIN_DIR) /tbl_header.inc.c
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(CRASH_TEXTURE_C_FILES) : TEXTURE_ENCODING := u 32
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( COMPILER ) , g c c )
$( BUILD_DIR) /lib/src/math/%.o: CFLAGS += -fno-builtin
e n d i f
2019-10-05 21:08:05 +02:00
2019-08-25 06:46:40 +02:00
i f e q ( $( VERSION ) , e u )
2022-03-13 09:17:10 +01:00
TEXT_DIRS := text/de text/us text/fr
# EU encoded text inserted into individual segment 0x19 files,
# and course data also duplicated in leveldata.c
$( BUILD_DIR) /bin/eu/translation_en.o: $( BUILD_DIR) /text/us/define_text.inc.c
$( BUILD_DIR) /bin/eu/translation_de.o: $( BUILD_DIR) /text/de/define_text.inc.c
$( BUILD_DIR) /bin/eu/translation_fr.o: $( BUILD_DIR) /text/fr/define_text.inc.c
$( BUILD_DIR) /levels/menu/leveldata.o: $( BUILD_DIR) /include/text_strings.h
$( BUILD_DIR) /levels/menu/leveldata.o: $( BUILD_DIR) /text/us/define_courses.inc.c
$( BUILD_DIR) /levels/menu/leveldata.o: $( BUILD_DIR) /text/de/define_courses.inc.c
$( BUILD_DIR) /levels/menu/leveldata.o: $( BUILD_DIR) /text/fr/define_courses.inc.c
2020-03-02 04:42:52 +01:00
e l s e
2022-03-13 09:17:10 +01:00
ifeq ( $( VERSION) ,sh)
TEXT_DIRS := text/jp
$( BUILD_DIR) /bin/segment2.o: $( BUILD_DIR) /text/jp/define_text.inc.c
else
TEXT_DIRS := text/$( VERSION)
# non-EU encoded text inserted into segment 0x02
$( BUILD_DIR) /bin/segment2.o: $( BUILD_DIR) /text/$( VERSION) /define_text.inc.c
endif
2020-03-02 04:42:52 +01:00
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
ALL_DIRS := $( BUILD_DIR) $( addprefix $( BUILD_DIR) /,$( SRC_DIRS) $( GODDARD_SRC_DIRS) $( ULTRA_SRC_DIRS) $( ULTRA_BIN_DIRS) $( BIN_DIRS) $( TEXTURE_DIRS) $( TEXT_DIRS) $( SOUND_SAMPLE_DIRS) $( addprefix levels/,$( LEVEL_DIRS) ) rsp include) $( MIO0_DIR) $( addprefix $( MIO0_DIR) /,$( VERSION) ) $( SOUND_BIN_DIR) $( SOUND_BIN_DIR) /sequences/$( VERSION)
2019-08-25 06:46:40 +02:00
# Make sure build directory exists before compiling anything
DUMMY != mkdir -p $( ALL_DIRS)
2019-10-06 01:40:22 +02:00
$(BUILD_DIR)/include/text_strings.h : $( BUILD_DIR ) /include /text_menu_strings .h
$(BUILD_DIR)/src/menu/file_select.o : $( BUILD_DIR ) /include /text_strings .h
$(BUILD_DIR)/src/menu/star_select.o : $( BUILD_DIR ) /include /text_strings .h
2022-03-13 09:17:10 +01:00
$(BUILD_DIR)/src/game/camera.o : $( BUILD_DIR ) /include /text_strings .h
2019-08-25 06:46:40 +02:00
$(BUILD_DIR)/src/game/ingame_menu.o : $( BUILD_DIR ) /include /text_strings .h
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Texture Generation #
#==============================================================================#
TEXTURE_ENCODING := u8
2020-06-02 18:44:34 +02:00
2020-06-01 11:13:05 +02:00
i f e q ( $( EXTERNAL_DATA ) , 1 )
2022-03-13 09:17:10 +01:00
$( BUILD_DIR) /%: %.png
$( call print,Dummying:,$<,$@ )
$( V) $( PYTHON) $( TOOLS_DIR) /zeroterm.py " $( patsubst %.png,%,$^) " > $@
2020-05-25 03:21:36 +02:00
e l s e
2022-03-13 09:17:10 +01:00
# Convert PNGs to RGBA32, RGBA16, IA16, IA8, IA4, IA1, I8, I4 binary files
$( BUILD_DIR) /%: %.png
$( call print,Converting:,$<,$@ )
$( V) $( N64GRAPHICS) -s raw -i $@ -g $< -f $( lastword $( subst ., ,$@ ) )
$( BUILD_DIR) /%.inc.c: %.png
$( call print,Converting:,$<,$@ )
$( V) $( N64GRAPHICS) -s $( TEXTURE_ENCODING) -i $@ -g $< -f $( lastword ,$( subst ., ,$( basename $<) ) )
e n d i f
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( EXTERNAL_DATA ) , 0 )
# Color Index CI8
$( BUILD_DIR) /%.ci8: %.ci8.png
$( call print,Converting:,$<,$@ )
$( V) $( N64GRAPHICS_CI) -i $@ -g $< -f ci8
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
# Color Index CI4
$( BUILD_DIR) /%.ci4: %.ci4.png
$( call print,Converting:,$<,$@ )
$( V) $( N64GRAPHICS_CI) -i $@ -g $< -f ci4
2020-05-25 03:21:36 +02:00
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Compressed Segment Generation #
#==============================================================================#
2019-11-03 20:36:27 +01:00
2022-03-13 09:17:10 +01:00
i f e q ( $( TARGET_N 64) , 1 )
# Link segment file to resolve external labels
# TODO: ideally this would be `-Trodata-segment=0x07000000` but that doesn't set the address
$(BUILD_DIR)/%.elf : $( BUILD_DIR ) /%.o
$( call print,Linking ELF file:,$<,$@ )
$( V) $( LD) -e 0 -Ttext= $( SEGMENT_ADDRESS) -Map $@ .map -o $@ $<
# Override for leveldata.elf, which otherwise matches the above pattern
.SECONDEXPANSION :
$(BUILD_DIR)/levels/%/leveldata.elf : $( BUILD_DIR ) /levels /%/leveldata .o $( BUILD_DIR ) /bin /$$( TEXTURE_BIN ) .elf
$( call print,Linking ELF file:,$<,$@ )
$( V) $( LD) -e 0 -Ttext= $( SEGMENT_ADDRESS) -Map $@ .map --just-symbols= $( BUILD_DIR) /bin/$( TEXTURE_BIN) .elf -o $@ $<
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
$(BUILD_DIR)/%.bin : $( BUILD_DIR ) /%.elf
$( call print,Extracting compressionable data from:,$<,$@ )
$( V) $( EXTRACT_DATA_FOR_MIO) $< $@
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(BUILD_DIR)/levels/%/leveldata.bin : $( BUILD_DIR ) /levels /%/leveldata .elf
$( call print,Extracting compressionable data from:,$<,$@ )
$( V) $( EXTRACT_DATA_FOR_MIO) $< $@
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
# Compress binary file
$(BUILD_DIR)/%.mio0 : $( BUILD_DIR ) /%.bin
$( call print,Compressing:,$<,$@ )
$( V) $( MIO0TOOL) $< $@
# convert binary mio0 to object file
$(BUILD_DIR)/%.mio0.o : $( BUILD_DIR ) /%.mio 0
$( call print,Converting MIO0 to ELF:,$<,$@ )
$( V) printf " .section .data\n\n.incbin \" $<\"\n " | $( AS) $( ASFLAGS) -o $@
2020-05-25 03:21:36 +02:00
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Sound File Generation #
#==============================================================================#
2019-08-25 06:46:40 +02:00
$(BUILD_DIR)/%.table : %.aiff
2022-03-13 09:17:10 +01:00
$( call print,Extracting codebook:,$<,$@ )
$( V) $( AIFF_EXTRACT_CODEBOOK) $< >$@
2019-08-25 06:46:40 +02:00
$(BUILD_DIR)/%.aifc : $( BUILD_DIR ) /%.table %.aiff
2022-03-13 09:17:10 +01:00
$( call print,Encoding VADPCM:,$<,$@ )
$( V) $( VADPCM_ENC) -c $^ $@
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
$(ENDIAN_BITWIDTH) : $( TOOLS_DIR ) /determine -endian -bitwidth .c
@$( PRINT) " $( GREEN) Generating endian-bitwidth $( NO_COL) \n "
$( V) $( CC) -c $( CFLAGS) -o $@ .dummy2 $< 2>$@ .dummy1; true
$( V) grep -o 'msgbegin --endian .* --bitwidth .* msgend' $@ .dummy1 > $@ .dummy2
$( V) head -n1 <$@ .dummy2 | cut -d' ' -f2-5 > $@
@$( RM) $@ .dummy1
@$( RM) $@ .dummy2
2019-12-02 03:52:53 +01:00
$(SOUND_BIN_DIR)/sound_data.ctl : sound /sound_banks / $( SOUND_BANK_FILES ) $( SOUND_SAMPLE_AIFCS ) $( ENDIAN_BITWIDTH )
2022-03-13 09:17:10 +01:00
@$( PRINT) " $( GREEN) Generating: $( BLUE) $@ $( NO_COL) \n "
$( V) $( PYTHON) $( TOOLS_DIR) /assemble_sound.py $( BUILD_DIR) /sound/samples/ sound/sound_banks/ $( SOUND_BIN_DIR) /sound_data.ctl $( SOUND_BIN_DIR) /ctl_header $( SOUND_BIN_DIR) /sound_data.tbl $( SOUND_BIN_DIR) /tbl_header $( C_DEFINES) $$ ( cat $( ENDIAN_BITWIDTH) )
2019-08-25 06:46:40 +02:00
$(SOUND_BIN_DIR)/sound_data.tbl : $( SOUND_BIN_DIR ) /sound_data .ctl
2019-12-02 03:52:53 +01:00
@true
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/ctl_header : $( SOUND_BIN_DIR ) /sound_data .ctl
@true
2019-09-01 21:50:50 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/tbl_header : $( SOUND_BIN_DIR ) /sound_data .ctl
2019-12-02 03:52:53 +01:00
@true
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/sequences.bin : $( SOUND_BANK_FILES ) sound /sequences .json $( SOUND_SEQUENCE_DIRS ) $( SOUND_SEQUENCE_FILES ) $( ENDIAN_BITWIDTH )
@$( PRINT) " $( GREEN) Generating: $( BLUE) $@ $( NO_COL) \n "
$( V) $( PYTHON) $( TOOLS_DIR) /assemble_sound.py --sequences $@ $( SOUND_BIN_DIR) /sequences_header $( SOUND_BIN_DIR) /bank_sets sound/sound_banks/ sound/sequences.json $( SOUND_SEQUENCE_FILES) $( C_DEFINES) $$ ( cat $( ENDIAN_BITWIDTH) )
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/bank_sets : $( SOUND_BIN_DIR ) /sequences .bin
@true
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/sequences_header : $( SOUND_BIN_DIR ) /sequences .bin
@true
2020-06-01 11:13:05 +02:00
2022-03-13 09:17:10 +01:00
$(SOUND_BIN_DIR)/%.m64 : $( SOUND_BIN_DIR ) /%.o
$( call print,Converting to M64:,$<,$@ )
$( V) $( OBJCOPY) -j .rodata $< -O binary $@
2020-06-01 11:13:05 +02:00
2020-05-10 10:11:27 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Generated Source Code Files #
#==============================================================================#
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
i f e q ( $( EXTERNAL_DATA ) , 1 )
$( SOUND_BIN_DIR) /%.inc.c: $( SOUND_BIN_DIR) /%
$( call print,Dummying:,$<,$@ )
$( V) $( PYTHON) $( TOOLS_DIR) /zeroterm.py " $( patsubst $( BUILD_DIR) /%,%,$^) " | hexdump -v -e '1/1 "0x%X,"' > $@
2020-06-01 11:13:05 +02:00
e n d i f
2022-03-13 09:17:10 +01:00
# Convert binary file to a comma-separated list of byte values for inclusion in C code
$(BUILD_DIR)/%.inc.c : $( BUILD_DIR ) /%
$( call print,Piping:,$<,$@ )
$( V) hexdump -v -e '1/1 "0x%X,"' $< > $@
$( V) echo >> $@
2019-12-02 03:52:53 +01:00
2022-03-13 09:17:10 +01:00
# Generate animation data
2019-11-03 20:36:27 +01:00
$(BUILD_DIR)/assets/mario_anim_data.c : $( wildcard assets /anims /*.inc .c )
2022-03-13 09:17:10 +01:00
@$( PRINT) " $( GREEN) Generating animation data $( NO_COL) \n "
$( V) $( PYTHON) $( TOOLS_DIR) /mario_anims_converter.py > $@
2019-11-03 20:36:27 +01:00
2022-03-13 09:17:10 +01:00
# Generate demo input data
2019-11-03 20:36:27 +01:00
$(BUILD_DIR)/assets/demo_data.c : assets /demo_data .json $( wildcard assets /demos /*.bin )
2022-03-13 09:17:10 +01:00
@$( PRINT) " $( GREEN) Generating demo data $( NO_COL) \n "
$( V) $( PYTHON) $( TOOLS_DIR) /demo_data_converter.py assets/demo_data.json $( DEF_INC_CFLAGS) > $@
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
# Encode in-game text strings
$(BUILD_DIR)/include/text_strings.h : include /text_strings .h .in
$( call print,Encoding:,$<,$@ )
$( V) $( TEXTCONV) charmap.txt $< $@
$(BUILD_DIR)/include/text_menu_strings.h : include /text_menu_strings .h .in
$( call print,Encoding:,$<,$@ )
$( V) $( TEXTCONV) charmap_menu.txt $< $@
$(BUILD_DIR)/text/%/define_courses.inc.c : text /define_courses .inc .c text /%/courses .h
@$( PRINT) " $( GREEN) Preprocessing: $( BLUE) $@ $( NO_COL) \n "
$( V) $( CPP) $( CPPFLAGS) $< -o - -I text/$* / | $( TEXTCONV) charmap.txt - $@
$(BUILD_DIR)/text/%/define_text.inc.c : text /define_text .inc .c text /%/courses .h text /%/dialogs .h
@$( PRINT) " $( GREEN) Preprocessing: $( BLUE) $@ $( NO_COL) \n "
$( V) $( CPP) $( CPPFLAGS) $< -o - -I text/$* / | $( TEXTCONV) charmap.txt - $@
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
# Level headers
$(BUILD_DIR)/include/level_headers.h : levels /level_headers .h .in
$( call print,Preprocessing level headers:,$<,$@ )
$( V) $( CPP) $( CPPFLAGS) -I . levels/level_headers.h.in | $( PYTHON) $( TOOLS_DIR) /output_level_headers.py > $( BUILD_DIR) /include/level_headers.h
2020-06-02 18:44:34 +02:00
2022-03-13 09:17:10 +01:00
# Run asm_processor on files that have NON_MATCHING code
i f e q ( $( NON_MATCHING ) , 0 )
$(GLOBAL_ASM_O_FILES) : CC := $( V ) $( PYTHON ) $( TOOLS_DIR ) /asm_processor /build .py $( CC ) -- $( AS ) $( ASFLAGS ) --
2019-08-25 06:46:40 +02:00
e n d i f
2019-12-02 03:52:53 +01:00
# Rebuild files with 'GLOBAL_ASM' if the NON_MATCHING flag changes.
$(GLOBAL_ASM_O_FILES) : $( GLOBAL_ASM_DEP ) .$( NON_MATCHING )
$(GLOBAL_ASM_DEP).$(NON_MATCHING) :
2022-03-13 09:17:10 +01:00
@$( RM) $( GLOBAL_ASM_DEP) .*
$( V) touch $@
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
#==============================================================================#
# Compilation Recipes #
#==============================================================================#
# Compile C++ code
2020-05-07 20:21:22 +02:00
$(BUILD_DIR)/%.o : %.cpp
2022-03-13 09:17:10 +01:00
$( call print,Compiling:,$<,$@ )
2022-03-01 06:33:52 +01:00
@$( CXX) -fsyntax-only $( EXTRA_CPP_FLAGS) $( EXTRA_CPP_INCLUDES) $( CFLAGS) -MMD -MP -MT $@ -MF $( BUILD_DIR) /$* .d $<
2022-03-13 09:17:10 +01:00
$( V) $( CXX) -c $( EXTRA_CPP_FLAGS) $( EXTRA_CPP_INCLUDES) $( CFLAGS) -o $@ $<
2020-05-07 20:21:22 +02:00
2022-03-13 09:17:10 +01:00
# Compile C code
2019-08-25 06:46:40 +02:00
$(BUILD_DIR)/%.o : %.c
2022-03-13 09:17:10 +01:00
$( call print,Compiling:,$<,$@ )
2020-06-02 18:44:34 +02:00
@$( CC_CHECK) $( CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $( BUILD_DIR) /$* .d $<
2022-03-13 09:17:10 +01:00
$( V) $( CC) -c $( CFLAGS) -o $@ $<
2019-11-03 20:36:27 +01:00
$(BUILD_DIR)/%.o : $( BUILD_DIR ) /%.c
2022-03-13 09:17:10 +01:00
$( call print,Compiling:,$<,$@ )
2020-06-02 18:44:34 +02:00
@$( CC_CHECK) $( CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $( BUILD_DIR) /$* .d $<
2022-03-13 09:17:10 +01:00
$( V) $( CC) -c $( CFLAGS) -o $@ $<
# Alternate compiler flags needed for matching
i f e q ( $( COMPILER ) , i d o )
$( BUILD_DIR) /levels/%/leveldata.o: OPT_FLAGS := -g
$( BUILD_DIR) /actors/%.o: OPT_FLAGS := -g
$( BUILD_DIR) /bin/%.o: OPT_FLAGS := -g
$( BUILD_DIR) /src/goddard/%.o: OPT_FLAGS := -g
$( BUILD_DIR) /src/goddard/%.o: MIPSISET := -mips1
$( BUILD_DIR) /lib/src/%.o: OPT_FLAGS :=
$( BUILD_DIR) /lib/src/math/%.o: OPT_FLAGS := -O2
$( BUILD_DIR) /lib/src/math/ll%.o: OPT_FLAGS :=
$( BUILD_DIR) /lib/src/math/ll%.o: MIPSISET := -mips3 -32
$( BUILD_DIR) /lib/src/ldiv.o: OPT_FLAGS := -O2
$( BUILD_DIR) /lib/src/string.o: OPT_FLAGS := -O2
$( BUILD_DIR) /lib/src/gu%.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/al%.o: OPT_FLAGS := -O3
# For the asm-processor, since it doesn't support -O3. Probably not actually compiled with these flags.
ifeq ( $( VERSION) ,sh)
$( BUILD_DIR) /lib/src/unk_shindou_file.o: OPT_FLAGS := -O1
$( BUILD_DIR) /lib/src/func_sh_80304D20.o: OPT_FLAGS := -O1
$( BUILD_DIR) /lib/src/_Printf.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/contramread.o: OPT_FLAGS := -O1
$( BUILD_DIR) /lib/src/osPfsIsPlug.o: OPT_FLAGS := -O1
$( BUILD_DIR) /lib/src/osAiSetFrequency.o: OPT_FLAGS := -O1
$( BUILD_DIR) /lib/src/contramwrite.o: OPT_FLAGS := -O1
$( BUILD_DIR) /lib/src/sprintf.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/_Litob.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/_Ldtob.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/osDriveRomInit.o: OPT_FLAGS := -g
endif
ifeq ( $( VERSION) ,eu)
$( BUILD_DIR) /lib/src/_Litob.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/_Ldtob.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/_Printf.o: OPT_FLAGS := -O3
$( BUILD_DIR) /lib/src/sprintf.o: OPT_FLAGS := -O3
# Enable loop unrolling except for external.c (external.c might also have used
# unrolling, but it makes one loop harder to match).
# For all audio files other than external.c and port_eu.c, put string literals
# in .data. (In Shindou, the port_eu.c string literals also moved to .data.)
$( BUILD_DIR) /src/audio/%.o: OPT_FLAGS := -O2 -use_readwrite_const
$( BUILD_DIR) /src/audio/port_eu.o: OPT_FLAGS := -O2
$( BUILD_DIR) /src/audio/external.o: OPT_FLAGS := -O2 -Wo,-loopunroll,0
endif
ifeq ( $( VERSION_JP_US) ,true)
$( BUILD_DIR) /src/audio/%.o: OPT_FLAGS := -O2 -Wo,-loopunroll,0
$( BUILD_DIR) /src/audio/load.o: OPT_FLAGS := -O2 -framepointer -Wo,-loopunroll,0
endif
ifeq ( $( VERSION_JP_US) ,true)
# The source-to-source optimizer copt is enabled for audio. This makes it use
# acpp, which needs -Wp,-+ to handle C++-style comments.
# All other files than external.c should really use copt, but only a few have
# been matched so far.
$( BUILD_DIR) /src/audio/effects.o: OPT_FLAGS := -O2 -Wo,-loopunroll,0 -sopt,-inline= sequence_channel_process_sound,-scalaroptimize= 1 -Wp,-+
$( BUILD_DIR) /src/audio/synthesis.o: OPT_FLAGS := -O2 -sopt,-scalaroptimize= 1 -Wp,-+
endif
2019-11-03 20:36:27 +01:00
2022-03-13 09:17:10 +01:00
# Add a target for build/eu/src/audio/*.copt to make it easier to see debug
$(BUILD_DIR)/src/audio/%.acpp : src /audio /%.c
$( ACPP) $( TARGET_CFLAGS) $( DEF_INC_CFLAGS) -D__sgi -+ $< > $@
$(BUILD_DIR)/src/audio/%.copt : $( BUILD_DIR ) /src /audio /%.acpp
$( COPT) -signed -I= $< -CMP= $@ -cp= i -scalaroptimize= 1 $( COPTFLAGS)
$(BUILD_DIR)/src/audio/seqplayer.copt : COPTFLAGS := -inline_manual
2019-08-25 06:46:40 +02:00
2022-02-12 21:27:20 +01:00
e n d i f
2019-08-25 06:46:40 +02:00
2022-03-13 09:17:10 +01:00
# Run linker script through the C preprocessor
$(BUILD_DIR)/$(LD_SCRIPT) : $( LD_SCRIPT )
$( call print,Preprocessing linker script:,$<,$@ )
$( V) $( CPP) $( CPPFLAGS) -DBUILD_DIR= $( BUILD_DIR) -MMD -MP -MT $@ -MF $@ .d -o $@ $<
# Assemble assembly code
$(BUILD_DIR)/%.o : %.s
$( call print,Assembling:,$<,$@ )
$( V) $( AS) $( ASFLAGS) -MD $( BUILD_DIR) /$* .d -o $@ $<
i f e q ( $( TARGET_N 64) , 1 )
# Assemble RSP assembly code
$( BUILD_DIR) /rsp/%.bin $( BUILD_DIR) /rsp/%_data.bin: rsp/%.s
$( call print,Assembling:,$<,$@ )
$( V) $( RSPASM) -sym $@ .sym $( RSPASMFLAGS) -strequ CODE_FILE $( BUILD_DIR) /rsp/$* .bin -strequ DATA_FILE $( BUILD_DIR) /rsp/$* _data.bin $<
# Link libultra
$( BUILD_DIR) /libultra.a: $( ULTRA_O_FILES)
@$( PRINT) " $( GREEN) Linking libultra: $( BLUE) $@ $( NO_COL) \n "
$( V) $( AR) rcs -o $@ $( ULTRA_O_FILES)
$( V) $( TOOLS_DIR) /patch_libultra_math $@
# Link libgoddard
$( BUILD_DIR) /libgoddard.a: $( GODDARD_O_FILES)
@$( PRINT) " $( GREEN) Linking libgoddard: $( BLUE) $@ $( NO_COL) \n "
$( V) $( AR) rcs -o $@ $( GODDARD_O_FILES)
# Link SM64 ELF file
$( ELF) : $( O_FILES) $( MIO0_OBJ_FILES) $( SEG_FILES) $( BUILD_DIR) /$( LD_SCRIPT) undefined_syms.txt $( BUILD_DIR) /libultra.a $( BUILD_DIR) /libgoddard.a
@$( PRINT) " $( GREEN) Linking ELF file: $( BLUE) $@ $( NO_COL) \n "
$( V) $( LD) -L $( BUILD_DIR) -T undefined_syms.txt -T $( BUILD_DIR) /$( LD_SCRIPT) -Map $( BUILD_DIR) /sm64.$( VERSION) .map --no-check-sections $( addprefix -R ,$( SEG_FILES) ) -o $@ $( O_FILES) -lultra -lgoddard
# Build ROM
$( ROM) : $( ELF)
$( call print,Building ROM:,$<,$@ )
$( V) $( OBJCOPY) --pad-to= 0x800000 --gap-fill= 0xFF $< $( @:.z64= .bin) -O binary
$( V) $( N64CKSUM) $( @:.z64= .bin) $@
$( BUILD_DIR) /$( TARGET) .objdump: $( ELF)
$( OBJDUMP) -D $< > $@
e l s e
$( EXE) : $( O_FILES) $( MIO0_FILES:.mio0= .o) $( ULTRA_O_FILES) $( GODDARD_O_FILES) $( BUILD_DIR) /$( RPC_LIBS) $( BUILD_DIR) /$( DISCORD_SDK_LIBS) $( BUILD_DIR) /$( MOD_DIR)
$( LD) -L $( BUILD_DIR) -o $@ $( O_FILES) $( ULTRA_O_FILES) $( GODDARD_O_FILES) $( LDFLAGS) $( EXTRA_INCLUDES)
e n d i f
2019-08-25 06:46:40 +02:00
2020-05-25 03:21:36 +02:00
.PHONY : all clean distclean default diff test load libultra res
2019-12-02 03:52:53 +01:00
.PRECIOUS : $( BUILD_DIR ) /bin /%.elf $( SOUND_BIN_DIR ) /%.ctl $( SOUND_BIN_DIR ) /%.tbl $( SOUND_SAMPLE_TABLES ) $( SOUND_BIN_DIR ) /%.s $( BUILD_DIR ) /%
2022-03-13 09:17:10 +01:00
# with no prerequisites, .SECONDARY causes no intermediate target to be removed
.SECONDARY :
2019-08-25 06:46:40 +02:00
# Remove built-in rules, to improve performance
MAKEFLAGS += --no-builtin-rules
- i n c l u d e $( DEP_FILES )
2022-03-13 09:17:10 +01:00
print-% : ; $( info $ * is a $ ( flavor $ *) variable set to [$ ( $ *) ]) @true