cmake_minimum_required(VERSION 3.16)
project(similarity LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -g -O3 -march=native -funroll-loops -fno-omit-frame-pointer -fopenmp")

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
endif()

set(MAIN_SOURCE_FILES
    src/utils.cpp
    src/clust.cpp
    src/lifelines.cpp
    src/ts.cpp
    src/distances.cpp
    src/dba.cpp
    src/kmeans.cpp
    src/cah.cpp
    src/main.cpp
)

add_executable(similarity.exe ${MAIN_SOURCE_FILES})

target_include_directories(similarity.exe PRIVATE
    ${PROJECT_SOURCE_DIR}/include
)

find_path(BAYESOPT_INCLUDE_DIR
    "bayesopt/bayesoptbase.hpp"
    HINTS /usr/local/include
)
find_path(NLOPT_INCLUDE_DIR
    "nlopt.hpp"
    HINTS /usr/local/include /usr/include
)

if(NOT BAYESOPT_INCLUDE_DIR)
    message(FATAL_ERROR "Headers BayesOpt introuvables dans /usr/local/include")
endif()
if(NOT NLOPT_INCLUDE_DIR)
    message(FATAL_ERROR "Headers NLopt introuvables (vérifier l'installation)")
endif()

target_include_directories(similarity.exe PRIVATE
    ${BAYESOPT_INCLUDE_DIR}
    ${NLOPT_INCLUDE_DIR}
)

find_library(BAYESOPT_LIB
    NAMES bayesopt
    HINTS /usr/local/lib
)
find_library(NLOPT_LIB
    NAMES nlopt
    HINTS /usr/local/lib /usr/lib
)

if(NOT BAYESOPT_LIB)
    message(FATAL_ERROR "Bibliothèque BayesOpt introuvable dans /usr/local/lib")
endif()
if(NOT NLOPT_LIB)
    message(FATAL_ERROR "Bibliothèque NLopt introuvable dans /usr/local/lib ou /usr/lib")
endif()

find_package(OpenMP REQUIRED)

target_link_libraries(similarity.exe PRIVATE
    OpenMP::OpenMP_CXX
    ${BAYESOPT_LIB}
    ${NLOPT_LIB}
    pthread
    dl
    m
)
