#
# MurkMUD++ - A Windows compatible, C++ compatible Merc 2.2 Mud.
#
# author Jon A. Lambert
# date 01/02/2007
# version 1.5
# remarks
#  This source code copyright (C) 2005, 2006, 2007 by Jon A. Lambert
#  All rights reserved.
#
#  Use governed by the MurkMUD++ public license found in license.murk++

#
# Murk++ build for cygwin, linux and bsd
#
CPP = g++
CC = gcc
AR = ar

# The suffix appended to executables.  
# This should be set for Cygwin.
#EXE = .exe
#EXE =

OPTIM = -O2 -pipe 
WARN = -Wall -Wno-parentheses -Wno-unused 
PROF    = -g

DEFS = -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE 
CPPFLAGS = $(OPTIM) $(WARN) -W $(PROF) -fno-default-inline 
CFLAGS = $(OPTIM) $(DEFS) $(WARN) -fno-strict-aliasing
LFLAGS = $(OPTIM) $(PROF) 

INCS = -Isqlite3 
LIBS = -lcrypt -ldl -lpthread

SQLITE_SRC = sqlite3/sqlite3.c
SQLITE_OBJ = $(SQLITE_SRC:.c=.o)
SQLITE_LIB = sqlite3/libsqlite3.a

SQLITE_PRG_SRC = sqlite3/shell.c 
SQLITE_PRG_OBJ = $(SQLITE_PRG_SRC:.c=.o)
SQLITE_PRG = sqlite3/sqlite3$(EXE) 

SQLITE_XTRA = sqlite3/sqlite3.h sqlite3/sqlite3ext.h \
	sqlite3/libsqlite3.vcxproj sqlite3/sqlite3.vcxproj \
	sqlite3/libsqlite3.cbproj sqlite3/sqlite3.cbproj

MURK_UTIL_SRC = loadhelps.cpp
MURK_UTIL_OBJ = $(MURK_UTIL_SRC:.cpp=.o)
MURK_SRC = murk.cpp os.cpp descriptor.cpp utils.cpp commands.cpp io.cpp \
	room.cpp object.cpp character.cpp spells.cpp objproto.cpp mobproto.cpp \
	affect.cpp exit.cpp area.cpp reset.cpp extra.cpp shop.cpp pcdata.cpp \
	symbols.cpp database.cpp world.cpp
MURK_OBJ = $(MURK_SRC:.cpp=.o)
MURK_HDR = os.hpp config.hpp descriptor.hpp character.hpp pcdata.hpp utils.hpp \
	globals.hpp object.hpp note.hpp room.hpp area.hpp mobproto.hpp \
	objproto.hpp affect.hpp exit.hpp extra.hpp ban.hpp shop.hpp reset.hpp \
	io.hpp symbols.hpp database.hpp spell_list.hpp cmd_list.hpp \
	baseobject.hpp world.hpp

OBJDEPENDS = $(MURK_OBJ) $(MURK_UTIL_OBJ)

# Data files Areas, Mobprogs and Players
DATAFILES = area.lst limbo.are mid_cit.prg midgaard.are school.are help.are \
        vagabond.prg beggar.prg crier.prg drunk.prg gategrd.prg gategrd2.prg \
	janitor.prg One schema item_types socials titles

# Files in the standard distribution
DISTFILES = $(MURK_SRC) $(MURK_UTIL_SRC) $(MURK_HDR) $(DATAFILES) \
	$(SQLITE_SRC) $(SQLITE_PRG_SRC) $(SQLITE_XTRA) \
	makefile makefile.bor makefile.vc makefile.dgm makefile.vc15 \
	doc.txt startup startup.bash startup.cmd \
	license.crypt license.diku license.merc license.murk++ \
	loadhelps.vcxproj murk.vcxproj murk++.sln \
	loadhelps.cbproj murk.cbproj murk++.groupproj
  
PDIST= $(patsubst %,murk++/%,$(DISTFILES))
RELEASE=dist

TARGETS = $(SQLITE_LIB) $(SQLITE_PRG) murk$(EXE) loadhelps$(EXE)

all: $(TARGETS)

$(SQLITE_LIB): $(SQLITE_OBJ)
	$(AR) rsc $@ $^

$(SQLITE_PRG): $(SQLITE_PRG_OBJ) $(SQLITE_LIB)
	$(CC) $(LFLAGS) -o $@ $^ $(LIBS)

murk$(EXE): $(MURK_OBJ) $(SQLITE_LIB) 
	@-rm murkold$(EXE)
	@-mv murk$(EXE) murkold$(EXE)
	$(CPP) $(LFLAGS) -o $@ $^ $(LIBS)

loadhelps$(EXE): loadhelps.o io.o $(SQLITE_LIB) 
	$(CPP) $(LFLAGS) -o $@ $^ $(LIBS)

database: $(SQLITE_PRG) loadhelps$(EXE)
	@echo "Building database..."
	@-cp murk.db murk.db.bkup
	@-rm murk.db
	@sqlite3/sqlite3 murk.db < schema
	@./loadhelps
	@echo "Done."

clean:
	-rm -f murk$(EXE) loadhelps$(EXE) $(MURK_OBJ) $(MURK_UTIL_OBJ) \
	$(OBJDEPENDS:.o=.d)

cleanall:
	-rm -f $(TARGETS) $(MURK_OBJ) $(MURK_UTIL_OBJ) $(SQLITE_OBJ) \
	$(SQLITE_PRG_OBJ) $(OBJDEPENDS:.o=.d)

dist:
	ln -s ./ murk++
	tar czvf murk++-$(RELEASE).tar.gz $(PDIST)
	rm murk++
	
# pull in dependency info for *existing* .o files
-include $(OBJDEPENDS:.o=.d)

# compile and generate dependency info;
# more complicated dependency computation, so all prereqs listed
# will also become command-less, prereq-less targets
#   sed:    append directory to object target. (gcc bug?)
#   sed:    strip the target (everything before colon)
#   sed:    remove any continuation backslashes
#   fmt -1: list words one per line
#   sed:    strip leading spaces
#   sed:    add trailing colons
%.o: %.cpp
	$(CPP) -c $(CPPFLAGS) $(INCS) $*.cpp -o $*.o
	@$(CPP) -MM $(CPPFLAGS) $(INCS) $*.cpp > $*.d
	@mv -f $*.d $*.d.tmp
	@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
	@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
	  sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
	@rm -f $*.d.tmp

#.cpp.o: 
#	$(CPP) -c $(CPPFLAGS) $(INCS) $*.cpp -o $*.o 

.c.o: 
	$(CC) -c $(CFLAGS) $(INCS) $*.c -o $*.o