#
# Quake2 gamei386.so Makefile for Linux 2.0
#
# Jan '98 by Zoid <zoid@idsoftware.com>
#
# ELF only
#
# Probably requires GNU make
#
# This builds the gamei386.so for Linux based on the q2source_12_11.zip
# release.  
# Put his Makefile in the game subdirectory you get when you unzip
# q2source_12_11.zip.
#
# There are two compiler errors you'll get, the following fixes
# are necessary:
#
# In g_local.h (around line 828), you must change the 
#    typedef struct g_client_s { ... } gclient_t;
# to just:
#    struct g_client_s { ... };
# The typedef is already defined elsewhere (seems to compile fine under
# MSCV++ for Win32 for some reason).
#
# m_player.h has a Ctrl-Z at the end (damn DOS editors).  Remove it or
# gcc complains.
#
# Note that the source in q2source_12_11.zip is for version 3.05.  To
# get it to run with Linux 3.10, change the following in game.h:
#    #define	GAME_API_VERSION	1
# change it to:
#    #define	GAME_API_VERSION	2

ARCH=i386
CC=gcc
BASE_CFLAGS=-Dstricmp=strcasecmp

#use these cflags to optimize it
CFLAGS=$(BASE_CFLAGS) -m486 -O6 -ffast-math -funroll-loops \
	-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \
	-malign-jumps=2 -malign-functions=2
#use these when debugging 
#CFLAGS=$(BASE_CFLAGS) -g

OBJDIR=linux

LDFLAGS=-ldl -lm
SHLIBEXT=so
SHLIBCFLAGS=-fPIC
SHLIBLDFLAGS=-shared

DO_CC=$(CC) $(CFLAGS) $(SHLIBCFLAGS) -o $@ -c $<

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

GAME_OBJS = \
	$(OBJDIR)/g_ai.o $(OBJDIR)/p_client.o $(OBJDIR)/g_svcmds.o $(OBJDIR)/g_cmds.o \
	$(OBJDIR)/g_combat.o $(OBJDIR)/g_func.o $(OBJDIR)/g_items.o \
	$(OBJDIR)/g_main.o $(OBJDIR)/g_misc.o $(OBJDIR)/g_monster.o $(OBJDIR)/g_phys.o \
	$(OBJDIR)/g_save.o $(OBJDIR)/g_spawn.o \
	$(OBJDIR)/g_target.o $(OBJDIR)/g_trigger.o $(OBJDIR)/g_utils.o $(OBJDIR)/g_weapon.o \
	$(OBJDIR)/m_move.o \
	$(OBJDIR)/p_hud.o $(OBJDIR)/p_trail.o $(OBJDIR)/p_view.o $(OBJDIR)/p_weapon.o \
	$(OBJDIR)/q_shared.o $(OBJDIR)/g_ctf.o $(OBJDIR)/p_menu.o $(OBJDIR)/g_chase.o

game$(ARCH).$(SHLIBEXT) : $(GAME_OBJS)
	$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(GAME_OBJS)

$(OBJDIR)/g_ai.o       : g_ai.c     
	$(DO_CC)

$(OBJDIR)/p_client.o   : p_client.c 
	$(DO_CC)

$(OBJDIR)/g_svcmds.o   : g_svcmds.c 
	$(DO_CC)

$(OBJDIR)/g_cmds.o     : g_cmds.c   
	$(DO_CC)

$(OBJDIR)/g_combat.o   : g_combat.c 
	$(DO_CC)

$(OBJDIR)/g_func.o     : g_func.c   
	$(DO_CC)

$(OBJDIR)/g_items.o    : g_items.c  
	$(DO_CC)

$(OBJDIR)/g_main.o     : g_main.c   
	$(DO_CC)

$(OBJDIR)/g_misc.o     : g_misc.c   
	$(DO_CC)

$(OBJDIR)/g_monster.o  : g_monster.c
	$(DO_CC)

$(OBJDIR)/g_phys.o     : g_phys.c   
	$(DO_CC)

$(OBJDIR)/g_save.o     : g_save.c   
	$(DO_CC)

$(OBJDIR)/g_spawn.o    : g_spawn.c  
	$(DO_CC)

$(OBJDIR)/g_target.o   : g_target.c 
	$(DO_CC)

$(OBJDIR)/g_trigger.o  : g_trigger.c
	$(DO_CC)

$(OBJDIR)/g_utils.o    : g_utils.c  
	$(DO_CC)

$(OBJDIR)/g_weapon.o   : g_weapon.c 
	$(DO_CC)

$(OBJDIR)/m_move.o     : m_move.c   
	$(DO_CC)

$(OBJDIR)/p_hud.o      : p_hud.c    
	$(DO_CC)

$(OBJDIR)/p_trail.o    : p_trail.c  
	$(DO_CC)

$(OBJDIR)/p_view.o     : p_view.c   
	$(DO_CC)

$(OBJDIR)/p_weapon.o   : p_weapon.c 
	$(DO_CC)

$(OBJDIR)/q_shared.o   : q_shared.c 
	$(DO_CC)

$(OBJDIR)/g_ctf.o      : g_ctf.c    
	$(DO_CC)

$(OBJDIR)/p_menu.o     : p_menu.c   
	$(DO_CC)

$(OBJDIR)/g_chase.o    : g_chase.c  
	$(DO_CC)

#############################################################################
# MISC
#############################################################################

clean:
	-rm -f $(GAME_OBJS)

depend:
	gcc -MM $(GAME_OBJS:.o=.c)

