# GNU Makefile for Quake II and modifications.
#
# Usage: just type "make".
#
# Configuration: the BUILD_* variables indicate the building of a component,
# and the WITH_* variables set options for these components. The "TYPE"
# variable indicates the type of build to do (release, debug and profile).
#
# Written by Alejandro Pulver for QuDos.
#

# Targets for building.

# FIXME: do not build dependencies when not building (define a variable and
# check for it before including files).

# OS type and architecture detection
ARCH:=		$(shell uname -m | sed -e 's/i.86/i386/')
OSTYPE:=	$(shell uname -s)

# Client and Renderers
BUILD_QUAKE2?=YES	# Build client (OSS sound, cdrom ioctls for cd audio).
BUILD_DEDICATED?=NO	# Build dedicated server.
BUILD_GLX?=YES		# Build OpenGL renderer.
BUILD_SDLGL?=YES	# Build SDL OpenGL renderer.
ifeq ($(OSTYPE),Linux)
BUILD_ALSA_SND?=YES     # Enable support for ALSA (default sound on 2.6 Linux).
endif
BUILD_ARTS_SND?=NO      # Enable support for libaRts (KDE sound system) sound.
BUILD_OSS_SND?=YES      # Enable support for OSS (default) sound.
BUILD_SDL_SND?=YES      # Enable support for SDL sound.

# Mods
BUILD_GAME?=YES		# Build original game modification (game$(ARCH).so).
BUILD_3ZB2?=NO		# Build 3zb2 (bots) modification.
BUILD_CTF?=NO		# Build CTF (Capture The Flag) modification.
BUILD_JABOT?=NO		# Build JABot (bots) modification.
BUILD_ROGUE?=NO		# Build Rogue modification.
BUILD_XATRIX?=NO	# Build Xatrix modification.
BUILD_ZAERO?=NO		# Build Zaero modification.

# Configurable options.
WITH_BOTS?=YES		# Enable Ace Bot support in modifications (Quake2, Rogue, Xatrix and Zaero).
WITH_DATADIR?=NO	# Read from $(DATADIR) and write to "~/.quake2".
WITH_DGA_MOUSE?=NO	# Enable DGA mouse extension.
WITH_GAME_MOD?=YES	# Enable custom addons in the main modification (Quake2, Rogue, Xatrix and Zaero).
WITH_IPV6?=NO		# Enable IPv6 support. Tested on FreeBSD.
WITH_JOYSTICK?=NO	# Enable joystick support.
WITH_LIBDIR?=NO		# Read data and renderers from $(LIBDIR).
WITH_QMAX?=YES		# Enable fancier OpenGL graphics.
WITH_REDBLUE?=NO	# Enable red-blue 3d glasses renderer.
WITH_RETEXTURE?=YES	# Enable retextured graphics support.
WITH_X86_ASM?=NO	# Enable x86 assembly code (only for i386).
WITH_XMMS?=YES		# Enable XMMS support (thanks AprQ2).

# General variables.
LOCALBASE?=	/usr/local
X11BASE?=	/usr/X11R6
PREFIX?=	$(LOCALBASE)

DATADIR?=	$(LOCALBASE)/share/quake2
LIBDIR?=	$(LOCALBASE)/lib/QuDos

CC?=		gcc
TYPE?=		release

OGG_LDFLAGS=	-lvorbisfile -lvorbis -logg

SDL_CONFIG?=	sdl-config
SDL_CFLAGS=	$(shell $(SDL_CONFIG) --cflags)
SDL_LDFLAGS=	$(shell $(SDL_CONFIG) --libs)

ifeq ($(OSTYPE),Linux)
ALSA_LDFLAGS=	-lasound
endif

ARTS_CFLAGS=	$(shell artsc-config --cflags)
ARTS_LDFLAGS=	$(shell artsc-config --libs)

SHLIB_EXT=	so
SHLIB_CFLAGS=	-fPIC
SHLIB_LDFLAGS=	-shared

# QuDos variables.
VERSION=	QuDos v0.40.1
VERSION_BZ2=	v0.40.1
SRC_DIR=	src
MOD_DIR=	mods
OBJ_DIR=	QuDos-build
BIN_DIR=	quake2

GAME_NAME=	game.$(SHLIB_EXT)

ifeq ($(OSTYPE),Linux)
  ifeq ($(ARCH),i386)
