#Variables
include $(SCT_DAQ_ROOT)/build/Makefile.include
#Commands
include $(SCT_DAQ_ROOT)/build/Makefile.commands

#
# SctApi library Makefile
#   Required environment:
#     SCTPIXEL_DAQ_ROOT   Root of RodDaq tree
#     DAQ_SW_DIR          RCC software tree
#     ROOTSYS             Root of ROOT tree
#     SCT_DAQ_ROOT        Root of our DAQ tree
#
# Builds:
#  libTApi.so  - An interface via the TApi ROOT class
#  libDTApi.so - As above built with the DummyVmeInterface
#

# Only define one
DAQ_SW_DIR:=$(if $(DF_INST_PATH),,$(if $(DAQ_SW_DIR),$(DAQ_SW_DIR),))

DAQ_LIB_DIR:=$(DF_INST_PATH)/$(CMTCONFIG)/lib
DAQ_INCLUDE_DIR:=$(DF_INST_PATH)/include

INCLUDES += $(if $(DF_INST_PATH),-I$(DAQ_INCLUDE_DIR),-I$(DAQ_SW_DIR)/include -I$(DAQ_SW_DIR)/../rcc_error/include -I$(DAQ_SW_DIR)/../cmem_rcc/include) \
	   -I$(SCTPIXEL_DAQ_ROOT)/../VmeInterface

INCLUDES += $(if $(shell xml2-config --cflags | grep "\-I/usr/include"),`xml2-config --cflags`,)

# .o files for SctApi.so # crate.o and VmeDecode change for dummy
SCTAPIOBJS := SctApiImpl.o SctApi.o SctApiBlock.o SctApiEvent.o SctApiLow.o SctApiMulti.o SctApiMConf.o \
	SctApiDDC.o SctApiDebug.o SctApiModify.o SctApiHisto.o SctApiRaw.o \
	autoConfig.o crateThread.o log.o primListWrapper.o utility.o \
	PrimBuilder.o primUtils.o DCSAccess.o
# .o files to link into the root library
TAPIOBJS := TApi.o tapi_cint.o

LDFLAGS := -L$(SCTPIXEL_DAQ_ROOT)/../VmeInterface \
         -L$(SCTPIXEL_DAQ_ROOT)/RodCrate \
         -L$(SCT_DAQ_ROOT)/lib
LDFLAGS += $(if $(DAQ_SW_DIR),-L$(DAQ_SW_DIR)/lib) $(if $(DF_INST_PATH),-L$(DAQ_LIB_DIR))
LDLIBS += -lsctconf -lsctDDC -lScanResultWriter -lboost_thread -lboost_date_time `xml2-config --libs`

# If using SBC then compile with the real VME library (should be automatic)
VMELIBS := -lcmem_rcc -lrcc_error -lvme_rcc $(if $(DF_INST_PATH),-lio_rcc,)

# Print out function names as they get compiled!!!
# CPPFLAGS += -Q

CPPFLAGS += -D_REENTRANT
CPPFLAGS += $(if $(wildcard $(SCT_DAQ_ROOT)/decodeTestStand/primNames.h),-DHAVE_PRIM_NAMES)

SRCS := $(wildcard *.cxx) 

# If not on an SBC compile DTApi.so instead (Tests compilation and linking, not featured enough to run)
# DSctApi needed for SCTTestAPI
LIB_TARGET := $(if $(DAQ_SW_DIR)$(DF_INST_PATH),SctApi.so TApi.so,) DSctApi.so DTApi.so
LIB_INSTALL := $(if $(DAQ_SW_DIR)$(DF_INST_PATH),$(LibDir)/libSctApi.so $(LibDir)/libTApi.so,) $(LibDir)/libDSctApi.so $(LibDir)/libDTApi.so

.PHONY: all tests install clean distclean c++ java

# Don't compile tests with dummy library
all: c++

c++: $(LIB_TARGET) install $(if $(DAQ_SW_DIR)$(DF_INST_PATH),tests)
	$(MAKE) -C UnitTest $(MAKECMDGOALS)
