cmake_minimum_required(VERSION 3.25)

project(FlatBook
    VERSION 0.3.0
    LANGUAGES CXX
)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

option(FLATBOOK_BUILD_TESTS "Build tests" OFF)

if(PROJECT_IS_TOP_LEVEL)
    set(FLATBOOK_BUILD_BENCHMARKS_DEFAULT ON)
else()
    set(FLATBOOK_BUILD_BENCHMARKS_DEFAULT OFF)
endif()
option(FLATBOOK_BUILD_BENCHMARKS "Build benchmarks" ${FLATBOOK_BUILD_BENCHMARKS_DEFAULT})
option(FLATBOOK_BUILD_EXAMPLES "Build examples" ${FLATBOOK_BUILD_BENCHMARKS_DEFAULT})
option(FLATBOOK_BUILD_FUZZER "Build libFuzzer target (Clang only)" OFF)
option(FLATBOOK_BUILD_PYTHON "Build Python bindings (nanobind)" OFF)
option(FLATBOOK_NATIVE "Compile with -march=native (GNU/Clang)" OFF)

if(FLATBOOK_NATIVE)
    if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
        add_compile_options(-march=native)
    else()
        message(WARNING "FLATBOOK_NATIVE is only supported with GNU/Clang")
    endif()
endif()

add_library(flatbook INTERFACE)
add_library(flatbook::flatbook ALIAS flatbook)

find_package(Threads REQUIRED)
target_link_libraries(flatbook INTERFACE Threads::Threads)

target_include_directories(flatbook
    INTERFACE
        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

target_compile_features(flatbook
    INTERFACE
        cxx_std_20
)

if(FLATBOOK_BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()

if(FLATBOOK_BUILD_BENCHMARKS)
    add_subdirectory(benchmarks)
endif()

if(FLATBOOK_BUILD_EXAMPLES)
    add_subdirectory(examples)
endif()

if(FLATBOOK_BUILD_FUZZER)
    add_subdirectory(fuzz)
endif()

if(FLATBOOK_BUILD_PYTHON)
    add_subdirectory(python)
endif()

find_package(Doxygen QUIET)
if(DOXYGEN_FOUND)
    add_custom_target(doc
        COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR}/Doxyfile
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        COMMENT "Generating API reference with Doxygen")
endif()

# --- Install / find_package -------------------------------------------------
# (skipped when building the Python wheel: only the extension module is
# installed into site-packages then)

if(NOT FLATBOOK_BUILD_PYTHON)
install(TARGETS flatbook EXPORT flatbookTargets)

install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(EXPORT flatbookTargets
        FILE flatbookTargets.cmake
        NAMESPACE flatbook::
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/flatbook)

configure_package_config_file(
    ${PROJECT_SOURCE_DIR}/cmake/flatbookConfig.cmake.in
    ${PROJECT_BINARY_DIR}/flatbookConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/flatbook)

write_basic_package_version_file(
    ${PROJECT_BINARY_DIR}/flatbookConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMinorVersion)

install(FILES
    ${PROJECT_BINARY_DIR}/flatbookConfig.cmake
    ${PROJECT_BINARY_DIR}/flatbookConfigVersion.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/flatbook)
endif()
