########################################################################
#
# Quake general stuff
#

PROJECT_DIR	= @top_srcdir@
PROJECT_ODIR	= ..
SRC_DIR		= @srcdir@
QW_COMMON_DIR	= $(PROJECT_DIR)/qw_common
COMMON_DIR	= $(PROJECT_DIR)/common
COMMON_ODIR	= $(PROJECT_ODIR)/common
BIN_PREFIX	= qw-client

DESTDIR		=

prefix		= @prefix@
exec_prefix	= @exec_prefix@
bindir		= @bindir@
mandir		= @mandir@

BUILD_DIR	= $(PROJECT_ODIR)/targets/qw_client

LDFLAGS = @LDFLAGS@ @SND_LIBS@ @NET_LIBS@ -lm
LIBS = @LIBS@
CC = @CC@
INTEL_ARCH = @INTEL_ARCH@

ifneq ($(SRC_DIR),.)
SRC_DIR_INC = -I$(SRC_DIR)
endif

HAS_MGL    = @HAS_MGL@
HAS_GGI    = @HAS_GGI@
HAS_SVGA   = @HAS_SVGA@
HAS_GLIDE  = @HAS_GLIDE@
HAS_TDFXGL = @HAS_TDFXGL@
HAS_OGL    = @HAS_OGL@
HAS_XIL    = @HAS_XIL@
HAS_X11    = @HAS_X11@
HAS_SDL    = @HAS_SDL@

MAKE_SURE_DIR = if test -d "$(BUILD_DIR)/$$DIR"; \
                then \
                   true; \
                else \
		   echo "Creating directory $(BUILD_DIR)/$$DIR"; \
		   mkdir -p $(BUILD_DIR)/$$DIR; \
                fi


########################################################################
#
# Client targets
#

COMMON_LIB=common_lib.a

ifeq ($(HAS_OGL),yes)
GLQUAKE   =$(BIN_PREFIX)-gl
endif

ifeq ($(HAS_TDFXGL),yes)
TDFXQUAKE= $(BIN_PREFIX)-3dfx
endif

ifeq ($(HAS_X11),yes)
X11QUAKE  = $(BIN_PREFIX)-x11
endif

ifeq ($(HAS_SVGA),yes)
SVGAQUAKE = $(BIN_PREFIX)-svga
endif

ifeq ($(HAS_GGI),yes)
GGIQUAKE = $(BIN_PREFIX)-ggi
endif

ifeq ($(HAS_MGL),yes)
MGLQUAKE = $(BIN_PREFIX)-mgl
endif

ifeq ($(HAS_SDL),yes)
SDLQUAKE = $(BIN_PREFIX)-sdl
endif

RELEASE = @RELEASE@
ifeq ($(RELEASE),yes)
OPTFLAGS = @RELEASE_CFLAGS@
else
OPTFLAGS = -g
endif

soft_targets  = $(X11QUAKE) $(SVGAQUAKE) $(GGIQUAKE) $(SDLQUAKE) $(MGLQUAKE)
gl_targets    = $(GLQUAKE) $(TDFXQUAKE)
lib_targets   = $(COMMON_LIB)
targets       = $(lib_targets) $(gl_targets) $(soft_targets)
CLEAN_TARGETS = $(patsubst %,clean-%, $(targets))
.PHONY: $(targets) $(CLEAN_TARGETS) clean-soft clean-gl

all: $(targets)
########################################################################
#
# Source files
#

ifeq ($(INTEL_ARCH),yes)

# Source file the Intel archictecture only

UQ_GENERAL_SRC         = worlda.s
UQ_SWREND_SRC_PLAT     = dosasm.s
CL_ADDITIONAL_GENERAL_SRC = sys_dosa.s math.s
SWREND_SRC_PLAT = d_draw.s d_draw16.s d_parta.s d_polysa.s d_scana.s \
	d_spr8.s d_varsa.s r_aclipa.s r_aliasa.s \
	r_drawa.s r_edgea.s r_varsa.s surf16.s surf8.s
XTRA_SND_SRC = snd_mixa.s
else

# Source files for non-Intel platforms

SWREND_SRC_PLAT = nonintel.c
endif

# System specific source files

CD_AUDIO_SRC   = cd_wrapper.c

