summary refs log tree commit diff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile239
1 files changed, 239 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..51ef5f1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,239 @@
+SOURCE_DIR  := src
+BUILD_DIR   := build
+C_SOURCES   := $(wildcard $(SOURCE_DIR)/*.c)
+C_OBJECTS   := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(C_SOURCES))
+
+OBJECTS := $(C_OBJECTS)
+ENAME   = ClassiCube
+CFLAGS  = -g -pipe -fno-math-errno
+LDFLAGS = -g -rdynamic
+
+ifndef RM
+	# No prefined RM variable, try to guess OS default
+	ifeq ($(OS),Windows_NT)
+		RM = del
+	else
+		RM = rm -f
+	endif
+endif
+
+# Enables dependency tracking (https://make.mad-scientist.net/papers/advanced-auto-dependency-generation/)
+# This ensures that changing a .h file automatically results in the .c files using it being auto recompiled when next running make
+# On older systems the required GCC options may not be supported - in which case just change TRACK_DEPENDENCIES to 0
+TRACK_DEPENDENCIES=1
+
+ifndef $(PLAT)
+	ifeq ($(OS),Windows_NT)
+		PLAT = mingw
+	else
+		PLAT = $(shell uname -s | tr '[:upper:]' '[:lower:]')
+	endif
+endif
+
+ifeq ($(PLAT),web)
+	CC      = emcc
+	OEXT    = .html
+	CFLAGS  = -g
+	LDFLAGS = -s WASM=1 -s NO_EXIT_RUNTIME=1 -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=1Mb --js-library $(SOURCE_DIR)/interop_web.js
+endif
+
+ifeq ($(PLAT),mingw)
+	CC      = gcc
+	OEXT    = .exe
+	CFLAGS  = -g -pipe -DUNICODE -fno-math-errno
+	LDFLAGS = -g
+	LIBS    = -mwindows -lwinmm -limagehlp
+endif
+
+ifeq ($(PLAT),linux)
+	CFLAGS  = -g -pipe -fno-math-errno -DCC_BUILD_ICON
+	LIBS    = -lX11 -lXi -lpthread -lGL -ldl
+endif
+
+ifeq ($(PLAT),sunos)
+	CFLAGS  = -g -pipe -fno-math-errno
+	LIBS    = -lsocket -lX11 -lXi -lGL
+endif
+
+ifeq ($(PLAT),darwin)
+	OBJECTS += $(BUILD_DIR)/Window_cocoa.o
+	CFLAGS  = -g -pipe -fno-math-errno -DCC_BUILD_ICON
+	LIBS    =
+	LDFLAGS = -rdynamic -framework Cocoa -framework OpenGL -framework IOKit -lobjc
+endif
+
+ifeq ($(PLAT),freebsd)
+	CFLAGS  = -g -pipe -I /usr/local/include -fno-math-errno -DCC_BUILD_ICON
+	LDFLAGS = -L /usr/local/lib -rdynamic
+	LIBS    = -lexecinfo -lGL -lX11 -lXi -lpthread
+endif
+
+ifeq ($(PLAT),openbsd)
+	CFLAGS  = -g -pipe -I /usr/X11R6/include -I /usr/local/include -fno-math-errno -DCC_BUILD_ICON
+	LDFLAGS = -L /usr/X11R6/lib -L /usr/local/lib -rdynamic
+	LIBS    = -lexecinfo -lGL -lX11 -lXi -lpthread
+endif
+
+ifeq ($(PLAT),netbsd)
+	CFLAGS  = -g -pipe -I /usr/X11R7/include -I /usr/pkg/include -fno-math-errno -DCC_BUILD_ICON
+	LDFLAGS = -L /usr/X11R7/lib -L /usr/pkg/lib -rdynamic
+	LIBS    = -lexecinfo -lGL -lX11 -lXi -lpthread
+endif
+
+ifeq ($(PLAT),dragonfly)
+	CFLAGS  = -g -pipe -I /usr/local/include -fno-math-errno -DCC_BUILD_ICON
+	LDFLAGS = -L /usr/local/lib -rdynamic
+	LIBS    = -lexecinfo -lGL -lX11 -lXi -lpthread
+endif
+
+ifeq ($(PLAT),haiku)
+	OBJECTS += $(BUILD_DIR)/Platform_BeOS.o $(BUILD_DIR)/Window_BeOS.o
+	CFLAGS  = -g -pipe -fno-math-errno
+	LDFLAGS = -g
+	LIBS    = -lGL -lnetwork -lstdc++ -lbe -lgame -ltracker
+endif
+
+ifeq ($(PLAT),beos)
+	OBJECTS += $(BUILD_DIR)/Platform_BeOS.o $(BUILD_DIR)/Window_BeOS.o
+	CFLAGS  = -g -pipe
+	LDFLAGS = -g
+	LIBS    = -lGL -lnetwork -lstdc++ -lbe -lgame -ltracker
+	TRACK_DEPENDENCIES=0
+endif
+
+ifeq ($(PLAT),serenityos)
+	LIBS    = -lgl -lSDL2
+endif
+
+ifeq ($(PLAT),irix)
+	CC      = gcc
+	LIBS    = -lGL -lX11 -lXi -lpthread -ldl
+endif
+
+ifdef SDL2
+	CFLAGS += -DCC_WIN_BACKEND=CC_WIN_BACKEND_SDL2
+	LIBS += -lSDL2
+endif
+ifdef SDL3
+	CFLAGS += -DCC_WIN_BACKEND=CC_WIN_BACKEND_SDL3
+	LIBS += -lSDL3
+endif
+
+
+ifdef TERMINAL
+	CFLAGS += -DCC_WIN_BACKEND=CC_WIN_BACKEND_TERMINAL -DCC_GFX_BACKEND=CC_GFX_BACKEND_SOFTGPU
+	LIBS := $(subst mwindows,mconsole,$(LIBS))
+endif
+
+default: $(PLAT)
+
+web:
+	$(MAKE) $(ENAME) PLAT=web
+linux:
+	$(MAKE) $(ENAME) PLAT=linux
+mingw:
+	$(MAKE) $(ENAME) PLAT=mingw
+sunos:
+	$(MAKE) $(ENAME) PLAT=sunos
+darwin:
+	$(MAKE) $(ENAME) PLAT=darwin
+freebsd:
+	$(MAKE) $(ENAME) PLAT=freebsd
+openbsd:
+	$(MAKE) $(ENAME) PLAT=openbsd
+netbsd:
+	$(MAKE) $(ENAME) PLAT=netbsd
+dragonfly:
+	$(MAKE) $(ENAME) PLAT=dragonfly
+haiku:
+	$(MAKE) $(ENAME) PLAT=haiku
+beos:
+	$(MAKE) $(ENAME) PLAT=beos
+serenityos:
+	$(MAKE) $(ENAME) PLAT=serenityos
+irix:
+	$(MAKE) $(ENAME) PLAT=irix
+
+# Default overrides
+sdl2:
+	$(MAKE) $(ENAME) SDL2=1
+sdl3:
+	$(MAKE) $(ENAME) SDL3=1
+terminal:
+	$(MAKE) $(ENAME) TERMINAL=1
+
+# Some builds require more complex handling, so are moved to
+#  separate makefiles to avoid having one giant messy makefile
+dreamcast:
+	$(MAKE) -f misc/dreamcast/Makefile
+saturn:
+	$(MAKE) -f misc/saturn/Makefile
+psp:
+	$(MAKE) -f misc/psp/Makefile
+vita:
+	$(MAKE) -f misc/vita/Makefile
+ps1:
+	cmake --preset default misc/ps1
+	cmake --build misc/ps1/build
+ps2:
+	$(MAKE) -f misc/ps2/Makefile
+ps3:
+	$(MAKE) -f misc/ps3/Makefile
+xbox:
+	$(MAKE) -f misc/xbox/Makefile
+xbox360:
+	$(MAKE) -f misc/xbox360/Makefile
+n64:
+	$(MAKE) -f misc/n64/Makefile
+ds:
+	$(MAKE) -f misc/ds/Makefile
+3ds:
+	$(MAKE) -f misc/3ds/Makefile
+gamecube:
+	$(MAKE) -f misc/gc/Makefile
+wii:
+	$(MAKE) -f misc/wii/Makefile
+wiiu:
+	$(MAKE) -f misc/wiiu/Makefile
+switch:
+	$(MAKE) -f misc/switch/Makefile
+os/2:
+	$(MAKE) -f misc/os2/Makefile
+macclassic_68k:
+	$(MAKE) -f misc/macclassic/Makefile_68k
+macclassic_ppc:
+	$(MAKE) -f misc/macclassic/Makefile_ppc
+	
+clean:
+	$(RM) $(OBJECTS)
+
+
+$(ENAME): $(BUILD_DIR) $(OBJECTS)
+	$(CC) $(LDFLAGS) -o $@$(OEXT) $(OBJECTS) $(LIBS)
+$(BUILD_DIR):
+	mkdir -p $(BUILD_DIR)
+
+
+# === Compiling with dependency tracking ===
+# NOTE: Tracking dependencies might not work on older systems - disable this if so
+ifeq ($(TRACK_DEPENDENCIES), 1)
+DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
+DEPFILES := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.d, $(C_SOURCES))
+$(DEPFILES):
+
+$(C_OBJECTS): $(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c $(BUILD_DIR)/%.d
+	$(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
+
+include $(wildcard $(DEPFILES))
+# === Compiling WITHOUT dependency tracking ===
+else
+$(C_OBJECTS): $(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c
+	$(CC) $(CFLAGS) -c $< -o $@
+endif
+	
+# === Platform specific file compiling ===
+$(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.m
+	$(CC) $(CFLAGS) -c $< -o $@
+	
+$(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.cpp
+	$(CC) $(CFLAGS) -c $< -o $@