# Manyo Library Utsusemi module
set(MODULENAME Utsusemi)

#
# ========= Dependencies =========
#

find_package(HDF5 REQUIRED
    COMPONENTS CXX
)

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

if (POLICY CMP0167)
    cmake_policy (SET CMP0167 NEW)
endif ()
find_package(Boost 1.66.0 REQUIRED
    COMPONENTS
        filesystem
        serialization
)
find_package(ZLIB REQUIRED)

#
# ========= SWIG =========
#

CMAKE_POLICY(SET CMP0086 NEW)
find_package(SWIG REQUIRED)
include(UseSWIG)

#
# ========= Library =========
#

add_library(${MODULENAME} SHARED)
target_sources(${MODULENAME} PRIVATE
    CaseInfoReaderBase.cc
    D4MatrixCalc.cc
    DetectorInfoEditorBase.cc
    DetectorInfoEditorNeunet.cc
    DetectorInfoEditorReadout2d.cc
    HistogramBinToPoint.cc
    NxspeFileIO.cc
    ShamotoDymPDF.cc
    T0TreatToolsNeunet.cc
    T0TreatToolsReadout.cc
    T0TreatToolsReadoutWLSF32.cc
    TofToEnergyChoppers.cc
    TofToEnergyTransfer.cc
    UtsusemiAnaEnvironReader.cc
    UtsusemiCalcContainers.cc
    UtsusemiCaseInfoReaderTrignet.cc
    UtsusemiCheckDataProcess.cc
    UtsusemiContainerTextConverter.cc
    UtsusemiD4Matrix2.cc
    UtsusemiD4Matrix.cc
    UtsusemiDetectorEfficiencyCorrection.cc
    UtsusemiDetectorInfoEditorBase.cc
    UtsusemiDetectorInfoEditorNeunet.cc
    UtsusemiEventCasesDecoderBase.cc
    UtsusemiEventCasesDecoderTemplate.cc
    UtsusemiEventDataConverterMWPC.cc
    UtsusemiEventDataConverterNeunet.cc
    UtsusemiEventDataConverterNeunetWithPH.cc
    UtsusemiEventDataConverterNeunetWithPHDep.cc
    UtsusemiEventDataConverterReadoutTemplate.cc
    UtsusemiEventDataConverterRPMT.cc
    UtsusemiEventDataConverterSample.cc
    UtsusemiEventDataConverterSimpleNeunet.cc
    UtsusemiEventDataConverterTemplate.cc
    UtsusemiEventDataConverterWLSF32.cc
    UtsusemiEventDataCreator.cc
    UtsusemiEventDataMonitorMWPC.cc
    UtsusemiEventDataMonitorNeunet.cc
    UtsusemiEventDataMonitorRPMT.cc
    UtsusemiFilterBase.cc
    UtsusemiFilterTrignet.cc
    UtsusemiGetNeunetHistogram.cc
    UtsusemiGetRPMTHistogram.cc
    UtsusemiHeader.cc
    UtsusemiNeunetEventDecoderBase.cc
    UtsusemiNeutronEventDecoderBase.cc
    UtsusemiOneTrignetStorage.cc
    UtsusemiReadoutEventDecoderTemplate.cc
    UtsusemiReadoutMWPCEventDecoder.cc
    UtsusemiReadoutRPMTEventDecoder.cc
    UtsusemiReadoutWLSF32EventDecoder.cc
    UtsusemiReductionCommon.cc
    UtsusemiReductionInEla.cc
    UtsusemiSetMask.cc
    UtsusemiSqeCalc2.cc
    UtsusemiSqeCalc.cc
    UtsusemiSqeCalcXtalParams.cc
    UtsusemiSubtractDarkBackground.cc
    UtsusemiTofOriginCorrection.cc
    UtsusemiTrignetDictionary.cc
    UtsusemiTrignetEventDecoderBase.cc
    UtsusemiUnitConverter.cc
    UtsusemiWiringInfoEditorBase.cc
    UtsusemiWiringInfoEditorNeunet.cc
    UtsusemiWiringInfoEditorTemplate.cc
    VanadiumToolsChoppers.cc
    WiringInfoConversionDictionary.cc
    WiringInfoDataBase.cc
    WiringInfoEditorBase.cc
    WiringInfoEditorNeunet.cc
    WiringInfoEditorReadout.cc
)