GAME_NAME=	game$(ARCH).$(SHLIB_EXT)
  endif
endif

# Compilation flags.
CFLAGS+=	-I/usr/include -I$(LOCALBASE)/include -I$(X11BASE)/include \
		-DGAME_NAME='"$(GAME_NAME)"' -DQUDOS_VERSION='"$(VERSION)"'

WARNS=	-Wshadow -Wpointer-arith -Wcast-align -Waggregate-return -Wstrict-prototypes -Wredundant-decls -Wnested-externs

ifeq ($(TYPE),debug)
CFLAGS+=	-Wall -Werror -g -ggdb -DDEBUGGING # $(WARNS)
else
  ifeq ($(TYPE),profile)
CFLAGS+=	-pg
  else
CFLAGS+=	-O3 -ffast-math -funroll-loops -fomit-frame-pointer \
		-fexpensive-optimizations
    ifeq ($(ARCH),i386)
CFLAGS+=	-falign-loops=2 -falign-jumps=2 -falign-functions=2 \
		-fno-strict-aliasing
    endif
  endif
endif

# Linker flags.
LDFLAGS+=	-L/usr/lib -L$(LOCALBASE)/lib -L$(X11BASE)/lib -lm

ifeq ($(OSTYPE),Linux)
LDFLAGS+=	-ldl
endif

REF_LDFLAGS=	-L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lGLU -ljpeg -lpng

ifeq ($(strip $(WITH_DGA_MOUSE)),YES)
REF_LDFLAGS+= -lXxf86dga
endif

# Sources and object code files list.
QuDos_cl_SRCS=	client/cl_cin.c \
		client/cl_ents.c \
		client/cl_fx.c \
		client/cl_input.c \
		client/cl_inv.c \
		client/cl_locs.c \
		client/cl_main.c \
		client/cl_newfx.c \
		client/cl_parse.c \
		client/cl_pred.c \
		client/cl_scrn.c \
		client/cl_tent.c \
		client/cl_view.c \
		client/console.c \
		client/keys.c \
		client/menu.c \
		client/qmenu.c \
		client/snd_dma.c \
		client/snd_mem.c \
		client/snd_mix.c \
		client/snd_ogg.c \
		client/snd_xmms.c \
		\
		game/m_flash.c \
		\
		unix/vid_menu.c \
		unix/vid_so.c

QuDos_com_SRCS=	game/q_shared.c \
		\
		qcommon/cmd.c \
		qcommon/cmodel.c \
		qcommon/common.c \
		qcommon/crc.c \
		qcommon/cvar.c \
		qcommon/files.c \
		qcommon/md4.c \
		qcommon/net_chan.c \
		qcommon/pmove.c \
		qcommon/unzip/ioapi.c \
		qcommon/unzip/unzip.c \
		qcommon/wildcard.c \
		\
		server/sv_ccmds.c \
		server/sv_ents.c \
		server/sv_game.c \
		server/sv_init.c \
		server/sv_main.c \
		server/sv_send.c \
		server/sv_user.c \
		server/sv_world.c \
		\
		unix/$(NET_API).c \
		unix/qsh_unix.c \
		unix/sys_unix.c

QuDos_SRCS=	$(QuDos_com_SRCS) \
		$(QuDos_cl_SRCS) \
		unix/$(CD_API).c

QuDos_BIN=	QuDos
QuDos_OBJS=	$(QuDos_SRCS:%.c=%.o)
QuDos_CFLAGS=	$(CFLAGS) -DQ2_BIN
QuDos_LDFLAGS=	$(LDFLAGS) $(OGG_LDFLAGS) -lz

QuDos_ded_SRCS=	$(QuDos_com_SRCS) \
		null/cd_null.c \
		null/cl_null.c

QuDos_ded_BIN=	QuDos-ded
QuDos_ded_OBJS=	$(QuDos_ded_SRCS:%.c=%.o)
QuDos_ded_CFLAGS=	$(CFLAGS) -DDEDICATED_ONLY -DQ2DED_BIN
QuDos_ded_LDFLAGS=	$(LDFLAGS) -lz

