#	Hinweise:
#
#	Executables liegen unter 'build' als linux.(client, server) und solaris.(client, server).
#	Kompiliert wird immer fuer die Plattform des verwendeten Hostsystems.
#	Sourcedateien muessen unter 'src' liegen.
#	Die Hauptdateien sollten mit server.cpp bzw client.cpp benannt sein.

# Targets:

SERVER_TARGET = server
CLIENT_TARGET = client

# Liste der Quelltexte:

CPP_SOURCES = $(shell find src -name "*.cpp")
CXX = g++

#-default compiler specific flags (overwritten by target specific settings)-------------------------------------
CXXFLAGS := $(CXXFLAGS) -Wall -I. -O0 
CXXFLAGS := $(CXXFLAGS) -g
LDFLAGS := $(CXXFLAGS) -lstdc++ 
LDLIBS += -lpthread 
MAKEDEP = $(CXX) -MM


#-SOLARIS specific settings-----------------------------------------------
HOST=$(findstring SunOS, $(shell uname)) #$(findstring solaris, $(OSTYPE))

ifeq ($(HOST), SunOS )
	CXX = /opt/forte11/SUNWspro/bin/CC 
	CXXFLAGS := $(CXXFLAGS)  -I. -misalign
	MAKEDEP = $(CXX) -xM1
	CXXFLAGS := -I. -D_REENTRANT 
	LDFLAGS := $(CXXFLAGS)# -lstdc++ 
	LDLIBS += -lsocket -lnsl
	TARGET_PLATFORM=solaris
else
#-default (linux) specific settings-----------------------------------------------
	CXXFLAGS := $(CXXFLAGS) -D_REENTRANT
	TARGET_PLATFORM=linux
endif

#-paths-----------------------------------------------
ROOTDIR=.

# shorthand
BUILDDIR = $(ROOTDIR)/build
OBJDIR_HAP_PREFIX = $(BUILDDIR)/$(TARGET_PLATFORM)

# build directories and files
OBJ_DIR = $(OBJDIR_HAP_PREFIX).objs
DEPS_DIR = $(OBJDIR_HAP_PREFIX).deps

S_TARGET = $(OBJDIR_HAP_PREFIX).$(SERVER_TARGET)
C_TARGET = $(OBJDIR_HAP_PREFIX).$(CLIENT_TARGET)

# -------------------------------------------------
# Default target
.PHONY : all clean cleanall
all: $(BUILDDIR) $(OBJ_DIR) $(DEPS_DIR) $(S_TARGET) $(C_TARGET) 

# -------------------------------------------------------------------------

# Namen der Unterverzeichnisse mit den Quelltexten
# (wird automatisch aus den Quelltextdateien ermittelt und vom Compiler
# benutzt, um die Quelltexte zu finden.)
VPATH = $(sort $(dir $(CPP_SOURCES)))

# Listen mit den Objektdateien, die beim Kompilieren entstehen:
# (werden automatisch aus den Quelltextdateinamen ermittelt)

DEPS = $(addprefix $(DEPS_DIR)/, $(notdir $(CPP_SOURCES:.cpp=.dep)))

CL_OBJS = $(addprefix $(OBJ_DIR)/, $(subst $(SERVER_TARGET).o, , $(notdir $(CPP_SOURCES:.cpp=.o))))
SV_OBJS = $(addprefix $(OBJ_DIR)/, $(subst $(CLIENT_TARGET).o, , $(notdir $(CPP_SOURCES:.cpp=.o)))) 

# --------------------------------------------------------------------------
# Regeln zur Erzeugung der Objektdateien

$(OBJ_DIR)/%.o : %.cpp
	@echo "compile	 	$< --> $@"
	$(CXX) -c $(CXXFLAGS) -o $@ $<

$(DEPS_DIR)/%.dep : %.cpp $(DEPS_DIR)
	@echo "make dep	$< --> $@"
	@set -e; $(MAKEDEP) $(CXXFLAGS) $< \
	| sed 's#\($*\)\.o[ :]*#$(DEPS_DIR)/$*\.dep $(OBJ_DIR)/$*\.o: #g' > $@;
	@[ -s $@ ] || rm -f $@

#--------------------------------------------------
# Linke Server

$(SERVER_TARGET): $(S_TARGET)
	@echo

$(S_TARGET): $(DEPS) $(SV_OBJS) 
	@echo "linking server"
	$(CXX) $(LDFLAGS) -o $(S_TARGET) $(SV_OBJS) $(LDLIBS)

#--------------------------------------------------
# Linke Client 

$(CLIENT_TARGET): $(C_TARGET)
	@echo

$(C_TARGET): $(DEPS) $(CL_OBJS)
	@echo "linking client"
	$(CXX) $(LDFLAGS) -o $(C_TARGET) $(CL_OBJS) $(LDLIBS)

# -------------------------------------------------
# Regel zur Erzeugung der Verzeichnisse
$(BUILDDIR):
	mkdir -p $(BUILDDIR)

$(OBJ_DIR):
	mkdir -p $(OBJ_DIR)

$(DEPS_DIR) :
	mkdir -p $(DEPS_DIR)


-include $(DEPS)


# -------------------------------------------------------------------------

clean:	
	@$(RM) -f $(OBJ_DIR)/*.[oO] $(DEPS_DIR)/*.dep *~
#	@$(RM) -r $(OBJ_DIR)
	@$(RM) -r $(DEPS_DIR)
	@$(RM) $(S_TARGET)
	@$(RM) $(C_TARGET)

cleanall:
	@$(RM) -r $(BUILDDIR)
