cmake_minimum_required(VERSION 3.16)

project(ikvxx VERSION 0.1.0 LANGUAGES C CXX)

option(IKVXX_BUILD_TESTS "Build iKvxx unit tests" ON)
option(IKVXX_INSTALL "Install iKvxx" ON)

if(IKVXX_BUILD_TESTS)
    include(CTest)
endif()

set(IKV_BUILD_DEMOS OFF CACHE BOOL "" FORCE)
set(IKV_BUILD_TESTS ${IKVXX_BUILD_TESTS} CACHE BOOL "" FORCE)
set(IKV_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory(third_party/iKv)
set_target_properties(ikv PROPERTIES
    PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/third_party/iKv/include/ikv.h")

add_library(ikvxx src/value.cpp)
add_library(ikvxx::ikvxx ALIAS ikvxx)
target_compile_features(ikvxx PUBLIC cxx_std_17)
target_include_directories(ikvxx PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>)
target_link_libraries(ikvxx PUBLIC ikv::ikv)

if(MSVC)
    target_compile_options(ikvxx PRIVATE /W4 /permissive-)
else()
    target_compile_options(ikvxx PRIVATE -Wall -Wextra -Wpedantic)
endif()

if(IKVXX_BUILD_TESTS)
    add_executable(ikvxx_tests tests/value_tests.cpp)
    target_link_libraries(ikvxx_tests PRIVATE ikvxx::ikvxx)
    target_compile_features(ikvxx_tests PRIVATE cxx_std_17)

    set(IKVXX_TEST_CASES
        construction_and_type_inspection
        assignments_and_conversions
        objects_members_and_lookup_overloads
        arrays_and_index_overloads
        text_parsing_and_files
        binary_memory_and_files
        refresh_and_ownership)

    foreach(IKVXX_TEST_CASE IN LISTS IKVXX_TEST_CASES)
        add_test(
            NAME "ikvxx.${IKVXX_TEST_CASE}"
            COMMAND ikvxx_tests --case "${IKVXX_TEST_CASE}")
    endforeach()
endif()

if(IKVXX_INSTALL)
    include(GNUInstallDirs)
    include(CMakePackageConfigHelpers)
    install(TARGETS ikv ikvxx EXPORT ikvxxTargets)
    install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
    install(EXPORT ikvxxTargets NAMESPACE ikvxx:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ikvxx)
    configure_package_config_file(cmake/ikvxxConfig.cmake.in
        "${CMAKE_CURRENT_BINARY_DIR}/ikvxxConfig.cmake"
        INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ikvxx)
    write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/ikvxxConfigVersion.cmake"
        VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion)
    install(FILES
        "${CMAKE_CURRENT_BINARY_DIR}/ikvxxConfig.cmake"
        "${CMAKE_CURRENT_BINARY_DIR}/ikvxxConfigVersion.cmake"
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ikvxx)
endif()
