#############################################################################
#############################################################################
#
#	Makefile for PmQuake
#
#	by Patrice Mandin
#
#	Compilation time :
#	Atari Falcon	Motorola 68030/16	 2 h  00 mn
#	PC		Cyrix 6x86 P200+/150	 2 mn 46 s
#
#############################################################################
#############################################################################

###############	Choose the configuration to compile the program for :
#
#	Configurations allowed are:
#
#	SYSTEM	CPU	RENDER	CROSS
#
#	linux	x86	gl	n	(GlX version)
#	linux	x86	soft	n
#	atari	m68k	soft	n	(Any volunteer for a GL version ?)
#	atari	m68k	soft	y	(cross compilation)

SYSTEM=		atari
CPU=		m68k
RENDER=		soft
CROSS=		y

###############	Different initializations values

CPU_IS_m68k=	-m68030 
#CPU_IS_m68k=	-m68030 -m68881
CPU_IS_x86=	-mpentium

SYSLIB_IS_linux=	-lm
SYSLIB_IS_atari=	-lm

VID_IS_x11=	-L/usr/X11R6/lib -lXext -lX11
VID_IS_svgalib=	-lvga -lvgagl
VID_IS_glx=	-L/usr/local/lib $(VID_IS_x11) -lXxf86dga -lXxf86vm -lGL -ldl
VID_IS_xbios=
VID_IS_vdi=	-lgem

VIDLIB_IS_linux_soft=	$(VID_IS_x11) $(VID_IS_svgalib)
VIDLIB_IS_linux_gl=	$(VID_IS_glx)
VIDLIB_IS_atari_soft=	$(VID_IS_xbios) $(VID_IS_vdi)

ASFLAG_IS_linux=	-DELF -x assembler-with-cpp
ASFLAG_IS_atari=

AS_IS_linux=	$(CROSSBINDIR)gcc
AS_IS_atari=	$(CROSSBINDIR)as

GAME_IS_soft=
GAME_IS_gl=	-DGLQUAKE

CROSSBINDIR_IS_y=	/usr/local/m68k-atari-mint/bin/
CROSSBINDIR_IS_n=

###############	Parse configuration now

SYSTEMFLAGS=	$(SYS_IS_$(SYSTEM))
GAMEFLAGS=	$(GAME_IS_$(RENDER))
VIDEOLIBS=	$(VIDLIB_IS_$(SYSTEM)_$(RENDER))
CPUFLAGS=	$(CPU_IS_$(CPU))
ASFLAGS=	$(ASFLAG_IS_$(SYSTEM))
SYSTEMOBJS=	$(OBJ_IS_$(SYSTEM))
SYSRENDEROBJS=	$(OBJ_IS_$(SYSTEM)_$(RENDER))
RENDEROBJS=	$(OBJ_IS_$(RENDER))
CROSSBINDIR=	$(CROSSBINDIR_IS_$(CROSS))
SYSTEMLIBS=	$(SYSLIB_IS_$(SYSTEM))

###############	Common variables

CC=		$(CROSSBINDIR)gcc
AS=		$(AS_IS_$(SYSTEM))
LD=		$(CROSSBINDIR)gcc
STRIP=		$(CROSSBINDIR)strip
STACK=		$(CROSSBINDIR)stack

STACKSIZE=	262144

SRCDIR=		./src
INCDIR=		./include
OBJDIR=		./obj

INCLUDES=	-I$(INCDIR)
CFLAGS=		-Wall -O2 -fomit-frame-pointer $(GAMEFLAGS)

###############	Program name

PROGRAM=	quake

###############	Common render objects

