#
# Quake Makefile for Solaris
#
# Nov '97 by Zoid <zoid@idsoftware.com>
#
# ELF only
#

VERSION=1.09

ifneq (,$(findstring i86pc,$(shell uname -m)))
ARCH=i386
else
ARCH=sparc
endif

MOUNT_DIR=/grog/Projects/WinQuake

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

CC=gcc
BASE_CFLAGS=-I/usr/openwin/include

RELEASE_CFLAGS=$(BASE_CFLAGS) -O6 -ffast-math -funroll-loops -fomit-frame-pointer -fexpensive-optimizations
DEBUG_CFLAGS=$(BASE_CFLAGS) -g
LDFLAGS=-R /usr/openwin/lib -L /usr/openwin/lib -lm -lX11 -lXext -lsocket -lnsl -lthread -ldl 
XIL_LDFLAGS=-L /opt/SUNWits/Graphics-sw/xil/lib -R /opt/SUNWits/Graphics-sw/xil/lib:/usr/openwin/lib -L /usr/openwin/lib -lm -lxil -lX11 -lXext -lsocket -lnsl -lthread -ldl 

DO_CC=$(CC) $(CFLAGS) -o $@ -c $<
DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<

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

TARGETS=$(BUILDDIR)/quake.sw $(BUILDDIR)/quake.xil

build_debug:
	@-mkdir $(BUILD_DEBUG_DIR)
	$(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"

build_release:
	@-mkdir $(BUILD_RELEASE_DIR)
	$(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"

all: build_debug build_release

targets: $(TARGETS)

#############################################################################
# CLIENT/SERVER
#############################################################################

QUAKE_OBJS= \
	$(BUILDDIR)/chase.o \
	$(BUILDDIR)/cl_demo.o \
	$(BUILDDIR)/cl_input.o \
	$(BUILDDIR)/cl_main.o \
	$(BUILDDIR)/cl_parse.o \
	$(BUILDDIR)/cl_tent.o \
	$(BUILDDIR)/cmd.o \
	$(BUILDDIR)/common.o \
	$(BUILDDIR)/console.o \
	$(BUILDDIR)/crc.o \
	$(BUILDDIR)/cvar.o \
	$(BUILDDIR)/draw.o \
	$(BUILDDIR)/d_edge.o \
	$(BUILDDIR)/d_fill.o \
	$(BUILDDIR)/d_init.o \
	$(BUILDDIR)/d_modech.o \
	$(BUILDDIR)/d_part.o \
	$(BUILDDIR)/d_polyse.o \
	$(BUILDDIR)/d_scan.o \
	$(BUILDDIR)/d_sky.o \
	$(BUILDDIR)/d_sprite.o \
	$(BUILDDIR)/d_surf.o \
	$(BUILDDIR)/d_vars.o \
	$(BUILDDIR)/d_zpoint.o \
	$(BUILDDIR)/host.o \
	$(BUILDDIR)/host_cmd.o \
	$(BUILDDIR)/keys.o \
	$(BUILDDIR)/menu.o \
	$(BUILDDIR)/mathlib.o \
	$(BUILDDIR)/model.o \
	$(BUILDDIR)/nonintel.o \
	$(BUILDDIR)/pr_cmds.o \
	$(BUILDDIR)/pr_edict.o \
	$(BUILDDIR)/pr_exec.o \
	$(BUILDDIR)/r_aclip.o \
	$(BUILDDIR)/r_alias.o \
	$(BUILDDIR)/r_bsp.o \
	$(BUILDDIR)/r_light.o \
	$(BUILDDIR)/r_draw.o \
	$(BUILDDIR)/r_efrag.o \
	$(BUILDDIR)/r_edge.o \
	$(BUILDDIR)/r_misc.o \
	$(BUILDDIR)/r_main.o \
	$(BUILDDIR)/r_sky.o \
	$(BUILDDIR)/r_sprite.o \
	$(BUILDDIR)/r_surf.o \
	$(BUILDDIR)/r_part.o \
	$(BUILDDIR)/r_vars.o \
	$(BUILDDIR)/screen.o \
	$(BUILDDIR)/sbar.o \
	$(BUILDDIR)/sv_main.o \
	$(BUILDDIR)/sv_phys.o \
	$(BUILDDIR)/sv_move.o \
	$(BUILDDIR)/sv_user.o \
	$(BUILDDIR)/zone.o	\
	$(BUILDDIR)/view.o	\
	$(BUILDDIR)/wad.o \
	$(BUILDDIR)/world.o \
	$(BUILDDIR)/cd_null.o \
	$(BUILDDIR)/snd_dma.o \
	$(BUILDDIR)/snd_mix.o \
	$(BUILDDIR)/snd_mem.o \
	$(BUILDDIR)/net_dgrm.o \
	$(BUILDDIR)/net_loop.o \
	$(BUILDDIR)/net_main.o \
	$(BUILDDIR)/net_vcr.o \
	$(BUILDDIR)/net_udp.o \
	$(BUILDDIR)/net_bsd.o \
	$(BUILDDIR)/sys_sun.o \
	$(BUILDDIR)/snd_sun.o 

QUAKE_AS_OBJS= \
	$(BUILDDIR)/d_copy.o \
	$(BUILDDIR)/d_draw.o \
	$(BUILDDIR)/d_draw16.o \
	$(BUILDDIR)/d_parta.o \
	$(BUILDDIR)/d_polysa.o \
	$(BUILDDIR)/d_scana.o \
	$(BUILDDIR)/d_spr8.o \
	$(BUILDDIR)/d_varsa.o \
	$(BUILDDIR)/math.o \
	$(BUILDDIR)/r_aliasa.o \
	$(BUILDDIR)/r_drawa.o \
	$(BUILDDIR)/r_edgea.o \
	$(BUILDDIR)/r_varsa.o \
	$(BUILDDIR)/surf16.o \
	$(BUILDDIR)/surf8.o \
	$(BUILDDIR)/worlda.o \
	$(BUILDDIR)/r_aclipa.o \
	$(BUILDDIR)/snd_mixa.o \
	$(BUILDDIR)/sys_dosa.o

QUAKE_X_OBJS = $(BUILDDIR)/vid_sunx.o

QUAKE_XIL_OBJS = $(BUILDDIR)/vid_sunxil.o

ifeq ($(ARCH),i386)
$(BUILDDIR)/quake.sw : $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_X_OBJS)
	$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_X_OBJS) $(LDFLAGS)