#
# ========= Compile Settings =========
#

target_compile_features(${MODULENAME} PRIVATE cxx_std_11)
target_compile_options(${MODULENAME} PRIVATE
    -O3
    -Werror=return-type
)

#
# ========= Compile Definitions =========
#

if (OpenMP_FOUND)
    target_compile_definitions(${MODULENAME}
        PRIVATE
            MULTH=${MANYO_MULTH}
            UTSUSEMIMANYOREVNUMBER=${UTSUSEMI_REVISION}
    )
else()
    target_compile_definitions(${MODULENAME}
        PRIVATE
            UTSUSEMIMANYOREVNUMBER=${UTSUSEMI_REVISION}
    )
endif()

#
# ========= Include Paths =========
#

target_include_directories(${MODULENAME}
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE
        ${MANYO_ROOT_PATH}/include
        ${MANYO_ROOT_PATH}/include/manyo
        ${MANYO_ROOT_PATH}/include/manyo/MLF
        ${MANYO_NEXUS_PATH}/include
)

#
# ========= Linking =========
#

target_link_libraries(${MODULENAME}
    PRIVATE
        Manyo
        MLF
        NeXus
        Python::Python
        OpenMP::OpenMP_CXX
        GSL::gsl
        Boost::serialization
        Boost::filesystem
        HDF5::HDF5
        ZLIB::ZLIB
        util
        dl
)

target_link_directories(${MODULENAME}
    PRIVATE
        ${MANYO_ROOT_PATH}/${MANYO_LIB_PATH}
        ${MANYO_NEXUS_PATH}/lib
)

#
# ========= SWIG Module =========
#

set_property(SOURCE ${MODULENAME}.i PROPERTY CPLUSPLUS ON)
set_property(SOURCE ${MODULENAME}.i
    PROPERTY INCLUDE_DIRECTORIES
        ${MANYO_ROOT_PATH}/include/manyo
        ${MANYO_ROOT_PATH}/include/manyo/MLF
        ${MANYO_NEXUS_PATH}/include
)

swig_add_library(Manyo${MODULENAME}
    TYPE MODULE
    LANGUAGE python
    OUTPUT_DIR ${PROJECT_BINARY_DIR}/
    SOURCES ${MODULENAME}.i
)

# Compile definitions
if (OpenMP_FOUND)
    target_compile_definitions(Manyo${MODULENAME}
        PRIVATE
            MULTH=${MANYO_MULTH}
            UTSUSEMIMANYOREVNUMBER=${UTSUSEMI_REVISION}
    )
else()
    target_compile_definitions(Manyo${MODULENAME}
        PRIVATE
            UTSUSEMIMANYOREVNUMBER=${UTSUSEMI_REVISION}
    )
endif()

# Include paths
target_include_directories(Manyo${MODULENAME}
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE
        ${MANYO_ROOT_PATH}/include
        ${MANYO_ROOT_PATH}/include/manyo
        ${MANYO_ROOT_PATH}/include/manyo/MLF
        ${MANYO_NEXUS_PATH}/include
)

# Linking
target_link_libraries(Manyo${MODULENAME}
    PRIVATE
        ${MODULENAME}
        Manyo
        MLF
        NeXus
        Python::Python
        OpenMP::OpenMP_CXX
        GSL::gsl
        Boost::serialization
        Boost::filesystem
        HDF5::HDF5
        ZLIB::ZLIB
        util
        dl
)

target_link_directories(Manyo${MODULENAME}
    PRIVATE
        ${MANYO_ROOT_PATH}/${MANYO_LIB_PATH}
        ${MANYO_NEXUS_PATH}/lib
)


#
# ========= Install =========
#

