ifndef GO4SYS
  GO4SYS = .
endif

GO4PACKAGE = go4

# rules which are used to produce packages
PACKAGERULES    = compress go4-package fit-package \
                  thrd-package task-package win-bin \
                  fast-packages packages

ifneq ($(findstring $(MAKECMDGOALS), $(PACKAGERULES)),)
DOPACKAGE = true
endif

# rules which are used to produce packages
DOCRULES    = docs clean-docs go4-doxygen clean-go4-doxygen

ifneq ($(findstring $(MAKECMDGOALS), $(DOCRULES)),)
DODOCS = true
endif


FASTRULES   += clean-qt4 clean-bak clean-dep \
               clean-plugin clean-bin clean-prefix clean-svn \
               $(PACKAGERULES)

.PHONY:  all includes libs gui plugin install uninstall \
         clean clean-qt4 clean-bak clean-plugin clean-mainlibs clean-prefix clean-svn \
         package $(PACKAGERULES)


all::    gui


include build/Makefile.discover

ifeq ($(GO4_OS), Win32)
GO4_GENERATED_FILES = go4login.bat  go4.bat
else
GO4_GENERATED_FILES = go4login  bin/go4-config
endif

include Makefile.config


# scan old dict to exclude them from makefile
OLD_DICT =  $(wildcard */$(DICT_PREFIX)*.*)