$(BUILDDIR)/quake.xil: $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_XIL_OBJS)
	$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_XIL_OBJS) $(XIL_LDFLAGS)
else
$(BUILDDIR)/quake.sw : $(QUAKE_OBJS) $(QUAKE_X_OBJS)
	$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_X_OBJS) $(LDFLAGS)

$(BUILDDIR)/quake.xil: $(QUAKE_OBJS) $(QUAKE_XIL_OBJS)
	$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_XIL_OBJS) $(XIL_LDFLAGS)
endif

##

$(BUILDDIR)/chase.o :				$(MOUNT_DIR)/chase.c
	$(DO_CC)

$(BUILDDIR)/cl_demo.o :             $(MOUNT_DIR)/cl_demo.c
	$(DO_CC)

$(BUILDDIR)/cl_input.o :            $(MOUNT_DIR)/cl_input.c
	$(DO_CC)

$(BUILDDIR)/cl_main.o :             $(MOUNT_DIR)/cl_main.c
	$(DO_CC)

$(BUILDDIR)/cl_parse.o :            $(MOUNT_DIR)/cl_parse.c
	$(DO_CC)

$(BUILDDIR)/cl_tent.o :             $(MOUNT_DIR)/cl_tent.c
	$(DO_CC)

$(BUILDDIR)/cmd.o :                 $(MOUNT_DIR)/cmd.c
	$(DO_CC)

