# Manyo Library LevmarTools module

# Find and include swig
CMAKE_POLICY(SET CMP0086 NEW)
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
#include(FindSWIG)
#include(UseSWIG)

# Find OpenMP, GSL
find_package(GSL REQUIRED)
find_package(OpenMP)

if (POLICY CMP0167)
  cmake_policy (SET CMP0167 NEW)
endif ()
find_package(Boost 1.49.0 REQUIRED
             COMPONENTS serialization)

# Set compile options for Utsusemi
if (MACOS AND OpenMP_FOUND)
  set(UTSUSEMI_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3 -Xpreprocessor -Werror=return-type -Xclang -fopenmp)
elseif(MACOS)
  set(UTSUSEMI_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3 -Xpreprocessor -Werror=return-type)
elseif(UNIX)
  set(UTSUSEMI_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -O3 -shared -pthread)
endif()

# Add LibMany
add_library(LevmarTools SHARED)
target_sources(LevmarTools PRIVATE
               AdvAdditionalData.cc
               AdvAugmentedLorentzian.cc
               AdvAugmentedLorentzianConv.cc
               AdvBSpline.cc
               AdvConstant.cc
               AdvConstantConv.cc
               AdvConvDeconv.cc
               AdvConvDeconvPre.cc
               AdvConvergenceStat.cc
               AdvConvolutionBase.cc
               AdvConvolutionByFFT.cc
               AdvConvolutionConsts.cc
               AdvDampedHarmonicOscillator.cc
               AdvDampedHarmonicOscillatorConv.cc
               AdvDeconvolutionByFFT.cc
               AdvDeltaConv.cc
               AdvDomain.cc
               AdvEqualSpacing.cc
               AdvErrorFunction.cc
               AdvExponential.cc
               AdvExtVectorTool.cc
               AdvFitCommand.cc
               AdvFuncBase.cc
               AdvFuncComb.cc
               AdvFuncCombToElementContainer.cc
               AdvFuncConv.cc
               AdvFuncParser.cc
               AdvGaussian.cc
               AdvGaussianConv.cc
               AdvGslFFTComplex.cc
               AdvInsMEM.cc
               AdvLevmarArgs.cc
               AdvLevmarConsts.cc
               AdvLevmarControl.cc
               AdvLevmarFit.cc
               AdvLevmarFunc.cc
               AdvLevmarImmutables.cc
               AdvLorentzian.cc
               AdvLorentzianConv.cc
               AdvMatrixUtil.cc
               AdvMessage.cc
               AdvMethod.cc
               AdvMethodFactory.cc
               AdvMethodType.cc
               AdvModel.cc
               AdvModelDistribution.cc
               AdvModelLayer.cc
               AdvModelParam.cc
               AdvModelParamSet.cc
               AdvModelParticle.cc
               AdvModelParticleType.cc
               AdvModelSmallAngle.cc
               AdvModelSpecular.cc
               AdvModelSpecularMul.cc
               AdvMovingAverage.cc
               AdvMultiDataLevmar.cc
               AdvMultiDataLevmarConsts.cc
               AdvMultiDataMethod.cc
               AdvMultiDataMethodFactory.cc
               AdvMultiDataOperationBase.cc
               AdvMultiDataPeakFit.cc
               AdvNewLevmar.cc
               AdvOperationBase.cc
               AdvOperationType.cc
               AdvParamSet.cc
               AdvPeak.cc
               AdvPeakData.cc
               AdvPeakFit.cc
               AdvPeakSearch.cc
               AdvPeakType.cc
               AdvPolynomial1.cc
               AdvPolynomial1Conv.cc
               AdvPolynomial2.cc
               AdvPolynomial2Conv.cc
               AdvPolynomial3.cc
               AdvPolynomial3Conv.cc
               AdvPseudoVoigt1.cc
               AdvPseudoVoigt1Conv.cc
               AdvPseudoVoigt2.cc
               AdvPseudoVoigt2Conv.cc
               AdvReportConvergenceProcess.cc
               AdvSimulatedAnnealingArgs.cc
               AdvSimulatedAnnealing.cc
               AdvSimulatedAnnealingConsts.cc
               AdvSmoothing.cc
               AdvTrapezoid.cc
               AdvTriangle.cc
               AdvVectorArrayConv.cc
               AdvVectorComplexTool.cc
               AdvVectorGSLVectorConv.cc
               ThreadBase.cc
    )

target_compile_options(LevmarTools PUBLIC ${UTSUSEMI_CXX_FLAGS})
# target_compile_features(LevmarTools PUBLIC cxx_std_11)
if (${LIBMXML} MATCHES "mxml4")
    target_compile_definitions(LevmarTools PUBLIC LIBMXML4)