ref_com_SRCS=	game/q_shared.c \
		\
		ref_gl/gl_blooms.c \
		ref_gl/gl_decals.c \
		ref_gl/gl_draw.c \
		ref_gl/gl_flares.c \
		ref_gl/gl_image.c \
		ref_gl/gl_light.c \
		ref_gl/gl_md3.c \
		ref_gl/gl_mesh.c \
		ref_gl/gl_model.c \
		ref_gl/gl_refl.c \
		ref_gl/gl_rmain.c \
		ref_gl/gl_rmisc.c \
		ref_gl/gl_rsurf.c \
		ref_gl/gl_vlights.c \
		ref_gl/gl_warp.c \
		\
		unix/qgl_unix.c \
		unix/qsh_unix.c \
		unix/rw_unix.c

ref_glx_SRCS=	$(ref_com_SRCS) \
		unix/gl_glx.c

ref_glx_BIN=	ref_q2glx.$(SHLIB_EXT)
ref_glx_OBJS=	$(ref_glx_SRCS:%.c=%.o)
ref_glx_CFLAGS=	$(CFLAGS) $(SHLIB_CFLAGS) -DREF_GL
ref_glx_LDFLAGS=	$(SHLIB_LDFLAGS) $(LDFLAGS) $(REF_LDFLAGS)

ref_sdlgl_SRCS=	$(ref_com_SRCS) \
		unix/gl_sdl.c

ref_sdlgl_BIN=	ref_q2sdlgl.$(SHLIB_EXT)
ref_sdlgl_OBJS=	$(ref_sdlgl_SRCS:%.c=%.o)
ref_sdlgl_CFLAGS=	$(CFLAGS) $(SDL_CFLAGS) $(SHLIB_CFLAGS) -DREF_SDLGL
ref_sdlgl_LDFLAGS=	$(SHLIB_LDFLAGS) $(LDFLAGS) $(SDL_LDFLAGS) \
			$(REF_LDFLAGS)

ifeq ($(OSTYPE),Linux)
snd_alsa_SRCS=	unix/snd_alsa.c

snd_alsa_BIN=	snd_alsa.$(SHLIB_EXT)
snd_alsa_OBJS=	$(snd_alsa_SRCS:%.c=%.o)
snd_alsa_CFLAGS=	$(CFLAGS) $(ALSA_CFLAGS) $(SHLIB_CFLAGS)
snd_alsa_LDFLAGS=	$(SHLIB_LDFLAGS) $(LDFLAGS) $(ALSA_LDFLAGS)
endif

snd_arts_SRCS=	unix/snd_arts.c

snd_arts_BIN=	snd_arts.$(SHLIB_EXT)
snd_arts_OBJS=	$(snd_arts_SRCS:%.c=%.o)
snd_arts_CFLAGS=	$(CFLAGS) $(ARTS_CFLAGS) $(SHLIB_CFLAGS)
snd_arts_LDFLAGS=	$(SHLIB_LDFLAGS) $(LDFLAGS) $(ARTS_LDFLAGS)

snd_oss_SRCS=	unix/snd_oss.c

snd_oss_BIN=	snd_oss.$(SHLIB_EXT)
snd_oss_OBJS=	$(snd_oss_SRCS:%.c=%.o)
snd_oss_CFLAGS=		$(CFLAGS) $(SHLIB_CFLAGS)
snd_oss_LDFLAGS=	$(SHLIB_LDFLAGS) $(LDFLAGS)

snd_sdl_SRCS=	unix/snd_sdl.c

snd_sdl_BIN=	snd_sdl.$(SHLIB_EXT)
snd_sdl_OBJS=	$(snd_sdl_SRCS:%.c=%.o)
snd_sdl_CFLAGS=		$(CFLAGS) $(SDL_CFLAGS) $(SHLIB_CFLAGS)
snd_sdl_LDFLAGS=	$(SHLIB_LDFLAGS) $(LDFLAGS) $(SDL_LDFLAGS)

# Targets to build.
ifeq ($(strip $(BUILD_3ZB2)),YES)
TARGETS_GAME+=	$(MOD_DIR)/3zb2
endif

ifeq ($(strip $(BUILD_CTF)),YES)
TARGETS_GAME+=	$(MOD_DIR)/ctf
endif

ifeq ($(strip $(BUILD_DEDICATED)),YES)
TARGETS+=	QuDos_ded
endif

ifeq ($(strip $(BUILD_GAME)),YES)
TARGETS_GAME+=	game
endif

