# Manyo Library core module

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

find_package(HDF5 REQUIRED
    COMPONENTS CXX
)

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

add_library(Manyo SHARED)
target_sources(Manyo PRIVATE
    CollectArchitecture.cc
    CppToPython.cc
    DoubleBinArrange.cc
    ElementContainerAppendError.cc
    ElementContainerArray.cc
    ElementContainer.cc
    ElementContainerMatrix.cc
    GaussianEventData.cc
    GslHistogram.cc
    GslRandGenerator.cc
    HeaderBase.cc
    ManipulatorBase.cc
    ManyoDataIO.cc
    Map.cc
    NeutronReadBinaryData.cc
    NeutronVector.cc
    NeutronWriteBinaryData.cc
    NeXusFileIO.cc
    OperatorBase.cc
    PyRunOnCPP.cc
    ReadNeXusFile.cc
    ReadSerializationFile.cc
    ReadTextFile.cc
    ReadWriteTextFile.cc
    SearchInHeader.cc
    SimpleIOVectorToTextFile.cc
    SplitString.cc
    StlMapDouble.cc
    StringTools.cc
    SwapBytes.cc
    TwoDimElementContainer.cc
    UInt4ContainerArray.cc
    UInt4Container.cc
    UInt4ContainerMatrix.cc
    VectorTool.cc
    WriteNeXusFile.cc
    WriteSerializationFile.cc
    WriteTextFile.cc
)

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

target_compile_features(Manyo PRIVATE cxx_std_11)
target_compile_options(Manyo PRIVATE
    -O3
    -Werror=return-type
)

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

if(OpenMP_FOUND)
    target_compile_definitions(Manyo PRIVATE
        MULTH=${MANYO_MULTH}
        PyMaj=${Python_VERSION_MAJOR}
    )
else()
    target_compile_definitions(Manyo PRIVATE
        PyMaj=${Python_VERSION_MAJOR}
    )
endif()

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

target_include_directories(Manyo
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${MANYO_NEXUS_PATH}/include
)

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

target_link_libraries(Manyo
    PRIVATE
        NeXus
        Python::Python
        OpenMP::OpenMP_CXX
        GSL::gsl
        Boost::serialization
        Boost::filesystem
        HDF5::HDF5
        util
        dl
)

target_link_directories(Manyo
    PRIVATE
        ${MANYO_NEXUS_PATH}/lib
)

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

set_property(SOURCE Manyo3.i PROPERTY CPLUSPLUS ON)

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

# Compile definitions
if(OpenMP_FOUND)
    target_compile_definitions(ManyoCore PRIVATE
        MULTH=${MANYO_MULTH}
        PyMaj=${Python_VERSION_MAJOR}
    )
else()
    target_compile_definitions(ManyoCore PRIVATE
        PyMaj=${Python_VERSION_MAJOR}
    )
endif()

# Include paths
target_include_directories(ManyoCore
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${MANYO_NEXUS_PATH}/include
)

# Linking
target_link_libraries(ManyoCore
    PRIVATE
        Manyo
        NeXus
        Python::Python
        OpenMP::OpenMP_CXX
        GSL::gsl
        Boost::serialization
        Boost::filesystem
        HDF5::HDF5
        util
        dl
)

target_link_directories(ManyoCore
    PRIVATE
        ${MANYO_NEXUS_PATH}/lib
)

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

install(TARGETS Manyo
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION ${MANYO_LIB_PATH}
)
install(FILES
    CollectArchitecture.hh
    CppToPython.hh
    DoubleBinArrange.hh
    ElementContainerAppendError.hh
    ElementContainerArray.hh
    ElementContainer.hh
    ElementContainerMatrix.hh
    GaussianEventData.hh
    GslHistogram.hh
    GslRandGenerator.hh
    Header.hh
    HeaderBase.hh
    ManipulatorBase.hh
    ManyoDataIO.hh
    Map.hh
    NeutronReadBinaryData.hh
    NeutronVector.hh
    NeutronWriteBinaryData.hh
    NeXusFileIO.hh
    OperatorBase.hh
    PyRunOnCPP.hh
    ReadNeXusFile.hh
    ReadSerializationFile.hh
    ReadTextFile.hh
    ReadWriteTextFile.hh
    SearchInHeader.hh
    SimpleIOVectorToTextFile.hh
    SplitString.hh
    StlMapDouble.hh
    StringTools.hh
    SwapBytes.hh
    TwoDimElementContainer.hh
    UInt4ContainerArray.hh
    UInt4Container.hh
    UInt4ContainerMatrix.hh
    VectorTool.hh
    WriteNeXusFile.hh
    WriteSerializationFile.hh
    WriteTextFile.hh
    ManipulatorBase.cc
    Map.cc
    NeutronVector.cc
    NeutronWriteBinaryData.cc
    NeutronReadBinaryData.cc
    OperatorBase.cc
    SwapBytes.cc
    DESTINATION ${MANYO_ROOT_PATH}/include/manyo
)

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

install(FILES
    ${PROJECT_BINARY_DIR}/Manyo.py
    DESTINATION ${MANYO_PATH}/Manyo
    RENAME core.py
)

install(FILES
    __init3__.py
    DESTINATION ${MANYO_PATH}/Manyo
    RENAME __init__.py
)

install(FILES
    sample/ManyoCpp
    sample/CreateNewPackage
    DESTINATION ${MANYO_ROOT_PATH}/bin
)

install(FILES
    sample/BinFile.py
    sample/FourOperators.py
    sample/NeXusFile.py
    sample/Test.py
    DESTINATION ${MANYO_ROOT_PATH}/share/Manyo/sample
)

install(DIRECTORY MyPackage
    DESTINATION ${MANYO_ROOT_PATH}/share/Manyo/sample/core
)

install(FILES
    Manyo.i
    Manyo3.i
    TemplateDef.i
    VectorDef.i
    PythonCode.i
    DoxySwig.i
    DESTINATION ${MANYO_ROOT_PATH}/include/manyo
)
