#---------------------------------------------- Macros and utilities ----------

### MACROS ###

# File suffixes definition
ObjSuf        := o
SrcSuf        := cc
cSrcSuf       := c
ExeSuf        := exe
DllSuf        := so
HeaderSuf     := h
OutPutOpt     := -o

# Path to datadisplay sources
SRC           := $(shell cd ../src;pwd)

# Libraries definition
ROOTLIBS      := -L$(ROOTSYSLIB) -lCore -lCint -lHist -lGraf -lGraf3d -lMatrix \
                -lGpad -lPostscript -lGui -lTree
ROOTGLIBS     := 

FRLIBS        := $(DIRFR)/$(UNAME)/libFrame.a
XFORMSLIB     := $(DIRXFORMS)/$(UNAME)/libforms.a
CMLIBS        := $(DIRCM)/$(UNAME)/libCm.a
CSETLIBS      := $(DIRCSET)/$(UNAME)/libCSet.a $(DIRCSET)/$(UNAME)/libReg.a

ifeq ($(NOCM),NOCM)
GLIBS         := $(ROOTLIBS) $(ROOTGLIBS) $(GENLIBS) $(FRLIBS) $(XFORMSLIB)
else
GLIBS         := $(ROOTLIBS) $(ROOTGLIBS) $(GENLIBS) \
                 $(FRLIBS) $(XFORMSLIB) $(CMLIBS) $(CSETLIBS)
endif


# Compiler flags
CXXALLFL      := $(CXXOPTFL) $(CXXGENFL)

# Includes
ifeq ($(NOCM),NOCM)
CXXINC        := -I$(SRC) -I$(SRC)/xform -I$(SRC)/mysiesta -I$(SRC)/userfct -I$(DIRFR)/src \
                 -I$(ROOTSYSINC) -I$(DIRXFORMS)/src
else
CXXINC        := -I$(SRC) -I$(SRC)/xform -I$(SRC)/mysiesta -I$(SRC)/userfct -I$(DIRFR)/src \
                 -I$(ROOTSYSINC) -I$(DIRXFORMS)/src -I$(DIRCSET)/src -I$(DIRCM)/src
endif

CXXFLAGS      := $(CXXALLFL) $(CXXINC)
MAKELIB          := ./makelib.sh

#----------------------------------------------- Programs -------
### Main program ###

MAINDDS    := $(SRC)/dataDisplay.c
MAINDDO    := $(OBJD)/dataDisplay.$(ObjSuf)
DDMAIN     := $(OBJD)/dataDisplay.$(ExeSuf)
SONAME     := libDy.$(DllSuf)
DDLIB      := $(OBJD)/$(SONAME)

### Includes path for Dy ###

DYINCPATHH := $(SRC)/dyincpath.h

### Wrapper for fl_check_forms ###

CHECKH     := $(SRC)/Wrapper_fl_check_forms.$(SrcSuf) \
             $(SRC)/Wrapper_LinkDef.h
CHECKDICTS := $(OBJD)/Wrapper_checkDict.$(SrcSuf)
CHECKDICTH := $(OBJD)/Wrapper_checkDict.$(HeaderSuf)
CHECKDICTO := $(OBJD)/Wrapper_checkDict.$(ObjSuf)

### Zoom X as last ###

ZOOMS     := $(SRC)/mysiesta/URZoomSeveral.$(SrcSuf)
ZOOMH     := $(SRC)/mysiesta/URZoomSeveral.$(SrcSuf) \
             $(SRC)/mysiesta/URZoomSeveral_LinkDef.h
ZOOMDICTS := $(OBJD)/URZoomSeveralDict.$(SrcSuf)
ZOOMDICTH := $(OBJD)/URZoomSeveralDict.$(HeaderSuf)
ZOOMDICTO := $(OBJD)/URZoomSeveralDict.$(ObjSuf)

### Plot class ###

VDYPLOTS     := $(SRC)/mysiesta/VDyPlot.$(SrcSuf)
VDYPLOTH     := $(SRC)/mysiesta/VDyPlot.$(HeaderSuf)
VDYPLOTDICTS := $(OBJD)/VDyPlotDict.$(SrcSuf)
VDYPLOTDICTH := $(OBJD)/VDyPlotDict.$(HeaderSuf)
VDYPLOTDICTO := $(OBJD)/VDyPlotDict.$(ObjSuf)

