#
# Quake Makefile for Linux 2.0
#
# Aug '98 by Zoid <zoid@idsoftware.com>
#
# ELF only
#
# Modified by QuDos at http://qudos.quakedev.com

BASEVERSION=0.16
VERSION=$(BASEVERSION)$(GLIBC)

ifneq (,$(findstring libc6,$(shell if [ -e /lib/libc.so.6 ];then echo libc6;fi)))
GLIBC=-glibc
else
GLIBC=
endif

ifneq (,$(findstring alpha,$(shell uname -m)))
ARCH=axp
else
ARCH=i386
endif
NOARCH=noarch

MOUNT_DIR=./src

BUILD_DEBUG_DIR=debug$(ARCH)$(GLIBC)
BUILD_RELEASE_DIR=release$(ARCH)$(GLIBC)

BUILD_SDL=YES   # demonquake sdl glx executable (uses SDL for cdrom and sound)

CC=gcc

BASE_CFLAGS=-Dstricmp=strcasecmp -Did386 -funsigned-char #-Wall

RELEASE_CFLAGS=$(BASE_CFLAGS) -march=i686 -O2 -ffast-math -funroll-loops \
	-fomit-frame-pointer -fexpensive-optimizations -fno-strict-aliasing -pipe #-Wall
	
DEBUG_CFLAGS=$(BASE_CFLAGS) -g #-DDEBUG_MEM


LDFLAGS=-lm -ldl

LDFLAGS += -L./src/fmod -Wl,-rpath,. -lfmod  #-L./src/mss -Wl,-rpath,. -lmss

ifeq ($(strip $(BUILD_SDL)),YES)
 SDLCFLAGS=$(shell sdl-config --cflags)
 SDLLDFLAGS=$(shell sdl-config --libs)
 LDFLAGS += \
    -lSDL
 BASE_CFLAGS += \
    -D_SDL_FIX -D_SDL_BIN
endif

GLLDFLAGS=-L/usr/X11R6/lib -L/usr/lib -L/usr/local/lib -lGL -lGLU -lX11 -lXext -ldl -lXxf86dga -lXxf86vm -lm -lz -lpng -ljpeg
GLCFLAGS=-DGLQUAKE -I/usr/include -I/usr/X11R6/include

