cmake_minimum_required(VERSION 3.16)
project(guangnian_sdk VERSION 1.1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(GUANGNIAN_SDK_ALLOW_INSECURE_HTTP "Allow HTTP for local integration tests only" OFF)
option(GUANGNIAN_SDK_HARDENING "Enable production compiler and linker hardening" ON)
find_package(CURL REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(nlohmann_json 3.9 REQUIRED)
add_library(guangnian_sdk src/client.cpp)
set_target_properties(guangnian_sdk PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN YES)
target_compile_definitions(guangnian_sdk PRIVATE GUANGNIAN_SDK_BUILD=1)
if(BUILD_SHARED_LIBS)
    target_compile_definitions(guangnian_sdk PUBLIC GUANGNIAN_SDK_SHARED=1)
endif()
target_include_directories(guangnian_sdk PUBLIC include)
target_link_libraries(guangnian_sdk PUBLIC CURL::libcurl OpenSSL::Crypto nlohmann_json::nlohmann_json)
if(GUANGNIAN_SDK_ALLOW_INSECURE_HTTP)
    target_compile_definitions(guangnian_sdk PRIVATE GUANGNIAN_SDK_ALLOW_INSECURE_HTTP=1)
endif()
if(WIN32)
    target_link_libraries(guangnian_sdk PUBLIC advapi32)
endif()
if(GUANGNIAN_SDK_HARDENING)
    include(CheckIPOSupported)
    check_ipo_supported(RESULT GUANGNIAN_IPO_SUPPORTED OUTPUT GUANGNIAN_IPO_ERROR)
    if(GUANGNIAN_IPO_SUPPORTED)
        set_property(TARGET guangnian_sdk PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)
    endif()
    if(MSVC)
        target_compile_options(guangnian_sdk PRIVATE /GS /guard:cf /sdl $<$<CONFIG:Release>:/O2>)
        target_link_options(guangnian_sdk PUBLIC /DYNAMICBASE /NXCOMPAT /guard:cf $<$<CONFIG:Release>:/OPT:REF> $<$<CONFIG:Release>:/OPT:ICF>)
    else()
        target_compile_options(guangnian_sdk PRIVATE -fstack-protector-strong $<$<CONFIG:Release>:-O2> $<$<CONFIG:Release>:-D_FORTIFY_SOURCE=2>)
        if(NOT APPLE)
            target_link_options(guangnian_sdk PUBLIC -Wl,-z,relro,-z,now)
        endif()
    endif()
endif()
add_executable(guangnian_quick_start examples/quick_start.cpp)
target_link_libraries(guangnian_quick_start PRIVATE guangnian_sdk)