# Install library
install(TARGETS ${MODULENAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION ${MANYO_ROOT_PATH}/${MANYO_LIB_PATH}
)

install(FILES
    CaseInfoReaderBase.hh
    D4MatrixCalc.hh
    DetectorInfoEditorBase.hh
    DetectorInfoEditorNeunet.hh
    DetectorInfoEditorReadout2d.hh
    HistogramBinToPoint.hh
    NxspeFileIO.hh
    ShamotoDymPDF.hh
    T0TreatToolsNeunet.hh
    T0TreatToolsReadout.hh
    T0TreatToolsReadoutWLSF32.hh
    TofToEnergyChoppers.hh
    TofToEnergyTransfer.hh
    UtsusemiAnaEnvironReader.hh
    UtsusemiCalcContainers.hh
    UtsusemiCaseInfoReaderTrignet.hh
    UtsusemiCheckDataProcess.hh
    UtsusemiContainerTextConverter.hh
    UtsusemiD4Matrix2.hh
    UtsusemiD4Matrix.hh
    UtsusemiDetectorEfficiencyCorrection.hh
    UtsusemiDetectorInfoEditorBase.hh
    UtsusemiDetectorInfoEditorNeunet.hh
    UtsusemiDetectorInfoEditorTemplate.hh
    UtsusemiEventCasesDecoderBase.hh
    UtsusemiEventCasesDecoderTemplate.hh
    UtsusemiEventDataConverterMWPC.hh
    UtsusemiEventDataConverterNeunet.hh
    UtsusemiEventDataConverterNeunetWithPHDep.hh
    UtsusemiEventDataConverterNeunetWithPH.hh
    UtsusemiEventDataConverterReadoutTemplate.hh
    UtsusemiEventDataConverterReadoutWLSF32Template.hh
    UtsusemiEventDataConverterRPMT.hh
    UtsusemiEventDataConverterSample.hh
    UtsusemiEventDataConverterSimpleNeunet.hh
    UtsusemiEventDataConverterTemplate.hh
    UtsusemiEventDataConverterTemplateWithPHDep.hh
    UtsusemiEventDataConverterTemplateWithPH.hh
    UtsusemiEventDataConverterWLSF32.hh
    UtsusemiEventDataCreator.hh
    UtsusemiEventDataMonitorMWPC.hh
    UtsusemiEventDataMonitorNeunet.hh
    UtsusemiEventDataMonitorRPMT.hh
    UtsusemiEventDataMonitorTemplate.hh
    UtsusemiFilterBase.hh
    UtsusemiFilterTrignet.hh
    UtsusemiGetHistogramTemplate.hh
    UtsusemiGetNeunetHistogram.hh
    UtsusemiGetRPMTHistogram.hh
    UtsusemiHeader.hh
    UtsusemiNeunetEventDecoderBase.hh
    UtsusemiNeutronEventDecoderBase.hh
    UtsusemiOneTrignetStorage.hh
    UtsusemiReadoutEventDecoderTemplate.hh
    UtsusemiReadoutMWPCEventDecoder.hh
    UtsusemiReadoutRPMTEventDecoder.hh
    UtsusemiReadoutWLSF32EventDecoder.hh
    UtsusemiReductionCommon.hh
    UtsusemiReductionInEla.hh
    UtsusemiSetMask.hh
    UtsusemiSqeCalc2.hh
    UtsusemiSqeCalc.hh
    UtsusemiSqeCalcXtalParams.hh
    UtsusemiSubtractDarkBackground.hh
    UtsusemiTofOriginCorrection.hh
    UtsusemiTrignetDictionary.hh
    UtsusemiTrignetEventDecoderBase.hh
    UtsusemiUnitConverter.hh
    UtsusemiWiringInfoEditorBase.hh
    UtsusemiWiringInfoEditorNeunet.hh
    UtsusemiWiringInfoEditorTemplate.hh
    UtsusemiWiringInfoEditorTemplate.cc
    VanadiumToolsChoppers.hh
    WiringInfoConversionDictionary.hh
    WiringInfoDataBase.hh
    WiringInfoEditorBase.hh
    WiringInfoEditorNeunet.hh
    WiringInfoEditorReadout.hh
    UtsusemiEventDataConverterTemplate.cc
    UtsusemiEventDataConverterReadoutTemplate.cc
    UtsusemiEventCasesDecoderTemplate.cc
    UtsusemiReadoutEventDecoderTemplate.cc
    DESTINATION ${MANYO_ROOT_PATH}/include/manyo/${MODULENAME}
)

# Install Manyo folder for Python
install(TARGETS Manyo${MODULENAME}
    LIBRARY DESTINATION ${MANYO_PATH}/Manyo/${MODULENAME}
)

install(FILES
    ${PROJECT_BINARY_DIR}/${MODULENAME}.py
    __init__.py
    DESTINATION ${MANYO_PATH}/Manyo/${MODULENAME}
)

install(FILES
    sample/sample.py
    DESTINATION ${MANYO_ROOT_PATH}/share/Manyo/sample/${MODULENAME}
)