# Sound source

SND_STYLE      = @SND_STYLE@
SND_SRC = snd_null.c

ifeq ($(SND_STYLE),ALSA)
SND_SRC = snd_dma.c snd_alsa.c
endif
ifeq ($(SND_STYLE),OSS)
SND_SRC = snd_dma.c snd_oss.c
endif
ifeq ($(SND_STYLE),Solaris)
SND_SRC = snd_dma.c snd_sun.c
endif
ifeq ($(SND_STYLE),MME)
SND_SRC = snd_dma.c snd_mme.c
endif
ifeq ($(SND_STYLE),Windows)
SND_SRC = snd_dma.c snd_win.c
endif

SND_SRC        += snd_mem.c snd_mix.c $(XTRA_SND_SRC)

SYS_SRC        = sys_common.c @QW_CL_SYS_SRC@

# Networking source files
#
# Uncomment the second line to add IPv6 support

QW_NET_SRC     = net_udp.c net_com.c mdfour.c
#QW_NET_SRC	= net_udp6.c net_com.c mdfour.c

# Common source files

MISC_SRC       = common.c crc.c cvar.c cmd.c mathlib.c register_check.c \
                 wad.c zone.c cvars.c

# GL renderer source

GL_REND_SRC = gl_screen.c gl_model.c gl_draw.c gl_mesh.c gl_refrag.c \
              gl_rlight.c gl_rmain.c gl_rmisc.c gl_rsurf.c gl_warp.c \
	      nonintel.c gl_ngraph.c gl_view.c gl_rpart.c gl_cl_parse.c
#              gl_rlight.c gl_rmain.c gl_rmisc.c gl_rsurf.c gl_test.c gl_warp.c

# Software renderer source

SW_REND_SRC = screen.c $(SWREND_SRC_PLAT) draw.c \
	d_edge.c d_fill.c d_init.c d_modech.c d_part.c d_polyse.c d_scan.c \
	d_sky.c d_sprite.c d_surf.c d_vars.c d_zpoint.c r_aclip.c r_alias.c \
	r_bsp.c r_draw.c r_edge.c r_efrag.c r_light.c r_main.c r_misc.c \
	r_sky.c r_sprite.c r_surf.c r_vars.c sw_view.c sw_rpart.c sw_cl_parse.c

# Client source files

CL_SRC    = cl_demo.c cl_input.c cl_main.c cl_parse.c cl_tent.c 
QW_CL_SRC = cl_cam.c cl_ents.c cl_pred.c 
CL_GUI_SRC= console.c sbar.c view.c keys.c menu.c

# Server source files

SRV_SRC     = sv_main.c sv_user.c sv_move.c sv_phys.c 
QW_SRV_SRC  = sv_ccmds.c sv_ents.c sv_init.c sv_send.c sv_nchan.c world.c
SRV_PR_SRC  = pr_cmds.c pr_edict.c pr_exec.c


QW_GENERAL_SRC = pmove.c pmovetst.c

# Source common to QW/UQuake
CL_COMMON_SRC = $(MISC_SRC) $(CL_GUI_SRC) $(CL_SRC) \
	$(CL_ADDITIONAL_GENERAL_SRC) $(SND_SRC) r_part.c


########################################################################
#
# Directory specific stuff
#
DEFS = @DEFS@
CFLAGS = @CFLAGS@ -DQUAKEWORLD $(OPTFLAGS) $(DEFS) -I. \
$(SRC_DIR_INC) -I$(QW_COMMON_DIR) -I$(COMMON_ODIR) -I$(COMMON_DIR)

GENERAL_SRC = $(CL_COMMON_SRC) \
	   $(QW_CL_SRC) $(QW_NET_SRC) net_chan.c skin.c \
	   $(SYS_SRC) $(QW_GENERAL_SRC)

# FIXME: add dos/win specifc source

###########################################################################
#
# Compilation rules
#

# Common lib targets.

$(BUILD_DIR)/common_lib/%.@OBJEXT@: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

