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

############            files            ############
########        list of source files        ########
FUNC_BASE_SRC=FuncBase.cc
FUNCTIONS_SRC=Constant.cc Polynomial1.cc ErrorFunction.cc Gaussian.cc Lorentzian.cc AugmentedLorentzian.cc PseudoVoigt1.cc PseudoVoigt2.cc \
              DampedHarmonicOscillator.cc \
              Triangle.cc Trapezoid.cc
FUNC_PARSER_SRC=FuncParser.cc
FUNC_WRAPPER_SRC=FuncComb.cc

########        list of header files        ########
FUNC_BASE_HDS=${FUNC_BASE_SRC:.cc=.hh}
FUNCTIONS_HDS=${FUNCTIONS_SRC:.cc=.hh}
FUNC_PARSER_HDS=${FUNC_PARSER_SRC:.cc=.hh}
FUNC_WRAPPER_HDS=${FUNC_WRAPPER_SRC:.cc=.hh}

########        list of object files        ########
FUNC_BASE_OBJ=${FUNC_BASE_SRC:.cc=.o}
FUNCTIONS_OBJ=${FUNCTIONS_SRC:.cc=.o}
FUNC_PARSER_OBJ=${FUNC_PARSER_SRC:.cc=.o}
FUNC_WRAPPER_OBJ=${FUNC_WRAPPER_SRC:.cc=.o}

LIB_OBJ=${FUNC_WRAPPER_OBJ} ${FUNC_PARSER_OBJ} ${FUNCTIONS_OBJ} ${FUNC_BASE_OBJ}

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

############            compileer options            ############
#LDFLAGS += -L${LOCAL_LIB_DIR}
BUILD_IN_FUNC_LIB=-l${STEM}
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}

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

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

####    primitive functions    ####
Constant.o : Constant.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

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

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

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

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

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

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

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

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

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

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

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

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

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

####    functions parser    ####
FuncParser.o : FuncParser.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

####    linear combination of functions    ####
FuncComb.o : FuncComb.cc
	${CXX} ${CXXFLAGS} -o $@ -c $^

############            cleaning            ############
clean:
	${RM} ${RM_FLAGS} *.o
	${RM} ${RM_FLAGS} ${SHARED_LIB} ${STATIC_LIB}
	${RM} ${RM_FLAGS} ${TEST_EXEC_LIST}

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}/TestFunc ${LOCAL_BIN_DIR}/testFuncParser ${LOCAL_BIN_DIR}/testFuncComb
#               ${LOCAL_BIN_DIR}/testGaussian ${LOCAL_BIN_DIR}/testLorentzian ${LOCAL_BIN_DIR}/testAugmentedLorentzian \
#                ${LOCAL_BIN_DIR}/testPseudoVoigt1 ${LOCAL_BIN_DIR}/testPseudoVoigt2 \
#                ${LOCAL_BIN_DIR}/testDampedHarmonicOscillator \
#                ${LOCAL_BIN_DIR}/testTriangle ${LOCAL_BIN_DIR}/testTrapezoid \

########        create && test        ########
#allTest : GaussianTest LorentzianTest AugmentedLorentzianTest PseudoVoigt1Test PseudoVoigt2Test \
#          DampedHarmonicOscillatorTest \
#          TriangleTest TrapezoidTest \
#          FuncParserTest FuncCombTest

allTest : FuncTest FuncParserTest FuncCombTest

####    test FuncBase    ####
FuncBaseTest : testFuncBase
	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.FuncBase | tee ${LOCAL_DIR}/log.FuncBase

testFuncBase : testFuncBase.o
	${CXX} -o $@ $^ ${LDFLAGS} -l${SHARED_LIB}
	${MV} $@ ${LOCAL_BIN_DIR}

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

####    test primitive functions    ####
#FuncTest : testFunc
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.Func | tee ${LOCAL_DIR}/log.Func
#
#testFunc : testFunc.o ${FUNCTIONS_OBJ} ${FUNC_BASE_OBJ}
#	${CXX} -o $@ $^ ${LDFLAGS} -l${SHRED_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testFunc.o : ${TEST_SRC}/testFunc.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^
#
#_Functions.so : Functions_wrap.o ${FUNCTIONS_OBJ} ${FUNC_BASE_OBJ}
#	${CC} ${WARNING} -shared -o $@ $^ ${LIB_DIR} ${MANYO_LIB}
#
#Functions_wrap.o : Functions_wrap.cxx
#	${CXX} ${CXXFLAGS} -o $@ -c $^
#
#Functions_wrap.cxx Funcsions.py : Functions.i
#	${SWIG} ${SWIG_FLAGS} $^

