cmake_minimum_required(VERSION 3.16)

project(ip2region_cpp LANGUAGES CXX)

option(IP2REGION_BUILD_TOOLS "Build the C++ command-line tools" ON)

add_library(
    ip2region_xdb
    src/base.cc
    src/bench.cc
    src/edit.cc
    src/header.cc
    src/ip.cc
    src/make.cc
    src/search.cc
)

target_compile_features(ip2region_xdb PUBLIC cxx_std_11)
target_include_directories(ip2region_xdb PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")

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

if(WIN32)
    target_compile_definitions(ip2region_xdb PRIVATE _WIN32_WINNT=0x0600)
    target_link_libraries(ip2region_xdb PUBLIC ws2_32)
endif()

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
foreach(config DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${config} "${CMAKE_CURRENT_SOURCE_DIR}/bin")
endforeach()

function(add_xdb_executable target source output_name)
    add_executable(${target} ${source})
    target_link_libraries(${target} PRIVATE ip2region_xdb)
    set_target_properties(${target} PROPERTIES OUTPUT_NAME ${output_name})
endfunction()

if(IP2REGION_BUILD_TOOLS)
    add_xdb_executable(xdb_header test/header.cc header)
    add_xdb_executable(xdb_search test/search.cc search)
    add_xdb_executable(xdb_bench test/bench.cc bench)
    add_xdb_executable(xdb_make test/make.cc make)
    add_xdb_executable(edit_v4 test/edit_v4.cc edit_v4)
    add_xdb_executable(edit_v6 test/edit_v6.cc edit_v6)
endif()

include(CTest)

if(BUILD_TESTING)
    add_xdb_executable(ip_test test/ip.cc ip_test)

    add_test(NAME cpp.ip COMMAND ip_test)
    set_tests_properties(cpp.ip PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

    if(IP2REGION_BUILD_TOOLS)
        add_test(NAME cpp.header COMMAND xdb_header)
        add_test(NAME cpp.search COMMAND xdb_search)
        set(cpp_make_output_directory "${CMAKE_CURRENT_BINARY_DIR}/test-output")
        file(MAKE_DIRECTORY "${cpp_make_output_directory}")
        add_test(
            NAME cpp.make
            COMMAND
                xdb_make
                "${CMAKE_CURRENT_SOURCE_DIR}/test/fixtures"
                "${cpp_make_output_directory}"
        )

        set_tests_properties(
            cpp.header cpp.search
            PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
        )
        set_tests_properties(
            cpp.make
            PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
        )
    endif()
endif()