cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

SET(LIB_NAME rw_noise)

project(${LIB_NAME})

FILE(GLOB SOURCE_FILES src/*.cpp)

add_library(${LIB_NAME} SHARED ${SOURCE_FILES})

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
LIST(APPEND LINK_LIBRARIES_LIST Threads::Threads)

find_package(OpenMP)
LIST(APPEND LINK_LIBRARIES_LIST OpenMP::OpenMP_CXX)

find_package(Boost COMPONENTS python numpy REQUIRED)
IF(BOOST_FOUND)
    LIST(APPEND INCLUDE_DIR_LIST ${BOOST_INCLUDE_DIRS})
    LIST(APPEND LINK_LIBRARIES_LIST ${Boost_LIBRARIES})
ELSE()
    MESSAGE(ERROR "Boost not found")
ENDIF()

find_package(PythonLibs "3" REQUIRED)
IF(PYTHONLIBS_FOUND)
    LIST(APPEND INCLUDE_DIR_LIST ${PYTHON_INCLUDE_DIRS})
    LIST(APPEND LINK_LIBRARIES_LIST ${PYTHON_LIBRARIES})
ELSE()
    MESSAGE(ERROR "Python not found")
ENDIF()

find_package(Eigen3 3.3 REQUIRED)

IF(EIGEN3_FOUND)
    LIST(APPEND INCLUDE_DIR_LIST ${EIGEN3_INCLUDE_DIRS})
    LIST(APPEND LINK_LIBRARIES_LIST ${EIGEN3_LIBRARIES})
ELSE()
    MESSAGE(ERROR "Eigen not found")
ENDIF()

OPTION(USE_MAGMA "USE_MAGMA" OFF)

IF(USE_MAGMA)
    add_definitions(-DUSE_MAGMA)

    find_package(CUDA REQUIRED)
    IF(CUDA_FOUND)
        LIST(APPEND INCLUDE_DIR_LIST ${CUDA_INCLUDE_DIRS})
        LIST(APPEND LINK_LIBRARIES_LIST ${CUDA_LIBRARIES})
    ELSE()
        MESSAGE(ERROR "Cuda not found")
    ENDIF()

    find_package(PkgConfig REQUIRED)
    pkg_check_modules(MAGMA REQUIRED magma)
    IF(MAGMA_FOUND)
        LIST(APPEND INCLUDE_DIR_LIST ${MAGMA_INCLUDE_DIRS})
        LIST(APPEND LINK_LIBRARIES_LIST ${MAGMA_LIBRARIES})
    ELSE()
        MESSAGE(ERROR "Magma not found")
    ENDIF()
ENDIF()

target_include_directories(${LIB_NAME} PRIVATE ${INCLUDE_DIR_LIST})
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "") #remove lib prefix
target_link_libraries(${LIB_NAME} ${LINK_LIBRARIES_LIST})

install(
    TARGETS ${LIB_NAME}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
