# QuakeWorld Forever Client Makefile for linux...
#
# To be perfectly honest the problem was that zoid's
# Makefile was pretty hard to understand. This is a new one.
#
#

.PHONY: all clean debug release generate_release_qwcl.svga generate_qwcl.svga generate_qwcl.x11 generate_qwcl.gl pristine

# This is a bad hack. :( Due to the problems with recursive variables
# and make. Simply put if you want a release version simply uncomment
# the line below. My apologies for this. Of course if you're making
# from the Makefile in the previous directory typing make {bin-type}-release
# will get around this problem.
#RELEASE=true

# For purely asthetic reasons you can change the name of generatecipher
GENERATECIPHER=CipherGenerator

# Rule file.. This file is generates the rules that
# We make..
RULES=.rule_file


#
#-----------------------------
# The names of the binaries...
#----------------------------
#

# Quake World CLient SVGA...
QWCL_SVGA=../qwfcl.svga

# Quake World X11 Client
QWCL_X11=../qwfcl.x11

# Quake World Client Opengl (non-glide X11)
QWCL_GL=../glqwfcl.glx

# This is just a hack to make clean delete the libc5 clients too.
QWCL_OTHERS=$(QWCL_SVGA).libc5 $(QWCL_X11).libc5 $(QWCL_GL).libc5


#
#----------------------------------------
# These are what we need for encryption..
#----------------------------------------
#

# Make ../gnupg a symlink to your (already compiled) gnupg source directory
# Eg. /usr/local/src/gnupg-1.0.1  or  $(HOME)/projects/gnupg-1.0.1
GNUPG=../gnupg

# The include we need.
GNUPG_INCLUDE=$(GNUPG)/include

# The mpi lib
GNUPG_MPILIB=$(GNUPG)/mpi/libmpi.a

# The utilities lib
GNUPG_UTILLIB=$(GNUPG)/util/libutil.a

# The cipher lib
GNUPG_CIPHERLIB=$(GNUPG)/cipher/libcipher.a

#GNUPG_LIBS=$(GNUPG_MPILIB) $(GNUPG_UTILLIB) $(GNUPG_CIPHERLIB) 
GNUPG_LIBS=$(GNUPG)/lib/lib*.a

#
#--------------------
# Compiler Options
#---------------------
#


# The C compiler we wish to use...
CC=gcc

# Common C Flags..
CFLAGS=-Wall -Dstricmp=strcasecmp -g -DLINUX
# Release Flags.. Optimisation flags used for a non-debugging release
RELEASE_FLAGS=-O3 -ffast-math -funroll-loops -fomit-frame-pointer -fexpensive-optimizations
# Extra X11 Flags
X11_FLAGS=
# Extra GL Flags
GL_FLAGS=-DGLQUAKE -DGL_EXT_SHARED -DAPIENTRY=GLAPIENTRY
# Extra 3DFX Flags
3DFX_FLAGS=-DGLQUAKE
# extra svga Flags (Please note at least a -O flag
# is needed or outb the function will appear as an 
# unresolved conflict)
SVGA_FLAGS=-O

# Assembler
AS=$(CC)
ASFLAGS=$(CFLAGS) -DELF -x assembler-with-cpp

# Extra flags at the linker stage
LINKERFLAGS=
# Extra Flags when compiling object files...
OBJECTFLAGS=-c

#
# This section merely contains the
# directories that we should look in
# to find headers..
#

# Common include directories...
COMMON_INCLUDES=-I/usr/include -I$(GNUPG_INCLUDE) -I.

# X11 includes...
X11_INCLUDES=-I/usr/X11R6/include

# GL_INCLUDES
GL_INCLUDES=-I$(HOME)/opengl/Mesa/include

# 3DFX_INCLUDES
3DFX_INCLUDES=-I/usr/include/glide

# SVGA INCLUDES
SVGA_INCLUDES=


#
# This section tells us where to look for
# the libraries we wish to link to.
#
#

