tuxanci2-engine
Game engine for tuxanci2
Log | Files | Refs | README | LICENSE
commit cb2ae2f271a9c19db844295fb9f34f59c1181c3a
parent cd1fb6247221505b3e6dad39b048fbc083f197ae
Author: Connor Thomson <connor@gnufault.org>
Date:   Sun, 25 Oct 2026 21:22:43 -0700

Make the build system a bit better

Diffstat:
MMakefile | 497+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Dplatforms/cocoa/.gitignore | 1-
Dplatforms/cocoa/Makefile | 43-------------------------------------------
Dplatforms/dos/.gitignore | 4----
Dplatforms/dos/Makefile | 35-----------------------------------
Dplatforms/dreamcast/.gitignore | 2--
Dplatforms/dreamcast/Makefile | 96-------------------------------------------------------------------------------
Dplatforms/n64/.gitignore | 1-
Dplatforms/n64/Makefile | 64----------------------------------------------------------------
Dplatforms/ps1/.gitignore | 3---
Dplatforms/ps1/Makefile | 141-------------------------------------------------------------------------------
Dplatforms/saturn/.gitignore | 2--
Dplatforms/saturn/Makefile | 45---------------------------------------------
Dplatforms/wayland/.gitignore | 2--
Dplatforms/wayland/Makefile | 42------------------------------------------
Dplatforms/win32/.gitignore | 1-
Dplatforms/win32/Makefile | 41-----------------------------------------
Mplatforms/win32/installer.nsi | 16++++++++++++++--
Dplatforms/x11/.gitignore | 2--
Dplatforms/x11/Makefile | 33---------------------------------
Dplatforms/xbox/.gitignore | 1-
Dplatforms/xbox/Makefile | 53-----------------------------------------------------
22 files changed, 451 insertions(+), 674 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,89 +1,466 @@ -CC ?= cc -AR ?= ar -XXD ?= xxd -MARCH ?= native -OPT ?= -O2 -BITS ?= $(shell getconf LONG_BIT) +SELF := $(abspath $(firstword $(MAKEFILE_LIST))) +ROOT := $(patsubst %/,%,$(dir $(SELF))) +PLATFORMS := $(shell ls "$(ROOT)/platforms") +OUT_DIR := $(ROOT)/build +OBJ_ROOT := $(ROOT)/build -.DEFAULT_GOAL := all +XXD ?= xxd -CSTD := c99 -SRC_DIR := src -FILES_DIR := files -INCLUDE_DIR := include -BUILD_DIR := build +TAB_DIR := $(OBJ_ROOT)/game +TAB_FILE := $(TAB_DIR)/tuxanci2.tab -OUT := $(BUILD_DIR)/tuxanci2.a +$(TAB_FILE): FORCE + env -u MAKEFLAGS -u MFLAGS $(MAKE) -C "$(ROOT)/game" BUILD="$(TAB_DIR)" $(if $(CROSS),CROSS="$(CROSS)") -CONFIG_HEADER := $(BUILD_DIR)/ta_config.h +FORCE: +.PHONY: FORCE + +ifeq ($(TA_PLATFORM),) + +.DEFAULT_GOAL := help +.NOTPARALLEL: +.PHONY: help tab clean distclean win32-installer $(PLATFORMS) + +help: + echo 'Usage: make <platform>' -FLAGS := -ffreestanding -nostdlib -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Wall -Wextra -Werror -pedantic -pedantic-errors +$(PLATFORMS): + $(MAKE) TA_PLATFORM=$@ + +win32-installer: + $(MAKE) TA_PLATFORM=win32 INSTALLER=1 + +tab: $(TAB_FILE) + if [ -d "$(OUT_DIR)" ]; then cp -f "$(TAB_FILE)" "$(OUT_DIR)/"; fi + +clean: + rm -rf "$(OUT_DIR)" + if [ -d "$(OBJ_ROOT)" ]; then \ + find "$(OBJ_ROOT)" -mindepth 1 -maxdepth 1 ! -name dreamcast -exec rm -rf {} + ; \ + if [ -d "$(OBJ_ROOT)/dreamcast" ]; then \ + find "$(OBJ_ROOT)/dreamcast" -mindepth 1 -maxdepth 1 \ + ! -name KallistiOS ! -name toolchain ! -name environ.sh ! -name .kos-source-copied \ + -exec rm -rf {} + ; \ + fi; \ + fi + find "$(ROOT)/platforms/saturn/joengine/jo_engine" -name '*.o' -delete 2>/dev/null || true + +distclean: + rm -rf "$(OUT_DIR)" "$(OBJ_ROOT)" + find "$(ROOT)/platforms/saturn/joengine/jo_engine" -name '*.o' -delete 2>/dev/null || true -# Needed for ta_types.h -ifeq ($(BITS),64) - ARCH_DEFINE := -DTA_64BIT else - ARCH_DEFINE := -DTA_32BIT + +ifeq ($(filter $(TA_PLATFORM),$(PLATFORMS)),) +$(error unknown platform '$(TA_PLATFORM)' (platforms: $(PLATFORMS))) endif -CFLAGS := $(OPT) -march=$(MARCH) -mtune=$(MARCH) -m$(BITS) $(ARCH_DEFINE) -I$(INCLUDE_DIR) -I$(BUILD_DIR) -std=$(CSTD) $(FLAGS) +.DEFAULT_GOAL := build -ifeq ($(TA_DISABLE_BILINEAR_FILTERING),true) -CFLAGS += -DTA_DISABLE_BILINEAR_FILTERING +OBJ := $(OBJ_ROOT)/$(TA_PLATFORM) + +OPT ?= -O2 +BITS := $(shell getconf LONG_BIT) +MARCH := native + +ENGINE_SRCS := $(shell find "$(ROOT)/src" -type f -name '*.c' | sort) +ASSETS := $(shell find "$(ROOT)/files" -type f -not -name 'LICENSE' | sort) +HEADERS := $(wildcard $(ROOT)/include/*.h $(ROOT)/include/screens/*.h) +GENERATED_SRCS := $(patsubst $(ROOT)/files/%,$(OBJ)/%,$(addsuffix .c,$(basename $(ASSETS)))) +ENGINE_SRC_OBJS := $(patsubst $(ROOT)/src/%.c,$(OBJ)/src/%.o,$(ENGINE_SRCS)) +GENERATED_OBJS := $(GENERATED_SRCS:.c=.o) +ENGINE_OBJS := $(ENGINE_SRC_OBJS) $(GENERATED_OBJS) + +CONFIG_HEADER := $(OBJ)/ta_config.h +FLAGS_STAMP := $(OBJ)/.engine-flags +ENGINE_LIB := $(OBJ)/tuxanci2.a + +PLATFORM_FILES := + +ifeq ($(TA_PLATFORM),x11) +HOST_SRC := $(ROOT)/platforms/x11/x11.c +HOST_CFLAGS := -O2 +HOST_LDLIBS := -lX11 endif -ARFLAGS := rcs +ifeq ($(TA_PLATFORM),wayland) +HOST_SRC := $(ROOT)/platforms/wayland/wayland.c +HOST_CFLAGS := -O2 +HOST_LDLIBS := -lwayland-client -lxkbcommon -lrt -lm +XDG_SHELL_H := $(OBJ)/xdg-shell-client-protocol.h +XDG_SHELL_C := $(OBJ)/xdg-shell-protocol.c +HOST_EXTRA_SRCS := $(XDG_SHELL_C) +HOST_DEPS := $(XDG_SHELL_H) -SRCS := $(shell find $(SRC_DIR) -type f -name '*.c') -ASSETS := $(shell find $(FILES_DIR) -type f -not -name 'LICENSE') -ASSET_PATHS := $(patsubst $(FILES_DIR)/%,%,$(ASSETS)) -GENERATED_SRCS := $(addprefix $(BUILD_DIR)/,$(addsuffix .c,$(basename $(ASSET_PATHS)))) -OBJS := $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRCS)) \ - $(patsubst $(BUILD_DIR)/%.c, $(BUILD_DIR)/%.o, $(GENERATED_SRCS)) -.SECONDARY: $(GENERATED_SRCS) -CONFIG_HEADER_IN := $(INCLUDE_DIR)/ta_config.h.in +$(XDG_SHELL_H): + mkdir -p $(@D) + wayland-scanner client-header $$(pkg-config --variable=pkgdatadir wayland-protocols)/stable/xdg-shell/xdg-shell.xml $@ -define ASSET_C_RULE -$(BUILD_DIR)/$(basename $(patsubst $(FILES_DIR)/%,%,$(1))).c: $(1) - mkdir -p $$(dir $$@) - $$(XXD) -i -n $$(shell printf '%s' 'ta_file_$(notdir $(basename $(1)))' | sed 's/[^a-zA-Z0-9_]/_/g; /^[0-9]/s/^/_/') $$< $$@ -endef +$(XDG_SHELL_C): + mkdir -p $(@D) + wayland-scanner private-code $$(pkg-config --variable=pkgdatadir wayland-protocols)/stable/xdg-shell/xdg-shell.xml $@ +endif + +ifeq ($(TA_PLATFORM),cocoa) +HOST_SRC := $(ROOT)/platforms/cocoa/cocoa.m +COCOA_TRIPLE := $(shell $(CC) -dumpmachine 2>/dev/null) +ifneq ($(findstring darwin,$(COCOA_TRIPLE))$(findstring macos,$(COCOA_TRIPLE)),) +HOST_CFLAGS := -O2 -Wno-deprecated-declarations +HOST_LDLIBS := -framework Cocoa +else +HOST_CFLAGS := -O2 $(filter-out -MMD -MP,$(shell gnustep-config --objc-flags)) +HOST_LDLIBS := $(shell gnustep-config --gui-libs) +endif +endif + +ifeq ($(TA_PLATFORM),dos) +CC := i586-pc-msdosdjgpp-gcc +AR := i586-pc-msdosdjgpp-ar +BITS := 32 +MARCH := i386 +HOST_SRC := $(ROOT)/platforms/dos/dos.c +HOST_CFLAGS := -O2 -march=$(MARCH) -mtune=$(MARCH) +EXE_EXT := .exe +PLATFORM_FILES += $(wildcard $(ROOT)/platforms/dos/CWSDPMI.EXE) +endif + +ifeq ($(TA_PLATFORM),win32) +CC := i686-w64-mingw32-gcc +AR := i686-w64-mingw32-ar +BITS := 32 +MARCH := i686 +HOST_SRC := $(ROOT)/platforms/win32/win32.c +HOST_CFLAGS := -O2 -Wall +HOST_LDFLAGS := -Wl,--subsystem,windows:95 +HOST_LDLIBS := -lgdi32 -luser32 +EXE_EXT := .exe +endif -$(foreach asset,$(ASSETS),$(eval $(call ASSET_C_RULE,$(asset)))) +ifeq ($(TA_PLATFORM),ps1) +NUGGET ?= $(ROOT)/platforms/ps1/nugget +NUGGET := $(abspath $(NUGGET)) +ifndef PS1_PREFIX +PS1_PREFIX := $(firstword $(foreach p,mipsel-none-elf mipsel-linux-gnu,$(if $(shell command -v $(p)-gcc 2>/dev/null),$(p)))) +endif +ifeq ($(PS1_PREFIX),) +$(error You need to install mipsel-none-elf-gcc or mipsel-linux-gnu-gcc or set PS1_PREFIX) +endif +ifeq ($(wildcard $(NUGGET)/ps-exe.ld),) +$(error nugget not found at '$(NUGGET)') +endif +PS1_OFORMAT ?= $(if $(filter mipsel-none-elf,$(PS1_PREFIX)),elf32-littlemips,elf32-tradlittlemips) +PS1_REGION ?= US +PS1_TEXT ?= +PS1_TMD ?= $(ROOT)/platforms/ps1/logo.tmd +MKPSXISO ?= mkpsxiso +PSXLICENSEPATCH ?= psxlicensepatch -all: $(CONFIG_HEADER) $(GENERATED_SRCS) $(OUT) +CC := $(PS1_PREFIX)-gcc +AR := $(PS1_PREFIX)-gcc-ar +PS1_OBJCOPY := $(PS1_PREFIX)-objcopy +BITS := 32 -generated: $(CONFIG_HEADER) $(GENERATED_SRCS) +PS1_OBJ := $(OBJ)/platform +PS1_ISO_DIR := $(OBJ)/iso +PS1_ELF := $(OBJ)/psx.elf +PS1_MAP := $(OBJ)/psx.map +PS1_EXE := $(PS1_ISO_DIR)/PSX.EXE +PS1_CNF := $(PS1_ISO_DIR)/SYSTEM.CNF +PS1_XML := $(PS1_ISO_DIR)/tuxanci2.xml +PS1_BIN := $(OBJ)/tuxanci2.bin +PS1_CUE := $(OBJ)/tuxanci2.cue -$(OUT): $(OBJS) - $(AR) $(ARFLAGS) $@ $^ +PS1_ARCHFLAGS := -march=mips1 -mabi=32 -EL -fno-pic -mno-shared -mno-abicalls -mfp32 -msoft-float -mno-llsc -G0 -fno-stack-protector -nostdlib -ffreestanding +PS1_COMMONFLAGS := -ffunction-sections -fdata-sections -mno-gpopt -fomit-frame-pointer -fno-builtin -fno-strict-aliasing -Wno-attributes +PS1_CFLAGS := -O2 $(PS1_ARCHFLAGS) $(PS1_COMMONFLAGS) -Wall -Wextra \ + -I$(ROOT)/include -I$(OBJ) -I$(NUGGET) -DTA_32BIT +PS1_NUGGET_CFLAGS := -O2 $(PS1_ARCHFLAGS) $(PS1_COMMONFLAGS) -I$(NUGGET) +PS1_LDFLAGS := -Wl,-Map=$(PS1_MAP) -nostdlib -T$(NUGGET)/nooverlay.ld -T$(NUGGET)/ps-exe.ld -static -Wl,--gc-sections $(PS1_ARCHFLAGS) -Wl,--oformat=$(PS1_OFORMAT) -$(BUILD_DIR): - mkdir -p $(BUILD_DIR) +ENGINE_CFLAGS := -O2 $(PS1_ARCHFLAGS) $(PS1_COMMONFLAGS) -DTA_32BIT -DTA_DISABLE_BILINEAR_FILTERING -I$(ROOT)/include -I$(OBJ) -std=c99 -nostdinc -Wall -Wextra -Werror -pedantic -pedantic-errors -$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR) - mkdir -p $(dir $@) - $(CC) $(CFLAGS) -c $< -o $@ +PS1_NUGGET_SRCS := common/crt0/crt0.s common/crt0/memory-s.s common/crt0/memory-c.c common/crt0/clz.c third_party/arith64/arith64.c +PS1_NUGGET_OBJS := $(addprefix $(PS1_OBJ)/nugget/,$(addsuffix .o,$(basename $(PS1_NUGGET_SRCS)))) +PS1_OBJS := $(PS1_NUGGET_OBJS) $(PS1_OBJ)/ps1.o -TA_IMAGE_FILTER_CONFIG := $(BUILD_DIR)/ta_image_filtering.config +$(PS1_OBJ)/ps1.o: $(ROOT)/platforms/ps1/ps1.c $(ENGINE_LIB) $(HEADERS) + mkdir -p $(@D) + $(CC) $(PS1_CFLAGS) -c $< -o $@ -$(TA_IMAGE_FILTER_CONFIG): FORCE | $(BUILD_DIR) - @printf '%s\n' '$(if $(filter true,$(TA_DISABLE_BILINEAR_FILTERING)),disabled,enabled)' > $@.tmp - @if ! cmp -s $@.tmp $@; then mv $@.tmp $@; else rm $@.tmp; fi +$(PS1_OBJ)/nugget/%.o: $(NUGGET)/%.c + mkdir -p $(@D) + $(CC) $(PS1_NUGGET_CFLAGS) -c $< -o $@ -$(BUILD_DIR)/ta_image.o: $(TA_IMAGE_FILTER_CONFIG) +$(PS1_OBJ)/nugget/%.o: $(NUGGET)/%.s + mkdir -p $(@D) + $(CC) $(PS1_ARCHFLAGS) -I$(NUGGET) -c $< -o $@ -$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c - mkdir -p $(dir $@) - $(CC) $(CFLAGS) -c $< -o $@ +$(PS1_ELF): $(PS1_OBJS) $(ENGINE_LIB) + $(CC) -o $@ $(PS1_OBJS) $(ENGINE_LIB) $(PS1_LDFLAGS) -$(CONFIG_HEADER): | $(BUILD_DIR) - BITS=$(BITS) envsubst < $(CONFIG_HEADER_IN) > $(CONFIG_HEADER) +$(PS1_EXE): $(PS1_ELF) + mkdir -p $(@D) + $(PS1_OBJCOPY) -O binary $< $@ -clean: - rm -rf $(BUILD_DIR) +$(PS1_CNF): $(SELF) + mkdir -p $(@D) + printf 'BOOT = cdrom:\\PSX.EXE;1\r\nTCB = 4\r\nEVENT = 10\r\nSTACK = 801FFF00\r\n' > $@ -FORCE: +$(PS1_XML): $(SELF) $(TAB_FILE) + mkdir -p $(@D) + { \ + echo '<?xml version="1.0" encoding="UTF-8"?>'; \ + echo '<iso_project>'; \ + echo ' <track type="data">'; \ + echo ' <identifiers system="PLAYSTATION" application="PLAYSTATION" volume="TUXANCI2" volume_set="TUXANCI2"/>'; \ + echo ' <directory_tree>'; \ + echo ' <file name="SYSTEM.CNF" type="data" source="$(PS1_CNF)"/>'; \ + echo ' <file name="PSX.EXE" type="data" source="$(PS1_EXE)"/>'; \ + echo ' <file name="TUXANCI2.TAB" type="data" source="$(TAB_FILE)"/>'; \ + echo ' <dummy sectors="1024"/>'; \ + echo ' </directory_tree>'; \ + echo ' </track>'; \ + echo '</iso_project>'; \ + } > $@ + +$(PS1_BIN) $(PS1_CUE) &: $(PS1_EXE) $(PS1_CNF) $(PS1_XML) $(TAB_FILE) + $(MKPSXISO) -y -q -o "$(PS1_BIN)" -c "$(PS1_CUE)" "$(PS1_XML)" + $(PSXLICENSEPATCH) --region $(PS1_REGION) $(if $(PS1_TEXT),--text "$(PS1_TEXT)") $(if $(PS1_TMD),--tmd "$(abspath $(PS1_TMD))") "$(PS1_BIN)" + +PLATFORM_FILES += $(PS1_BIN) $(PS1_CUE) +endif + +ifeq ($(TA_PLATFORM),saturn) +BITS := 32 +JOENGINE ?= $(ROOT)/platforms/saturn/joengine +JOENGINE := $(abspath $(JOENGINE)) + +SATURN_ENGINE_LINKS := $(patsubst $(ROOT)/src/%.c,$(OBJ)/src/%.c,$(ENGINE_SRCS)) +SATURN_PLATFORM_LINK := $(OBJ)/saturn.c +SATURN_CUE := $(OBJ)/game.cue +SATURN_ISO := $(OBJ)/game.iso + +$(SATURN_ENGINE_LINKS): $(OBJ)/src/%.c: $(ROOT)/src/%.c + mkdir -p $(@D) + ln -sf "$<" "$@" + +$(SATURN_PLATFORM_LINK): $(ROOT)/platforms/saturn/saturn.c + mkdir -p $(@D) + ln -sf "$<" "$@" + +$(SATURN_CUE) $(SATURN_ISO) &: $(CONFIG_HEADER) $(GENERATED_SRCS) $(SATURN_ENGINE_LINKS) $(SATURN_PLATFORM_LINK) $(TAB_FILE) FORCE + mkdir -p "$(OBJ)/cd" + printf 'TUXANCI 2\r\n' > "$(OBJ)/cd/ABS.TXT" + printf 'TUXANCI 2\r\n' > "$(OBJ)/cd/CPY.TXT" + printf 'TUXANCI 2\r\n' > "$(OBJ)/cd/BIB.TXT" + cp -f "$(TAB_FILE)" "$(OBJ)/cd/TUXANCI2.TAB" + $(MAKE) -C "$(OBJ)" -f "$(ROOT)/platforms/saturn/jo.mk" MAKEFILE="$(ROOT)/platforms/saturn/jo.mk" JOENGINE="$(JOENGINE)" ROOT_DIR="$(ROOT)" SATURN_BUILD_DIR="$(OBJ)" + +PLATFORM_FILES += $(SATURN_CUE) $(SATURN_ISO) +endif + +ifeq ($(TA_PLATFORM),xbox) +BITS := 32 +NXDK_DIR ?= $(ROOT)/platforms/xbox/nxdk +NXDK_DIR := $(abspath $(NXDK_DIR)) +export NXDK_DIR +export PATH := $(NXDK_DIR)/bin:$(PATH) + +XBOX_ENTRY := $(OBJ)/src/xbox.c +XBOX_STAGED := $(patsubst $(ROOT)/src/%.c,$(OBJ)/src/%.c,$(ENGINE_SRCS)) +XBOX_SRCS := $(XBOX_ENTRY) $(XBOX_STAGED) $(GENERATED_SRCS) +XBOX_ISO := $(OBJ)/tuxanci2.iso + +NXDK_CFLAGS += -I$(ROOT)/include -I$(OBJ) +export NXDK_CFLAGS + +$(XBOX_ENTRY): $(ROOT)/platforms/xbox/xbox.c + mkdir -p $(@D) + printf '#include "%s"\n' '$(abspath $<)' > $@ + +$(XBOX_STAGED): $(OBJ)/src/%.c: $(ROOT)/src/%.c + mkdir -p $(@D) + printf '#include "%s"\n' '$(abspath $<)' > $@ + +$(XBOX_ISO): $(XBOX_ENTRY) $(XBOX_STAGED) $(GENERATED_SRCS) $(CONFIG_HEADER) $(TAB_FILE) FORCE + cp -f "$(TAB_FILE)" "$(OBJ)/" + SRCS="$(XBOX_SRCS)" $(MAKE) -C "$(OBJ)" -f "$(NXDK_DIR)/Makefile" NXDK_DIR="$(NXDK_DIR)" NXDK_SDL=y OUTPUT_DIR="$(OBJ)" 'XBE_TITLE=Tuxanci\ 2' GEN_XISO="$(XBOX_ISO)" + +PLATFORM_FILES += $(XBOX_ISO) +endif + +ifeq ($(TA_PLATFORM),n64) +N64_INST ?= /opt/libdragon +export N64_INST +N64_MK := $(N64_INST)/include/n64.mk +ifeq ($(wildcard $(N64_MK)),) +$(error libdragon n64.mk not found under N64_INST='$(N64_INST)') +endif + +CC := $(N64_INST)/bin/mips64-elf-gcc +AR := $(N64_INST)/bin/mips64-elf-ar +BITS := 32 +MARCH := vr4300 -.PHONY: all generated clean FORCE +BUILD_DIR := $(OBJ)/rom +SOURCE_DIR := $(ROOT)/platforms/n64 +ROMNAME := tuxanci2 +N64_LIBRARY := $(ENGINE_LIB) +include $(N64_MK) +N64_CFLAGS += -I$(ROOT)/include -I$(OBJ) + +ENGINE_CFLAGS := $(N64_CFLAGS) -DTA_32BIT -DTA_DISABLE_BILINEAR_FILTERING -I$(ROOT)/include -I$(OBJ) -std=c99 -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Wall -Wextra -Werror -pedantic -pedantic-errors + +N64_ROM := $(OBJ)/tuxanci2.z64 + +ifeq ($(TA_STAGE),) +$(N64_ROM): $(ENGINE_LIB) $(ROOT)/platforms/n64/n64.c $(CONFIG_HEADER) $(HEADERS) FORCE + $(MAKE) -C "$(OBJ)" -f "$(SELF)" TA_PLATFORM=n64 TA_STAGE=rom tuxanci2.z64 + +PLATFORM_FILES += $(N64_ROM) +else +tuxanci2.z64: N64_ROM_TITLE = "Tuxanci 2" +$(BUILD_DIR)/n64.o: $(ROOT)/platforms/n64/n64.c $(CONFIG_HEADER) $(HEADERS) +$(BUILD_DIR)/$(ROMNAME).elf: $(BUILD_DIR)/n64.o $(N64_LIBRARY) +ifneq ($(wildcard $(BUILD_DIR)),) +-include $(shell find $(BUILD_DIR) -name '*.d') +endif +endif +endif + +ifeq ($(TA_PLATFORM),dreamcast) +KOS_SOURCE ?= $(ROOT)/platforms/dreamcast/KallistiOS +KOS_SOURCE := $(abspath $(KOS_SOURCE)) +KOS_BASE := $(OBJ)/KallistiOS +KOS_CHAIN_DIR := $(KOS_BASE)/utils/kos-chain +KOS_SOURCE_STAMP := $(OBJ)/.kos-source-copied +TOOLCHAIN_PREFIX := $(OBJ)/toolchain/sh-elf +KOS_CC_PATH := $(TOOLCHAIN_PREFIX)/bin/sh-elf-gcc +KOS_ENV := $(OBJ)/environ.sh +KOS_CC_WRAPPER := $(KOS_BASE)/utils/build_wrappers/kos-cc +KOS_LIBRARY := $(KOS_BASE)/lib/dreamcast/libkallisti.a +KOS_CHAIN_JOBS ?= 2 +KOS_BUILD_JOBS ?= 2 +DC_APP_OBJ := $(OBJ)/app/dreamcast.o +DC_ELF := $(OBJ)/tuxanci2.elf + +BITS := 32 +CC = $(KOS_CC_WRAPPER) +AR = $(KOS_AR) + +ENGINE_CFLAGS := -DTA_32BIT -DTA_DISABLE_BILINEAR_FILTERING -I$(ROOT)/include -I$(OBJ) -std=c99 -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Wall -Wextra -Werror -pedantic -pedantic-errors + +CPPFLAGS += -I$(ROOT)/include -I$(OBJ) +export CPPFLAGS +export KOS_BASE + +.PHONY: dc-kos-source +dc-kos-source: + mkdir -p "$(OBJ)" + if [ ! -f "$(KOS_SOURCE_STAMP)" ]; then \ + mkdir -p "$(KOS_BASE)"; \ + tar --exclude=.git -C "$(KOS_SOURCE)" -cf - . | tar -C "$(KOS_BASE)" -xf -; \ + touch "$(KOS_SOURCE_STAMP)"; \ + fi + +$(KOS_CC_PATH): | dc-kos-source + $(MAKE) -C "$(KOS_CHAIN_DIR)" platform=dreamcast kos_base="$(KOS_BASE)" toolchain_path="$(TOOLCHAIN_PREFIX)" makejobs="$(KOS_CHAIN_JOBS)" enable_cpp=0 enable_objc=0 enable_objcpp=0 + test -x "$@" + +$(KOS_ENV): $(KOS_CC_PATH) $(KOS_SOURCE)/doc/environ.sh.sample + mkdir -p "$(@D)" + sed -e 's|^export KOS_BASE=.*|export KOS_BASE="$(KOS_BASE)"|' -e 's|^export KOS_CC_BASE=.*|export KOS_CC_BASE="$(TOOLCHAIN_PREFIX)"|' "$(KOS_SOURCE)/doc/environ.sh.sample" > "$@" + +ifeq ($(TA_STAGE),) +$(DC_ELF): $(KOS_ENV) FORCE + . "$(KOS_ENV)" && $(MAKE) TA_PLATFORM=dreamcast TA_STAGE=kos "$@" + +PLATFORM_FILES += $(DC_ELF) +else +include $(KOS_SOURCE)/Makefile.rules + +$(KOS_LIBRARY): $(KOS_ENV) + . "$(KOS_ENV)" && $(MAKE) -C "$(KOS_BASE)" -j"$(KOS_BUILD_JOBS)" + +$(DC_APP_OBJ): $(ROOT)/platforms/dreamcast/dreamcast.c $(ENGINE_LIB) + mkdir -p "$(@D)" + $(KOS_CC_WRAPPER) $(CFLAGS) $(CPPFLAGS) -c "$<" -o "$@" + +$(DC_ELF): $(DC_APP_OBJ) $(ENGINE_LIB) | $(KOS_LIBRARY) + $(KOS_CC_WRAPPER) -o "$@" $(DC_APP_OBJ) $(ENGINE_LIB) +endif +endif + +ifneq ($(filter 64,$(BITS)),) +ARCH_DEFINE := -DTA_64BIT +else +ARCH_DEFINE := -DTA_32BIT +endif + +ENGINE_CFLAGS ?= $(OPT) -march=$(MARCH) -mtune=$(MARCH) -m$(BITS) $(ARCH_DEFINE) -I$(ROOT)/include -I$(OBJ) -std=c99 -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Wall -Wextra -Werror -pedantic -pedantic-errors + +ifeq ($(TA_DISABLE_BILINEAR_FILTERING),true) +ENGINE_CFLAGS += -DTA_DISABLE_BILINEAR_FILTERING +endif + +$(FLAGS_STAMP): FORCE + mkdir -p $(@D) + printf '%s\n' '$(CC) $(AR) $(ENGINE_CFLAGS)' > $@.tmp + if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv -f $@.tmp $@; fi + +$(CONFIG_HEADER): $(ROOT)/include/ta_config.h.in $(FLAGS_STAMP) + mkdir -p $(@D) + sed 's/\$$BITS/$(BITS)/g' $< > $@ + +asset_sym = $(shell printf '%s' 'ta_file_$(notdir $(basename $(1)))' | sed 's/[^a-zA-Z0-9_]/_/g') + +define ASSET_RULE +$(OBJ)/$(basename $(patsubst $(ROOT)/files/%,%,$(1))).c: $(1) + mkdir -p $$(@D) + $$(XXD) -i -n $(call asset_sym,$(1)) $$< $$@ +endef +$(foreach a,$(ASSETS),$(eval $(call ASSET_RULE,$(a)))) + +$(ENGINE_SRC_OBJS): $(OBJ)/src/%.o: $(ROOT)/src/%.c $(CONFIG_HEADER) $(FLAGS_STAMP) + mkdir -p $(@D) + $(CC) $(ENGINE_CFLAGS) -MMD -MP -c $< -o $@ + +$(GENERATED_OBJS): $(OBJ)/%.o: $(OBJ)/%.c $(CONFIG_HEADER) $(FLAGS_STAMP) + mkdir -p $(@D) + $(CC) $(ENGINE_CFLAGS) -MMD -MP -c $< -o $@ + +$(ENGINE_LIB): $(ENGINE_OBJS) + rm -f $@ + $(AR) rcs $@ $^ + +-include $(ENGINE_OBJS:.o=.d) + +ifneq ($(HOST_SRC),) +HOST_EXE := $(OBJ)/tuxanci2$(EXE_EXT) + +$(HOST_EXE): $(HOST_SRC) $(HOST_EXTRA_SRCS) $(HOST_DEPS) $(ENGINE_LIB) $(HEADERS) + $(CC) $(HOST_CFLAGS) -I"$(ROOT)/include" -I"$(OBJ)" $(HOST_SRC) $(HOST_EXTRA_SRCS) "$(ENGINE_LIB)" $(HOST_LDFLAGS) $(HOST_LDLIBS) -o $@ + +PLATFORM_FILES += $(HOST_EXE) + +ifdef INSTALLER +INSTALLER_EXE := $(OBJ)/tuxanci2-win32-i686.exe + +$(INSTALLER_EXE): $(ROOT)/platforms/win32/installer.nsi $(HOST_EXE) $(TAB_FILE) + makensis -V2 -DEXE_FILE="$(HOST_EXE)" -DTAB_FILE="$(TAB_FILE)" -DOUT_FILE="$(INSTALLER_EXE)" $< + +PLATFORM_FILES += $(INSTALLER_EXE) +endif +endif + +ifeq ($(TA_STAGE),) +.PHONY: build +build: $(TAB_FILE) $(PLATFORM_FILES) + mkdir -p "$(OUT_DIR)" + cp -f $(PLATFORM_FILES) "$(TAB_FILE)" "$(OUT_DIR)/" + printf '\nbuild/ ($(TA_PLATFORM)):\n' + ls -1 "$(OUT_DIR)" | sed 's/^/ /' +endif + +endif diff --git a/platforms/cocoa/.gitignore b/platforms/cocoa/.gitignore @@ -1 +0,0 @@ -tuxanci2 diff --git a/platforms/cocoa/Makefile b/platforms/cocoa/Makefile @@ -1,42 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -COCOA_CC ?= cc -COCOA_BUILD ?= build/cocoa - -COCOA_TRIPLE := $(shell $(COCOA_CC) -dumpmachine 2>/dev/null) -ifneq ($(findstring darwin,$(COCOA_TRIPLE))$(findstring macos,$(COCOA_TRIPLE)),) - COCOA_CFLAGS ?= -O2 -Wno-deprecated-declarations - COCOA_LDFLAGS ?= - COCOA_LDLIBS ?= -framework Cocoa -else - COCOA_CFLAGS ?= -O2 $(filter-out -MMD -MP,$(shell gnustep-config --objc-flags)) - COCOA_LDFLAGS ?= - COCOA_LDLIBS ?= $(shell gnustep-config --gui-libs) -endif - -COCOA_SOURCE := $(MAKEFILE_DIR)cocoa.m -COCOA_BUILD_DIR := $(ROOT_DIR)/$(COCOA_BUILD) -COCOA_LIBRARY := $(COCOA_BUILD_DIR)/tuxanci2.a -TARGET := $(MAKEFILE_DIR)tuxanci2 -ROOT_INPUTS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile - -.DEFAULT_GOAL := all -.PHONY: all clean - -all: $(TARGET) - -$(COCOA_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(COCOA_CC)" BUILD_DIR="$(COCOA_BUILD)" all - -$(TARGET): $(COCOA_SOURCE) $(COCOA_LIBRARY) - $(COCOA_CC) $(COCOA_CFLAGS) -I"$(ROOT_DIR)/include" -I"$(COCOA_BUILD_DIR)" "$(COCOA_SOURCE)" "$(COCOA_LIBRARY)" $(COCOA_LDFLAGS) $(COCOA_LDLIBS) -o "$@" - -clean: - $(RM) "$(TARGET)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(COCOA_BUILD)" clean - -\ No newline at end of file diff --git a/platforms/dos/.gitignore b/platforms/dos/.gitignore @@ -1,3 +0,0 @@ -tuxanci2.exe -CWSDPMI.EXE -CWSDPMI.SWP -\ No newline at end of file diff --git a/platforms/dos/Makefile b/platforms/dos/Makefile @@ -1,35 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -DOS_CC ?= i586-pc-msdosdjgpp-gcc -DOS_AR ?= i586-pc-msdosdjgpp-ar -DOS_MARCH ?= i386 -DOS_BITS := 32 -DOS_CFLAGS ?= -O2 -march=$(DOS_MARCH) -mtune=$(DOS_MARCH) -DOS_BUILD ?= build/dos - -DOS_SOURCE := $(MAKEFILE_DIR)dos.c -DOS_BUILD_DIR := $(ROOT_DIR)/$(DOS_BUILD) -DOS_LIBRARY := $(DOS_BUILD_DIR)/tuxanci2.a -TARGET := $(MAKEFILE_DIR)tuxanci2.exe -ROOT_INPUTS := $(wildcard $(ROOT_DIR)/src/*.c) \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile - -.DEFAULT_GOAL := all - -.PHONY: all clean - -all: $(TARGET) - -$(DOS_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(DOS_CC)" AR="$(DOS_AR)" BITS=$(DOS_BITS) MARCH=$(DOS_MARCH) BUILD_DIR="$(DOS_BUILD)" all - -$(TARGET): $(DOS_SOURCE) $(DOS_LIBRARY) - $(DOS_CC) $(DOS_CFLAGS) -I"$(ROOT_DIR)/include" -I"$(DOS_BUILD_DIR)" "$(DOS_SOURCE)" "$(DOS_LIBRARY)" -o "$@" - -clean: - $(RM) "$(TARGET)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(DOS_BUILD)" clean diff --git a/platforms/dreamcast/.gitignore b/platforms/dreamcast/.gitignore @@ -1,2 +0,0 @@ -build/ -/tuxanci2.elf diff --git a/platforms/dreamcast/Makefile b/platforms/dreamcast/Makefile @@ -1,96 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -KOS_SOURCE ?= $(MAKEFILE_DIR)KallistiOS -KOS_SOURCE := $(abspath $(KOS_SOURCE)) -BUILD_ROOT := $(ROOT_DIR)/build/dreamcast -KOS_BASE := $(BUILD_ROOT)/KallistiOS -KOS_CHAIN_DIR := $(KOS_BASE)/utils/kos-chain -KOS_SOURCE_STAMP := $(BUILD_ROOT)/.kos-source-copied -TOOLCHAIN_PREFIX := $(BUILD_ROOT)/toolchain/sh-elf -KOS_CC_PATH := $(TOOLCHAIN_PREFIX)/bin/sh-elf-gcc -KOS_ENV := $(BUILD_ROOT)/environ.sh -KOS_CC_WRAPPER := $(KOS_BASE)/utils/build_wrappers/kos-cc -KOS_CHAIN_JOBS ?= 2 -KOS_BUILD_JOBS ?= 2 - -DREAMCAST_BUILD ?= build/dreamcast/engine -DREAMCAST_BUILD_DIR := $(abspath $(ROOT_DIR)/$(DREAMCAST_BUILD)) -DREAMCAST_LIBRARY := $(DREAMCAST_BUILD_DIR)/tuxanci2.a -KOS_LIBRARY := $(KOS_BASE)/lib/dreamcast/libkallisti.a -APP_BUILD_DIR := $(BUILD_ROOT)/app -APP_OBJECT := $(APP_BUILD_DIR)/dreamcast.o -TARGET := $(MAKEFILE_DIR)tuxanci2.elf - -ROOT_INPUTS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile -ENGINE_CFLAGS := -DTA_32BIT -DTA_DISABLE_BILINEAR_FILTERING \ - -I$(ROOT_DIR)/include -I$(DREAMCAST_BUILD_DIR) \ - -std=c99 -ffreestanding -nostdlib -nostdinc \ - -fno-builtin -fno-stack-protector \ - -Wall -Wextra -Werror -pedantic -pedantic-errors - -CPPFLAGS += -I$(ROOT_DIR)/include -I$(DREAMCAST_BUILD_DIR) -export CPPFLAGS -export KOS_BASE - -.DEFAULT_GOAL := all -.PHONY: all build clean distclean prepare-kos-source - -all: $(KOS_ENV) - . "$(KOS_ENV)" && $(MAKE) --no-print-directory build - -build: $(TARGET) | $(KOS_LIBRARY) - -prepare-kos-source: - mkdir -p "$(BUILD_ROOT)" - if [ ! -f "$(KOS_SOURCE_STAMP)" ]; then \ - mkdir -p "$(KOS_BASE)"; \ - tar --exclude=.git -C "$(KOS_SOURCE)" -cf - . | tar -C "$(KOS_BASE)" -xf -; \ - touch "$(KOS_SOURCE_STAMP)"; \ - fi - -$(KOS_CC_PATH): | prepare-kos-source - $(MAKE) -C "$(KOS_CHAIN_DIR)" platform=dreamcast \ - kos_base="$(KOS_BASE)" toolchain_path="$(TOOLCHAIN_PREFIX)" \ - makejobs="$(KOS_CHAIN_JOBS)" \ - enable_cpp=0 enable_objc=0 enable_objcpp=0 - test -x "$@" - -$(KOS_ENV): $(KOS_CC_PATH) $(KOS_SOURCE)/doc/environ.sh.sample - mkdir -p "$(@D)" - sed \ - -e 's|^export KOS_BASE=.*|export KOS_BASE="$(KOS_BASE)"|' \ - -e 's|^export KOS_CC_BASE=.*|export KOS_CC_BASE="$(TOOLCHAIN_PREFIX)"|' \ - "$(KOS_SOURCE)/doc/environ.sh.sample" > "$@" - -$(KOS_LIBRARY): $(KOS_ENV) - . "$(KOS_ENV)" && $(MAKE) -C "$(KOS_BASE)" -j"$(KOS_BUILD_JOBS)" - -$(DREAMCAST_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(KOS_CC_WRAPPER)" AR="$(KOS_AR)" BITS=32 \ - BUILD_DIR="$(DREAMCAST_BUILD)" TA_DISABLE_BILINEAR_FILTERING=true \ - CFLAGS="$(ENGINE_CFLAGS)" all - -$(APP_OBJECT): dreamcast.c $(DREAMCAST_LIBRARY) - mkdir -p "$(@D)" - $(KOS_CC_WRAPPER) $(CFLAGS) $(CPPFLAGS) -c "$<" -o "$@" - -$(TARGET): $(APP_OBJECT) $(DREAMCAST_LIBRARY) | $(KOS_LIBRARY) - $(KOS_CC_WRAPPER) -o "$@" $^ - -$(BUILD_ROOT): - mkdir -p "$@" - -clean: - $(RM) "$(TARGET)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(DREAMCAST_BUILD)" clean - $(RM) "$(APP_OBJECT)" - -distclean: clean - $(RM) -r "$(BUILD_ROOT)" - -include $(KOS_SOURCE)/Makefile.rules diff --git a/platforms/n64/.gitignore b/platforms/n64/.gitignore @@ -1 +0,0 @@ -tuxanci2.z64 diff --git a/platforms/n64/Makefile b/platforms/n64/Makefile @@ -1,64 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -N64_GCC ?= $(N64_INST)/bin/mips64-elf-gcc -N64_AR ?= $(N64_INST)/bin/mips64-elf-ar -N64_BUILD ?= build/n64 -N64_BUILD_DIR := $(ROOT_DIR)/$(N64_BUILD) -N64_LIBRARY := $(N64_BUILD_DIR)/tuxanci2.a -N64_SOURCE := $(MAKEFILE_DIR)n64.c -TARGET := tuxanci2.z64 - -N64_INST ?= /opt/libdragon -N64_MK := $(N64_INST)/include/n64.mk -export N64_INST - -ifeq ($(wildcard $(N64_MK)),) -$(error libdragon n64.mk not found under N64_INST='$(N64_INST)') -endif - -BUILD_DIR := ../../$(N64_BUILD) -SOURCE_DIR := $(MAKEFILE_DIR) -ROMNAME := tuxanci2 -include $(N64_MK) -N64_CFLAGS += -I$(ROOT_DIR)/include -I$(N64_BUILD_DIR) - -ROOT_INPUTS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile - -ENGINE_CFLAGS := $(N64_CFLAGS) -DTA_32BIT -DTA_DISABLE_BILINEAR_FILTERING \ - -I$(ROOT_DIR)/include -I$(N64_BUILD_DIR) -std=c99 \ - -ffreestanding -nostdlib -nostdinc -fno-builtin \ - -fno-stack-protector -Wall -Wextra -Werror -pedantic -pedantic-errors - -.DEFAULT_GOAL := all -.PHONY: all clean - -all: $(TARGET) - -$(N64_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(N64_GCC)" AR="$(N64_AR)" BITS=32 MARCH=vr4300 \ - BUILD_DIR="$(N64_BUILD)" TA_DISABLE_BILINEAR_FILTERING=true \ - CFLAGS="$(ENGINE_CFLAGS)" all - -$(BUILD_DIR)/n64.o: $(N64_SOURCE) $(N64_BUILD_DIR)/ta_config.h $(wildcard $(ROOT_DIR)/include/*.h) - -$(N64_BUILD_DIR)/ta_config.h: - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(N64_BUILD)" BITS=32 MARCH=vr4300 \ - "$(N64_BUILD)/ta_config.h" - -$(BUILD_DIR)/$(ROMNAME).elf: $(BUILD_DIR)/n64.o $(N64_LIBRARY) - -$(TARGET): N64_ROM_TITLE = "Tuxanci 2" - -clean: - $(RM) "$(TARGET)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(N64_BUILD)" clean - $(RM) -r "$(MAKEFILE_DIR)build" - -ifneq ($(wildcard $(BUILD_DIR)),) --include $(shell find $(BUILD_DIR) -name '*.d') -endif diff --git a/platforms/ps1/.gitignore b/platforms/ps1/.gitignore @@ -1,3 +0,0 @@ -tuxanci2.cue -tuxanci2.bin -tuxanci2.card diff --git a/platforms/ps1/Makefile b/platforms/ps1/Makefile @@ -1,141 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -NUGGET ?= $(MAKEFILE_DIR)nugget -NUGGET := $(abspath $(NUGGET)) - -PS1_PREFIX ?= $(firstword $(foreach p,mipsel-none-elf mipsel-linux-gnu,$(if $(shell command -v $(p)-gcc 2>/dev/null),$(p)))) -ifeq ($(PS1_PREFIX),) -$(error You need to install mipsel-none-elf-gcc or mipsel-linux-gnu-gcc or set PS1_PREFIX) -endif -PS1_OFORMAT ?= $(if $(filter mipsel-none-elf,$(PS1_PREFIX)),elf32-littlemips,elf32-tradlittlemips) -PS1_CC := $(PS1_PREFIX)-gcc -PS1_AR := $(PS1_PREFIX)-gcc-ar -PS1_OBJCOPY := $(PS1_PREFIX)-objcopy -MKPSXISO ?= mkpsxiso - -PSXLICENSEPATCH ?= psxlicensepatch -PSXLICENSEDUMP ?= psxlicensedump - -PS1_REGION ?= US -PS1_TEXT ?= -PS1_TMD ?= logo.tmd - -PS1_BUILD ?= build/ps1 -PS1_BUILD_DIR := $(ROOT_DIR)/$(PS1_BUILD) -PS1_LIBRARY := $(PS1_BUILD_DIR)/tuxanci2.a -OBJ_DIR := $(PS1_BUILD_DIR)/platform -ISO_DIR := $(PS1_BUILD_DIR)/iso - -ifeq ($(wildcard $(NUGGET)/ps-exe.ld),) -$(error nugget not found at '$(NUGGET)'.) -endif - -PS1_ELF := $(PS1_BUILD_DIR)/psx.elf -PS1_MAP := $(PS1_BUILD_DIR)/psx.map -PS1_EXE := $(ISO_DIR)/PSX.EXE -SYSTEM_CNF := $(ISO_DIR)/SYSTEM.CNF -ISO_XML := $(ISO_DIR)/tuxanci2.xml - -TARGET_BIN := $(MAKEFILE_DIR)tuxanci2.bin -TARGET_CUE := $(MAKEFILE_DIR)tuxanci2.cue - -ARCHFLAGS := -march=mips1 -mabi=32 -EL -fno-pic -mno-shared -mno-abicalls -mfp32 -msoft-float -mno-llsc -G0 \ - -fno-stack-protector -nostdlib -ffreestanding -COMMONFLAGS := -ffunction-sections -fdata-sections -mno-gpopt -fomit-frame-pointer -fno-builtin \ - -fno-strict-aliasing -Wno-attributes - -PLATFORM_CFLAGS := -O2 $(ARCHFLAGS) $(COMMONFLAGS) -Wall -Wextra \ - -I$(ROOT_DIR)/include -I$(PS1_BUILD_DIR) -I$(NUGGET) -DTA_32BIT - -NUGGET_CFLAGS := -O2 $(ARCHFLAGS) $(COMMONFLAGS) -I$(NUGGET) - -ENGINE_CFLAGS := -O2 $(ARCHFLAGS) $(COMMONFLAGS) -DTA_32BIT -DTA_DISABLE_BILINEAR_FILTERING \ - -I$(ROOT_DIR)/include -I$(PS1_BUILD_DIR) \ - -std=c99 -nostdinc -Wall -Wextra -Werror -pedantic -pedantic-errors - -LDFLAGS := -Wl,-Map=$(PS1_MAP) -nostdlib -T$(NUGGET)/nooverlay.ld -T$(NUGGET)/ps-exe.ld -static \ - -Wl,--gc-sections $(ARCHFLAGS) -Wl,--oformat=$(PS1_OFORMAT) - -NUGGET_SRCS := common/crt0/crt0.s common/crt0/memory-s.s common/crt0/memory-c.c common/crt0/clz.c \ - third_party/arith64/arith64.c -NUGGET_OBJS := $(addprefix $(OBJ_DIR)/nugget/,$(addsuffix .o,$(basename $(NUGGET_SRCS)))) -PLATFORM_OBJS := $(OBJ_DIR)/ps1.o -OBJS := $(NUGGET_OBJS) $(PLATFORM_OBJS) - -ROOT_INPUTS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(wildcard $(ROOT_DIR)/include/screens/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile - -.DEFAULT_GOAL := all -.PHONY: all clean dump-license patch-license - -all: $(TARGET_CUE) $(TARGET_BIN) - -$(PS1_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(PS1_CC)" AR="$(PS1_AR)" BITS=32 \ - BUILD_DIR="$(PS1_BUILD)" TA_DISABLE_BILINEAR_FILTERING=true \ - CFLAGS="$(ENGINE_CFLAGS)" all - -$(PS1_BUILD_DIR)/ta_config.h: $(PS1_LIBRARY) - -$(OBJ_DIR)/ps1.o: $(MAKEFILE_DIR)ps1.c $(PS1_LIBRARY) $(wildcard $(ROOT_DIR)/include/*.h) - mkdir -p "$(@D)" - $(PS1_CC) $(PLATFORM_CFLAGS) -c "$<" -o "$@" - -$(OBJ_DIR)/nugget/%.o: $(NUGGET)/%.c - mkdir -p "$(@D)" - $(PS1_CC) $(NUGGET_CFLAGS) -c "$<" -o "$@" - -$(OBJ_DIR)/nugget/%.o: $(NUGGET)/%.s - mkdir -p "$(@D)" - $(PS1_CC) $(ARCHFLAGS) -I$(NUGGET) -c "$<" -o "$@" - -$(PS1_ELF): $(OBJS) $(PS1_LIBRARY) - mkdir -p "$(@D)" - $(PS1_CC) -o "$@" $(OBJS) $(PS1_LIBRARY) $(LDFLAGS) - -$(PS1_EXE): $(PS1_ELF) - mkdir -p "$(@D)" - $(PS1_OBJCOPY) -O binary "$<" "$@" - -$(SYSTEM_CNF): $(MAKEFILE_DIR)Makefile - mkdir -p "$(@D)" - printf 'BOOT = cdrom:\\PSX.EXE;1\r\nTCB = 4\r\nEVENT = 10\r\nSTACK = 801FFF00\r\n' > "$@" - -$(ISO_XML): $(MAKEFILE_DIR)Makefile - mkdir -p "$(@D)" - { \ - echo '<?xml version="1.0" encoding="UTF-8"?>'; \ - echo '<iso_project>'; \ - echo ' <track type="data">'; \ - echo ' <identifiers system="PLAYSTATION" application="PLAYSTATION" volume="TUXANCI2" volume_set="TUXANCI2"/>'; \ - echo ' <directory_tree>'; \ - echo ' <file name="SYSTEM.CNF" type="data" source="$(SYSTEM_CNF)"/>'; \ - echo ' <file name="PSX.EXE" type="data" source="$(PS1_EXE)"/>'; \ - echo ' <dummy sectors="1024"/>'; \ - echo ' </directory_tree>'; \ - echo ' </track>'; \ - echo '</iso_project>'; \ - } > "$@" - -$(TARGET_BIN) $(TARGET_CUE) &: $(PS1_EXE) $(SYSTEM_CNF) $(ISO_XML) - $(MKPSXISO) -y -q -o "$(TARGET_BIN)" -c "$(TARGET_CUE)" "$(ISO_XML)" - $(PSXLICENSEPATCH) --region $(PS1_REGION) \ - $(if $(PS1_TEXT),--text "$(PS1_TEXT)") \ - $(if $(PS1_TMD),--tmd "$(abspath $(PS1_TMD))") \ - "$(TARGET_BIN)" - -patch-license: $(TARGET_BIN) - $(PSXLICENSEPATCH) --region $(PS1_REGION) \ - $(if $(PS1_TEXT),--text "$(PS1_TEXT)") \ - $(if $(PS1_TMD),--tmd "$(abspath $(PS1_TMD))") \ - "$(TARGET_BIN)" - -clean: - $(RM) "$(TARGET_BIN)" "$(TARGET_CUE)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(PS1_BUILD)" clean - $(RM) -r "$(PS1_BUILD_DIR)" diff --git a/platforms/saturn/.gitignore b/platforms/saturn/.gitignore @@ -1,2 +0,0 @@ -game.cue -game.iso diff --git a/platforms/saturn/Makefile b/platforms/saturn/Makefile @@ -1,45 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -JOENGINE ?= $(MAKEFILE_DIR)joengine -JOENGINE := $(abspath $(JOENGINE)) - -SATURN_BUILD ?= build/saturn -SATURN_BUILD_DIR := $(ROOT_DIR)/$(SATURN_BUILD) - -ENGINE_SRCS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') -ENGINE_LINKS := $(patsubst $(ROOT_DIR)/src/%.c,$(SATURN_BUILD_DIR)/src/%.c,$(ENGINE_SRCS)) -PLATFORM_LINK := $(SATURN_BUILD_DIR)/saturn.c - -.DEFAULT_GOAL := all -.PHONY: all generated stage clean - -all: stage - $(MAKE) -C "$(SATURN_BUILD_DIR)" -f "$(MAKEFILE_DIR)jo.mk" \ - MAKEFILE="$(MAKEFILE_DIR)jo.mk" \ - JOENGINE="$(JOENGINE)" \ - ROOT_DIR="$(ROOT_DIR)" \ - SATURN_BUILD_DIR="$(SATURN_BUILD_DIR)" - cp "$(SATURN_BUILD_DIR)/game.cue" "$(SATURN_BUILD_DIR)/game.iso" "$(MAKEFILE_DIR)" - -generated: - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(SATURN_BUILD)" BITS=32 generated - -$(SATURN_BUILD_DIR)/src/%.c: $(ROOT_DIR)/src/%.c - mkdir -p "$(dir $@)" - ln -sf "$<" "$@" - -$(PLATFORM_LINK): $(MAKEFILE_DIR)saturn.c - mkdir -p "$(dir $@)" - ln -sf "$<" "$@" - -stage: generated $(ENGINE_LINKS) $(PLATFORM_LINK) - mkdir -p "$(SATURN_BUILD_DIR)/cd" - printf 'TUXANCI 2\r\n' > "$(SATURN_BUILD_DIR)/cd/ABS.TXT" - printf 'TUXANCI 2\r\n' > "$(SATURN_BUILD_DIR)/cd/CPY.TXT" - printf 'TUXANCI 2\r\n' > "$(SATURN_BUILD_DIR)/cd/BIB.TXT" - -clean: - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(SATURN_BUILD)" clean 2>/dev/null || true - $(RM) -r "$(SATURN_BUILD_DIR)" - find "$(JOENGINE)/jo_engine" -name '*.o' -delete 2>/dev/null || true diff --git a/platforms/wayland/.gitignore b/platforms/wayland/.gitignore @@ -1 +0,0 @@ -tuxanci2 -\ No newline at end of file diff --git a/platforms/wayland/Makefile b/platforms/wayland/Makefile @@ -1,42 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -WL_CC ?= cc -WL_CFLAGS ?= -O2 -WL_LDFLAGS ?= -WL_LDLIBS ?= -lwayland-client -lxkbcommon -lrt -lm -WL_BUILD ?= build/wayland - -WL_SOURCE := $(MAKEFILE_DIR)wayland.c -WL_BUILD_DIR := $(ROOT_DIR)/$(WL_BUILD) -WL_LIBRARY := $(WL_BUILD_DIR)/tuxanci2.a -TARGET := $(MAKEFILE_DIR)tuxanci2 - -XDG_SHELL_H := $(WL_BUILD_DIR)/xdg-shell-client-protocol.h -XDG_SHELL_C := $(WL_BUILD_DIR)/xdg-shell-protocol.c - -ROOT_INPUTS := $(wildcard $(ROOT_DIR)/src/*.c) $(wildcard $(ROOT_DIR)/include/*.h) $(ROOT_DIR)/include/ta_config.h.in $(shell find $(ROOT_DIR)/files -type f) $(ROOT_DIR)/Makefile - -.DEFAULT_GOAL := all -.PHONY: all clean - -all: $(TARGET) - -$(WL_BUILD_DIR): - mkdir -p $(WL_BUILD_DIR) - -$(XDG_SHELL_H): | $(WL_BUILD_DIR) - wayland-scanner client-header $$(pkg-config --variable=pkgdatadir wayland-protocols)/stable/xdg-shell/xdg-shell.xml $@ - -$(XDG_SHELL_C): | $(WL_BUILD_DIR) - wayland-scanner private-code $$(pkg-config --variable=pkgdatadir wayland-protocols)/stable/xdg-shell/xdg-shell.xml $@ - -$(WL_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(WL_CC)" BUILD_DIR="$(WL_BUILD)" all - -$(TARGET): $(WL_SOURCE) $(XDG_SHELL_H) $(XDG_SHELL_C) $(WL_LIBRARY) - $(WL_CC) $(WL_CFLAGS) -I"$(ROOT_DIR)/include" -I"$(WL_BUILD_DIR)" "$(WL_SOURCE)" "$(XDG_SHELL_C)" "$(WL_LIBRARY)" $(WL_LDFLAGS) $(WL_LDLIBS) -o "$@" - -clean: - $(RM) "$(TARGET)" "$(XDG_SHELL_H)" "$(XDG_SHELL_C)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(WL_BUILD)" clean diff --git a/platforms/win32/.gitignore b/platforms/win32/.gitignore @@ -1 +0,0 @@ -tuxanci2*.exe diff --git a/platforms/win32/Makefile b/platforms/win32/Makefile @@ -1,41 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -WIN32_CC ?= i686-w64-mingw32-gcc -WIN32_CFLAGS ?= -O2 -Wall -WIN32_LDFLAGS ?= -Wl,--subsystem,windows:95 -WIN32_LDLIBS ?= -lgdi32 -luser32 -WIN32_BUILD ?= build/win32 - -WIN32_SOURCE := $(MAKEFILE_DIR)win32.c -WIN32_BUILD_DIR := $(ROOT_DIR)/$(WIN32_BUILD) -WIN32_LIBRARY := $(WIN32_BUILD_DIR)/tuxanci2.a - -GAME_TARGET := $(WIN32_BUILD_DIR)/tuxanci2.exe - -NSIS_SCRIPT := $(MAKEFILE_DIR)installer.nsi -TARGET := $(MAKEFILE_DIR)tuxanci2-win32-i686.exe - -ROOT_INPUTS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile - -.DEFAULT_GOAL := all -.PHONY: all clean - -all: $(TARGET) - -$(WIN32_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(WIN32_CC)" BITS=32 BUILD_DIR="$(WIN32_BUILD)" all - -$(GAME_TARGET): $(WIN32_SOURCE) $(WIN32_LIBRARY) - $(WIN32_CC) $(WIN32_CFLAGS) -I"$(ROOT_DIR)/include" -I"$(WIN32_BUILD_DIR)" "$(WIN32_SOURCE)" "$(WIN32_LIBRARY)" $(WIN32_LDFLAGS) $(WIN32_LDLIBS) -o "$@" - -$(TARGET): $(GAME_TARGET) $(NSIS_SCRIPT) - makensis "$(NSIS_SCRIPT)" - -clean: - $(RM) "$(TARGET)" "$(GAME_TARGET)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(WIN32_BUILD)" clean diff --git a/platforms/win32/installer.nsi b/platforms/win32/installer.nsi @@ -2,8 +2,18 @@ !define VERSION "0.30.0" +!ifndef EXE_FILE + !define EXE_FILE "../../obj/win32/tuxanci2.exe" +!endif +!ifndef TAB_FILE + !define TAB_FILE "../../obj/game/tuxanci2.tab" +!endif +!ifndef OUT_FILE + !define OUT_FILE "tuxanci2-win32-i686.exe" +!endif + Name "Tuxánci 2 v${VERSION}" -OutFile "tuxanci2-win32-i686.exe" +OutFile "${OUT_FILE}" InstallDir "$PROGRAMFILES\tuxanci2" !define MUI_ICON "installer.ico" @@ -31,7 +41,8 @@ InstallDir "$PROGRAMFILES\tuxanci2" Section "Core Files" SetOutPath "$INSTDIR" - File "../../build/win32/tuxanci2.exe" + File "${EXE_FILE}" + File "${TAB_FILE}" File "../../LICENSE" WriteUninstaller "$INSTDIR\uninstall.exe" @@ -48,6 +59,7 @@ SectionEnd Section "Uninstall" Delete "$INSTDIR\tuxanci2.exe" + Delete "$INSTDIR\tuxanci2.tab" Delete "$INSTDIR\LICENSE" Delete "$INSTDIR\uninstall.exe" diff --git a/platforms/x11/.gitignore b/platforms/x11/.gitignore @@ -1 +0,0 @@ -tuxanci2 -\ No newline at end of file diff --git a/platforms/x11/Makefile b/platforms/x11/Makefile @@ -1,33 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -X11_CC ?= cc -X11_CFLAGS ?= -O2 -X11_LDFLAGS ?= -X11_LDLIBS ?= -lX11 -X11_BUILD ?= build/x11 - -X11_SOURCE := $(MAKEFILE_DIR)x11.c -X11_BUILD_DIR := $(ROOT_DIR)/$(X11_BUILD) -X11_LIBRARY := $(X11_BUILD_DIR)/tuxanci2.a -TARGET := $(MAKEFILE_DIR)tuxanci2 -ROOT_INPUTS := $(shell find $(ROOT_DIR)/src -type f -name '*.c') \ - $(wildcard $(ROOT_DIR)/include/*.h) \ - $(ROOT_DIR)/include/ta_config.h.in \ - $(shell find $(ROOT_DIR)/files -type f) \ - $(ROOT_DIR)/Makefile - -.DEFAULT_GOAL := all -.PHONY: all clean - -all: $(TARGET) - -$(X11_LIBRARY): $(ROOT_INPUTS) - $(MAKE) -C "$(ROOT_DIR)" CC="$(X11_CC)" BUILD_DIR="$(X11_BUILD)" all - -$(TARGET): $(X11_SOURCE) $(X11_LIBRARY) - $(X11_CC) $(X11_CFLAGS) -I"$(ROOT_DIR)/include" -I"$(X11_BUILD_DIR)" "$(X11_SOURCE)" "$(X11_LIBRARY)" $(X11_LDFLAGS) $(X11_LDLIBS) -o "$@" - -clean: - $(RM) "$(TARGET)" - $(MAKE) -C "$(ROOT_DIR)" BUILD_DIR="$(X11_BUILD)" clean diff --git a/platforms/xbox/.gitignore b/platforms/xbox/.gitignore @@ -1 +0,0 @@ -tuxanci2.iso diff --git a/platforms/xbox/Makefile b/platforms/xbox/Makefile @@ -1,53 +0,0 @@ -MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..) - -NXDK_DIR ?= $(MAKEFILE_DIR)nxdk -NXDK_DIR := $(abspath $(NXDK_DIR)) -export NXDK_DIR -export PATH := $(NXDK_DIR)/bin:$(PATH) -XBOX_BUILD_DIR ?= $(ROOT_DIR)/build/xbox -XBOX_BUILD_DIR := $(abspath $(XBOX_BUILD_DIR)) -XXD ?= xxd - -ROOT_SOURCES := $(shell find $(ROOT_DIR)/src -type f -name '*.c') -STAGED_SOURCES := $(patsubst $(ROOT_DIR)/src/%.c,$(XBOX_BUILD_DIR)/src/%.c,$(ROOT_SOURCES)) -STAGED_ENTRY := $(XBOX_BUILD_DIR)/src/xbox.c -ASSETS := $(shell find $(ROOT_DIR)/files -type f -not -name 'LICENSE') -ASSET_PATHS := $(patsubst $(ROOT_DIR)/files/%,%,$(ASSETS)) -ASSET_SOURCES := $(addprefix $(XBOX_BUILD_DIR)/assets/,$(addsuffix .c,$(basename $(ASSET_PATHS)))) -CONFIG_HEADER := $(XBOX_BUILD_DIR)/ta_config.h - -SRCS := $(STAGED_ENTRY) $(STAGED_SOURCES) $(ASSET_SOURCES) -NXDK_CFLAGS += -I$(ROOT_DIR)/include -I$(XBOX_BUILD_DIR) -export NXDK_CFLAGS - -.DEFAULT_GOAL := all -.PHONY: all clean - -all: $(STAGED_ENTRY) $(STAGED_SOURCES) $(ASSET_SOURCES) $(CONFIG_HEADER) - SRCS="$(SRCS)" $(MAKE) -C "$(XBOX_BUILD_DIR)" -f "$(NXDK_DIR)/Makefile" NXDK_DIR="$(NXDK_DIR)" NXDK_SDL=y OUTPUT_DIR="$(XBOX_BUILD_DIR)" 'XBE_TITLE=Tuxanci\ 2' GEN_XISO="$(MAKEFILE_DIR)tuxanci2.iso" - -$(STAGED_ENTRY): $(MAKEFILE_DIR)xbox.c - mkdir -p $(@D) - printf '#include "%s"\n' '$(abspath $<)' > $@ - -$(XBOX_BUILD_DIR)/src/%.c: $(ROOT_DIR)/src/%.c - mkdir -p $(@D) - printf '#include "%s"\n' '$(abspath $<)' > $@ - -define ASSET_C_RULE -$(XBOX_BUILD_DIR)/assets/$(basename $(patsubst $(ROOT_DIR)/files/%,%,$(1))).c: $(1) - mkdir -p $$(dir $$@) - $$(XXD) -i -n ta_file_$$(notdir $$(basename $(1))) $$< $$@ -endef - -$(foreach asset,$(ASSETS),$(eval $(call ASSET_C_RULE,$(asset)))) - -$(CONFIG_HEADER): - mkdir -p $(@D) - printf '#ifndef TA_CONFIG_H\n#define TA_CONFIG_H\n\n#define TA_BITS 32\n\n#endif\n' > $@ - -clean: - rm -rf "$(XBOX_BUILD_DIR)" - rm -rf "$(MAKEFILE_DIR)build" - rm -f "$(MAKEFILE_DIR)main.exe" "$(MAKEFILE_DIR)Tuxanci 2.iso" "$(MAKEFILE_DIR)tuxanci2.iso"