############# Names and dirs #############

PROGNAME = Psyclone$(EXT)
LIBNAME = libPsyclone$(EXT).a

BINDIR = bin
LIBDIR = lib
SRCDIR = src
BUILDDIR = build$(EXTLOW)

#INCLUDEDIRS = include ../CoreLibrary/include ../PsySDK/include
#LIBRARIES = ../CoreLibrary/lib/arch/CoreLibrary.a ../PsySDK/lib/arch/PsySDK.a

INCLUDEDIRS = include ../CMSDK/include
LIBRARIES = ../CMSDK/lib/arch/libCMSDK$(EXT).a

############# Include system stuff #############

include ../CMSDK/Makefile.sys

############# Files to compile #############

CPPFILES = ComponentManager.cpp LicenceManager.cpp NetServices.cpp Node.cpp SubscriptionEngine.cpp
CPPFILES += ComRecorder.cpp Logging.cpp TagManager.cpp PsyProbe.cpp IDManager.cpp
CPPFILES += Console.cpp Monitoring.cpp Networking.cpp ServiceManager.cpp
CPPFILES += InterSystemManager.cpp

PROG_CPPFILES = Psyclone.cpp

############# Setup dirs #############

PROGRAM = $(BINDESTDIR)/$(PROGNAME)
LIBRARY = $(LIBDESTDIR)/$(LIBNAME)

SRCFILES = $(patsubst %.cpp,$(SRCDIR)/%.cpp,$(CPPFILES))
OBJFILES = $(patsubst %.cpp,$(BUILDDIR)/%.o,$(CPPFILES))

PROG_SRCFILES = $(patsubst %.cpp,$(SRCDIR)/%.cpp,$(PROG_CPPFILES))
PROG_OBJFILES = $(patsubst %.cpp,$(BUILDDIR)/%.o,$(PROG_CPPFILES))

INCLUDES = $(patsubst %,-I% ,$(INCLUDEDIRS))
LIBS = $(subst /arch/,/$(ARCH)/,$(LIBRARIES))

RESULT := $(shell if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi)
RESULT := $(shell if [ ! -d $(BINDESTDIR) ]; then mkdir $(BINDESTDIR); fi)
RESULT := $(shell if [ ! -d $(LIBDIR) ]; then mkdir $(LIBDIR); fi)
RESULT := $(shell if [ ! -d $(LIBDESTDIR) ]; then mkdir $(LIBDESTDIR); fi)
RESULT := $(shell if [ ! -d $(BUILDDIR) ]; then mkdir $(BUILDDIR); fi)

############# Overall commands #############

all : $(LIBRARY) $(PROGRAM)
	@echo $(LIBRARY) and $(PROGRAM) ready

debug: all

ssl: all

ssldebug: all

profile: all

############# Dependencies #############

$(BUILDDIR)/%.d: $(SRCDIR)/%.cpp
	@echo Making dependencies for $(<F)...
	@$(SHELL) -ec '$(CC) -MM $(INCLUDES) -D $(SYSTEM) $(STANDARD) $< \
		| sed '\''s/\($(*F)\)\.o[ :]*/\1.o $(@F) : /g'\'' > $@; \
		[ -s $@ ] || rm -f $@'

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),cleandebug)
ifneq ($(MAKECMDGOALS),totalclean)
  -include $(OBJFILES:.o=.d)
endif
endif
endif

############# Compiling #############

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp
	@echo Compiling $(<F)
	@$(CC) $(DEBUG) $(INCLUDES) $(STANDARD) $(NOTLINK) $(OUTPUT_OPTION) $<

############# Linking #############

$(PROGRAM): $(LIBRARY) $(PROG_OBJFILES) $(LIBS)
	@echo Linking $(PROGNAME) $(SYSTEM)...
	@$(CC) $(DEBUG) $(STANDARD) $(PROG_OBJFILES) $(LIBRARY) $(LIBPATHS) -o $(PROGRAM) $(LIBS) $(OTHERLIBS)

$(LIBRARY): $(OBJFILES)
	@echo Creating $(LIBRARY)...
	@$(RM) -f $(LIBRARY)
	@$(AR) $(ARFLAGS) $(LIBRARY) $(OBJFILES)
	@$(RANLIB) $(LIBRARY)

############# Cleaning #############

clean:
	@echo Removing .o files and executable
	@find $(BUILDDIR) -path '*/.svn' -prune -o -type f -name \*.[o,d] -exec rm -f {} \;
	@rm -rf $(BUILDDIR)
	@rm -f $(PROGRAM) $(LIBRARY)
	@make cleandebug

cleandebug:
	@echo Removing debug .o files and executable
	@find $(BUILDDIR) -path '*/.svn' -prune -o -type f -name \*.[o,d] -exec rm -f {} \;
	@rm -rf $(BUILDDIR)
	@rm -f $(PROGRAM) $(LIBRARY)
	
totalclean : clean
	#@echo Code size before is: `du -ks .`
	@echo Cleaning Visual Studio files...
	@rm -f *.lib
	@find . -type d -name Debug -exec rm -rf {} \; > /dev/null 2>&1
	@find . -type d -name Release -exec rm -rf {} \; > /dev/null 2>&1
	@find . -type f -name \*.ncb -exec rm -f {} \; > /dev/null 2>&1
	@find . -type f -name \*.plg -exec rm -f {} \; > /dev/null 2>&1
	@find . -type f -name \*.exe -exec rm -f {} \; > /dev/null 2>&1
	@find . -type f -name \*.ilk -exec rm -f {} \; > /dev/null 2>&1
	@find . -type f -name \*.vcl -exec rm -f {} \; > /dev/null 2>&1
	@echo Cleaning core dump files...
	@find . -type f -name core -exec rm -f {} \; > /dev/null 2>&1
	#@echo Code size after is: `du -ks .`

############# Additional commands #############

rebuild : clean all

run : all
	@echo Running $(PROGNAME)
	@echo
	@$(PROGNAME)
