cmake_minimum_required(VERSION 3.10)
project(server LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
    file(CREATE_LINK
        "${CMAKE_BINARY_DIR}/compile_commands.json"
        "${CMAKE_SOURCE_DIR}/compile_commands.json"
        SYMBOLIC)
endif()

add_compile_definitions(HPSOCKET_STATIC_LIB YLIB_STATIC)

file(GLOB_RECURSE SERVER_SOURCES CONFIGURE_DEPENDS
    "${CMAKE_SOURCE_DIR}/src/*.cpp"
)

add_executable(${PROJECT_NAME} ${SERVER_SOURCES})

set(YLIB_ROOT "/usr/local" CACHE PATH "ylib 安装前缀")
set(HPSOCKET_ROOT "/usr/local" CACHE PATH "HPSocket 头文件前缀")

target_include_directories(${PROJECT_NAME} PRIVATE
    ${CMAKE_SOURCE_DIR}/src
    ${CMAKE_SOURCE_DIR}/..
    ${YLIB_ROOT}/include
    ${HPSOCKET_ROOT}/include
    /usr/include
)

if(MSVC)
    target_compile_options(${PROJECT_NAME} PRIVATE /W3 /wd4819)
    set(YLIB_LIB_DIR "${YLIB_ROOT}/lib" CACHE PATH "ylib 库目录")
    set(HPSOCKET_LIB_DIR "${CMAKE_SOURCE_DIR}/3rdparty/HP-Socket/Lib" CACHE PATH "HPSocket 库目录")
    target_link_directories(${PROJECT_NAME} PRIVATE ${YLIB_LIB_DIR} ${HPSOCKET_LIB_DIR})
    target_link_libraries(${PROJECT_NAME} PRIVATE
        $<$<CONFIG:Debug>:ylib_d>
        $<$<CONFIG:Release>:ylib>
        $<$<CONFIG:Debug>:HPSocket_D>
        $<$<CONFIG:Release>:HPSocket>
        ws2_32 iphlpapi advapi32 user32 shell32
    )
else()
    target_compile_options(${PROJECT_NAME} PRIVATE -Wall -fPIC)
    target_link_directories(${PROJECT_NAME} PRIVATE
        /usr/local/lib
        /usr/lib/x86_64-linux-gnu
    )
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(_YLIB_NAME ylib_d)
    else()
        set(_YLIB_NAME ylib)
    endif()
    target_link_libraries(${PROJECT_NAME} PRIVATE
        ${_YLIB_NAME}
        hpsocket
        mysqlcppconn
        hiredis
        curl
        ssl
        crypto
        pthread
        dl
        rt
        z
    )
endif()