OBJ_IS_soft=	$(OBJDIR)/draw.o \
		$(OBJDIR)/d_edge.o \
		$(OBJDIR)/d_fill.o \
		$(OBJDIR)/d_init.o \
		$(OBJDIR)/d_modech.o \
		$(OBJDIR)/d_part.o \
		$(OBJDIR)/d_polyse.o \
		$(OBJDIR)/d_scan.o \
		$(OBJDIR)/d_scan0.o \
		$(OBJDIR)/d_sky.o \
		$(OBJDIR)/d_sprite.o \
		$(OBJDIR)/d_surf.o \
		$(OBJDIR)/d_vars.o \
		$(OBJDIR)/d_zpoint.o \
		$(OBJDIR)/model.o \
		$(OBJDIR)/nonintel.o \
		$(OBJDIR)/r_aclip.o \
		$(OBJDIR)/r_alias.o \
		$(OBJDIR)/r_bsp.o \
		$(OBJDIR)/r_light.o \
		$(OBJDIR)/r_draw.o \
		$(OBJDIR)/r_efrag.o \
		$(OBJDIR)/r_edge.o \
		$(OBJDIR)/r_misc.o \
		$(OBJDIR)/r_main.o \
		$(OBJDIR)/r_sky.o \
		$(OBJDIR)/r_sprite.o \
		$(OBJDIR)/r_surf.o \
		$(OBJDIR)/r_vars.o \
		$(OBJDIR)/screen.o

OBJ_IS_gl=	$(OBJDIR)/gl_draw.o \
		$(OBJDIR)/gl_mesh.o \
		$(OBJDIR)/gl_model.o \
		$(OBJDIR)/gl_refrag.o \
		$(OBJDIR)/gl_rlight.o \
		$(OBJDIR)/gl_rmain.o \
		$(OBJDIR)/gl_rmisc.o \
		$(OBJDIR)/gl_rsurf.o \
		$(OBJDIR)/gl_screen.o \
		$(OBJDIR)/gl_test.o \
		$(OBJDIR)/gl_warp.o

###############	Linux specific objects

OBJ_IS_linux=	$(OBJDIR)/sys_linux.o \
		$(OBJDIR)/cd_linux.o \
		$(OBJDIR)/snd_linux.o \
		$(OBJDIR)/net_udp.o \
		$(OBJDIR)/net_bsd.o \
		$(OBJDIR)/net_dgrm.o \
		\
		$(OBJDIR)/x86/math.o \
		$(OBJDIR)/x86/worlda.o \
		$(OBJDIR)/x86/snd_mixa.o \
		$(OBJDIR)/x86/sys_dosa.o \

OBJ_IS_linux_soft=\
		$(OBJDIR)/vid_x.o \
		$(OBJDIR)/vid_svgalib.o \
		\
		$(OBJDIR)/x86/d_draw.o \
		$(OBJDIR)/x86/d_draw16.o \
		$(OBJDIR)/x86/d_parta.o \
		$(OBJDIR)/x86/d_polysa.o \
		$(OBJDIR)/x86/d_scana.o \
		$(OBJDIR)/x86/d_spr8.o \
		$(OBJDIR)/x86/d_varsa.o \
		$(OBJDIR)/x86/r_aliasa.o \
		$(OBJDIR)/x86/r_drawa.o \
		$(OBJDIR)/x86/r_edgea.o \
		$(OBJDIR)/x86/r_varsa.o \
		$(OBJDIR)/x86/surf16.o \
		$(OBJDIR)/x86/surf8.o \
		$(OBJDIR)/x86/r_aclipa.o

OBJ_IS_linux_gl=\
		$(OBJDIR)/gl_vidlinuxglx.o

###############	Atari specific objects

OBJ_IS_atari=	$(OBJDIR)/sys_atari.o \
		$(OBJDIR)/vid_xbios.o \
		$(OBJDIR)/vid_vdi.o \
		$(OBJDIR)/in_bios.o \
		$(OBJDIR)/in_ikbd.o \
		$(OBJDIR)/i_cookies.o \
		\
		$(OBJDIR)/m68k/c2p.o \
		$(OBJDIR)/m68k/ikbd.o

OBJ_IS_atari_soft=

OBJ_IS_atari_gl=

###############	Game objects

