# vim: set tw=75 :

# MetaMOD makefile
# by Will Day, based on the Valve SDK 2.1 Makefile as well as the Makefile
# in adminmod by Alfred Reynolds

#! Half-Life StandardSDK 2.0 mp_i386.so Makefile for i386 Linux
#
#! April 2000 by Leon Hartwig (jehannum@planethalflife.com)
#
# From SDK 2.1 dlls/Makefile

# NOTE: This is a generic Makefile for metamod and the bundled plugins, and
# is symlinked into each subdir.  Per-module config statements are in
# Config.mak in each subdir.

#############################################################################
# CONFIGURATION
#############################################################################

SDKDIR=$(HOME)/src/hl/hlsdk-2.1
#SDKDIR=/hlsdk2.1
SDKSRC=$(SDKDIR)/SourceCode
METADIR=../metamod

INST_DIR=$(HOME)/half-life/cstrike/dlls
TEST_DIR=$(HOME)/test/cstrike/dlls
#TEST_DIR=/hlserver/tfc/dlls

include Config.mak

#############################################################################
# STUFF
#############################################################################

ARCH=i386

#! make sure this is the correct compiler for your system
CC=gcc
WIN_PATH=/usr/local/cross-tools/i386-mingw32msvc/bin
#WIN_PATH=/gcc-2.95.2-msvcrt/bin
WIN_CC=$(WIN_PATH)/gcc
WIN_LD_DLL= PATH=$(WIN_PATH) $(WIN_PATH)/dllwrap
#WIN_LD_DLL= $(WIN_PATH)/dllwrap

DLL_SRCDIR=.

DLL_OBJDIR=$(DLL_SRCDIR)/obj
WIN_OBJDIR=$(DLL_SRCDIR)/win_obj

CFLAGS=-Dstricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -Dstrcmpi=strcasecmp \
	-march=i686 -Wall -Wno-unknown-pragmas

# original safe optimization, from valve Makefile
#CFLAGS+= -O2 -ffast-math -funroll-loops \
#	-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \
#	-malign-jumps=2 -malign-functions=2

# safe optimization, adapted from adminmod Makefile
#CFLAGS+= -m486 -O6 -ffast-math -funroll-loops \
# -fexpensive-optimizations -malign-loops=2  -malign-jumps=2 \
# -malign-functions=2 -Wall

# full optimization, adapted from adminmod Makefile
# "WONT WORK WITH omit-frame-pointer"?
#CFLAGS+= -m486 -O6 -ffast-math -funroll-loops \
#	-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \
#	-malign-jumps=2 -malign-functions=2 -s

#! use these when debugging 
#CFLAGS+= -ggdb3

INCLUDEDIRS=-I. -I$(METADIR) -I$(SDKSRC)/engine -I$(SDKSRC)/common -I$(SDKSRC)/pm_shared -I$(SDKSRC)/dlls -I$(SDKSRC)

LDFLAGS=-ldl

SHLIBEXT=so
SHLIBCFLAGS=-fPIC
SHLIBLDFLAGS=-shared

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

#############################################################################
#! SETUP
#############################################################################

$(DLL_OBJDIR)/%.o: $(DLL_SRCDIR)/%.cpp
	$(DO_CC)

$(WIN_OBJDIR)/%.o: $(DLL_SRCDIR)/%.cpp
	$(DO_CC_WIN32)

SRC = $(DLLSRC)

OBJ := $(SRC:%.cpp=$(DLL_OBJDIR)/%.o)
WINOBJ := $(SRC:%.cpp=$(WIN_OBJDIR)/%.o)

LIBSHARED = $(DLLNAME)_$(ARCH).$(SHLIBEXT)
LIB_TARGET = $(DLL_OBJDIR)/$(LIBSHARED)

DLLSHARED = $(DLLNAME).dll
WIN_TARGET = $(WIN_OBJDIR)/$(DLLSHARED)

FILES_ALL = *.cpp *.h [A-Z]*

#############################################################################
#! BUILD RULES FOR GAME
#############################################################################

all: $(LIB_TARGET)

win32: $(WIN_TARGET)

$(LIB_TARGET): $(DLL_OBJDIR) $(OBJ) tags
	$(CC) $(CFLAGS) $(SHLIBLDFLAGS) $(LDFLAGS) -o $@ $(OBJ)

$(WIN_TARGET): $(WIN_OBJDIR) $(WINOBJ)
#	@#$(WIN_CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(WINOBJ)
#	$(WIN_LD_DLL) -k -mwindows --add-stdcall-alias --def metamod.def -o $@ $(WINOBJ)
#	$(WIN_LD_DLL) -A -k -mwindows --export-all-symbols -o $@ $(WINOBJ)
	$(WIN_LD_DLL) --add-stdcall-alias -mwindows -o $@ $(WINOBJ)

$(DLL_OBJDIR):
	mkdir $(DLL_OBJDIR)

$(WIN_OBJDIR):
	mkdir $(WIN_OBJDIR)

clean:
	-rm -f $(OBJ) $(DLLNAME)_$(ARCH).$(SHLIBEXT) $(DLL_OBJDIR)/*.o $(DLL_OBJDIR)/*.so $(WIN_OBJDIR)/*.o $(WIN_OBJDIR)/*.dll

spotless: clean
	-rm -r $(DLL_OBJDIR) $(WIN_OBJDIR)

distclean:	clean
	rm Rules.depend

tags: $(SRC)
	-ctags -i=cdegfmstuvS *.h *.cpp

test: $(TEST_DIR)/$(LIBSHARED)

$(TEST_DIR)/$(LIBSHARED): $(LIB_TARGET)
	install -m 644 $(LIB_TARGET) $@

tst: $(TEST_DIR)/$(DLLSHARED)

$(TEST_DIR)/$(DLLSHARED): $(WIN_TARGET)
	cp $(WIN_TARGET) $@

snap:	.snap

.snap: $(FILES_ALL)
	mkdir -p snapshots
	tar zcvf snapshots/`date '+%m%d-%H%M'`.tgz $(FILES_ALL)
	touch .snap
	
depend: Rules.depend

Rules.depend: $(SRC)
	$(CC) -MM $(INCLUDEDIRS) $(SRC) | sed "s;\(^[^ 	]*\):\(.*\);$(DLL_OBJDIR)/\1 $(WIN_OBJDIR)/\1: \2;" > Rules.depend

include Rules.depend