# Common library directories...
COMMON_LIBS=-L/lib -L/usr/lib 

# X11 library directories
X11_LIBS=-L/usr/X11R6/lib

# GL library directories
GL_LIBS=-L$(HOME)/lib

#3df lib's..
3DFX_LIBS=

# svga lib's
SVGA_LIBS=


#
# These are linker options that
# should be sent to the compiler
# so our program should link
#

# Common lib's to link... (Math lib and NOT dynamic library support)
COMMON_LD=-lm -O

# LDFLAGS for release
# This forces the end users to use the statically linked in libraries.
# For things like libvga, libGL, etc, this REALLY sucks.
# Seriously consider NOT statically linking.
#RELEASE_LD_FLAGS=-static
RELEASE_LD_FLAGS=

# The libs we need to link for an X11 client
X11_LD=-lX11 -lXext

# Open GL libs...
GL_LD=-lGL 

# Lib's to link in for 3DFX...
3DFX_LD=

# svga lib's to link in...
SVGA_LD=-lvga


STRIP=strip --remove-section=.comment


# Let's find out what platform we're making it for
ifneq (,$(filter i%86,$(shell uname -m)))
	ARCH=i386
endif

# Find out what libc we're running under.
LIBCTEST=./libctest.sh
ifneq ($(shell $(LIBCTEST)),6)
	PROGRAM_SUFFIX=.libc$(shell $(LIBCTEST))
endif


# The Common Quake World C source files...
QWCL_OBJS = cl_demo.o cl_ents.o cl_input.o cl_main.o cl_parse.o \
	cl_pred.o cl_tent.o cl_cam.o cmd.o common.o console.o \
	crc.o cvar.o qwf.o keys.o mathlib.o md4.o menu.o \
	net_chan.o net_udp.o nonintel.o pmove.o pmovetst.o \
	sbar.o skin.o snd_dma.o snd_mem.o \
	snd_mix.o view.o wad.o zone.o cd_linux.o sys_linux.o \
	snd_linux.o \
	GetKey0.o GetKey1.o GetKey2.o GetKey3.o \
	GetKey4.o GetKey5.o GetKey6.o GetKey7.o GetKey8.o \
	GetKey9.o GetKey10.o GetKey11.o GetKey12.o GetKey13.o \
	GetKey14.o GetKey15.o GetKey16.o GetKey17.o GetKey18.o \
	GetKey19.o GetKey20.o GetKey21.o GetKey22.o GetKey23.o \
	GetKey24.o GetKey25.o GetKey26.o GetKey27.o GetKey28.o \
	GetKey29.o GetKey30.o GetKey31.o \
	GeneratedData1.o GeneratedData2.o


# NEEDED NON-GL objects..
NON_GL = d_edge.o d_fill.o d_init.o d_modech.o d_part.o d_polyse.o \
	 d_scan.o d_sky.o d_sprite.o d_surf.o d_vars.o d_zpoint.o draw.o \
	model.o screen.o r_aclip.o r_alias.o r_bsp.o r_draw.o r_edge.o \
	 r_efrag.o r_light.o r_main.o r_misc.o r_sky.o r_sprite.o \
	r_surf.o r_vars.o r_part.o

# THe qwcl ASM source.. We only use it for x86 machines..
ifeq ($(ARCH),i386)
	ASM=true
else
	ASM=
endif

ifneq ($(ASM), i386)
QWCL_AS_OBJS = math.o snd_mixa.o sys_dosa.o

NON_GL_AS= d_copy.o d_draw.o d_draw16.o d_parta.o \
	d_polysa.o d_scana.o d_spr8.o d_varsa.o \
	r_aclipa.o r_aliasa.o r_drawa.o r_edgea.o \
	r_varsa.o surf16.o surf8.o 
else
	QWCL_AS_OBJS=
	NON_GL_AS=
endif

# We now make out the common source objects.
QWCL_SRC=$(QWCL_OBJS:%.o=% )
QWCL_AS_SRC=$(QWCL_AS_OBJS:%.o=% )