VDYPLOTS2     := $(SRC)/mysiesta/VDyPlot2.$(SrcSuf)
VDYPLOT2H     := $(SRC)/mysiesta/VDyPlot2.$(HeaderSuf)
VDYPLOT2DICTS := $(OBJD)/VDyPlot2Dict.$(SrcSuf)
VDYPLOT2DICTH := $(OBJD)/VDyPlot2Dict.$(HeaderSuf)
VDYPLOT2DICTO := $(OBJD)/VDyPlot2Dict.$(ObjSuf)

### VViewer class ###

VVIEWERH     := $(SRC)/mysiesta/VViewerSelector.$(HeaderSuf) \
                $(SRC)/mysiesta/VViewerSelectorCint.$(HeaderSuf) \
                $(SRC)/mysiesta/VViewerSelector_LinkDef.h
VVIEWERDICTS := $(OBJD)/VViewerSelectorDict.$(SrcSuf)
VVIEWERDICTH := $(OBJD)/VViewerSelectorDict.$(HeaderSuf)
VVIEWERDICTO := $(OBJD)/VViewerSelectorDict.$(ObjSuf)

### User fonctions loaded at startup ###

USERFCTH     := $(SRC)/userfct/AddVect.$(HeaderSuf) \
                $(SRC)/userfct/DivVect.$(HeaderSuf) \
                $(SRC)/userfct/HighPassFilter.$(HeaderSuf) \
                $(SRC)/userfct/Integrator.$(HeaderSuf) \
                $(SRC)/userfct/LowPassFilter.$(HeaderSuf) \
                $(SRC)/userfct/MultVect.$(HeaderSuf) \
                $(SRC)/userfct/SubVect.$(HeaderSuf) \
                $(SRC)/userfct/UserFct_LinkDef.h
USERFCTDICTS := $(OBJD)/UserFctDict.$(SrcSuf)
USERFCTDICTH := $(OBJD)/UserFctDict.$(HeaderSuf)
USERFCTDICTO := $(OBJD)/UserFctDict.$(ObjSuf)

### dataDisplay objects ###

DDO       := $(OBJD)/DyFdShm.o \
             $(OBJD)/DyFd.o \
             $(OBJD)/DyUtil.o \
             $(OBJD)/DyXform.o \
             $(OBJD)/DyXformUser.o \
             $(OBJD)/DyVar.o \
             $(OBJD)/DyCm.o \
             $(OBJD)/DyDd.o \
             $(OBJD)/DyFrOutput.o \
             $(OBJD)/DyConfig.o \
             $(OBJD)/DyDump.o \
             $(OBJD)/DyFiles.o \
             $(OBJD)/DyHelp.o \
             $(OBJD)/DyPlot.o \
             $(OBJD)/DyVisu.o \
             $(OBJD)/cmservers.o \
             $(OBJD)/dumpdata.o \
             $(OBJD)/getdd.o \
             $(OBJD)/reffile.o \
             $(OBJD)/inputfile.o \
             $(OBJD)/mainbrowser.o \
             $(OBJD)/plot1d.o \
             $(OBJD)/mainpanel.o \
             $(OBJD)/dyoptions.o \
             $(OBJD)/dydebug.o \
             $(OBJD)/dyoutput.o \
             $(OBJD)/plot2d.o \
             $(OBJD)/plotaudio.o \
             $(OBJD)/plotgenepar.o \
             $(OBJD)/plotfft.o \
             $(OBJD)/plotffttime.o \
             $(OBJD)/plot1dtime.o \
             $(OBJD)/plotrawtime.o \
             $(OBJD)/plottrfct.o \
             $(OBJD)/plottime.o \
             $(OBJD)/plotraw.o \
             $(OBJD)/userfuncbrowser.o \
             $(OBJD)/UArrayL.o \
             $(OBJD)/UFrameL.o \
             $(OBJD)/UJobL.o \
             $(OBJD)/UMathL.o \
             $(OBJD)/URPlot.o \
             $(OBJD)/USignalL.o \
             $(OBJD)/URootAccess.o \
             $(OBJD)/VDyPlot.o \
             $(OBJD)/VDyPlot2.o \
             $(OBJD)/VDyPlotDict.o \
             $(OBJD)/VDyPlot2Dict.o \
             $(OBJD)/URootProcess.o \
             $(OBJD)/VViewerSelector.o \
             $(OBJD)/VViewerSelectorCint.o \
             $(OBJD)/URZoomSeveralDict.o \
             $(OBJD)/Wrapper_checkDict.o \
             $(OBJD)/VViewerSelectorDict.o \
             $(OBJD)/fselector.o \
