############            Makefile.in            ############
include ../../Makefile.in

############            files            ############
########        list of source files        ########
OPERATION_BASE_SRC=OperationBase.cc MultiDataOperationBase.cc OperationType.cc
DRIVERS_SRC=PeakFit.cc PeakSearch.cc Smoothing.cc
MULTI_DATA_DRIVERS_SRC=MultiDataPeakFit.cc

########        list of header files        ########
PERATION_BASE_HDS=${OPERATION_BASE_SRC:.cc=.hh}
DRIVERS_HDS=${DRIVERS_SRC:.cc=.hh}
MULTI_DATA_DRIVERS_HDS=${MULTI_DATA_DRIVERS_SRC:.cc=.hh}

########        list of object files        ########
OPERATION_BASE_OBJ=${OPERATION_BASE_SRC:.cc=.o}
DRIVERS_OBJ=${DRIVERS_SRC:.cc=.o}
MULTI_DATA_DRIVERS_OBJ=${MULTI_DATA_DRIVERS_SRC:.cc=.o}

LIB_OBJ= ${MULTI_DATA_DRIVERS_OBJ} ${DRIVERS_OBJ} ${OPERATION_BASE_OBJ}

########        library        ########
####    stem && library file    ####
STEM=Driver
SHARED_LIB=lib${STEM}.so
STATIC_LIB=lib${STEM}.a

############            compileer options            ############
LDFLAGS += -L${LOCAL_LIB_DIR}
DRIVER_LIB=-l${STEM}
METHOD_LIB=-lMethod
DATA_CONTAINER_LIB=-lDataContainer
BUILD_IN_FUNC_LIB=-lBuildInFunc
HELPERS_LIB=-lHelpers

############            targets            ############
lib : ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}

########        c++ library        ########
${LOCAL_LIB_DIR}/${SHARED_LIB} : ${SHARED_LIB}
	${MV} $^ ${LOCAL_LIB_DIR}

${LOCAL_LIB_DIR}/${STATIC_LIB} : ${STATIC_LIB}
	${MV} $^ ${LOCAL_LIB_DIR}

${SHARED_LIB} : ${LIB_OBJ}
	${CXX} -shared -o $@ $^ ${LIB_DIR} ${LEVMAR_LIB}

${STATIC_LIB} : ${LIB_OBJ}
	${AR} ${AR_FLAGS} $@ $^
	${RANLIB} ${RANLIB_FLAGS} $@

########        object files       ########
#----    operation base    ----
OperationType.o : OperationType.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

OperationBase.o : OperationBase.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

MultiDataOperationBase : MultiDataOperationBase.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

#----    single data operations    ----
Smoothing.o : Smoothing.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

PeakSearch.o : PeakSearch.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

PeakFit.o : PeakFit.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

#----    single data operations    ----
MultiDataPeakFit.o : MultiDataPeakFit.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

############            cleaning            ############
clean:
	${RM} ${RM_FLAGS} *.o
	${RM} ${RM_FLAGS} ${SHARED_LIB} ${STATIC_LIB}
	${RM} ${RM_FLAGS} ${TEST_EXEC_LIST}
	${RM} ${RM_FLAGS} ${TEST_SHARED_LIB}
	${RM} ${RM_FLAGS} ${TEST_PYTHON_MOD}
	${RM} ${RM_FLAGS} ${TEST_PYTHON_CMOD}
	${RM} ${RM_FLAGS} *_wrap.cxx

allclean: clean
	${RM} ${RM_FLAGS} ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
	${RM} ${RM_FLAGS} ${LOCAL_LIB_DIR}/${STEM}.py
	${RM} ${RM_FLAGS} ./${STEM}_wrap.cxx

############            test routines            ############
########        list of test executables        ########
TEST_EXEC_LIST=${LOCAL_BIN_DIR}/testSmoothing ${LOCAL_BIN_DIR}/testPeakSearch ${LOCAL_BIN_DIR}/testPeakFit

TEST_SHARED_LIB=${LOCAL_LIB_DIR}/_Smoothing.so ${LOCAL_LIB_DIR}/_PeakSearch.so ${LOCAL_LIB_DIR}/_PeakFit.so
TEST_PYTHON_MOD=${LOCAL_LIB_DIR}/Smoothing.py  ${LOCAL_LIB_DIR}/PeakSearch.py  ${LOCAL_LIB_DIR}/PeakFit.py
TEST_PYTHON_CMOD=${TEST_PYTHON_MOD:.py=.pyc}

########        create && test        ########
allTest: SmoothingTest PeakTest PeakSearchTest PeakFitTest

allPyTest: SmoothingPyTest PeakPyTest PeakSearchPyTest PeakFitPyTest

####    test Smoothing    ####
SmoothingTest : ${LOCAL_BIN_DIR}/testSmoothing
	$^ 2>${LOG_DIR}/err.Smoothing | tee ${LOG_DIR}/log.Smoothing

${LOCAL_BIN_DIR}/testSmoothing : testSmoothing
	${MV} $^ $@

testSmoothing : testSmoothing.o
	${CXX} -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${LEVMAR_LIB} ${MANYO_LIB}

testSmoothing.o : ${TEST_SRC}/testSmoothing.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

#--------------------------
SmoothingPyTest : ${LOCAL_LIB_DIR}/_Smoothing.so ${LOCAL_LIB_DIR}/Smoothing.py
	python test_src/testSmoothing.py 2>${LOG_DIR}/err.Smoothing | tee ${LOG_DIR}/log.Smoothing

${LOCAL_LIB_DIR}/_Smoothing.so : _Smoothing.so
	${MV} $^ ${LOCAL_LIB_DIR}

