| #.rst: |
| # FindWinSock |
| # -------- |
| # |
| # Find the native realtime includes and library. |
| # |
| # IMPORTED Targets |
| # ^^^^^^^^^^^^^^^^ |
| # |
| # This module defines :prop_tgt:`IMPORTED` target ``WINSOCK::WINSOCK``, if |
| # WINSOCK has been found. |
| # |
| # Result Variables |
| # ^^^^^^^^^^^^^^^^ |
| # |
| # This module defines the following variables: |
| # |
| # :: |
| # |
| # WINSOCK_INCLUDE_DIRS - where to find winsock.h, etc. |
| # WINSOCK_LIBRARIES - List of libraries when using librt. |
| # WINSOCK_FOUND - True if realtime library found. |
| # |
| # Hints |
| # ^^^^^ |
| # |
| # A user may set ``WINSOCK_ROOT`` to a realtime installation root to tell this |
| # module where to look. |
| |
| macro(REMOVE_DUPLICATE_PATHS LIST_VAR) |
| set(WINSOCK_LIST "") |
| foreach(PATH IN LISTS ${LIST_VAR}) |
| get_filename_component(PATH "${PATH}" REALPATH) |
| list(APPEND WINSOCK_LIST "${PATH}") |
| endforeach(PATH) |
| set(${LIST_VAR} ${WINSOCK_LIST}) |
| list(REMOVE_DUPLICATES ${LIST_VAR}) |
| endmacro(REMOVE_DUPLICATE_PATHS) |
| |
| set(WINSOCK_INCLUDE_PATHS "${WINSOCK_ROOT}/include/") |
| if(MINGW) |
| execute_process( |
| COMMAND ${CMAKE_C_COMPILER} -xc -E -v - |
| RESULT_VARIABLE RESULT |
| INPUT_FILE nul |
| ERROR_VARIABLE ERR |
| OUTPUT_QUIET |
| ) |
| if (NOT RESULT) |
| string(FIND "${ERR}" "#include <...> search starts here:" START) |
| string(FIND "${ERR}" "End of search list." END) |
| if (NOT ${START} EQUAL -1 AND NOT ${END} EQUAL -1) |
| math(EXPR START "${START} + 36") |
| math(EXPR END "${END} - 1") |
| math(EXPR LENGTH "${END} - ${START}") |
| string(SUBSTRING "${ERR}" ${START} ${LENGTH} WINSOCK_INCLUDE_PATHS) |
| string(REPLACE "\n " ";" WINSOCK_INCLUDE_PATHS "${WINSOCK_INCLUDE_PATHS}") |
| list(REVERSE WINSOCK_INCLUDE_PATHS) |
| endif() |
| endif() |
| endif() |
| remove_duplicate_paths(WINSOCK_INCLUDE_PATHS) |
| |
| set(WINSOCK_LIBRARY_PATHS "${WINSOCK_ROOT}/lib/") |
| if(MINGW) |
| execute_process( |
| COMMAND ${CMAKE_C_COMPILER} -print-search-dirs |
| RESULT_VARIABLE RESULT |
| OUTPUT_VARIABLE OUT |
| ERROR_QUIET |
| ) |
| if (NOT RESULT) |
| string(REGEX MATCH "libraries: =([^\r\n]*)" OUT "${OUT}") |
| list(APPEND WINSOCK_LIBRARY_PATHS "${CMAKE_MATCH_1}") |
| endif() |
| endif() |
| if (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "AMD64" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4) |
| list(APPEND WINSOCK_LIBRARY_PATHS "C:/Windows/SysWOW64") |
| endif() |
| list(APPEND WINSOCK_LIBRARY_PATHS "C:/Windows/System32") |
| remove_duplicate_paths(WINSOCK_LIBRARY_PATHS) |
| |
| find_path(WINSOCK_INCLUDE_DIRS |
| NAMES winsock2.h |
| PATHS ${WINSOCK_INCLUDE_PATHS} |
| ) |
| find_library(WINSOCK_LIBRARIES ws2_32 |
| PATHS ${WINSOCK_LIBRARY_PATHS} |
| NO_DEFAULT_PATH |
| ) |
| include(FindPackageHandleStandardArgs) |
| find_package_handle_standard_args(WinSock DEFAULT_MSG WINSOCK_LIBRARIES WINSOCK_INCLUDE_DIRS) |
| mark_as_advanced(WINSOCK_INCLUDE_DIRS WINSOCK_LIBRARIES) |
| |
| if(WINSOCK_FOUND) |
| if(NOT TARGET WINSOCK::WINSOCK) |
| add_library(WINSOCK::WINSOCK UNKNOWN IMPORTED) |
| set_target_properties(WINSOCK::WINSOCK PROPERTIES |
| IMPORTED_LOCATION "${WINSOCK_LIBRARIES}" |
| INTERFACE_INCLUDE_DIRECTORIES "${WINSOCK_INCLUDE_DIRS}") |
| endif() |
| endif() |