ifeq ($(strip $(BUILD_GLX)),YES)
TARGETS+=	ref_glx
endif

ifeq ($(strip $(BUILD_JABOT)),YES)
TARGETS_GAME+=	$(MOD_DIR)/jabot
endif

ifeq ($(strip $(BUILD_QUAKE2)),YES)
TARGETS+=	QuDos
endif

ifeq ($(strip $(BUILD_ROGUE)),YES)
TARGETS_GAME+=	$(MOD_DIR)/rogue
endif

ifeq ($(strip $(BUILD_SDLGL)),YES)
TARGETS+=	ref_sdlgl
endif

ifeq ($(strip $(BUILD_XATRIX)),YES)
TARGETS_GAME+=	$(MOD_DIR)/xatrix
endif

ifeq ($(strip $(BUILD_ZAERO)),YES)
TARGETS_GAME+=	$(MOD_DIR)/zaero
endif

ifeq ($(OSTYPE),Linux)
 ifeq ($(strip $(BUILD_ALSA_SND)),YES)
  TARGETS+=	snd_alsa
 endif
endif

ifeq ($(strip $(BUILD_ARTS_SND)),YES)
TARGETS+=	snd_arts
endif

ifeq ($(strip $(BUILD_OSS_SND)),YES)
TARGETS+=	snd_oss
endif

ifeq ($(strip $(BUILD_SDL_SND)),YES)
TARGETS+=	snd_sdl
endif

# System dependent options.
ifeq ($(OSTYPE),FreeBSD)
CD_API=		cd_freebsd
else
  ifeq ($(OSTYPE),Linux)
CD_API=		cd_linux
  else
CD_API=		cd_null
  endif
endif

# Option detection and handling.
ifeq ($(OSTYPE),Linux)
 ifeq ($(strip $(BUILD_ALSA_SND)),YES)
 SOUND_API=	snd_alsa
 endif
endif

ifeq ($(strip $(BUILD_ARTS_SND)),YES)
SOUND_API=	snd_arts
endif

ifeq ($(strip $(BUILD_SDL_SND)),YES)
SOUND_API=	snd_sdl
endif

ifeq ($(strip $(BUILD_OSS_SND)),YES)
SOUND_API=	snd_oss
endif

ifeq ($(strip $(WITH_BOTS)),YES)
CFLAGS+=	-DWITH_ACEBOT
endif

ifeq ($(strip $(WITH_DATADIR)),YES)
CFLAGS+=	-DDATADIR='"$(DATADIR)"'
endif

ifeq ($(strip $(WITH_DGA_MOUSE)),YES)
CFLAGS+=	-DUSE_XF86_DGA
endif

ifeq ($(strip $(WITH_GAME_MOD)),YES)
CFLAGS+=	-DGAME_MOD
endif

ifeq ($(strip $(WITH_IPV6)),YES)
CFLAGS+=	-DHAVE_IPV6
NET_API=	net_udp6
  ifeq ($(OSTYPE),FreeBSD)
CFLAGS+=	-DHAVE_SIN6_LEN
  endif
else
NET_API=	net_udp
endif

ifeq ($(strip $(WITH_JOYSTICK)),YES)
CFLAGS+=	-DJoystick
ref_com_SRCS+=	unix/joystick.c
endif

ifeq ($(strip $(WITH_LIBDIR)),YES)
CFLAGS+=	-DLIBDIR='"$(LIBDIR)"'
endif

ifeq ($(strip $(WITH_QMAX)),YES)
CFLAGS+=	-DQMAX
endif

ifeq ($(strip $(WITH_REDBLUE)),YES)
CFLAGS+=	-DREDBLUE
endif

ifeq ($(strip $(WITH_RETEXTURE)),YES)
CFLAGS+=	-DRETEX
endif

ifeq ($(ARCH),i386)
  ifeq ($(strip $(WITH_X86_ASM)),YES)
QuDos_OBJS+=	snd_mixa.o
  else
CFLAGS+=	-DC_ONLY
  endif
endif

ifeq ($(strip $(WITH_XMMS)),YES)
CFLAGS+=	-DWITH_XMMS `glib-config --cflags`
endif

# Targets for building.
.PHONY: clean distclean distclean_full bin_clean obj_clean src_clean

