cmake_minimum_required(VERSION 3.21)
project(TSSUpdater VERSION 1.0 LANGUAGES CXX)
if(NOT WIN32)
    add_subdirectory(platform)
    return()
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(TSS_UPDATE_PUBLIC_KEY "${CMAKE_CURRENT_SOURCE_DIR}/keys/release-public.txt" CACHE FILEPATH "Открытый ключ подписи обновлений")
file(READ "${TSS_UPDATE_PUBLIC_KEY}" TSS_UPDATE_KEY_BLOB)
string(STRIP "${TSS_UPDATE_KEY_BLOB}" TSS_UPDATE_KEY_BLOB)
if(NOT TSS_UPDATE_KEY_BLOB MATCHES "^[A-Za-z0-9+/=]+$")
    message(FATAL_ERROR "Некорректный открытый ключ обновлений")
endif()
configure_file(core/trustedkey.h.in "${CMAKE_CURRENT_BINARY_DIR}/trustedkey.h" @ONLY)
option(TSS_UPDATER_BUILD_HELPER "Собирать отдельный TSSUpdater.exe" ON)
option(TSS_UPDATER_BUILD_CLIENT "Собирать модуль Qt для приложений" ON)
option(TSS_UPDATER_BUILD_TESTS "Собирать проверки протокола и подписи" OFF)

function(tss_update_core target)
    target_sources(${target} PRIVATE core/updatecore.cpp core/updatecore.h)
    target_include_directories(${target} PRIVATE core "${CMAKE_CURRENT_BINARY_DIR}")
    target_compile_definitions(${target} PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
    target_compile_options(${target} PRIVATE /utf-8 /W4)
    target_link_libraries(${target} PRIVATE bcrypt crypt32 advapi32 shell32)
endfunction()
if(TSS_UPDATER_BUILD_HELPER)
    add_executable(TSSUpdater WIN32 native/main.cpp)
    tss_update_core(TSSUpdater)
    # Обновлятор не зависит от заменяемых Qt DLL и установленного VC Runtime.
    set_target_properties(TSSUpdater PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" AUTOMOC OFF AUTOUIC OFF AUTORCC OFF)
    target_link_libraries(TSSUpdater PRIVATE ole32 uuid)
    target_link_options(TSSUpdater PRIVATE /Brepro /DYNAMICBASE /NXCOMPAT)
endif()
if(TSS_UPDATER_BUILD_CLIENT)
    find_package(Qt6 REQUIRED COMPONENTS Widgets Network Concurrent)
    add_library(tss_update_client STATIC client/updatecontroller.cpp client/updatecontroller.h client/updatedialog.ui)
    tss_update_core(tss_update_client)
    set_target_properties(tss_update_client PROPERTIES AUTOMOC ON AUTOUIC ON)
    target_include_directories(tss_update_client PUBLIC client core)
    target_link_libraries(tss_update_client PUBLIC Qt6::Widgets Qt6::Network Qt6::Concurrent)
endif()
if(TSS_UPDATER_BUILD_TESTS)
    enable_testing()
    add_executable(tss_update_tests tests/coretests.cpp)
    tss_update_core(tss_update_tests)
    add_test(NAME update_protocol COMMAND tss_update_tests)
endif()