endif()
target_include_directories(LevmarTools PUBLIC ${MANYO_MXML_INC_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/../lib-levmar/2.5 ${MANYO_NEXUS_PATH}/include ${Python_INCLUDE_DIRS} ${CMAKE_INSTALL_PREFIX}/include/manyo ${CMAKE_INSTALL_PREFIX}/include/manyo/MLF ${CMAKE_INSTALL_PREFIX}/include/manyo/Utsusemi)

target_link_directories(LevmarTools PUBLIC ${MANYO_MXML_LIB_PATH} ${MANYO_NEXUS_PATH}/lib ${CMAKE_INSTALL_PREFIX}/${MANYO_LIB_PATH} ${CMAKE_BINARY_DIR}/lib-levmar/2.5)
if (MACOS AND OpenMP_FOUND)
  target_link_libraries(LevmarTools Manyo MLF NeXus levmar ${LIBMXML} GSL::gsl Python::Python util dl pthread omp)
  target_link_options(LevmarTools PRIVATE ${CMAKE_CXX_FLAGS} ${UTSUSEMI_CXX_FLAGS})
elseif (MACOS)
  target_link_libraries(LevmarTools Manyo MLF NeXus levmar mxml GSL::gsl Python::Python util dl pthread)
  target_link_options(LevmarTools PRIVATE ${CMAKE_CXX_FLAGS} ${UTSUSEMI_CXX_FLAGS})
else()
  target_link_libraries(LevmarTools Manyo MLF NeXus levmar mxml GSL::gsl Python::Python util dl)
endif()


# message("MULTH = " ${MANYO_MULTH})
# message("Library = " ${CMAKE_INSTALL_PREFIX}/lib)

# Set up swig
set_property(SOURCE LevmarTools.i PROPERTY CPLUSPLUS ON)
set_property(SOURCE LevmarTools.i PROPERTY INCLUDE_DIRECTORIES ${CMAKE_INSTALL_PREFIX}/include/manyo ${CMAKE_INSTALL_PREFIX}/include/manyo/MLF ${CMAKE_INSTALL_PREFIX}/include/manyo/Utsusemi)

swig_add_library(ManyoLevmarTools
  TYPE MODULE
  LANGUAGE python
  OUTPUT_DIR ${PROJECT_BINARY_DIR}/
  SOURCES LevmarTools.i)
swig_link_libraries(ManyoLevmarTools LevmarTools)

# Install library
install(TARGETS LevmarTools
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION ${MANYO_LIB_PATH})
install(FILES
            AdvAdditionalData.hh
            AdvAugmentedLorentzianConv.hh
            AdvAugmentedLorentzian.hh
            AdvBSpline.hh
            AdvConstantConv.hh
            AdvConstant.hh
            AdvContainerBaseTemplate.hh
            AdvContainerDumpTool.hh
            AdvContainerForMatrix.hh
            AdvContainerForVector.hh
            AdvConvDeconv.hh
            AdvConvDeconvPre.hh
            AdvConvergenceStat.hh
            AdvConvolutionBase.hh
            AdvConvolutionByFFT.hh
            AdvConvolutionConsts.hh
            AdvDampedHarmonicOscillatorConv.hh
            AdvDampedHarmonicOscillator.hh
            AdvDeconvolutionByFFT.hh
            AdvDeltaConv.hh
            AdvDomain.hh
            AdvEqualSpacing.hh
            AdvErrorFunction.hh
            AdvExponential.hh
            AdvExtVectorTool.hh
            AdvFitCommand.hh
            AdvFuncBase.hh
            AdvFuncComb.hh
            AdvFuncCombToElementContainer.hh
            AdvFuncConv.hh
            AdvFuncParser.hh
            AdvGaussianConv.hh
            AdvGaussian.hh
            AdvGslFFTComplex.hh
            AdvInsMEM.hh
            AdvLevmarArgs.hh
            AdvLevmarConsts.hh
            AdvLevmarControl.hh
            AdvLevmarFit.hh
            AdvLevmarFunc.hh
            AdvLevmarImmutables.hh
            AdvLogger.hh
            AdvLorentzianConv.hh
            AdvLorentzian.hh
            AdvMatrixUtil.hh
            AdvMessage.hh
            AdvMethodFactory.hh
            AdvMethod.hh
            AdvMethodType.hh
            AdvModelDistribution.hh
            AdvModel.hh
            AdvModelInterference.hh
            AdvModelLayer.hh
            AdvModelParam.hh
            AdvModelParamSet.hh
            AdvModelParticle.hh
            AdvModelParticleType.hh
            AdvModelSmallAngle.hh
            AdvModelSpecular.hh
            AdvModelSpecularMul.hh
            AdvMovingAverage.hh
            AdvMultiDataLevmarConsts.hh
            AdvMultiDataLevmar.hh
            AdvMultiDataMethodFactory.hh
            AdvMultiDataMethod.hh
            AdvMultiDataOperationBase.hh
            AdvMultiDataPeakFit.hh
            AdvNewLevmar.hh
            AdvOperationBase.hh
            AdvOperationType.hh
            AdvParameterIOconst.hh
            AdvParamSet.hh
            AdvPeakData.hh
            AdvPeakFit.hh
            AdvPeak.hh
            AdvPeakSearch.hh
            AdvPeakType.hh
            AdvPolynomial1Conv.hh
            AdvPolynomial1.hh
            AdvPolynomial2Conv.hh
            AdvPolynomial2.hh
            AdvPolynomial3Conv.hh
            AdvPolynomial3.hh
            AdvPseudoVoigt1Conv.hh
            AdvPseudoVoigt1.hh
            AdvPseudoVoigt2Conv.hh
            AdvPseudoVoigt2.hh
            AdvReportConvergenceProcess.hh
            AdvSimulatedAnnealingArgs.hh
            AdvSimulatedAnnealingConsts.hh
            AdvSimulatedAnnealing.hh
            AdvSmoothing.hh
            AdvTrapezoid.hh
            AdvTriangle.hh
            AdvVectorArrayConv.hh
            AdvVectorComplexTool.hh
            AdvVectorGslVectorComplex.hh
            AdvVectorGSLVectorConv.hh
            ThreadBase.hh
        DESTINATION include/manyo/LevmarTools)

# Install Manyo folder for Python
install(TARGETS ManyoLevmarTools LIBRARY DESTINATION ${MANYO_PATH}/Manyo/LevmarTools)
install(FILES ${PROJECT_BINARY_DIR}/LevmarTools.py DESTINATION ${MANYO_PATH}/Manyo/LevmarTools)
install(FILES __init__.py DESTINATION ${MANYO_PATH}/Manyo/LevmarTools)
install(FILES sample/sample.py DESTINATION share/Manyo/sample/LevmarTools)