#             $(OBJD)/AddVect.o \
#             $(OBJD)/DivVect.o \
#             $(OBJD)/HighPassFilter.o \
#             $(OBJD)/Integrator.o \
#             $(OBJD)/LowPassFilter.o \
#             $(OBJD)/MultVect.o \
#             $(OBJD)/SubVect.o \
             $(OBJD)/UserFctDict.o

#--------------------------------------------------------- All ----------------

PROGRAMS   := $(DDMAIN)

#------------------------------------------------------ Rules ----------------
### General object generation

#.SUFFIXES: .$(ObjSuf) .$(cSrcSuf) .$(SrcSuf)
.SUFFIXES: .$(ObjSuf) .$(cSrcSuf)

$(OBJD)/%.$(ObjSuf): $(SRC)/%.$(cSrcSuf)
	$(CC) $(CXXFLAGS) -c $< -o $(OBJD)/$*.o

$(OBJD)/%.$(ObjSuf): $(SRC)/mysiesta/%.$(SrcSuf)
	$(CXX) $(CXXFLAGS) -c $< -o $(OBJD)/$*.o

$(OBJD)/%.$(ObjSuf): $(SRC)/mysiesta/%.$(cSrcSuf)
	$(CC) $(CXXFLAGS) -c $< -o $(OBJD)/$*.o

$(OBJD)/%.$(ObjSuf): $(SRC)/userfct/%.C
	$(CXX) $(CXXFLAGS) -c $< -o $(OBJD)/$*.o

$(OBJD)/%.$(ObjSuf): $(SRC)/xform/%.$(cSrcSuf)
	$(CC) $(CXXFLAGS) -c $< -o $(OBJD)/$*.o

$(OBJD)/%.$(ObjSuf): $(SRC)/%.$(SrcSuf)
	$(CXX) $(CXXFLAGS) -c $< -o $(OBJD)/$*.o

#--------------------------------------------------------- Targets ------------

### ALL ############################################

all:           $(PROGRAMS)

$(OBJD):
	mkdir $(OBJD)

### Main program dataDisplay ################################

$(DDMAIN):  $(OBJD) $(DYINCPATHH) $(DDO) $(MAINDDO)
		$(MAKELIB) $(PLATFORM) "$(LD)" "$(LDFLAGS)" "$(SOFLAGS)" $(SONAME) \
                                    $(DDLIB) "$(DDO) $(MAINDDO) $(XFORMSLIB)"
		$(LD) $(LDFLAGS) -Wl,-rpath,$(SRC)/$(OBJD)  $(MAINDDO)  $(DDLIB)  $(GLIBS) $(OutPutOpt) $(DDMAIN)

$(DYINCPATHH): $(SRC)/dyincpath.in ./Make-requirements ./Make-macros
#  build the configuration header
#		@cp -f $(SRC)/dyincpath.in ve.tmp
		@echo "Generating configuration header $(DYINCPATHH)"
		@sed  -e "s|@dyincpath@|-I$(DIRFR)/src -I$(SRC)/mysiesta|"  \
              < $(SRC)/dyincpath.in > $(DYINCPATHH)
#		@rm -f vegaconfig.tmp

### VViewer class ################################

$(VVIEWERDICTS): $(VVIEWERH)
	@echo "Generating dictionary $(VVIEWERDICTS)..."
#  rootcint doesn't accept generation of files in other directories
#  NOT TRUE anymore, have to change
	$(ROOTSYSBIN)/rootcint -f $(VVIEWERDICTS) -c -I$(DIRFR)/src -I$(ROOTSYS)/$(UNAME)/include -D__cplusplus $(VVIEWERH)

$(VVIEWERDICTO): $(VVIEWERDICTS)
	$(CXX) $(CXXFLAGS) -c $(VVIEWERDICTS) -o $(VVIEWERDICTO)


### Plot class ################################

$(VDYPLOTDICTS): $(VDYPLOTH)
	@echo "Generating dictionary $(VDYPLOTDICTS)..."