$(BUILD_DIR)/common_lib/%.@OBJEXT@: $(SRC_DIR)/%.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(BUILD_DIR)/common_lib/%.@OBJEXT@: $(COMMON_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

$(BUILD_DIR)/common_lib/%.@OBJEXT@: $(COMMON_DIR)/%.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(BUILD_DIR)/common_lib/%.o: $(QW_COMMON_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

# Software targets
soft_DIR:
	@DIR=soft; $(MAKE_SURE_DIR)

$(BUILD_DIR)/soft/%.@OBJEXT@: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

$(BUILD_DIR)/soft/%.@OBJEXT@: $(SRC_DIR)/%.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(BUILD_DIR)/soft/%.@OBJEXT@: $(COMMON_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

$(BUILD_DIR)/soft/%.@OBJEXT@: $(COMMON_DIR)/%.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(BUILD_DIR)/soft/%.o: $(QW_COMMON_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

# GL targets

gl_DIR:
	@DIR=gl; $(MAKE_SURE_DIR)

$(BUILD_DIR)/gl/%.@OBJEXT@: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) $(GL_CFLAGS) -o $@ -c $<

$(BUILD_DIR)/gl/%.@OBJEXT@: $(SRC_DIR)/%.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(BUILD_DIR)/gl/%.@OBJEXT@: $(COMMON_DIR)/%.c
	$(CC) $(CFLAGS) $(GL_CFLAGS) -o $@ -c $<

$(BUILD_DIR)/gl/%.@OBJEXT@: $(COMMON_DIR)/%.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(BUILD_DIR)/gl/%.o: $(QW_COMMON_DIR)/%.c
	$(CC) $(CFLAGS) -o $@ -c $<

###########################################################################
#
# Specific target rules
#

# Lib Software targets
ALL_COMMON_LIB_OBJS = $(patsubst %,$(BUILD_DIR)/common_lib/%,$(addsuffix \
			  .@OBJEXT@, $(basename $(GENERAL_SRC) .c .s)))

common_lib_DIR:
	@DIR=common_lib; $(MAKE_SURE_DIR)

$(COMMON_LIB): common_lib_DIR $(BUILD_DIR)/common_lib.a

$(BUILD_DIR)/common_lib.a: $(ALL_COMMON_LIB_OBJS)
	ar cru $@ $(ALL_COMMON_LIB_OBJS)
	ranlib $@

# X11 Software target

ifneq ($(X11QUAKE),)

ALL_X11_SRC  = $(CD_AUDIO_SRC) $(SW_REND_SRC) @X11_VID_SRC@\
               model.c
ALL_X11_OBJS = $(patsubst %,$(BUILD_DIR)/soft/%,$(addsuffix .@OBJEXT@,\
                          $(basename $(ALL_X11_SRC) .c .s))) \
			  $(BUILD_DIR)/common_lib.a

X11_CFLAGS  = -DX11 @X_CFLAGS@
X11_LDFLAGS = @X_LIBS@ -lX11 @X11_SHM_LIB@ @X_EXTRA_LIBS@

# FIXME: This rule is pathological because of the seperate sunx driver,
#    either merge it into vid_x.c or make a seperate sun target.  In either
#    case, find the moro^wpeople responsible for this and other stupidities
#    in Solaris and "educate" them.
$(BUILD_DIR)/soft/$(addsuffix .@OBJEXT@,$(basename @X11_VID_SRC@ .c)):\
$(COMMON_DIR)/@X11_VID_SRC@
	$(CC) $(CFLAGS) $(X11_CFLAGS) -o $@ -c $<

$(X11QUAKE): soft_DIR $(BUILD_DIR)/../$(X11QUAKE)

$(BUILD_DIR)/../$(X11QUAKE): $(ALL_X11_OBJS)
	$(CC) $(CFLAGS) $(ALL_X11_OBJS) $(X11_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(X11QUAKE)

endif

# SVGALib software target

ifneq ($(SVGAQUAKE),)
ALL_SVGA_SRC = $(CD_AUDIO_SRC) $(SW_REND_SRC) \
		vid_svgalib.c in_svgalib.c d_copy.s model.c
ALL_SVGA_OBJS = $(patsubst %,$(BUILD_DIR)/soft/%,$(addsuffix .@OBJEXT@,\
                $(basename $(ALL_SVGA_SRC) .c .s))) \
		$(BUILD_DIR)/common_lib.a

SVGA_CFLAGS  = @SVGA_CFLAGS@
SVGA_LDFLAGS = @SVGA_LIBS@

# Not sure why this -O is needed, but it is...
$(BUILD_DIR)/soft/vid_svgalib.@OBJEXT@: $(COMMON_DIR)/vid_svgalib.c
	$(CC) -O $(CFLAGS) $(SVGA_CFLAGS) -o $@ -c $<

$(BUILD_DIR)/soft/d_copy.@OBJEXT@: $(COMMON_DIR)/d_copy.s
	$(CC) $(CFLAGS) -x assembler-with-cpp -o $@ -c $<

$(SVGAQUAKE): soft_DIR $(BUILD_DIR)/../$(SVGAQUAKE)

$(BUILD_DIR)/../$(SVGAQUAKE): $(ALL_SVGA_OBJS)
	$(CC) $(CFLAGS) $(ALL_SVGA_OBJS) $(SVGA_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(SVGAQUAKE)

endif

# GGI software target

ifneq ($(GGIQUAKE),)

# Map the list of source files into a list of object files
ALL_GGI_SRC   = $(CD_AUDIO_SRC) $(SW_REND_SRC) vid_ggi.c\
                model.c
ALL_GGI_OBJS  = $(patsubst %,$(BUILD_DIR)/soft/%,$(addsuffix .@OBJEXT@,\
                $(basename $(ALL_GGI_SRC) .c .s))) \
		$(BUILD_DIR)/common_lib.a

GGI_SRC     = vid_ggi.c
GGI_CFLAGS  = -DGGI @GGI_CFLAGS@
GGI_LDFLAGS = @GGI_LIBS@

$(BUILD_DIR)/soft/vid_ggi.@OBJEXT@: $(COMMON_DIR)/vid_ggi.c
	$(CC) $(CFLAGS) $(GGI_CFLAGS) -o $@ -c $<

$(GGIQUAKE): soft_DIR $(BUILD_DIR)/../$(GGIQUAKE)

$(BUILD_DIR)/../$(GGIQUAKE): $(ALL_GGI_OBJS)
	$(CC) $(CFLAGS) $(ALL_GGI_OBJS) $(GGI_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(GGIQUAKE)

endif

# SDL software target

ifneq ($(SDLQUAKE),)
ALL_SDL_SRC  = $(SW_REND_SRC) $(SDL_SRC) vid_sdl.c cd_sdl.c\
               model.c
ALL_SDL_OBJS = $(patsubst %,$(BUILD_DIR)/soft/%,$(addsuffix .@OBJEXT@,\
               $(basename $(ALL_SDL_SRC) .c .s))) \
	       $(BUILD_DIR)/common_lib.a

SDL_CFLAGS  = @SDL_CFLAGS@ -DSDL
SDL_LDFLAGS = @SDL_LIBS@

$(BUILD_DIR)/soft/vid_sdl.@OBJEXT@: $(COMMON_DIR)/vid_sdl.c
	$(CC) $(CFLAGS) $(SDL_CFLAGS) -o $@ -c $<

$(BUILD_DIR)/soft/cd_sdl.@OBJEXT@: $(COMMON_DIR)/cd_sdl.c
	$(CC) $(CFLAGS) $(SDL_CFLAGS) -o $@ -c $<

$(SDLQUAKE): soft_DIR $(BUILD_DIR)/../$(SDLQUAKE)

$(BUILD_DIR)/../$(SDLQUAKE): $(ALL_SDL_OBJS)
	$(CC) $(CFLAGS) $(ALL_SDL_OBJS) $(SDL_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(SDLQUAKE)

endif

# MGL software target

ifneq ($(MGLQUAKE),)

# Map the list of source files into a list of object files
ALL_MGL_SRC = $(CD_AUDIO_SRC) $(SW_REND_SRC) \
	vid_win.c in_win.c model.c
ALL_MGL_OBJS = $(patsubst %,$(BUILD_DIR)/soft/%,$(addsuffix .@OBJEXT@,\
               $(basename $(ALL_MGL_SRC) .c .s))) \
	       $(BUILD_DIR)/common_lib.a

MGL_CFLAGS  = -DMGL @MGL_CFLAGS@
MGL_LDFLAGS = @MGL_LIBS@ -lm

$(BUILD_DIR)/soft/vid_mgl.@OBJEXT@: $(COMMON_DIR)/vid_mgl.c
	$(CC) $(CFLAGS) $(MGL_CFLAGS) -o $@ -c $<

$(MGLQUAKE): soft_DIR $(BUILD_DIR)/../$(MGLQUAKE)

$(BUILD_DIR)/../$(MGLQUAKE): $(ALL_MGL_OBJS)
	$(CC) $(CFLAGS) $(ALL_MGL_OBJS) $(MGL_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(MGLQUAKE)

endif

# X11 GL target

ifneq ($(GLQUAKE),)
ALL_GL_SRC  = $(CD_AUDIO_SRC) $(GL_REND_SRC) \
	gl_vidglx.c dga_check.c
ALL_GL_OBJS = $(patsubst %,$(BUILD_DIR)/gl/%,$(addsuffix .@OBJEXT@,\
              $(basename $(ALL_GL_SRC) .c .s))) \
	      $(BUILD_DIR)/common_lib.a

GL_CFLAGS  = @OGL_CFLAGS@
GL_LDFLAGS = $(X11_LDFLAGS) @OGL_LIBS@ @DGA_LIBS@ @DYN_LIBS@

$(BUILD_DIR)/gl/gl_vidglx.o: $(COMMON_DIR)/gl_vidglx.c
	$(CC) $(CFLAGS) $(GL_CFLAGS) -o $@ -c $<

$(BUILD_DIR)/gl/dga_check.@OBJEXT@: $(COMMON_DIR)/dga_check.c
	$(CC) $(CFLAGS) $(X11_CFLAGS) -o $@ -c $<

$(GLQUAKE): gl_DIR $(BUILD_DIR)/../$(GLQUAKE)

$(BUILD_DIR)/../$(GLQUAKE): $(ALL_GL_OBJS)
	$(CC) $(CFLAGS) $(ALL_GL_OBJS) $(GL_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(GLQUAKE)

endif


# 3Dfx GL MCD target

ifneq ($(TDFXQUAKE),)
ALL_TDFX_SRC  = $(CD_AUDIO_SRC) $(GL_REND_SRC) \
		gl_vidlinux_3dfx.c in_svgalib.c
ALL_TDFX_OBJS = $(patsubst %,$(BUILD_DIR)/gl/%,$(addsuffix .@OBJEXT@,\
		$(basename $(ALL_TDFX_SRC) .c .s))) \
		$(BUILD_DIR)/common_lib.a

TDFX_CFLAGS  = @OGL_CFLAGS@ @GLIDE_CFLAGS@
TDFX_LDFLAGS = @SVGA_LIBS@ @TDFXGL_LIBS@

$(BUILD_DIR)/gl/gl_vidlinux_3dfx.@OBJEXT@: $(COMMON_DIR)/gl_vidlinux_3dfx.c
	$(CC) $(CFLAGS) $(TDFX_CFLAGS) -o $@ -c $<

$(TDFXQUAKE): gl_DIR $(BUILD_DIR)/../$(TDFXQUAKE)

$(BUILD_DIR)/../$(TDFXQUAKE): $(ALL_TDFX_OBJS)
	$(CC) $(CFLAGS) $(ALL_TDFX_OBJS) $(TDFX_LDFLAGS) $(LDFLAGS) $(LIBS) \
	-o $(BUILD_DIR)/../$(TDFXQUAKE)

endif


###########################################################################
#
# Misc targets
#

distclean: clean
	rm -f Makefile

$(CLEAN_TARGETS):
	rm -f $(BUILD_DIR)/../$(subst clean-,,$@)

clean-soft clean-gl clean-common_lib:
	rm -rf $(BUILD_DIR)/$(subst clean-,,$@)

clean: clean-soft clean-gl clean-common_lib $(CLEAN_TARGETS)
	-rmdir $(BUILD_DIR)

install: $(targets)
	$(PROJECT_DIR)/mkinstalldirs $(DESTDIR)/$(bindir)
	for i in $(targets); do \
	   $(PROJECT_DIR)/install-sh -m 755 $(BUILD_DIR)/../$$i \
	     $(DESTDIR)/$(bindir)/$$i; \
	done

check:
	@echo check not implemented