java:

install: libs install_headers
	$(MAKE) -C UnitTest $@

tests: $(LIB_INSTALL)
	$(MAKE) -C tests $(MAKECMDGOALS)

$(TAPIOBJS): INCLUDES += $(ROOTINCLUDES)
$(TAPIOBJS:.o=.d): INCLUDES += $(ROOTINCLUDES)

DTApi.so: $(TAPIOBJS) $(LibDir)/libDSctApi.so
	$(CC) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) $(LDLIBS) $(ROOTLIBS) -lDSctApi

TApi.so: $(TAPIOBJS) $(LibDir)/libSctApi.so
	$(CC) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) $(LDLIBS) $(ROOTLIBS) -lSctApi

RODDAQLIBS = $(addprefix $(SCTPIXEL_DAQ_ROOT)/RodCrate/, libRodModule.so libBocCard.so libTimModule.so)

DSctApi.so: $(SCTAPIOBJS) dcrate.o dVmeDecode.o $(RODDAQLIBS)
	$(CC) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) -lDummyVmeInterface $(LDLIBS) -lRodModule -lBocCard -lTimModule -lVmeModule -lBaseException

SctApi.so: $(SCTAPIOBJS) crate.o VmeDecode.o $(RODDAQLIBS)
	$(CC) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) -lRCCVmeInterface -lDummyVmeInterface $(LDLIBS) -lRodModule -lBocCard -lTimModule -lVmeModule -lBaseException $(VMELIBS)

tapi_cint.cpp tapi_cint.h: TApi.h linkdef.h
	rootcint -f tapi_cint.cpp -c $(INCLUDES) $(CPPFLAGS) $^

# Output not the same name as input so needs special case
dcrate.o: CPPFLAGS += -DUSE_DUMMY_VME
dcrate.o: crate.cxx crate.h
	$(CPPCMD)

dVmeDecode.o: CPPFLAGS += -DUSE_DUMMY_VME
dVmeDecode.o: VmeDecode.cxx 
	$(CPPCMD)

mytest: mytest.o SctApi.o crate.o
	g++ mytest.o -o mytest SctApi.o crate.o log.o $(LDFLAGS) -lRCCVmeInterface $(LDLIBS)

tapi_cint.o: tapi_cint.cpp tapi_cint.h
	g++ $(CPPFLAGS) $(INCLUDES) -o tapi_cint.o -c tapi_cint.cpp

libs: $(LIB_INSTALL)


install_headers: $(IncludeDir)/SctApi $(addprefix $(IncludeDir)/SctApi/,autoConfig.h log.h extraScans.h SctApi.h SctApiHisto.h config.h SctApiFwd.h SctApiImpl.h DCSAccess.h utility.h)

$(IncludeDir)/SctApi/%.h: %.h
	$(CPCMD)

$(IncludeDir)/SctApi:
	$(MKDIR)

.PHONY : clean distclean java
java:
clean:
	$(RM) *.o *~ core tapi_cint.cpp tapi_cint.h DTApi.so TApi.so SctApi.so DSctApi.so
	$(MAKE) -C tests $(MAKECMDGOALS)
	$(MAKE) -C UnitTest $@

distclean: clean
	-$(RM) -f *.d
	$(MAKE) -C UnitTest $@

$(LibDir)/lib%.so: %.so
	cp $< $@

# From Makefile.commands
%.o: %.cxx
	$(CPPCMD)

# Do preprocessing only
%.P: %.cxx
	g++ $(CPPFLAGS) $(INCLUDES) -o $@ -E $<

# Generate dependency files automatically
ifeq ($(INCLUDEDEPENDANCIES),)
include $(SRCS:.cxx=.d) tapi_cint.d
endif

%.d: %.c
	$(DEPENDCMD)

%.d: %.cpp
	$(DEPENDCMD)

%.d: %.cxx
	$(DEPENDCMD)
