cmake_minimum_required(VERSION 3.20)

project(NeighborlyPolyhedra LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(EIGEN_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/external/eigen-3.4.0" CACHE PATH "Eigen include root")
if(NOT EXISTS "${EIGEN_ROOT}/Eigen/Dense")
    message(FATAL_ERROR "Eigen not found at ${EIGEN_ROOT}. Download Eigen 3.4.0 into external/eigen-3.4.0 or pass -DEIGEN_ROOT=...")
endif()

add_library(neighborly_core
    src/NeighborlyCore/plane.h
    src/NeighborlyCore/precise_geometry.h
    src/NeighborlyCore/util.cpp
    src/NeighborlyCore/util.h
    src/NeighborlyCore/wide_real.h
    projects/Szilassi/solver.cpp
    projects/Szilassi/solver.h
)

target_include_directories(neighborly_core
    PUBLIC
        "${CMAKE_CURRENT_SOURCE_DIR}/src/NeighborlyCore"
        "${CMAKE_CURRENT_SOURCE_DIR}/projects/Szilassi"
        "${EIGEN_ROOT}"
)

if(MSVC)
    target_compile_options(neighborly_core PRIVATE /W3 /permissive- /EHsc)
    target_compile_definitions(neighborly_core PUBLIC NOMINMAX _CRT_SECURE_NO_WARNINGS)
else()
    target_compile_options(neighborly_core PRIVATE -Wall -Wextra)
endif()

add_executable(neighborly_main projects/Szilassi/main.cpp)
target_link_libraries(neighborly_main PRIVATE neighborly_core)

add_executable(verify_cpp projects/VerifyCpp/verify_cpp.cpp)
target_link_libraries(verify_cpp PRIVATE neighborly_core)

add_executable(polyhedron_gui WIN32 projects/PolyhedronGui/launcher_gui.cpp)
if(MSVC)
    target_compile_definitions(polyhedron_gui PRIVATE UNICODE _UNICODE NOMINMAX)
    target_link_libraries(polyhedron_gui PRIVATE shell32)
endif()