# SVGA OBJECTS
SVGA_OBJECTS=$(NON_GL) vid_svgalib.o
SVGA_SRC=$(SVGA_OBJECTS:%.o=%)
SVGA_AS_OBJECTS=$(NON_GL_AS)
SVGA_AS_SRC=$(SVGA_AS_OBJECTS:%.o=%)

# X11 Objects
X11_OBJECTS=$(NON_GL) vid_x.o
X11_SRC=$(X11_OBJECTS:%.o=%)
X11_AS_OBJECTS=$(NON_GL_AS)
X11_AS_SRC=$(SVGA_AS_OBJECTS:%.o=%)

# GL Objects
GL_OBJECTS= gl_draw.o gl_mesh.o gl_model.o gl_ngraph.o \
	gl_refrag.o gl_rlight.o gl_rmain.o gl_rmisc.o \
	gl_rsurf.o gl_screen.o gl_warp.o gl_vidlinuxglx.o gl_rpart.o
GL_SRC=$(GL_OBJECTS:%.o=%)
GL_AS_OBJECTS=
GL_AS_SRC=$(SVGA_AS_OBJECTS:%.o=%)


# If the rule file exists include it.
ifeq ($(RULES),$(wildcard $(RULES)))
include $(RULES)
endif


# Parameters to Make a Super vga Quake World Client
generate_qwcl.svga : CLIENT= Quake World Super Vga Client
generate_qwcl.svga : FLAGS = \$$(CC) \$$(CFLAGS) \$$(SVGA_FLAGS)  \$$(COMMON_INCLUDES) \$$(SVGA_INCLUDES)
generate_qwcl.svga : LD_FLAGS = \$$(COMMON_LIBS) \$$(COMMON_LD) \$$(SVGA_LIBS) \$$(SVGA_LD) \$$(GNUPG_LIBS)
generate_qwcl.svga : OBJECTS = $(QWCL_OBJS) $(SVGA_OBJECTS)
generate_qwcl.svga : AS_OBJECTS = $(QWCL_AS_OBJS) $(SVGA_AS_OBJECTS)
generate_qwcl.svga : SRC = $(QWCL_SRC) $(SVGA_SRC)
generate_qwcl.svga : AS_SRC = $(QWCL_AS_SRC) $(SVGA_AS_SRC)
generate_qwcl.svga : PROGRAM = $(QWCL_SVGA)$(PROGRAM_SUFFIX)
generate_qwcl.svga : generate


# Parameters to Make an X11 Quake World Client
generate_qwcl.x11: CLIENT=Quake World X11 Client
generate_qwcl.x11: FLAGS=\$$(CC) \$$(CFLAGS) \$$(X11_FLAGS)  \$$(COMMON_INCLUDES) \$$(X11_INCLUDES)
generate_qwcl.x11: LD_FLAGS=\$$(COMMON_LIBS) \$$(COMMON_LD) \$$(X11_LIBS) \$$(X11_LD)  \$$(GNUPG_LIBS)
generate_qwcl.x11: OBJECTS=$(QWCL_OBJS) $(X11_OBJECTS)
generate_qwcl.x11: AS_OBJECTS=$(QWCL_AS_OBJS) $(X11_AS_OBJECTS)
generate_qwcl.x11: SRC=$(QWCL_SRC) $(X11_SRC)
generate_qwcl.x11: AS_SRC=$(QWCL_AS_SRC) $(X11_AS_SRC)
generate_qwcl.x11: PROGRAM=$(QWCL_X11)$(PROGRAM_SUFFIX)
generate_qwcl.x11: generate