DEPEND_TARGETS=	$(patsubst %,$(OBJ_DIR)/%/.depend,$(TARGETS)) \
		$(patsubst %,$(OBJ_DIR)/%/.depend,$(notdir $(TARGETS_GAME)))

BUILD_TARGETS=	$(foreach target,$(TARGETS),$(patsubst %,$(BIN_DIR)/%,$($(target)_BIN))) \
		$(foreach target,$(TARGETS_GAME),$(patsubst %,$(BIN_DIR)/%/$(GAME_NAME),$(notdir $(target))))

all: build

build: $(DEPEND_TARGETS) $(BUILD_TARGETS)

install: build
	@printf "Installing files to your home directory...\n"
	@cp -rv $(BIN_DIR) ~
	@cp -rv docs/gnu.txt docs/Ogg_readme.txt docs/QuDos.txt src/unix/QuDos.run ~/quake2
ifeq ($(strip $(BUILD_DEDICATED)),YES)
	@cp -rv src/unix/QuDos-dedicated.run ~/quake2
endif
	@printf "Done.\n"

clean: obj_clean

distclean: bin_clean obj_clean

distclean_full: bin_clean obj_clean src_clean

bin_clean:
	@printf "Cleaning binaries... "
	@rm -rf $(BIN_DIR)
	@printf ".... Done.\n"

obj_clean:
	@printf "Cleaning object code files... "
	@rm -rf $(OBJ_DIR)
	@printf ".... Done.\n"

src_clean:
	@printf "Cleaning backup files generated by text editors... "
	@find . -type f \( -name "*~" -or -name "*.orig" \) -delete
	@rm -f tags
	@printf ".... Done.\n"
bz2:
	@printf "Creating bzip2 compressed file ...\n"
ifeq ($(strip $(WITH_QMAX)),YES)
	@tar cjvf QuDosmaX-$(VERSION_BZ2).tar.bz2 quake2 docs/gnu.txt docs/Ogg_readme.txt docs/QuDos.txt
else
	@tar cjvf QuDos-$(VERSION_BZ2).tar.bz2 quake2 docs/gnu.txt docs/Ogg_readme.txt docs/QuDos.txt
endif
	@printf ".... Done.\n"

