1 #***************************************************************************
3 # Project ___| | | | _ \| |
5 # | (__| |_| | _ <| |___
6 # \___|\___/|_| \_\_____|
8 # Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
10 # This software is licensed as described in the file COPYING, which
11 # you should have received as part of this distribution. The terms
12 # are also available at https://curl.se/docs/copyright.html.
14 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 # copies of the Software, and permit persons to whom the Software is
16 # furnished to do so, under the terms of the COPYING file.
18 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 # KIND, either express or implied.
21 ###########################################################################
22 include(CheckCSourceCompiles)
23 # The begin of the sources (macros and includes)
24 set(_source_epilogue "#undef inline")
26 macro(add_header_include check header)
28 set(_source_epilogue "${_source_epilogue}\n#include <${header}>")
32 set(signature_call_conv)
34 add_header_include(HAVE_WINSOCK2_H "winsock2.h")
35 add_header_include(HAVE_WINDOWS_H "windows.h")
37 "${_source_epilogue}\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif")
38 set(signature_call_conv "PASCAL")
40 set(CMAKE_REQUIRED_LIBRARIES ws2_32)
43 add_header_include(HAVE_SYS_TYPES_H "sys/types.h")
44 add_header_include(HAVE_SYS_SOCKET_H "sys/socket.h")
47 set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
49 if(1) # CMake hard-codes these
50 set(RECV_TYPE_ARG1 "curl_socket_t")
51 set(RECV_TYPE_ARG2 "char *")
52 set(RECV_TYPE_ARG3 "size_t")
53 set(RECV_TYPE_ARG4 "int")
54 set(RECV_TYPE_RETV "ssize_t")
56 function(curl_cv_func_recv_run_test recv_retv recv_arg1 recv_arg2 recv_arg3 recv_arg4)
57 unset(curl_cv_func_recv_test CACHE)
58 check_c_source_compiles("
60 #ifdef WINSOCK_API_LINKAGE
63 extern ${recv_retv} ${signature_call_conv}
64 recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4});
70 ${recv_retv} res = recv(s, buf, len, flags);
74 curl_cv_func_recv_test)
76 "Tested: ${recv_retv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})")
77 if(curl_cv_func_recv_test)
78 set(curl_cv_func_recv_args
79 "${recv_arg1},${recv_arg2},${recv_arg3},${recv_arg4},${recv_retv}" PARENT_SCOPE)
80 set(RECV_TYPE_ARG1 "${recv_arg1}" PARENT_SCOPE)
81 set(RECV_TYPE_ARG2 "${recv_arg2}" PARENT_SCOPE)
82 set(RECV_TYPE_ARG3 "${recv_arg3}" PARENT_SCOPE)
83 set(RECV_TYPE_ARG4 "${recv_arg4}" PARENT_SCOPE)
84 set(RECV_TYPE_RETV "${recv_retv}" PARENT_SCOPE)
85 set(HAVE_RECV 1 PARENT_SCOPE)
86 set(curl_cv_func_recv_done 1 PARENT_SCOPE)
90 check_c_source_compiles("${_source_epilogue}
96 if(NOT DEFINED curl_cv_func_recv_args OR curl_cv_func_recv_args STREQUAL "unknown")
98 curl_cv_func_recv_run_test("ssize_t" "int" "void *" "size_t" "int")
100 foreach(recv_retv "int" "ssize_t" )
101 foreach(recv_arg1 "SOCKET" "int" )
102 foreach(recv_arg2 "char *" "void *" )
103 foreach(recv_arg3 "int" "size_t" "socklen_t" "unsigned int")
104 foreach(recv_arg4 "int" "unsigned int")
105 if(NOT curl_cv_func_recv_done)
106 curl_cv_func_recv_run_test(${recv_retv} ${recv_arg1} ${recv_arg2} ${recv_arg3} ${recv_arg4})
114 string(REGEX REPLACE "^([^,]*),[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG1 "${curl_cv_func_recv_args}")
115 string(REGEX REPLACE "^[^,]*,([^,]*),[^,]*,[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG2 "${curl_cv_func_recv_args}")
116 string(REGEX REPLACE "^[^,]*,[^,]*,([^,]*),[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG3 "${curl_cv_func_recv_args}")
117 string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,([^,]*),[^,]*$" "\\1" RECV_TYPE_ARG4 "${curl_cv_func_recv_args}")
118 string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" RECV_TYPE_RETV "${curl_cv_func_recv_args}")
121 if(curl_cv_func_recv_args STREQUAL "unknown")
122 message(FATAL_ERROR "Cannot find proper types to use for recv args")
125 message(FATAL_ERROR "Unable to link function recv")
127 set(curl_cv_func_recv_args "${curl_cv_func_recv_args}" CACHE INTERNAL "Arguments for recv")
131 if(1) # CMake hard-codes these
132 set(SEND_QUAL_ARG2 " ")
133 set(SEND_TYPE_ARG1 "curl_socket_t")
134 set(SEND_TYPE_ARG2 "char *")
135 set(SEND_TYPE_ARG3 "size_t")
136 set(SEND_TYPE_ARG4 "int")
137 set(SEND_TYPE_RETV "ssize_t")
139 function(curl_cv_func_send_run_test send_retv send_arg1 send_arg2 send_arg3 send_arg4)
140 unset(curl_cv_func_send_test CACHE)
141 check_c_source_compiles("
143 #ifdef WINSOCK_API_LINKAGE
146 extern ${send_retv} ${signature_call_conv}
147 send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4});
152 ${send_arg4} flags=0;
153 ${send_retv} res = send(s, buf, len, flags);
157 curl_cv_func_send_test)
159 "Tested: ${send_retv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})")
160 if(curl_cv_func_send_test)
161 string(REGEX REPLACE "(const) .*" "\\1" send_qual_arg2 "${send_arg2}")
162 string(REGEX REPLACE "const (.*)" "\\1" send_arg2 "${send_arg2}")
163 set(curl_cv_func_send_args
164 "${send_arg1},${send_arg2},${send_arg3},${send_arg4},${send_retv},${send_qual_arg2}" PARENT_SCOPE)
165 set(SEND_TYPE_ARG1 "${send_arg1}" PARENT_SCOPE)
166 set(SEND_TYPE_ARG2 "${send_arg2}" PARENT_SCOPE)
167 set(SEND_TYPE_ARG3 "${send_arg3}" PARENT_SCOPE)
168 set(SEND_TYPE_ARG4 "${send_arg4}" PARENT_SCOPE)
169 set(SEND_TYPE_RETV "${send_retv}" PARENT_SCOPE)
170 set(HAVE_SEND 1 PARENT_SCOPE)
171 set(curl_cv_func_send_done 1 PARENT_SCOPE)
175 check_c_source_compiles("${_source_epilogue}
181 if(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown")
183 curl_cv_func_send_run_test("ssize_t" "int" "const void *" "size_t" "int")
185 foreach(send_retv "int" "ssize_t" )
186 foreach(send_arg1 "SOCKET" "int" "ssize_t" )
187 foreach(send_arg2 "const char *" "const void *" "void *" "char *")
188 foreach(send_arg3 "int" "size_t" "socklen_t" "unsigned int")
189 foreach(send_arg4 "int" "unsigned int")
190 if(NOT curl_cv_func_send_done)
191 curl_cv_func_send_run_test("${send_retv}" "${send_arg1}" "${send_arg2}" "${send_arg3}" "${send_arg4}")
199 string(REGEX REPLACE "^([^,]*),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG1 "${curl_cv_func_send_args}")
200 string(REGEX REPLACE "^[^,]*,([^,]*),[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG2 "${curl_cv_func_send_args}")
201 string(REGEX REPLACE "^[^,]*,[^,]*,([^,]*),[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG3 "${curl_cv_func_send_args}")
202 string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,([^,]*),[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG4 "${curl_cv_func_send_args}")
203 string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*),[^,]*$" "\\1" SEND_TYPE_RETV "${curl_cv_func_send_args}")
204 string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" SEND_QUAL_ARG2 "${curl_cv_func_send_args}")
207 if("${curl_cv_func_send_args}" STREQUAL "unknown")
208 message(FATAL_ERROR "Cannot find proper types to use for send args")
210 set(SEND_QUAL_ARG2 "const")
212 message(FATAL_ERROR "Unable to link function send")
214 set(curl_cv_func_send_args "${curl_cv_func_send_args}" CACHE INTERNAL "Arguments for send")
218 check_c_source_compiles("${_source_epilogue}
220 int flag = MSG_NOSIGNAL;
223 }" HAVE_MSG_NOSIGNAL)
225 if(NOT HAVE_WINDOWS_H)
226 add_header_include(HAVE_SYS_TIME_H "sys/time.h")
227 add_header_include(TIME_WITH_SYS_TIME "time.h")
228 add_header_include(HAVE_TIME_H "time.h")
230 check_c_source_compiles("${_source_epilogue}
237 }" HAVE_STRUCT_TIMEVAL)
240 set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h)
242 set(CMAKE_EXTRA_INCLUDE_FILES)
243 if(HAVE_SYS_SOCKET_H)
244 set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
248 check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE)
249 if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE)
250 set(HAVE_STRUCT_SOCKADDR_STORAGE 1)
253 unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
255 if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
256 if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "iOS")
257 # only try this on non-apple platforms
259 # if not cross-compilation...
260 include(CheckCSourceRuns)
261 set(CMAKE_REQUIRED_FLAGS "")
263 set(CMAKE_REQUIRED_FLAGS "-DHAVE_SYS_POLL_H")
265 set(CMAKE_REQUIRED_FLAGS "-DHAVE_POLL_H")
267 check_c_source_runs("
269 #include <sys/time.h>
271 #ifdef HAVE_SYS_POLL_H
272 # include <sys/poll.h>
279 if(0 != poll(0, 0, 10)) {
283 /* detect the 10.12 poll() breakage */
284 struct timeval before, after;
288 gettimeofday(&before, NULL);
289 rc = poll(NULL, 0, 500);
290 gettimeofday(&after, NULL);
292 us = (after.tv_sec - before.tv_sec) * 1000000 +
293 (after.tv_usec - before.tv_usec);