$(BUILDDIR)/common.o :              $(MOUNT_DIR)/common.c
	$(DO_CC)

$(BUILDDIR)/console.o :             $(MOUNT_DIR)/console.c
	$(DO_CC)

$(BUILDDIR)/crc.o :                 $(MOUNT_DIR)/crc.c
	$(DO_CC)

$(BUILDDIR)/cvar.o :                $(MOUNT_DIR)/cvar.c
	$(DO_CC)

$(BUILDDIR)/draw.o :                $(MOUNT_DIR)/draw.c
	$(DO_CC)

$(BUILDDIR)/d_edge.o :              $(MOUNT_DIR)/d_edge.c
	$(DO_CC)

$(BUILDDIR)/d_fill.o :              $(MOUNT_DIR)/d_fill.c
	$(DO_CC)

$(BUILDDIR)/d_init.o :              $(MOUNT_DIR)/d_init.c
	$(DO_CC)

$(BUILDDIR)/d_modech.o :            $(MOUNT_DIR)/d_modech.c
	$(DO_CC)

$(BUILDDIR)/d_part.o :              $(MOUNT_DIR)/d_part.c
	$(DO_CC)

$(BUILDDIR)/d_polyse.o :            $(MOUNT_DIR)/d_polyse.c
	$(DO_CC)

$(BUILDDIR)/d_scan.o :              $(MOUNT_DIR)/d_scan.c
	$(DO_CC)

$(BUILDDIR)/d_sky.o :               $(MOUNT_DIR)/d_sky.c
	$(DO_CC)

$(BUILDDIR)/d_sprite.o :            $(MOUNT_DIR)/d_sprite.c
	$(DO_CC)

$(BUILDDIR)/d_surf.o :              $(MOUNT_DIR)/d_surf.c
	$(DO_CC)

$(BUILDDIR)/d_vars.o :              $(MOUNT_DIR)/d_vars.c
	$(DO_CC)

$(BUILDDIR)/d_zpoint.o :            $(MOUNT_DIR)/d_zpoint.c
	$(DO_CC)

$(BUILDDIR)/host.o :                $(MOUNT_DIR)/host.c
	$(DO_CC)

$(BUILDDIR)/host_cmd.o :            $(MOUNT_DIR)/host_cmd.c
	$(DO_CC)

$(BUILDDIR)/keys.o :                $(MOUNT_DIR)/keys.c
	$(DO_CC)

$(BUILDDIR)/menu.o :                $(MOUNT_DIR)/menu.c
	$(DO_CC)

$(BUILDDIR)/mathlib.o :             $(MOUNT_DIR)/mathlib.c
	$(DO_CC)

$(BUILDDIR)/model.o :               $(MOUNT_DIR)/model.c
	$(DO_CC)

$(BUILDDIR)/nonintel.o :            $(MOUNT_DIR)/nonintel.c
	$(DO_CC)

$(BUILDDIR)/pr_cmds.o :             $(MOUNT_DIR)/pr_cmds.c
	$(DO_CC)

$(BUILDDIR)/pr_edict.o :            $(MOUNT_DIR)/pr_edict.c
	$(DO_CC)

$(BUILDDIR)/pr_exec.o :             $(MOUNT_DIR)/pr_exec.c
	$(DO_CC)

$(BUILDDIR)/r_aclip.o :             $(MOUNT_DIR)/r_aclip.c
	$(DO_CC)

$(BUILDDIR)/r_alias.o :             $(MOUNT_DIR)/r_alias.c
	$(DO_CC)

$(BUILDDIR)/r_bsp.o :               $(MOUNT_DIR)/r_bsp.c
	$(DO_CC)

$(BUILDDIR)/r_light.o :             $(MOUNT_DIR)/r_light.c
	$(DO_CC)

$(BUILDDIR)/r_draw.o :              $(MOUNT_DIR)/r_draw.c
	$(DO_CC)