#------------------------------------------
#GaussianTest : testGaussian
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.Gaussian | tee ${LOG_DIR}/log.Gaussian
#
#testGaussian : testGaussian.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testGaussian.o : ${TEST_SRC}/testGaussian.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#LorentzianTest : testLorentzian
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.Lorentzian | tee ${LOG_DIR}/log.Lorentzian
#
#testLorentzian : testLorentzian.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testLorentzian.o : ${TEST_SRC}/testLorentzian.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#AugmentedLorentzianTest : testAugmentedLorentzian
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.AugmentedLorentzian | tee ${LOG_DIR}/log.AugmentedLorentzian
#
#testAugmentedLorentzian : testAugmentedLorentzian.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testAugmentedLorentzian.o : ${TEST_SRC}/testAugmentedLorentzian.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#PseudoVoigt1Test : testPseudoVoigt1
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.PseudoVoigt1 | tee ${LOG_DIR}/log.PseudoVoigt1
#
#testPseudoVoigt1 : testPseudoVoigt1.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testPseudoVoigt1.o : ${TEST_SRC}/testPseudoVoigt1.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#PseudoVoigt2Test : testPseudoVoigt2
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.PseudoVoigt2 | tee ${LOG_DIR}/log.PseudoVoigt2
#
#testPseudoVoigt2 : testPseudoVoigt2.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testPseudoVoigt2.o : ${TEST_SRC}/testPseudoVoigt2.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#DampedHarmonicOscillatorTest : testDampedHarmonicOscillator
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.PseudoVoigt2 | tee ${LOG_DIR}/log.PseudoVoigt2
#
#testDampedHarmonicOscillator : testDampedHarmonicOscillator.o
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testDampedHarmonicOscillator.o : ${TEST_SRC}/testDampedHarmonicOscillator.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#TriangleTest : testTriangle
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.Triangle | tee ${LOG_DIR}/log.Triangle
#
#testTriangle : testTriangle.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testTriangle.o : ${TEST_SRC}/testTriangle.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
#TrapezoidTest : testTrapezoid
#	${LOCAL_BIN_DIR}/$^ 2>${LOG_DIR}/err.Trapezoid | tee ${LOG_DIR}/log.Trapezoid
#
#testTrapezoid : testTrapezoid.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
#	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
#	${MV} $@ ${LOCAL_BIN_DIR}
#
#testTrapezoid.o : ${TEST_SRC}/testTrapezoid.cc
#	${CXX} ${CXXFLAGS} -o $@ -c $^

#------------------------------------------
FuncTest : ${LOCAL_BIN_DIR}/TestFunc
	$^ -f "c erf g l al pv1 pv2 dho tri trp" -l ${LOG_DIR} -o log

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

TestFunc : TestFunc.o FunctionTestBase.o
	${CXX} -o $@ $^ ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}

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

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

#------------------------------------------
FuncParserTest : ${LOCAL_BIN_DIR}/testFuncParser
	$^ 2>${LOG_DIR}/err.FuncParser | tee ${LOG_DIR}/log.FuncParser

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

testFuncParser : testFuncParser.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}

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

#------------------------------------------
FuncCombTest : ${LOCAL_BIN_DIR}/testFuncComb
	$^ 2>${LOG_DIR}/err.FuncComb | tee ${LOG_DIR}/log.FuncComb

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

testFuncComb : testFuncComb.o ${LOCAL_LIB_DIR}/${SHARED_LIB} ${LOCAL_LIB_DIR}/${STATIC_LIB}
	${CXX} -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}

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

#------------------------------------------

_${STEM}.so : ${STEM}_wrap.o ${LOCAL_LIB_DIR}/${Shared_lib} ${LOCAL_LIB_DIR}/libHelpers.so
	${CXX} ${WARNING} -shared -o $@ $< ${LDFLAGS} ${BUILD_IN_FUNC_LIB} ${HELPERS_LIB} ${MANYO_LIB}
	${MV} $@ ${LOCAL_LIB_DIR}

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

${STEM}_wrap.cxx ${STEM}.py : ${STEM}.i
	${SWIG} ${SWIG_FLAGS} $^
	${MV} ${STEM}.py ${LOCAL_LIB_DIR}

