# Builds cppmodel-tool. Works in two ways:
#  - inside the CppModel source tree (added by the top-level CMakeLists.txt), and
#  - standalone against an installed SDK, where this folder lives in <sdk>/share/cppmodel/tools:
#      cmake -S <sdk>/share/cppmodel/tools -B build/cppmodel-tool
#      cmake --build build/cppmodel-tool
#    Pass -DCPPMODEL_ROOT=<sdk> if the folder was copied elsewhere.
cmake_minimum_required(VERSION 3.18)

project(CppModelTool CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(cppmodel-tool cppmodel-tool.cpp FetchCommand.cpp SweepCommand.cpp)

# Link everything statically so the tool runs without shipping runtime DLLs/shared libraries next to it.
set(ZLIB_USE_STATIC_LIBS ON)
find_package(ZLIB QUIET)

if (MINGW)
    # libstdc++-6.dll, libgcc_s_*.dll, libwinpthread-1.dll, libssl/libcrypto and zlib1.dll.
    target_link_options(cppmodel-tool PRIVATE -static)
elseif (UNIX AND NOT APPLE)
    target_link_options(cppmodel-tool PRIVATE -static-libstdc++ -static-libgcc)
endif()

if (TARGET CppModelBase)
    # In-tree build: CppModelBase carries its OpenSSL/ixwebsocket link requirements.
    target_link_libraries(cppmodel-tool PRIVATE CppModelBase)
else()
    set(CPPMODEL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../.." CACHE PATH "Root of the installed CppModel SDK")
    get_filename_component(CPPMODEL_ROOT "${CPPMODEL_ROOT}" ABSOLUTE)

    find_library(CPPMODEL_BASE_LIB CppModelBase PATHS "${CPPMODEL_ROOT}/lib" NO_DEFAULT_PATH REQUIRED)
    find_library(CPPMODEL_IXWEBSOCKET_LIB ixwebsocket PATHS "${CPPMODEL_ROOT}/lib" NO_DEFAULT_PATH REQUIRED)

    if (MSVC)
        set_property(TARGET cppmodel-tool PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
        set(OPENSSL_USE_STATIC_LIBS TRUE)
        set(OPENSSL_MSVC_STATIC_RT TRUE)
    endif()
    find_package(OpenSSL REQUIRED)
    find_package(Threads REQUIRED)

    target_include_directories(cppmodel-tool PRIVATE "${CPPMODEL_ROOT}/include/cppmodel" "${CPPMODEL_ROOT}/include")
    target_link_libraries(cppmodel-tool PRIVATE
        ${CPPMODEL_BASE_LIB} ${CPPMODEL_IXWEBSOCKET_LIB}
        OpenSSL::SSL OpenSSL::Crypto Threads::Threads)
    if (WIN32)
        target_link_libraries(cppmodel-tool PRIVATE crypt32 ws2_32)
    endif()
endif()

if (ZLIB_FOUND)
    target_link_libraries(cppmodel-tool PRIVATE ZLIB::ZLIB)
endif()