$(BUILDDIR)/r_efrag.o :             $(MOUNT_DIR)/r_efrag.c
	$(DO_CC)

$(BUILDDIR)/r_edge.o :              $(MOUNT_DIR)/r_edge.c
	$(DO_CC)

$(BUILDDIR)/r_misc.o :              $(MOUNT_DIR)/r_misc.c
	$(DO_CC)

$(BUILDDIR)/r_main.o :              $(MOUNT_DIR)/r_main.c
	$(DO_CC)

$(BUILDDIR)/r_sky.o :               $(MOUNT_DIR)/r_sky.c
	$(DO_CC)

$(BUILDDIR)/r_sprite.o :            $(MOUNT_DIR)/r_sprite.c
	$(DO_CC)

$(BUILDDIR)/r_surf.o :              $(MOUNT_DIR)/r_surf.c
	$(DO_CC)

$(BUILDDIR)/r_part.o :              $(MOUNT_DIR)/r_part.c
	$(DO_CC)

$(BUILDDIR)/r_vars.o :              $(MOUNT_DIR)/r_vars.c
	$(DO_CC)

$(BUILDDIR)/screen.o :              $(MOUNT_DIR)/screen.c
	$(DO_CC)

$(BUILDDIR)/sbar.o :                $(MOUNT_DIR)/sbar.c
	$(DO_CC)

$(BUILDDIR)/sv_main.o :             $(MOUNT_DIR)/sv_main.c
	$(DO_CC)

$(BUILDDIR)/sv_phys.o :             $(MOUNT_DIR)/sv_phys.c
	$(DO_CC)

$(BUILDDIR)/sv_move.o :             $(MOUNT_DIR)/sv_move.c
	$(DO_CC)

$(BUILDDIR)/sv_user.o :             $(MOUNT_DIR)/sv_user.c
	$(DO_CC)

$(BUILDDIR)/zone.o	:               $(MOUNT_DIR)/zone.c
	$(DO_CC)

$(BUILDDIR)/view.o	:               $(MOUNT_DIR)/view.c
	$(DO_CC)

$(BUILDDIR)/wad.o :                 $(MOUNT_DIR)/wad.c
	$(DO_CC)

$(BUILDDIR)/world.o :               $(MOUNT_DIR)/world.c
	$(DO_CC)

$(BUILDDIR)/cd_null.o :             $(MOUNT_DIR)/cd_null.c
	$(DO_CC)

$(BUILDDIR)/snd_dma.o :             $(MOUNT_DIR)/snd_dma.c
	$(DO_CC)

$(BUILDDIR)/snd_mix.o :             $(MOUNT_DIR)/snd_mix.c
	$(DO_CC)

$(BUILDDIR)/snd_mem.o :             $(MOUNT_DIR)/snd_mem.c
	$(DO_CC)

$(BUILDDIR)/net_dgrm.o :            $(MOUNT_DIR)/net_dgrm.c
	$(DO_CC)

$(BUILDDIR)/net_loop.o :            $(MOUNT_DIR)/net_loop.c
	$(DO_CC)

$(BUILDDIR)/net_main.o :            $(MOUNT_DIR)/net_main.c
	$(DO_CC)

$(BUILDDIR)/net_vcr.o :             $(MOUNT_DIR)/net_vcr.c
	$(DO_CC)

$(BUILDDIR)/net_udp.o :             $(MOUNT_DIR)/net_udp.c
	$(DO_CC)

$(BUILDDIR)/net_bsd.o :             $(MOUNT_DIR)/net_bsd.c
	$(DO_CC)

$(BUILDDIR)/sys_sun.o :             $(MOUNT_DIR)/sys_sun.c
	$(DO_CC)

$(BUILDDIR)/snd_sun.o :             $(MOUNT_DIR)/snd_sun.c
	$(DO_CC)

$(BUILDDIR)/in_sun.o :             $(MOUNT_DIR)/in_sun.c
	$(DO_CC)

