cmake_minimum_required(VERSION 3.4)
project(cork)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake)
set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)

add_library(cork SHARED
  src/file_formats/files.cpp
  src/file_formats/ifs.cpp
  src/file_formats/off.cpp
  src/isct/empty3d.cpp
  src/isct/quantization.cpp
  src/isct/cdt/CDT.cpp
  src/util/log.cpp
  src/util/timer.cpp
  src/cork.cpp
)

include(GenerateExportHeader)
generate_export_header(cork)
include_directories(${CMAKE_CURRENT_BINARY_DIR})

add_executable(cork-bin src/main.cpp)

if(UNIX)
    set_property(TARGET cork PROPERTY POSITION_INDEPENDENT_CODE ON)
endif(UNIX)

set_target_properties(cork-bin PROPERTIES OUTPUT_NAME cork)

if(UNIX)
    find_package(GMP REQUIRED)
    include_directories(${GMP_INCLUDES})
    target_link_libraries(cork PRIVATE ${GMP_LIBRARIES})
    target_link_libraries(cork-bin PRIVATE cork ${GMP_LIBRARIES})
elseif(WIN32)
    find_package(MPIR REQUIRED)
    include_directories(${MPIR_INCLUDES})
    target_link_libraries(cork PRIVATE ${MPIR_LIBRARIES})
    target_link_libraries(cork-bin PRIVATE cork ${MPIR_LIBRARIES})
    target_compile_definitions(cork PRIVATE _USE_MATH_DEFINES NOMINMAX)
    target_compile_definitions(cork-bin PRIVATE _USE_MATH_DEFINES NOMINMAX)

    if(("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "x64"))
        set_target_properties(cork PROPERTIES OUTPUT_NAME "Cork$<$<CONFIG:Debug>:d>_x64")
    else()
        set_target_properties(cork PROPERTIES OUTPUT_NAME "Cork$<$<CONFIG:Debug>:d>_x86")
    endif()
endif()

target_compile_definitions(
  cork
  PRIVATE
  NO_TIMER
  REDUCED
  TRILIBRARY
  ANSI_DECLARATORS
  CDT_USE_AS_COMPILED_LIBRARY
  CDT_DONT_USE_BOOST_RTREE
)

# Installation
include(GNUInstallDirs)
install(
    TARGETS ${PROJECT_NAME}
    EXPORT CorkConfig
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if (MSVC)
  install(
    FILES 
      $<TARGET_PDB_FILE:${PROJECT_NAME}> 
    DESTINATION
      ${CMAKE_BINARY_DIR}/lib
    OPTIONAL
  )
endif()

install(
  FILES
    src/cork.h
    ${CMAKE_BINARY_DIR}/cork_export.h
  DESTINATION
    include
)
install(
  FILES
    src/math/vec.h
  DESTINATION
    include/math
)
install(
  FILES
    src/rawmesh/rawMesh.h
  DESTINATION
    include/rawmesh
)
install(
  FILES
    src/util/types.h
  DESTINATION
    include/util
)
install(EXPORT CorkConfig DESTINATION cmake)