DO_CC=$(CC) $(CFLAGS) -o $@ -c $<
DO_DEBUG_CC=$(CC) $(DEBUG_CFLAGS) -o $@ -c $<
DO_GL_CC=$(CC) $(CFLAGS) $(GLCFLAGS) -o $@ -c $<
DO_GL_DEBUG_CC=$(CC) $(DEBUG_CFLAGS) $(GLCFLAGS) -o $@ -c $<
DO_X11_CC=$(CC) $(CFLAGS) $(XCFLAGS) -o $@ -c $<
DO_X11_DEBUG_CC=$(CC) $(DEBUG_CFLAGS) $(XCFLAGS) -o $@ -c $<
DO_O_CC=$(CC) -O $(CFLAGS) -o $@ -c $<
DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
DO_GL_AS=$(CC) $(CFLAGS) $(GLCFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<

#############################################################################
# SETUP AND BUILD
#############################################################################

   TARGETS=$(BUILDDIR)/demonquake.glx

ifeq ($(strip $(BUILD_SDL)),YES)
   TARGETS +=$(BUILDDIR)/demonquake-sdl.glx
endif

all:
	@echo
	@echo Possible targets:
	@echo
	@echo ">> make release	               build the binary for a release."
	@echo ">> make debug	               build the binary for debuging mode."
	@echo ">> make clean "
	@echo	
	@echo ">> SDL binaries options "
	@echo ">> make release BUILD_SDL=YES  build the binary for a SDL release."
	@echo ">> make debug BUILD_SDL=YES    build the binary for SDL debuging mode."
	@echo ">> make clean BUILD_SDL=YES"
	@echo
debug:
	@-mkdir $(BUILD_DEBUG_DIR) \
	$(BUILD_DEBUG_DIR)/glquake
	$(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"

release:
	@-mkdir $(BUILD_RELEASE_DIR) \
	$(BUILD_RELEASE_DIR)/glquake
	$(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"


targets: $(TARGETS)

#############################################################################
# GLQuake
#############################################################################

GLQUAKE_OBJS= \
   $(BUILDDIR)/glquake/cl_collision.o \
   $(BUILDDIR)/glquake/cl_demo.o \
   $(BUILDDIR)/glquake/cl_input.o \
   $(BUILDDIR)/glquake/cl_main.o \
   $(BUILDDIR)/glquake/cl_parse.o \
   $(BUILDDIR)/glquake/cl_tent.o \
   $(BUILDDIR)/glquake/chase.o \
   $(BUILDDIR)/glquake/cmd.o \
   $(BUILDDIR)/glquake/common.o \
   $(BUILDDIR)/glquake/console.o \
   $(BUILDDIR)/glquake/crc.o \
   $(BUILDDIR)/glquake/cvar.o \
   \
   $(BUILDDIR)/glquake/gl_corona.o \
   $(BUILDDIR)/glquake/gl_draw.o \
   $(BUILDDIR)/glquake/gl_image.o \
   $(BUILDDIR)/glquake/gl_md3.o \
   $(BUILDDIR)/glquake/gl_mesh.o \
   $(BUILDDIR)/glquake/gl_model.o \
   $(BUILDDIR)/glquake/gl_refrag.o \
   $(BUILDDIR)/glquake/gl_rlight.o \
   $(BUILDDIR)/glquake/gl_rmain.o \
   $(BUILDDIR)/glquake/gl_rmisc.o \
   $(BUILDDIR)/glquake/gl_rpart.o \
   $(BUILDDIR)/glquake/gl_rsurf.o \
   $(BUILDDIR)/glquake/gl_screen.o \
   $(BUILDDIR)/glquake/gl_warp.o \
   \
   $(BUILDDIR)/glquake/host.o \
   $(BUILDDIR)/glquake/host_cmd.o \
   $(BUILDDIR)/glquake/keys.o \
   $(BUILDDIR)/glquake/lmp.o \
   $(BUILDDIR)/glquake/menu.o \
   $(BUILDDIR)/glquake/mathlib.o \
   $(BUILDDIR)/glquake/mod.o \
   $(BUILDDIR)/glquake/nehahra.o \
   $(BUILDDIR)/glquake/net_dgrm.o \
   $(BUILDDIR)/glquake/net_loop.o \
   $(BUILDDIR)/glquake/net_main.o \
   $(BUILDDIR)/glquake/net_vcr.o \
   $(BUILDDIR)/glquake/net_udp.o \
   $(BUILDDIR)/glquake/net_bsd.o \
   $(BUILDDIR)/glquake/pr_cmds.o \
   $(BUILDDIR)/glquake/pr_edict.o \
   $(BUILDDIR)/glquake/pr_exec.o \
   $(BUILDDIR)/glquake/r_part.o \
   $(BUILDDIR)/glquake/sbar.o \
   $(BUILDDIR)/glquake/sv_main.o \
   $(BUILDDIR)/glquake/sv_phys.o \
   $(BUILDDIR)/glquake/sv_move.o \
   $(BUILDDIR)/glquake/sv_user.o \
   $(BUILDDIR)/glquake/zone.o   \
   $(BUILDDIR)/glquake/view.o   \
   $(BUILDDIR)/glquake/wad.o \
   $(BUILDDIR)/glquake/world.o \
   $(BUILDDIR)/glquake/sys_linux.o \
   $(BUILDDIR)/glquake/snd_dma.o \
   $(BUILDDIR)/glquake/snd_mem.o \
   $(BUILDDIR)/glquake/snd_mix.o \
   \
   $(BUILDDIR)/glquake/math.o \
   $(BUILDDIR)/glquake/snd_mixa.o \
   $(BUILDDIR)/glquake/sys_x86.o \
   $(BUILDDIR)/glquake/worlda.o

GLQUAKE_LNX_OBJS = \
   $(BUILDDIR)/glquake/cd_linux.o \
   $(BUILDDIR)/glquake/snd_linux.o

GLQUAKE_SDL_OBJS = \
   $(BUILDDIR)/glquake/cd_sdl.o \
   $(BUILDDIR)/glquake/snd_linux_sdl.o 
   
GLX_OBJS=$(BUILDDIR)/glquake/vid_glx.o \
	$(BUILDDIR)/glquake/vid_common_gl.o

$(BUILDDIR)/demonquake.glx : $(GLQUAKE_OBJS) $(GLQUAKE_LNX_OBJS)  $(GLX_OBJS)
	$(CC) $(CFLAGS) -o $@ $(GLQUAKE_OBJS) $(GLQUAKE_LNX_OBJS)  $(GLX_OBJS) $(GLLDFLAGS) $(LDFLAGS)
	
$(BUILDDIR)/demonquake-sdl.glx : $(GLQUAKE_OBJS) $(GLQUAKE_SDL_OBJS)  $(GLX_OBJS)
	$(CC) $(CFLAGS) -o $@ $(GLQUAKE_OBJS) $(GLQUAKE_SDL_OBJS)  $(GLX_OBJS) $(GLLDFLAGS) $(LDFLAGS) $(SDLLDFLAGS)

$(BUILDDIR)/glquake/cl_collision.o : $(MOUNT_DIR)/cl_collision.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cl_demo.o :      $(MOUNT_DIR)/cl_demo.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cl_input.o :     $(MOUNT_DIR)/cl_input.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cl_main.o :      $(MOUNT_DIR)/cl_main.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cl_parse.o :     $(MOUNT_DIR)/cl_parse.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cl_tent.o :      $(MOUNT_DIR)/cl_tent.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/chase.o :        $(MOUNT_DIR)/chase.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cmd.o :          $(MOUNT_DIR)/cmd.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/common.o :       $(MOUNT_DIR)/common.c
	$(DO_GL_DEBUG_CC)

$(BUILDDIR)/glquake/console.o :      $(MOUNT_DIR)/console.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/crc.o :          $(MOUNT_DIR)/crc.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cvar.o :         $(MOUNT_DIR)/cvar.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_corona.o :    $(MOUNT_DIR)/gl_corona.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_draw.o :      $(MOUNT_DIR)/gl_draw.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_image.o :     $(MOUNT_DIR)/gl_image.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_md3.o :       $(MOUNT_DIR)/gl_md3.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_mesh.o :      $(MOUNT_DIR)/gl_mesh.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_model.o :     $(MOUNT_DIR)/gl_model.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_refrag.o :    $(MOUNT_DIR)/gl_refrag.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_rlight.o :    $(MOUNT_DIR)/gl_rlight.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_rmain.o :     $(MOUNT_DIR)/gl_rmain.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_rmisc.o :     $(MOUNT_DIR)/gl_rmisc.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_rpart.o :     $(MOUNT_DIR)/gl_rpart.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_rsurf.o :     $(MOUNT_DIR)/gl_rsurf.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_screen.o :    $(MOUNT_DIR)/gl_screen.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/vid_common_gl.o : $(MOUNT_DIR)/vid_common_gl.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/vid_glx.o :      $(MOUNT_DIR)/vid_glx.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/gl_warp.o :      $(MOUNT_DIR)/gl_warp.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/host.o :         $(MOUNT_DIR)/host.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/host_cmd.o :     $(MOUNT_DIR)/host_cmd.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/keys.o :         $(MOUNT_DIR)/keys.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/lmp.o :          $(MOUNT_DIR)/lmp.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/menu.o :         $(MOUNT_DIR)/menu.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/mathlib.o :      $(MOUNT_DIR)/mathlib.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/mod.o :          $(MOUNT_DIR)/mod.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/nehahra.o :      $(MOUNT_DIR)/nehahra.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/net_dgrm.o :     $(MOUNT_DIR)/net_dgrm.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/net_loop.o :     $(MOUNT_DIR)/net_loop.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/net_main.o :     $(MOUNT_DIR)/net_main.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/net_vcr.o :      $(MOUNT_DIR)/net_vcr.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/net_udp.o :      $(MOUNT_DIR)/net_udp.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/net_bsd.o :      $(MOUNT_DIR)/net_bsd.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/pr_cmds.o :      $(MOUNT_DIR)/pr_cmds.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/pr_edict.o :     $(MOUNT_DIR)/pr_edict.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/pr_exec.o :      $(MOUNT_DIR)/pr_exec.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/r_part.o :       $(MOUNT_DIR)/r_part.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/sbar.o :         $(MOUNT_DIR)/sbar.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/sv_main.o :      $(MOUNT_DIR)/sv_main.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/sv_phys.o :      $(MOUNT_DIR)/sv_phys.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/sv_move.o :      $(MOUNT_DIR)/sv_move.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/sv_user.o :      $(MOUNT_DIR)/sv_user.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/zone.o   :       $(MOUNT_DIR)/zone.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/view.o   :       $(MOUNT_DIR)/view.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/wad.o :          $(MOUNT_DIR)/wad.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/world.o :        $(MOUNT_DIR)/world.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cd_linux.o :     $(MOUNT_DIR)/cd_linux.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/cd_sdl.o :       $(MOUNT_DIR)/cd_sdl.c
	$(DO_GL_CC) $(SDLCFLAGS)

$(BUILDDIR)/glquake/sys_linux.o :    $(MOUNT_DIR)/sys_linux.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/snd_dma.o :      $(MOUNT_DIR)/snd_dma.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/snd_mem.o :      $(MOUNT_DIR)/snd_mem.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/snd_mix.o :      $(MOUNT_DIR)/snd_mix.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/snd_linux.o :    $(MOUNT_DIR)/snd_linux.c
	$(DO_GL_CC)

$(BUILDDIR)/glquake/snd_linux_sdl.o : $(MOUNT_DIR)/snd_linux_sdl.c
	$(DO_GL_CC) $(SDLCFLAGS)

$(BUILDDIR)/glquake/math.o :         $(MOUNT_DIR)/math.s
	$(DO_GL_AS)

$(BUILDDIR)/glquake/snd_mixa.o :     $(MOUNT_DIR)/snd_mixa.s
	$(DO_GL_AS)

$(BUILDDIR)/glquake/sys_x86.o :      $(MOUNT_DIR)/sys_x86.s
	$(DO_GL_AS)

$(BUILDDIR)/glquake/worlda.o :       $(MOUNT_DIR)/worlda.s
	$(DO_GL_AS)

#############################################################################
# MISC
#############################################################################

clean: clean-debug clean-release

clean-debug:
	$(MAKE) clean2 BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"

clean-release:
	$(MAKE) clean2 BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(DEBUG_CFLAGS)"

clean2:
	-rm -f $(GLQUAKE_OBJS) \
	$(GLX_OBJS) \
	$(GLQUAKE_LNX_OBJS) \
	$(GLQUAKE_SDL_OBJS)
	