$(BUILDDIR)/vid_sunx.o :             $(MOUNT_DIR)/vid_sunx.c
	$(DO_CC)

$(BUILDDIR)/vid_sunxil.o :             $(MOUNT_DIR)/vid_sunxil.c
	$(DO_CC)

#####

$(BUILDDIR)/d_copy.o :   $(MOUNT_DIR)/d_copy.s
	$(DO_AS)

$(BUILDDIR)/d_draw.o :   $(MOUNT_DIR)/d_draw.s
	$(DO_AS)

$(BUILDDIR)/d_draw16.o : $(MOUNT_DIR)/d_draw16.s
	$(DO_AS)

$(BUILDDIR)/d_parta.o :  $(MOUNT_DIR)/d_parta.s
	$(DO_AS)

$(BUILDDIR)/d_polysa.o : $(MOUNT_DIR)/d_polysa.s
	$(DO_AS)

$(BUILDDIR)/d_scana.o :  $(MOUNT_DIR)/d_scana.s
	$(DO_AS)

$(BUILDDIR)/d_spr8.o :   $(MOUNT_DIR)/d_spr8.s
	$(DO_AS)

$(BUILDDIR)/d_varsa.o :  $(MOUNT_DIR)/d_varsa.s
	$(DO_AS)

$(BUILDDIR)/math.o :     $(MOUNT_DIR)/math.s
	$(DO_AS)

$(BUILDDIR)/r_aliasa.o : $(MOUNT_DIR)/r_aliasa.s
	$(DO_AS)

$(BUILDDIR)/r_drawa.o :  $(MOUNT_DIR)/r_drawa.s
	$(DO_AS)

$(BUILDDIR)/r_edgea.o :  $(MOUNT_DIR)/r_edgea.s
	$(DO_AS)

$(BUILDDIR)/r_varsa.o :  $(MOUNT_DIR)/r_varsa.s
	$(DO_AS)

$(BUILDDIR)/surf16.o :   $(MOUNT_DIR)/surf16.s
	$(DO_AS)

$(BUILDDIR)/surf8.o :    $(MOUNT_DIR)/surf8.s
	$(DO_AS)

$(BUILDDIR)/worlda.o :   $(MOUNT_DIR)/worlda.s
	$(DO_AS)

$(BUILDDIR)/r_aclipa.o : $(MOUNT_DIR)/r_aclipa.s
	$(DO_AS)

$(BUILDDIR)/snd_mixa.o : $(MOUNT_DIR)/snd_mixa.s
	$(DO_AS)

$(BUILDDIR)/sys_dosa.o : $(MOUNT_DIR)/sys_dosa.s
	$(DO_AS)

#############################################################################
# TAR
#############################################################################

# Make RPMs.  You need to be root to make this work
RPMDIR = /var/tmp/quake-$(VERSION)

tar:
	if [ ! -d archives ];then mkdir archives;fi
	$(MAKE) copyfiles COPYDIR=$(RPMDIR)
	cd $(RPMDIR); tar cvf q2ded-$(VERSION)-$(ARCH)-sun-solaris2.5.1.tar *
	cd $(RPMDIR); compress q2ded-$(VERSION)-$(ARCH)-sun-solaris2.5.1.tar
	mv $(RPMDIR)/*.tar.Z archives/.
	rm -rf $(RPMDIR)

copyfiles:
	-mkdirhier $(COPYDIR)
	cp $(BUILD_RELEASE_DIR)/quake.sw $(COPYDIR)
	cp $(BUILD_RELEASE_DIR)/quake.xil $(COPYDIR)
	strip $(COPYDIR)/quake
	strip $(COPYDIR)/quake.xil
	cp $(MOUNT_DIR)/README.Solaris $(COPYDIR)/README.Solaris

#############################################################################
# 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 $(QUAKE_OBJS) $(QUAKE_X_OBJS) $(QUAKE_XIL_OBJS)