# Parameters to Make an X11 OpenGL Quake World Client (non-glide)
generate_qwcl.gl: CLIENT=Open GL version (non-glide)
generate_qwcl.gl: FLAGS=\$$(CC) \$$(GL_FLAGS) \$$(CFLAGS) \$$(GL_INCLUDES) \$$(COMMON_INCLUDES) \$$(X11_INCLUDES)
generate_qwcl.gl: LD_FLAGS=\$$(COMMON_LIBS) \$$(COMMON_LD) \$$(X11_LIBS) \$$(X11_LD) \$$(GL_LIBS) \$$(GL_LD)  \$$(GNUPG_LIBS)
generate_qwcl.gl: OBJECTS=$(QWCL_OBJS) $(GL_OBJECTS)
generate_qwcl.gl: AS_OBJECTS=$(QWCL_AS_OBJS) $(GL_AS_OBJECTS)
generate_qwcl.gl: SRC=$(QWCL_SRC) $(GL_SRC)
generate_qwcl.gl: AS_SRC=$(QWCL_AS_SRC) $(GL_AS_SRC)
generate_qwcl.gl: PROGRAM=$(QWCL_GL)$(PROGRAM_SUFFIX)
generate_qwcl.gl: generate


generate: randargs
	@echo "Generating Rules now for $(CLIENT)"
	@if [ "$(RELEASE)x" != "x" ]; then \
	echo "CFLAGS += \$$(RELEASE_FLAGS)" > $(RULES); \
	echo "COMMON_LD += \$$(RELEASE_LD_FLAGS)" >> $(RULES); \
	echo "SVGA_FLAGS = " >> $(RULES); \
	else cat /dev/null > $(RULES); fi;
	# Make sure that randargs will actually run
	@if ! randargs ; then rm -f randargs; $(MAKE) randargs; fi;
	# Make the rule for svga Quake World Client
	@echo "$(PROGRAM): $(OBJECTS) $(AS_OBJECTS)" >> $(RULES)
	@echo "	$(FLAGS) $(shell randargs $(OBJECTS) $(AS_OBJECTS)) $(LD_FLAGS) -o $(PROGRAM)" >> $(RULES)
	@echo "" >> $(RULES)
	@if [ "$(RELEASE)x" != "x" ]; then \
	echo "	$(STRIP) $(PROGRAM)" >> $(RULES); \
	fi;

	# Make the rules for it's C source files.
	@for i in $(SRC); do echo "$${i}.o: $${i}.c" >> $(RULES); \
	echo "	$(FLAGS) -c $${i}.c" >> $(RULES); echo "" >> $(RULES); done

	# Make the rules for it's assmebler files.
	@if [ "$(AS_SRC)x" != "x" ]; then \
	for i in $(AS_SRC); do echo "$${i}.o: $${i}.s" >> $(RULES); \
	echo "	\$$(AS) \$$(ASFLAGS) -c $${i}.s" >> $(RULES); echo "" >> $(RULES); \
	done; fi;

	@echo "Finished making Rules for $(CLIENT)"


clean:
	rm -f *.o 

pristine: clean
	rm -f $(QWCL_SVGA) $(QWCL_X11) $(QWCL_GL) $(QWCL_OTHERS)
	rm -f GetKey*.c GeneratedData1.c GeneratedData2.c
	rm -f randargs
	rm -f $(GENERATECIPHER)


randargs: randargs.c
	$(CC) $(CFLAGS) -o randargs randargs.c

# The rules for our key generation program 
$(GENERATECIPHER): CipherGenerator.c
	$(CC) $(CFLAGS) $(COMMON_INCLUDES) $(COMMON_LIBS) -o $(GENERATECIPHER) CipherGenerator.c 

# Generated Data... These files will be generated..
# To help this I'm creating some special rules.
GeneratedData.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)

GetKey0.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey1.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey2.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey3.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey4.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey5.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey6.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey7.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey8.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey9.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey10.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey11.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey12.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey13.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey14.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey15.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey16.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey17.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey18.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey19.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey20.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey21.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey22.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey23.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey24.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey25.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey26.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey27.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey28.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey29.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey30.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
GetKey31.c: $(GENERATECIPHER)
	./$(GENERATECIPHER)