#  rootcint doesn't accept generation of files in other directories
#  NOT TRUE anymore, have to change
	$(ROOTSYSBIN)/rootcint -f $(VDYPLOTDICTS) -c -I$(ROOTSYS)/$(UNAME)/include  $(VDYPLOTH)

$(VDYPLOTDICTO): $(VDYPLOTDICTS)
	$(CXX) $(CXXFLAGS) -c $(VDYPLOTDICTS) -o $(VDYPLOTDICTO)

$(VDYPLOT2DICTS): $(VDYPLOT2H)
	@echo "Generating dictionary $(VDYPLOT2DICTS)..."
#  rootcint doesn't accept generation of files in other directories
#  NOT TRUE anymore, have to change
	$(ROOTSYSBIN)/rootcint -f $(VDYPLOT2DICTS) -c -I$(ROOTSYS)/$(UNAME)/include  $(VDYPLOT2H)

$(VDYPLOT2DICTO): $(VDYPLOT2DICTS)
	$(CXX) $(CXXFLAGS) -c $(VDYPLOT2DICTS) -o $(VDYPLOT2DICTO)

### Wrapper to fl_check_forms for ROOT ################################

$(CHECKDICTS): $(CHECKH)
	@echo "Generating dictionary $(CHECKDICTS)..."
#  rootcint doesn't accept generation of files in other directories
#  NOT TRUE anymore, have to change
	$(ROOTSYSBIN)/rootcint -f $(CHECKDICTS) -c -I$(ROOTSYS)/$(UNAME)/include $(CHECKH)

$(CHECKDICTO): $(CHECKDICTS)
	$(CXX) $(CXXFLAGS) -c $(CHECKDICTS) -o $(CHECKDICTO)

### Zoom X as last ################################

$(ZOOMDICTS): $(ZOOMH)
	@echo "Generating dictionary $(ZOOMDICTS)..."
#  rootcint doesn't accept generation of files in other directories
#  NOT TRUE anymore, have to change
	$(ROOTSYSBIN)/rootcint -f $(ZOOMDICTS) -c -I$(ROOTSYS)/$(UNAME)/include -D__CINT__ $(ZOOMH)

$(ZOOMDICTO): $(ZOOMDICTS)
	$(CXX) $(CXXFLAGS) -c $(ZOOMDICTS) -o $(ZOOMDICTO)

### User Functions classes ################################

$(USERFCTDICTS): $(USERFCTH)
	@echo "Generating dictionary $(USERFCTDICTS)..."
#  rootcint doesn't accept generation of files in other directories
#  NOT TRUE anymore, have to change
	$(ROOTSYSBIN)/rootcint -f $(USERFCTDICTS) -c -I$(DIRFR)/src \
        -I$(SRC)/mysiesta -I$(ROOTSYS)/$(UNAME)/include -D__cplusplus $(USERFCTH)

$(USERFCTDICTO): $(USERFCTDICTS)
	$(CXX) $(CXXFLAGS) -c $(USERFCTDICTS) -o $(USERFCTDICTO)

### Standard targets ###########################################

clean:
		@rm -f $(MAINDDO)
		@rm -f $(DDO) $(CHECKDICTS) $(CHECKDICTO) $(CHECKDICTH)
		@rm -f $(ZOOMDICTS) $(ZOOMDICTO) $(ZOOMDICTH)
		@rm -f $(VDYPLOTDICTS) $(VDYPLOTDICTO) $(VDYPLOTDICTH)
		@rm -f $(VDYPLOT2DICTS) $(VDYPLOT2DICTO) $(VDYPLOT2DICTH)
		@rm -rf core so_locations cxx_repository Make-depend.bak

distclean:
		@rm -f $(MAINVGO) $(DDMAIN) $(MAINDDO)
		@rm -f $(DDO) $(CHECKDICTS) $(CHECKDICTO) $(CHECKDICTH)
		@rm -f $(ZOOMDICTS) $(ZOOMDICTO) $(ZOOMDICTH)
		@rm -f $(VDYPLOTDICTS) $(VDYPLOTDICTO) $(VDYPLOTDICTH)
		@rm -f $(VDYPLOT2DICTS) $(VDYPLOT2DICTO) $(VDYPLOT2DICTH)
		@rm -rf core so_locations cxx_repository Make-depend.bak
