diff --git a/Makefile.port b/Makefile.port new file mode 100644 index 000000000..8361f2673 --- /dev/null +++ b/Makefile.port @@ -0,0 +1,254 @@ +# Options. + +# HOST_PLATFORM - Which platform we're building on. +# +# Determined automatically if not specified on command line. +# +# Supported values: +# * i686-windows +# * i686-linux + +HOST_PLATFORM ?= + +# TARGET_PLATFORM - Which platform to build for. +# +# Determined from HOST_PLATFORM if not specified on command line. +# +# Supported values: +# * i686-windows +# * i686-linux + +TARGET_PLATFORM ?= + +# ROMID - The ROM version to use. +# +# Can be set in your environment using +# $ export ROMID=... +# +# Supported values: +# * ntsc-final + +ROMID ?= ntsc-final + +# GCC_OPT_LVL - the optimisation level if building with gcc. +# +# Supported values: -O0, -O1, -O2, -O3, -Os, -Og + +GCC_OPT_LVL = -O0 + +# ROM_SIZE - The desired ROM size in megabytes. +# +# All versions of the retail ROM are 32MB. +# +# If this is too low you might get this error from ld: +# "final link failed: memory exhausted" + +ROM_SIZE := 32 + +# DEBUG - Enable (1) or disable (0) the debug menu and crash screen. +# +# When enabled, press C-up and C-down simultaneously to toggle the debug menu. +# Note that some emulators have problems displaying the crash screen text. + +DEBUG = 0 + +################################################################################ + +# Detect host platform if not specified. +ifeq ($(HOST_PLATFORM),) + ifeq ($(OS),Windows_NT) + # assume msys for now + UNAME_OS := $(shell uname -s) + ifneq (,$(findstring MINGW64,$(UNAME_OS))) + HOST_PLATFORM := x86_64-windows + else + HOST_PLATFORM := i686-windows + endif + else # TODO + UNAME_ARCH := $(shell uname -p) + UNAME_OS := $(shell uname -s) + UNAME_OS := `echo $(UNAME_OS) | tr A-Z a-z` + HOST_PLATFORM := $(UNAME_ARCH)-$(UNAME_OS) + endif +endif + +$(info Host platform: $(HOST_PLATFORM)) + +# Set target platform to host platform if not specified. +ifeq ($(TARGET_PLATFORM),) + TARGET_PLATFORM := $(HOST_PLATFORM) +endif + +$(info Target platform: $(TARGET_PLATFORM)) + +# Set whether the target arch is 64- or 32-bit. +ifneq (,$(findstring 64,$(TARGET_PLATFORM))) + # TODO: we're not 64-bit compatible yet + $(error 64-bit target platforms are not supported yet.) + TARGET_64BIT = 1 +else # TODO + TARGET_64BIT = 0 +endif + +# Set whether the target is big-endian or little-endian. +TARGET_BIG_ENDIAN = 0 # TODO + +# The VERSION constant is used in the source to handle version-specific code. +ifeq ($(ROMID),ntsc-final) + VERSION = 2 +else + $(error ROM version $(VERSION) is not supported.) +endif + +DEFINES := \ + VERSION=$(VERSION) \ + MATCHING=0 \ + PAL=0 \ + PIRACYCHECKS=0 \ + ROM_SIZE=$(ROM_SIZE) \ + _LANGUAGE_C=1 + +ifeq ($(DEBUG),1) + DEFINES := $(DEFINES) DEBUG=1 +endif + +C_DEFINES := $(foreach d,$(DEFINES),-D$(d)) + +A_DIR := src/assets/$(ROMID) +B_DIR := build/$(ROMID)-port +E_DIR := extracted/$(ROMID) + +ifneq (,$(findstring x86_64,$(TARGET_PLATFORM))) + TOOLCHAIN_ARCH := x86_64 +else # TODO + TOOLCHAIN_ARCH := i686 +endif + +ifneq (,$(findstring windows,$(TARGET_PLATFORM))) + TOOLCHAIN := $(TOOLCHAIN_ARCH)-w64-mingw32 + TARGET_LDFLAGS := $(shell pkg-config sdl2 --libs) -lz -lopengl32 + TARGET_CFLAGS := $(shell pkg-config sdl2 --cflags-only-I) +else # TODO + TOOLCHAIN := $(TOOLCHAIN_ARCH)-linux-gnu + TARGET_LDFLAGS := $(shell pkg-config sdl2 --libs) -lGL -lz + TARGET_CFLAGS := $(shell pkg-config sdl2 --cflags-only-I) +endif + +# These are still used in the port, but only to generate headers. +LANG_JSON_FILES := $(shell find $(A_DIR) -path '*/lang/*.json') +PADS_JSON_FILES := $(shell find $(A_DIR) -path '*/pads/*.json') +TILES_JSON_FILES := $(shell find $(A_DIR) -path '*/tiles/*.json') + +C_FILES := $(shell find src/game port -name '*.c') +C_FILES := $(C_FILES) \ + $(wildcard src/lib/mp3/*.c) \ + $(wildcard src/lib/naudio/*.c) \ + $(wildcard src/lib/ultra/audio/*.c) \ + $(wildcard src/lib/ultra/gu/*.c) \ + src/lib/ultra/io/vimodentsclan1.c \ + src/lib/ultra/io/vimodepallan1.c \ + src/lib/ultra/io/vimodempallan1.c \ + src/lib/ultra/io/vitbl.c \ + $(wildcard src/lib/a*.c) \ + src/lib/base.c \ + src/lib/collision.c \ + src/lib/debughud.c \ + src/lib/dma.c \ + src/lib/fault.c \ + src/lib/joy.c \ + $(wildcard src/lib/lib_*.c) \ + src/lib/mema.c \ + src/lib/memp.c \ + src/lib/model.c \ + src/lib/modelasm_c.c \ + src/lib/mp3.c \ + src/lib/mtx_c.c \ + src/lib/mtx.c \ + src/lib/music.c \ + src/lib/path.c \ + src/lib/profile.c \ + src/lib/rdp.c \ + src/lib/rmon.c \ + src/lib/rng_c.c \ + src/lib/rzip_c.c \ + src/lib/snd.c \ + src/lib/speaker.c \ + src/lib/varsinit.c \ + src/lib/vi.c \ + src/textureconfig.c + +CXX_FILES :=$(shell find port -name '*.cpp') + +C_O_FILES := $(patsubst %.c, $(B_DIR)/%.o, $(C_FILES)) +CXX_O_FILES := $(patsubst %.cpp, $(B_DIR)/%.o, $(CXX_FILES)) + +O_FILES := $(C_O_FILES) $(CXX_O_FILES) + +INCLUDES = \ + -I include \ + -I include/PR \ + -I src/include \ + -I src/generated/$(ROMID) \ + -I src/lib/ultra/audio \ + -I port/include + +CC := $(TOOLCHAIN)-gcc -std=gnu11 +CXX := $(TOOLCHAIN)-g++ -std=gnu++20 +ifneq (,$(CXX_O_FILES)) + LD := $(CXX) +else + LD := $(CC) +endif + +$(C_O_FILES): OPT_LVL := $(GCC_OPT_LVL) + +COMMON_CFLAGS := $(C_DEFINES) -DAVOID_UB=1 $(INCLUDES) $(TARGET_CFLAGS) -g \ + -fno-inline-functions \ + -fno-strict-aliasing \ + -funsigned-char \ + -fwrapv \ + -Wall \ + -Wno-address \ + -Wno-aggressive-loop-optimizations \ + -Wno-int-in-bool-context \ + -Wno-misleading-indentation \ + -Wno-missing-braces \ + -Wno-multichar \ + -Wno-tautological-compare \ + -Wno-unused-but-set-variable \ + -Wno-unused-value \ + -Wno-unused-variable + +CFLAGS := $(COMMON_CFLAGS) -Wno-pointer-sign +CXXFLAGS := $(COMMON_CFLAGS) -Wno-unused-function +LDFLAGS := $(TARGET_LDFLAGS) + +# Make ROMID available as an environment variable to all tooling. +# (We use this a lot) +export ROMID + +BIN := $(B_DIR)/pd.exe + +default: $(BIN) + +$(BIN): $(O_FILES) + $(LD) $(COMMON_CFLAGS) $(OPT_LVL) -o $(BIN) $^ $(LDFLAGS) + +$(B_DIR)/%.o: %.c + @mkdir -p $(dir $@) + $(CC) -c $(CFLAGS) $(OPT_LVL) -o $@ $< + +$(B_DIR)/%.o: %.cpp + @mkdir -p $(dir $@) + $(CXX) -c $(CXXFLAGS) $(OPT_LVL) -o $@ $< + +clean: + rm -rf build/$(ROMID)-port +# rm -rf src/generated/$(ROMID) + +allclean: + rm -rf build/* +# rm -rf src/generated + +codeclean: + find $(B_DIR)/game $(B_DIR)/inflate $(B_DIR)/lib -name '*.o' -delete