Kaynağa Gözat

CMake Module for finding winsock

Matt Clarkson 10 yıl önce
ebeveyn
işleme
03a3f18c83
1 değiştirilmiş dosya ile 102 ekleme ve 0 silme
  1. 102 0
      cmake/FindWinSock.cmake

+ 102 - 0
cmake/FindWinSock.cmake

@@ -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()