ifdef QTPATH
ifeq ($(wildcard $(QTPATH)/*),)
$(error No files found in $(QTPATH), check your Qt installation)
endif
endif


Go4_Makefile_Rules = included

ifdef GO4_WIN32
  GO4SYS = .
endif

# new staff concerning big libraries

GO4BASE_LIBNAME  = $(LIB_PREFIX)Go4Base
GO4BASE_LIB      = $(GO4DLLPATH)/$(GO4BASE_LIBNAME).$(DllSuf)

THRDMNGR_LIBNAME = $(LIB_PREFIX)Go4ThreadManager
THRDMNGR_LIB     = $(GO4DLLPATH)/$(THRDMNGR_LIBNAME).$(DllSuf)

GO4TSKH_LIBNAME  = $(LIB_PREFIX)Go4TaskHandler
GO4TSKH_LIB      = $(GO4DLLPATH)/$(GO4TSKH_LIBNAME).$(DllSuf)

GO4ANBASE_LIBNAME = $(LIB_PREFIX)Go4AnalBase
GO4ANBASE_LIB     = $(GO4DLLPATH)/$(GO4ANBASE_LIBNAME).$(DllSuf)

GO4AN_LIBNAME   = $(LIB_PREFIX)Go4Analysis
GO4AN_LIB       = $(GO4DLLPATH)/$(GO4AN_LIBNAME).$(DllSuf)

GO4BGUI_LIBNAME = $(LIB_PREFIX)Go4GUI
GO4BGUI_LIB     = $(GO4DLLPATH)/$(GO4BGUI_LIBNAME).$(DllSuf)

BUILDGO4LIBS += $(GO4FIT_LIB) \
                $(GO4BASE_LIB) \
                $(THRDMNGR_LIB) \
                $(GO4TSKH_LIB) \
                $(GO4ANBASE_LIB) \
                $(GO4AN_LIB) \
                $(GO4BGUI_LIB)

MODULES  = MbsAPIbase MbsAPI RawAPI  \
           Go4Fit Go4Log Go4LockGuard \
           Go4ThreadManager \
           Go4CommandsAnalysis Go4CommandsBase  \
           Go4CommandsTaskHandler Go4TaskHandler \
           Go4ConditionsBase Go4DynamicList Go4Event \
           Go4EventServer Go4Exceptions \
           Go4Display Go4Proxies \
           Go4ObjectManager \
           Go4Queue Go4Socket Go4StatusAnalysis Go4StatusBase Go4HDF5 \
           Go4Http Go4HistogramServer Go4Analysis Go4AnalysisClient Go4Dict

EXMODULES = Go4ExampleSimple Go4Example1Step Go4Example2Step Go4ExampleAdvanced \
            Go4ExampleUserSource Go4ExampleUserStore Go4ExampleMesh Go4FitExample \
            Go4ThreadManagerExample Go4TaskHandlerExample Go4EventServerExample

include $(patsubst %,%/Module.mk,$(MODULES))

include $(patsubst %,%/Makefile, $(EXMODULES))

-include qt4/Module.mk

bin/go4-config: Makefile $(GO4SYS)/build/dummy.d
	@echo Producing $@
	@sed -e "s|@go4arch@|$(GO4_OS)|"        \
		  -e "s|@go4vers@|$(VERSSUF)|"       \
		  -e "s|@go4topdir@|$(GO4TOPPATH)|"  \
		  -e "s|@go4bindir@|$(GO4EXEPATH)|"  \
		  -e "s|@go4libdir@|$(GO4LIBPATH)|"  \
		  -e "s|@go4incdir@|$(GO4INCPATH)|"  \
		  -e "s|@go4mainlibs@|'$(subst -Llib,-L$(GO4LIBPATH),$(LIBS_FULLSET))'|"  \
		  -e "s|@go4guilibs@|'$(subst -L../../lib,-L$(GO4LIBPATH),$(LIBS_GUISET))'|"  \
		  -e "s|@go4cflags@|'$(subst -Iinclude -I.,-I$(GO4INCPATH),$(OPTFLAGS) $(CXXFLAGS))'|" \
		     < build/go4-config.ini > $@
	@chmod 755 $@

$(GO4SYS)/build/dummy.d: Makefile $(GO4QTHEADS) $(ALLHDRS)
	@(if [ ! -d bin ] ; then mkdir -p bin; fi)
	@(if [ ! -d lib ] ; then mkdir -p lib; fi)
	@(if [ ! -f $(GO4MAP) ] ; then touch $(GO4MAP); fi)
	@(if [ ! -f $@ ] ; then touch $@; fi)

libs::    $(BUILDGO4LIBS) $(GO4_GENERATED_FILES)

gui::    libs
ifdef GO4PREFIX
	@echo Call make install to copy all binary files into $(GO4PREFIX)
endif


ifndef GO4PREFIX
install:
	@echo "Go4 compiled without prefix set - install is not allowed"

uninstall:
	@echo "Go4 compiled without prefix set - uninstall is not allowed"
else
uninstall:
	@rm -rf $(GO4TOPPATH)
	@rm -f $(GO4EXEPATH)/go4 $(GO4EXEPATH)/go4analysis $(GO4EXEPATH)/go4-config
	@rm -f $(GO4LIBPATH)/libGo4*.*
	@rm -rf $(GO4INCPATH)

install: uninstall
	@echo "Installing Go4 in directory $(GO4PREFIX) ..."
	@mkdir -p $(GO4EXEPATH); cp bin/go4 bin/go4analysis bin/go4-config go4login $(GO4EXEPATH)
	@mkdir -p $(GO4LIBPATH); cp lib/* $(GO4LIBPATH)
	@mkdir -p $(GO4INCPATH); cp include/* $(GO4INCPATH)
	@mkdir -p $(GO4TOPPATH); cp Makefile.config Makefile.rules $(GO4TOPPATH)
	@mkdir -p $(GO4TOPPATH)/build; cp build/*.sh build/Makefile.* $(GO4TOPPATH)/build
	@mkdir -p $(GO4TOPPATH)/etc; cp -r etc/* $(GO4TOPPATH)/etc
	@mkdir -p $(GO4TOPPATH)/html; cp -r html/* $(GO4TOPPATH)/html
	@mkdir -p $(GO4TOPPATH)/html5; cp -r html5/* $(GO4TOPPATH)/html5
	@mkdir -p $(GO4TOPPATH)/macros; cp macros/* $(GO4TOPPATH)/macros
	@mkdir -p $(GO4TOPPATH)/docs; cp docs/* $(GO4TOPPATH)/docs
	@mkdir -p $(GO4TOPPATH)/qt4
	@mkdir -p $(GO4TOPPATH)/qt4/Go4UserGUI; cp qt4/Go4UserGUI/libGo4UserGui.$(DllSuf) $(GO4TOPPATH)/qt4/Go4UserGUI
	@mkdir -p $(GO4TOPPATH)/icons; cp icons/* $(GO4TOPPATH)/icons
	@echo "Installation completed"
endif

clean::  clean-bin clean-mainlibs clean-plugin
	@rm -f $(GO4MAP) */$(DICT_PREFIX)*.*
	@rm -f include/*.h
	@rm -rf bin lib
	@rm -f build/dummy.d build/Makefile.gener go4login go4login.bat go4.bat
	@echo "Clean go4 done"

clean-bin::
	@echo "Clean binary (generated) files"

clean-bak:
	@echo "Delete bak files"
	@rm -f $(patsubst %,%/*.bak,$(MODULES))
	@rm -f $(patsubst %,%/*.*~,$(MODULES))
	@rm -f $(patsubst %,%/*.bak,$(EXMODULES))
	@rm -f $(patsubst %,%/*.*~,$(EXMODULES))
	@rm -f go4logfile.txt $(patsubst %,%/go4logfile.txt,$(EXMODULES))

clean-dep:
	@rm -f $(LIBDEPENDENC) $(EXAMPDEPENDENCS)
	@echo "Delete all dependency files"

clean-prefix:
	@rm -f Go4Log/TGo4Log.o Go4Log/TGo4Log.d
	@rm -f qt4/Go4GUI/Makefile.qt
	@rm -f build/Makefile.gener go4login go4login.bat go4.bat
	@rm -f bin/*
	@echo "Clean prefix-dependend files done"

clean-svn:
	find . -name ".svn" -type d -exec rm -rf {} \;
	@echo "Clean svn-specific files done"

ifdef DOPACKAGE
-include build/Makefile.packaging
endif

ifdef DODOCS
-include build/Makefile.docs
endif

Go4_Makefile_Rules =
include Makefile.rules

ifeq ($(findstring $(MAKECMDGOALS), $(FASTRULES)),)
-include build/dummy.d
endif
