cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME shadowsocks-uvw)
project(${PROJECT_NAME})
set(VERSION 0.0.1)
# Detect linux
if (UNIX AND NOT APPLE)
    set(LINUX TRUE)
endif ()
add_compile_options($<$<CXX_COMPILER_ID:MSVC>:/MP>)
include(CTest)
set(SSR_UVW_WITH_QT 1 CACHE BOOL "build with qt")
option(BUILD_SODIUM_TESTING "build sodium testing when static link sodium" OFF)
option(USE_SYSTEM_SODIUM "use system sodium" OFF)
option(USE_SYSTEM_LIBUV "use system libuv" OFF)
option(STATIC_LINK_LIBUV "static link libuv" ON)
option(STATIC_LINK_SODIUM "static link libsodium" ON)
option(USE_SYSTEM_MBEDTLS "use system mbedtls" ON)
if(NOT USE_SYSTEM_SODIUM AND NOT STATIC_LINK_SODIUM)
    message(FATAL_ERROR "Not support dynamic linking libsodium without using system libsodium!")
endif()
if(NOT USE_SYSTEM_LIBUV AND NOT STATIC_LINK_LIBUV)
    message(FATAL_ERROR "Not support dynamic linking libuv without using system libuv!")
endif()


if(NOT USE_SYSTEM_SODIUM)
    configure_file(cmake/souium.cmake ${CMAKE_CURRENT_SOURCE_DIR}/libsodium/CMakeLists.txt COPYONLY)
    if(NOT STATIC_LINK_SODIUM)
        add_definitions(-DSODIUM_BUILD_SHARED_LIBS)
    endif()
    add_subdirectory(libsodium)
    set(sodium_LIBRARIES sodium::sodium)
elseif(USE_SYSTEM_SODIUM AND STATIC_LINK_SODIUM)
    add_definitions(-Dsodium_USE_STATIC_LIBS)
endif()
if(NOT USE_SYSTEM_LIBUV)
    set(LibUV_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libuv/include)
    add_subdirectory(libuv)
    if(STATIC_LINK_LIBUV)
        add_library(uv::uv-static ALIAS uv_a)
        set_target_properties(uv PROPERTIES EXCLUDE_FROM_ALL TRUE)
        set_target_properties(uv_a PROPERTIES POSITION_INDEPENDENT_CODE 1)
        set(LibUV_LIBRARIES uv::uv-static)
    else()
        add_library(uv::uv-shared ALIAS uv)
        set_target_properties(uv PROPERTIES POSITION_INDEPENDENT_CODE 1)
        set(LibUV_LIBRARIES uv::uv-shared)
    endif()
endif()

#mbedtls
if (NOT USE_SYSTEM_MBEDTLS)
    set(MBEDTLS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mbedtls/include)
    option(ENABLE_TESTING "" OFF)
    add_subdirectory(mbedtls EXCLUDE_FROM_ALL)
    add_library(mbed::crypto ALIAS "mbedcrypto")
    add_library(mbed::x509 ALIAS "mbedx509")
    add_library(mbed::tls ALIAS "mbedtls")
    set(LIBCRYPTO mbed::crypto mbed::tls mbed::crypto)
else()
    find_path(MBEDTLS_INCLUDE_DIR NAMES aes.h PATH_SUFFIXES mbedtls)
    find_library(MBEDCRYPTO NAMES mbedcrypto)
    find_library(MBEDX509 NAMES mbedx509)
    find_library(MBEDTLS NAMES mbedtls)
    set(LIBCRYPTO ${MBEDCRYPTO} ${MBEDX509} ${MBEDTLS})
endif()


include ( cmake/dist.cmake )
include ( configure )
include (cmake/libbloom.cmake)
configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h )


include_directories( ${CMAKE_CURRENT_BINARY_DIR} )

add_subdirectory(src)
if (BUILD_TESTING)
   message("build ssr uvw testing")
   add_subdirectory(test)
endif ()
