cmake_minimum_required(VERSION 3.14)

project(
  evd
  VERSION 1.0
  LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

option(BUILD_HEXL "Build HEXL from source" ON)

add_library(evd src/Client.cpp src/HEval.cpp src/PIRServer.cpp src/Random.cpp
                src/Server.cpp)

target_compile_options(evd PRIVATE -g)

target_include_directories(
  evd PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
             $<INSTALL_INTERFACE:include>)

include(FetchContent)

if(BUILD_HEXL)
  FetchContent_Declare(
    hexl
    GIT_REPOSITORY https://github.com/intel/hexl.git
    GIT_TAG v1.2.5)
  set(HEXL_BENCHMARK OFF)
  set(HEXL_TESTING OFF)
  FetchContent_MakeAvailable(hexl)
else()
  find_package(hexl REQUIRED)
endif()

FetchContent_Declare(cnpy GIT_REPOSITORY https://github.com/rogersce/cnpy.git)
FetchContent_MakeAvailable(cnpy)

include(FetchContent)
FetchContent_Declare(
  asio
  URL https://github.com/chriskohlhoff/asio/archive/refs/tags/asio-1-30-2.zip)
FetchContent_MakeAvailable(asio)

find_package(OpenSSL REQUIRED)
find_package(OpenMP REQUIRED)

target_include_directories(evd PUBLIC ${hexl_INCLUDE_DIRS})
target_link_libraries(evd PUBLIC hexl crypto OpenMP::OpenMP_CXX)

add_executable(ex1-mod-pack example/ex1-mod-pack.cpp)
target_link_libraries(ex1-mod-pack PRIVATE evd)
target_compile_options(ex1-mod-pack PRIVATE -g)

add_executable(ex2-auted-mod-pack example/ex2-auted-mod-pack.cpp)
target_link_libraries(ex2-auted-mod-pack PRIVATE evd)
target_compile_options(ex2-auted-mod-pack PRIVATE -g)

add_executable(ex3-ip example/ex3-ip.cpp)
target_link_libraries(ex3-ip PRIVATE evd)
target_compile_options(ex3-ip PRIVATE -g)

add_executable(ex3-ip-ptxt example/ex3-ip-ptxt.cpp)
target_link_libraries(ex3-ip-ptxt PRIVATE evd)
target_compile_options(ex3-ip-ptxt PRIVATE -g)

add_executable(ex4-ip-ptxt example/ex4-ip-ptxt.cpp)
target_link_libraries(ex4-ip-ptxt PRIVATE evd)
target_compile_options(ex4-ip-ptxt PRIVATE -g)

add_executable(ex5-pir example/ex5-pir.cpp)
target_link_libraries(ex5-pir PRIVATE evd)
target_compile_options(ex5-pir PRIVATE -g)

add_executable(ex6-deep1m example/ex6-deep1m.cpp)
target_link_libraries(ex6-deep1m PRIVATE evd)
target_compile_options(ex6-deep1m PRIVATE -g)

add_executable(ex6-deep1m-ptxt example/ex6-deep1m-ptxt.cpp)
target_link_libraries(ex6-deep1m-ptxt PRIVATE evd)
target_compile_options(ex6-deep1m-ptxt PRIVATE -g)

add_executable(ex6-deep1m-client example/ex6-deep1m-client.cpp)
target_link_libraries(ex6-deep1m-client PRIVATE evd pthread)
target_include_directories(ex6-deep1m-client PRIVATE ${ASIO_DIR})
target_compile_options(ex6-deep1m-client PRIVATE -g)

add_executable(ex6-deep1m-server example/ex6-deep1m-server.cpp)
target_link_libraries(ex6-deep1m-server PRIVATE evd pthread)
target_include_directories(ex6-deep1m-server PRIVATE ${ASIO_DIR})
target_compile_options(ex6-deep1m-server PRIVATE -g)

add_executable(ex7-laion example/ex7-laion.cpp)
target_link_libraries(ex7-laion PRIVATE evd cnpy)
target_include_directories(ex7-laion PUBLIC ${cnpy_SOURCE_DIR})
target_compile_options(ex7-laion PRIVATE -g -mf16c)

add_executable(ex7-laion-ptxt example/ex7-laion-ptxt.cpp)
target_link_libraries(ex7-laion-ptxt PRIVATE evd cnpy)
target_include_directories(ex7-laion-ptxt PUBLIC ${cnpy_SOURCE_DIR})
target_compile_options(ex7-laion-ptxt PRIVATE -g -mf16c)

include(GNUInstallDirs)
install(
  TARGETS evd
  EXPORT evdTargets
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  INCLUDES
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(
  EXPORT evdTargets
  FILE evdConfig.cmake
  NAMESPACE evd::
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/evd)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/evdConfigVersion.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY AnyNewerVersion)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/evdConfigVersion.cmake"
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/evd)