# Auto-generate rules.
$(OBJ_DIR)/QuDos/.depend: $(patsubst %,$(SRC_DIR)/%,$(QuDos_SRCS))
	@mkdir -p $(OBJ_DIR)/QuDos $(BIN_DIR)
	$(CC) -MM $(QuDos_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/QuDos/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(QuDos_CFLAGS) -o $$@ $$<' > $@

$(OBJ_DIR)/QuDos_ded/.depend: $(patsubst %,$(SRC_DIR)/%,$(QuDos_ded_SRCS))
	@mkdir -p $(OBJ_DIR)/QuDos_ded $(BIN_DIR)
	$(CC) -MM $(QuDos_ded_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/QuDos_ded/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(QuDos_ded_CFLAGS) -o $$@ $$<' > $@

$(OBJ_DIR)/ref_glx/.depend: $(patsubst %,$(SRC_DIR)/%,$(ref_glx_SRCS))
	@mkdir -p $(OBJ_DIR)/ref_glx $(BIN_DIR)
	$(CC) -MM $(ref_glx_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/ref_glx/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(ref_glx_CFLAGS) -o $$@ $$<' > $@

$(OBJ_DIR)/ref_sdlgl/.depend: $(patsubst %,$(SRC_DIR)/%,$(ref_sdlgl_SRCS))
	@mkdir -p $(OBJ_DIR)/ref_sdlgl $(BIN_DIR)
	$(CC) -MM $(ref_sdlgl_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/ref_sdlgl/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(ref_sdlgl_CFLAGS) -o $$@ $$<' > $@

ifeq ($(OSTYPE),Linux)
$(OBJ_DIR)/snd_alsa/.depend: $(patsubst %,$(SRC_DIR)/%,$(snd_alsa_SRCS))
	@mkdir -p $(OBJ_DIR)/snd_alsa $(BIN_DIR)
	$(CC) -MM $(snd_alsa_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/snd_alsa/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(snd_alsa_CFLAGS) -o $$@ $$<' > $@
endif

$(OBJ_DIR)/snd_arts/.depend: $(patsubst %,$(SRC_DIR)/%,$(snd_arts_SRCS))
	@mkdir -p $(OBJ_DIR)/snd_arts $(BIN_DIR)
	$(CC) -MM $(snd_arts_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/snd_arts/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(snd_arts_CFLAGS) -o $$@ $$<' > $@

$(OBJ_DIR)/snd_oss/.depend: $(patsubst %,$(SRC_DIR)/%,$(snd_oss_SRCS))
	@mkdir -p $(OBJ_DIR)/snd_oss $(BIN_DIR)
	$(CC) -MM $(snd_oss_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/snd_oss/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(snd_oss_CFLAGS) -o $$@ $$<' > $@

$(OBJ_DIR)/snd_sdl/.depend: $(patsubst %,$(SRC_DIR)/%,$(snd_sdl_SRCS))
	@mkdir -p $(OBJ_DIR)/snd_sdl $(BIN_DIR)
	$(CC) -MM $(snd_sdl_CFLAGS) $^ | sed -e 's|^\(..*\.o\)|$(OBJ_DIR)/snd_sdl/\1|' | awk -f rules.awk -v rule='\t$$(CC) -c $$(snd_sdl_CFLAGS) -o $$@ $$<' > $@

# Object lists relative to $(OBJ_DIR) and without path.
QuDos_OL=	$(patsubst %,$(OBJ_DIR)/QuDos/%,$(notdir $(QuDos_OBJS)))
QuDos_ded_OL=	$(patsubst %,$(OBJ_DIR)/QuDos_ded/%,$(notdir $(QuDos_ded_OBJS)))
ref_glx_OL=	$(patsubst %,$(OBJ_DIR)/ref_glx/%,$(notdir $(ref_glx_OBJS)))
ref_sdlgl_OL=	$(patsubst %,$(OBJ_DIR)/ref_sdlgl/%,$(notdir $(ref_sdlgl_OBJS)))
ifeq ($(OSTYPE),Linux)
snd_alsa_OL=	$(patsubst %,$(OBJ_DIR)/snd_alsa/%,$(notdir $(snd_alsa_OBJS)))
endif
snd_arts_OL=	$(patsubst %,$(OBJ_DIR)/snd_arts/%,$(notdir $(snd_arts_OBJS)))
snd_oss_OL=	$(patsubst %,$(OBJ_DIR)/snd_oss/%,$(notdir $(snd_oss_OBJS)))
snd_sdl_OL=	$(patsubst %,$(OBJ_DIR)/snd_sdl/%,$(notdir $(snd_sdl_OBJS)))

# Assembly rules.
$(OBJ_DIR)/QuDos/snd_mixa.o: $(SRC_DIR)/unix/snd_mixa.s
	$(CC) -c $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<

# Linking rules.
$(BIN_DIR)/$(QuDos_BIN): $(QuDos_OL)
	$(CC) -o $@ $^ $(QuDos_LDFLAGS)

$(BIN_DIR)/$(QuDos_ded_BIN): $(QuDos_ded_OL)
	$(CC) -o $@ $^ $(QuDos_ded_LDFLAGS)

$(BIN_DIR)/$(ref_glx_BIN): $(ref_glx_OL)
	$(CC) -o $@ $^ $(ref_glx_LDFLAGS)

$(BIN_DIR)/$(ref_sdlgl_BIN): $(ref_sdlgl_OL)
	$(CC) -o $@ $^ $(ref_sdlgl_LDFLAGS)

ifeq ($(OSTYPE),Linux)
$(BIN_DIR)/$(snd_alsa_BIN): $(snd_alsa_OL)
	$(CC) -o $@ $^ $(snd_alsa_LDFLAGS)
endif

$(BIN_DIR)/$(snd_arts_BIN): $(snd_arts_OL)
	$(CC) -o $@ $^ $(snd_arts_LDFLAGS)

$(BIN_DIR)/$(snd_oss_BIN): $(snd_oss_OL)
	$(CC) -o $@ $^ $(snd_oss_LDFLAGS)

$(BIN_DIR)/$(snd_sdl_BIN): $(snd_sdl_OL)
	$(CC) -o $@ $^ $(snd_sdl_LDFLAGS)

# Include make modules (for mods).
-include $(patsubst %,$(SRC_DIR)/%/module.mk,$(TARGETS_GAME))

# Include dependencies.
-include $(DEPEND_TARGETS)