OBJS=		$(OBJDIR)/cl_demo.o \
		$(OBJDIR)/cl_input.o \
		$(OBJDIR)/cl_main.o \
		$(OBJDIR)/cl_parse.o \
		$(OBJDIR)/cl_tent.o \
		$(OBJDIR)/chase.o \
		$(OBJDIR)/cmd.o \
		$(OBJDIR)/common.o \
		$(OBJDIR)/console.o \
		$(OBJDIR)/crc.o \
		$(OBJDIR)/cvar.o \
		$(OBJDIR)/host.o \
		$(OBJDIR)/host_cmd.o \
		$(OBJDIR)/keys.o \
		$(OBJDIR)/menu.o \
		$(OBJDIR)/mathlib.o \
		$(OBJDIR)/pr_cmds.o \
		$(OBJDIR)/pr_edict.o \
		$(OBJDIR)/pr_exec.o \
		$(OBJDIR)/r_part.o \
		$(OBJDIR)/sbar.o \
		$(OBJDIR)/sv_main.o \
		$(OBJDIR)/sv_phys.o \
		$(OBJDIR)/sv_move.o \
		$(OBJDIR)/sv_user.o \
		$(OBJDIR)/zone.o \
		$(OBJDIR)/view.o \
		$(OBJDIR)/wad.o \
		$(OBJDIR)/world.o \
		\
		$(OBJDIR)/cd_null.o \
		$(OBJDIR)/in_null.o \
		$(OBJDIR)/sys_null.o \
		$(OBJDIR)/vid_null.o \
		$(OBJDIR)/snd_null.o \
		$(OBJDIR)/snd_dma.o \
		$(OBJDIR)/snd_mem.o \
		$(OBJDIR)/snd_mix.o \
		$(OBJDIR)/net_null.o \
		$(OBJDIR)/net_loop.o \
		$(OBJDIR)/net_main.o \
		$(OBJDIR)/net_vcr.o \
		\
		$(RENDEROBJS) \
		$(SYSTEMOBJS) \
		$(SYSRENDEROBJS)

###############	Source files

SRCDISTNAME=	pmquake-0.5

SRCDISTFILES=	$(SRCDISTNAME)/Changes \
		$(SRCDISTNAME)/Copying \
		$(SRCDISTNAME)/Readme.fra \
		$(SRCDISTNAME)/Readme.eng \
		$(SRCDISTNAME)/Makefile \
		$(SRCDISTNAME)/src \
		$(SRCDISTNAME)/include

###############	Rules to build program

all:	 $(PROGRAM) make-strip $(SYSTEM)

clean:
	rm -rf $(OBJDIR)
	rm -f $(PROGRAM)

make-strip:
	$(STRIP) $(PROGRAM)

srcdist:
	cd .. ; tar cvzf $(SRCDISTNAME).tar.gz $(SRCDISTFILES)

$(PROGRAM):	$(OBJS)
	$(LD) $(OBJS) $(VIDEOLIBS) $(SYSTEMLIBS) -o $(PROGRAM)

$(OBJDIR)/%.o:	$(SRCDIR)/%.c
	@if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi
	$(CC) $(INCLUDES) $(CFLAGS) $(SYSTEMFLAGS) $(CPUFLAGS) -c $< -o $@

$(OBJDIR)/x86/%.o:	$(SRCDIR)/x86/%.s
	@if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi
	@if [ ! -d $(OBJDIR)/x86 ]; then mkdir $(OBJDIR)/x86; fi
	$(AS) $(INCLUDES) $(INCLUDES)/x86 $(ASFLAGS) -o $@ -c $< 

$(OBJDIR)/m68k/%.o:	$(SRCDIR)/m68k/%.s
	@if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi
	@if [ ! -d $(OBJDIR)/m68k ]; then mkdir $(OBJDIR)/m68k; fi
	$(AS) -o $@ $< 

###############	System dependent rules

linux:
	@echo "--> Warning: you need to be root to use Svgalib"
	chown root $(PROGRAM)
	chgrp root $(PROGRAM)
	chmod +s $(PROGRAM)

atari:
	$(STACK) -S $(STACKSIZE) $(PROGRAM)
