
list(APPEND netplussrc
    crypto/sha.cpp
    crypto/base64.cpp
    crypto/des.cpp
    crypto/aes.cpp
    crypto/rc4.cpp
    crypto/rsa.cpp
    crypto/x509.cpp
    crypto/ecc_u256.cpp
    crypto/ecc_p256.cpp
    crypto/hkdf.cpp
    crypto/rsa_pss_sha256.cpp
    crypto/rsa_pss_sha384.cpp
    crypto/rsa_pkcs1_sha256.cpp
    crypto/curve25519.cpp
    crypto/pkcs12.cpp
    crypto/tls.cpp
    utils/certgen.cpp
    exception.cpp
    connection.cpp
    ssl.cpp
    quic.cpp
)

if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
    list(APPEND netplussrc
        windows/socket.cpp
        windows/udp.cpp
        windows/tcp.cpp
        windows/random.cpp
    )
else()
    list(APPEND netplussrc
        posix/socket.cpp
        posix/udp.cpp
        posix/tcp.cpp
        posix/random.cpp
    )
endif()

if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
    list(APPEND netplussrc event/epoll.cpp)
elseif(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows")
    if("${CMAKE_HOST_SYSTEM_VERSION}" VERSION_LESS "5.1")
        list(APPEND netplussrc event/poll.cpp)
    else()
        list(APPEND netplussrc event/iocp.cpp)
    endif()
elseif("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "BSD" OR "${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Darwin")
    list(APPEND netplussrc event/kqueue.cpp)
else()
    list(APPEND netplussrc event/poll.cpp)
endif()

set(headers
    socket.h
    exception.h
    eventapi.h
    connection.h
    random.h
    crypto/base64.h
    crypto/des.h
    crypto/aes.h
    crypto/rc4.h
    crypto/rsa.h
    crypto/x509.h
    crypto/ecc_u256.h
    crypto/ecc_p256.h
    crypto/hkdf.h
    crypto/rsa_pss_sha256.h
    crypto/rsa_pss_sha384.h
    crypto/rsa_pkcs1_sha256.h
    crypto/sha.h
    crypto/pkcs12.h
    crypto/tls.h
    crypto/curve25519.h
    utils/certgen.h
)

add_library(netplus SHARED ${netplussrc} ${headers})
set_property(TARGET netplus PROPERTY ENABLE_EXPORTS 1)

add_library(netplus-static STATIC ${netplussrc} ${headers})
set_property(TARGET netplus-static PROPERTY ENABLE_EXPORTS 1)

target_sources(netplus PUBLIC
    FILE_SET publicheaders
    TYPE HEADERS
    BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
    FILES ${headers}
)

target_include_directories(netplus
  INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<INSTALL_INTERFACE:include/netplus>
  PRIVATE
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

target_sources(netplus-static PUBLIC
    FILE_SET publicheaders
    TYPE HEADERS
    BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
    FILES ${headers}
)

target_include_directories(netplus-static
  INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<INSTALL_INTERFACE:include/netplus>
  PRIVATE
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
)

if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows")
   target_link_libraries(netplus ws2_32)
   target_link_libraries(netplus-static  ws2_32)
else()
   target_link_libraries(netplus pthread) #PUBLIC MbedTLS::mbedcrypto MbedTLS::mbedtls MbedTLS::mbedx509)
   target_link_libraries(netplus-static pthread)
endif()

set_property(TARGET netplus PROPERTY VERSION ${Upstream_VERSION})
set_property(TARGET netplus PROPERTY SOVERSION ${LIBV})
set_property(TARGET netplus PROPERTY INTERFACE_systempp_MAJOR_VERSION ${LIBV})
set_property(TARGET netplus APPEND PROPERTY COMPATIBLE_INTERFACE_STRING netplus_MAJOR_VERSION)

install(
   TARGETS netplus netplus-static 
   EXPORT netplusTargets
   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
   FILE_SET publicheaders DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/netplus
)

set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/libnetplus)

include(CMakePackageConfigHelpers)

configure_package_config_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/../libnetplusConfig.cmake.in"
    "${CMAKE_BINARY_DIR}/libnetplusConfig.cmake"
    INSTALL_DESTINATION ${ConfigPackageLocation}
)

export(EXPORT netplusTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/libnetplusTargets.cmake"
  NAMESPACE netplus::
)

include(CMakePackageConfigHelpers)

write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/libnetplusVersion.cmake"
  VERSION ${Upstream_VERSION}
  COMPATIBILITY AnyNewerVersion
)

install(EXPORT netplusTargets
  FILE
    libnetplusTargets.cmake
  NAMESPACE
    netplus::
  DESTINATION
    ${ConfigPackageLocation}
)

install(
  FILES
    "${CMAKE_CURRENT_BINARY_DIR}/libnetplusVersion.cmake"
    "${CMAKE_BINARY_DIR}/libnetplusConfig.cmake"
  DESTINATION
    ${ConfigPackageLocation}
  COMPONENT
    Devel
)

if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows")
    set(CPACK_GENERATOR WIX)
    set(CPACK_PACKAGE_NAME "libnetplus")
    set(CPACK_PACKAGE_VENDOR "tuxist.de")
    set(CPACK_WIX_UPGRADE_GUID "A4999F8C-2D6A-4F55-AF9F-0EE8F40BE489")
    set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "libnetplus - A C++ Socket and Event Library")
    set(CPACK_PACKAGE_VERSION "1.0.0")
    set(CPACK_PACKAGE_VERSION_MAJOR "1")
    set(CPACK_PACKAGE_VERSION_MINOR "0")
    set(CPACK_PACKAGE_VERSION_PATCH "0")
    set(CPACK_PACKAGE_INSTALL_DIRECTORY "libnetplus")
    INCLUDE(CPack)
endif()
