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

.PHONY: all install clean distclean java c++ install_headers install_java compile_java install_c++

# Build real one if possible
SCTAPISERVERBINS := $(if $(DAQ_SW_DIR)$(DF_INST_PATH),SctApiServer) DSctApiServer
SCRIPTS := $(addprefix $(ScriptDir)/../,$(wildcard scripts/*.sh))

all: c++ java install

c++: $(SCTAPISERVERBINS) SctApiClient nmask install_c++
	$(MAKE) -C UnitTest $(MAKECMDGOALS)

javaTests: test_client.class

java: classes SctApi.javaidl
	$(MAKE) compile_java

compile_java: javaTests install_java
install: install_c++ install_java $(SCRIPTS)

# 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

JINCLUDES := -i $(TDAQ_INST_PATH)/include

CPPFLAGS += `xml2-config --cflags`

LDLIBS += -lboost_thread -lboost_date_time -lpthread
LDLIBS += `xml2-config --libs`

#	@echo "To run the java class, make sure . is in the classpath then type: java -Dipc.ref.file=$IPC_REF_FILE Sct_SctApi.test_client"

SRCS := $(shell find -name "*.cc")

# Order important, need to fix dependencies...
JARS := Sct_SctApi.jar
JIDLSRCS := $(shell find Sct_SctApi -name "*.java")
JAVAFLAGS += -d classes

# OBJS to build into IPC client library
CLIENTOBJS := Sct_SctApi.o

SctApiServer: SctApiServer.o SctApiServerMain.o Sct_SctApi-server-stubs.o Sct_SctApi.o
	g++ $(LDFLAGS) -o SctApiServer SctApiServer.o SctApiServerMain.o Sct_SctApi-server-stubs.o Sct_SctApi.o -lSctApi -lsctConfIPC $(LDLIBS)

DSctApiServer: SctApiServer.o SctApiServerMain.o Sct_SctApi-server-stubs.o Sct_SctApi.o
	g++ $(LDFLAGS) -o DSctApiServer SctApiServer.o SctApiServerMain.o Sct_SctApi-server-stubs.o Sct_SctApi.o -lDSctApi -lsctConfIPC $(LDLIBS)

SctApiServer.o: Sct_SctApi.hh

SctApiClient: LDLIBS += -lsctConfIPC
SctApiClient: SctApiClient.o Sct_SctApi.o
	g++ $(LDFLAGS) -o SctApiClient SctApiClient.o Sct_SctApi.o $(LDLIBS)

SctApiClient.o: Sct_SctApi.hh

nmask: LDLIBS += -lsctConfIPC
nmask: nmask.o Sct_SctApi.o
	g++ $(LDFLAGS) -o nmask nmask.o Sct_SctApi.o $(LDLIBS)

nmask.o: Sct_SctApi.hh

Sct_SctApi-server-stubs.cc Sct_SctApi.cc Sct_SctApi.hh: SctApi.idl
	c++-stubber ./SctApi.idl
	@echo "Checking all methods overridden by SctApiServer.h"
	@bash checkSct_SctApi || (rm Sct_SctApi.hh && false)

SctApiIPC.so: $(CLIENTOBJS)
	$(CC) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) $(LDLIBS)

DSctApiServer.so: $(CLIENTOBJS) SctApiServer.o Sct_SctApi-server-stubs.o
	$(CC) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) $(LDLIBS) -lDSctApi -lsctConfIPC


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

SctApi.javaidl: SctApi.idl
	$(JAVAIDLCMD)  && touch $@

classes/Sct_SctApi/SctApi.class: $(JIDLSRCS)
	$(JAVACMD)

Sct_SctApi.jar: classes/Sct_SctApi/SctApi.class
	$(JARCMD) -C classes Sct_SctApi

$(ShareLibDir)/%.jar: %.jar
	$(CPCMD)

classes:
	$(MKDIR)

test_client.class: test_client.java
	javac -sourcepath . $^

install_c++: $(addprefix $(BinDir)/,$(SCTAPISERVERBINS)) $(LibDir)/libDSctApiServer.so $(LibDir)/libSctApiIPC.so install_headers install_idl

install_java: $(addprefix $(ShareLibDir)/,$(JARS)) $(ShareBinDir)/SctApiGUI install_idl

install_headers: $(IncludeDir)/Sct_SctApi/Sct_SctApi.hh $(IncludeDir)/Sct_SctApi/SctApiServer.h

install_idl: $(IncludeDir)/SctApi/SctApi.idl

$(IncludeDir)/Sct_SctApi/%: % $(IncludeDir)/Sct_SctApi
	$(CPCMD)

$(IncludeDir)/Sct_SctApi:
	$(MKDIR)

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

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

$(IncludeDir)/SctApi:
	$(MKDIR)

$(BinDir)/%: %
	$(CPCMD)

$(ShareBinDir)/%: %
	$(CPCMD)

$(ScriptDir)/%: scripts/%
	$(CPCMD)

clean:
	-$(RM) *.o *.d *.so core *~ *.jar $(SCTAPISERVERBINS) SctApiClient nmask Sct_SctApi-server-stubs.cc Sct_SctApi.cc Sct_SctApi.hh *.javaidl *.cppidl $(shell find -name "*.class" | sed 's/\$$/\\\$$/g')
	$(MAKE) -C UnitTest $(MAKECMDGOALS)

distclean: clean
	-$(RM) -f *.d -r Sct_SctApi *.javaidl sctConf*.cc sctConf.hh
	$(MAKE) -C UnitTest $(MAKECMDGOALS)

ifeq ($(INCLUDEDEPENDANCIES),)
include $(SRCS:.cc=.d)
endif

%.d: %.cc
	$(DEPENDCMD)

