]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | #.rst: |
2 | # FindWinSock | |
3 | # -------- | |
4 | # | |
5 | # Find the native realtime includes and library. | |
6 | # | |
7 | # IMPORTED Targets | |
8 | # ^^^^^^^^^^^^^^^^ | |
9 | # | |
10 | # This module defines :prop_tgt:`IMPORTED` target ``WINSOCK::WINSOCK``, if | |
11 | # WINSOCK has been found. | |
12 | # | |
13 | # Result Variables | |
14 | # ^^^^^^^^^^^^^^^^ | |
15 | # | |
16 | # This module defines the following variables: | |
17 | # | |
18 | # :: | |
19 | # | |
20 | # WINSOCK_INCLUDE_DIRS - where to find winsock.h, etc. | |
21 | # WINSOCK_LIBRARIES - List of libraries when using librt. | |
22 | # WINSOCK_FOUND - True if realtime library found. | |
23 | # | |
24 | # Hints | |
25 | # ^^^^^ | |
26 | # | |
27 | # A user may set ``WINSOCK_ROOT`` to a realtime installation root to tell this | |
28 | # module where to look. | |
29 | ||
30 | macro(REMOVE_DUPLICATE_PATHS LIST_VAR) | |
31 | set(WINSOCK_LIST "") | |
32 | foreach(PATH IN LISTS ${LIST_VAR}) | |
33 | get_filename_component(PATH "${PATH}" REALPATH) | |
34 | list(APPEND WINSOCK_LIST "${PATH}") | |
35 | endforeach(PATH) | |
36 | set(${LIST_VAR} ${WINSOCK_LIST}) | |
37 | list(REMOVE_DUPLICATES ${LIST_VAR}) | |
38 | endmacro(REMOVE_DUPLICATE_PATHS) | |
39 | ||
40 | set(WINSOCK_INCLUDE_PATHS "${WINSOCK_ROOT}/include/") | |
41 | if(MINGW) | |
42 | execute_process( | |
43 | COMMAND ${CMAKE_C_COMPILER} -xc -E -v - | |
44 | RESULT_VARIABLE RESULT | |
45 | INPUT_FILE nul | |
46 | ERROR_VARIABLE ERR | |
47 | OUTPUT_QUIET | |
48 | ) | |
49 | if (NOT RESULT) | |
50 | string(FIND "${ERR}" "#include <...> search starts here:" START) | |
51 | string(FIND "${ERR}" "End of search list." END) | |
52 | if (NOT ${START} EQUAL -1 AND NOT ${END} EQUAL -1) | |
53 | math(EXPR START "${START} + 36") | |
54 | math(EXPR END "${END} - 1") | |
55 | math(EXPR LENGTH "${END} - ${START}") | |
56 | string(SUBSTRING "${ERR}" ${START} ${LENGTH} WINSOCK_INCLUDE_PATHS) | |
57 | string(REPLACE "\n " ";" WINSOCK_INCLUDE_PATHS "${WINSOCK_INCLUDE_PATHS}") | |
58 | list(REVERSE WINSOCK_INCLUDE_PATHS) | |
59 | endif() | |
60 | endif() | |
61 | endif() | |
62 | remove_duplicate_paths(WINSOCK_INCLUDE_PATHS) | |
63 | ||
64 | set(WINSOCK_LIBRARY_PATHS "${WINSOCK_ROOT}/lib/") | |
65 | if(MINGW) | |
66 | execute_process( | |
67 | COMMAND ${CMAKE_C_COMPILER} -print-search-dirs | |
68 | RESULT_VARIABLE RESULT | |
69 | OUTPUT_VARIABLE OUT | |
70 | ERROR_QUIET | |
71 | ) | |
72 | if (NOT RESULT) | |
73 | string(REGEX MATCH "libraries: =([^\r\n]*)" OUT "${OUT}") | |
74 | list(APPEND WINSOCK_LIBRARY_PATHS "${CMAKE_MATCH_1}") | |
75 | endif() | |
76 | endif() | |
77 | if (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "AMD64" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4) | |
78 | list(APPEND WINSOCK_LIBRARY_PATHS "C:/Windows/SysWOW64") | |
79 | endif() | |
80 | list(APPEND WINSOCK_LIBRARY_PATHS "C:/Windows/System32") | |
81 | remove_duplicate_paths(WINSOCK_LIBRARY_PATHS) | |
82 | ||
83 | find_path(WINSOCK_INCLUDE_DIRS | |
84 | NAMES winsock2.h | |
85 | PATHS ${WINSOCK_INCLUDE_PATHS} | |
86 | ) | |
87 | find_library(WINSOCK_LIBRARIES ws2_32 | |
88 | PATHS ${WINSOCK_LIBRARY_PATHS} | |
89 | NO_DEFAULT_PATH | |
90 | ) | |
91 | include(FindPackageHandleStandardArgs) | |
92 | find_package_handle_standard_args(WinSock DEFAULT_MSG WINSOCK_LIBRARIES WINSOCK_INCLUDE_DIRS) | |
93 | mark_as_advanced(WINSOCK_INCLUDE_DIRS WINSOCK_LIBRARIES) | |
94 | ||
95 | if(WINSOCK_FOUND) | |
96 | if(NOT TARGET WINSOCK::WINSOCK) | |
97 | add_library(WINSOCK::WINSOCK UNKNOWN IMPORTED) | |
98 | set_target_properties(WINSOCK::WINSOCK PROPERTIES | |
99 | IMPORTED_LOCATION "${WINSOCK_LIBRARIES}" | |
100 | INTERFACE_INCLUDE_DIRECTORIES "${WINSOCK_INCLUDE_DIRS}") | |
101 | endif() | |
102 | endif() |