|
@@ -0,0 +1,102 @@
|
|
|
+#.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()
|