${LOCAL_LIB_DIR}/Smoothing.py : Smoothing.py
	${MV} $^ ${LOCAL_LIB_DIR}

_Smoothing.so : Smoothing_wrap.o
	${CXX} ${WARNING} -shared -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}

Smoothing_wrap.o : Smoothing_wrap.cxx
	${CXX} ${CXXFLAGS} -o $@ -c $^

Smoothing_wrap.cxx Smoothing.py : Smoothing.i
	${SWIG} ${SWIG_FLAGS} $^

####    test PeakSearch    ####
PeakSearchTest : ${LOCAL_BIN_DIR}/testPeakSearch
	$^ 2>${LOG_DIR}/err.PeakSearch | tee ${LOG_DIR}/log.PeakSearch

${LOCAL_BIN_DIR}/testPeakSearch : testPeakSearch
	${MV} $^ $@

testPeakSearch : testPeakSearch.o
	${CXX} -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${LEVMAR_LIB} ${MANYO_LIB}

testPeakSearch.o : ${TEST_SRC}/testPeakSearch.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

#----------------------------
PeakSearchPyTest : ${LOCAL_LIB_DIR}/_PeakSearch.so ${LOCAL_LIB_DIR}/PeakSearch.py
	python test_src/testPeakSearch.py 2>${LOG_DIR}/err.PeakSearch | tee ${LOG_DIR}/log.PeakSearch

${LOCAL_LIB_DIR}/_PeakSearch.so : _PeakSearch.so
	${MV} $^ ${LOCAL_LIB_DIR}

${LOCAL_LIB_DIR}/PeakSearch.py : PeakSearch.py
	${MV} $^ ${LOCAL_LIB_DIR}

_PeakSearch.so : PeakSearch_wrap.o
	${CXX} ${WARNING} -shared -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${LIB_DIR} ${MANYO_LIB}

PeakSearch_wrap.o : PeakSearch_wrap.cxx
	${CXX} ${CXXFLAGS} -o $@ -c $^

PeakSearch_wrap.cxx PeakSearch.py : PeakSearch.i
	${SWIG} ${SWIG_FLAGS} $^

####    test PeakFit    ####
PeakFitTest : ${LOCAL_BIN_DIR}/testPeakFit
	$^ 2>${LOG_DIR}/err.PeakFit | tee ${LOG_DIR}/log.PeakFit

${LOCAL_BIN_DIR}/testPeakFit : testPeakFit
	${MV} $^ $@

testPeakFit : testPeakFit.o
	${CXX} -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${LEVMAR_LIB} ${MANYO_LIB}

testPeakFit.o : ${TEST_SRC}/testPeakFit.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

#----------------------------
PeakFitPyTest : ${LOCAL_LIB_DIR}/_PeakFit.so ${LOCAL_LIB_DIR}/PeakFit.py
	python ${TEST_SRC}/testPeakFit.py 2>${LOG_DIR}/err.PeakFit | tee ${LOG_DIR}/log.PeakFit

${LOCAL_LIB_DIR}/_PeakFit.so : _PeakFit.so
	${MV} $^ ${LOCAL_LIB_DIR}

${LOCAL_LIB_DIR}/PeakFit.py : PeakFit.py
	${MV} $^ ${LOCAL_LIB_DIR}

_PeakFit.so : PeakFit_wrap.o
	${CXX} ${WARNING} -shared -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}

PeakFit_wrap.o : PeakFit_wrap.cxx
	${CXX} ${CXXFLAGS} -o $@ -c $^

PeakFit_wrap.cxx PeakFit.py : PeakFit.i
	${SWIG} ${SWIG_FLAGS} $^


#### test MultiDataPeakFit    ####
MultiDataPeakFitTest: ${LOCAL_BIN_DIR}/testMultiDataPeakFit
	cp ${SAMPLE_DATA_DIR}/elementContainerArray/sourceArray.data .
	$^ 2>${LOG_DIR}/err.MultiDataPeakFit | tee ${LOG_DIR}/log.MultiDataPeakFit

${LOCAL_BIN_DIR}/testMultiDataPeakFit: testMultiDataPeakFit
	${MV} $^ $@

testMultiDataPeakFit: testMultiDataPeakFit.o
	${CXX} -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${LEVMAR_LIB} ${MANYO_LIB}

testMultiDataPeakFit.o: ${TEST_SRC}/testMultiDataPeakFit.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

#----------------------------
MultiDataPeakFitPyTest: ${LOCAL_LIB_DIR}/_MultiDataPeakFit.so ${LOCAL_LIB_DIR}/MultiDataPeakFit.py
	python ${TEST_SRC}/testMultiDataPeakFit.py -i ${SAMPLE_DATA_DIR}/elementContainerArray/sourceArray.data 2>${LOG_DIR}/err.MultiDataPeakFit | tee ${LOG_DIR}/log.MultiDataPeakFit

${LOCAL_LIB_DIR}/_MultiDataPeakFit.so: _MultiDataPeakFit.so
	${MV} $^ ${LOCAL_LIB_DIR}

${LOCAL_LIB_DIR}/MultiDataPeakFit.py: MultiDataPeakFit.py
	${MV} $^ ${LOCAL_LIB_DIR}

_MultiDataPeakFit.so : MultiDataPeakFit_wrap.o
	${CXX} ${WARNING} -shared -o $@ $^ ${LDFLAGS} ${DRIVER_LIB} ${METHOD_LIB} ${DATA_CONTAINER_LIB} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}

MultiDataPeakFit_wrap.o : MultiDataPeakFit_wrap.cxx
	${CXX} ${CXXFLAGS} -o $@ -c $^

MultiDataPeakFit_wrap.cxx MultiDataPeakFit.py : MultiDataPeakFit.i
	${SWIG} ${SWIG_FLAGS} $^

