Annotation of embedaddon/curl/CMake/OtherTests.cmake, revision 1.1
1.1 ! misho 1: #***************************************************************************
! 2: # _ _ ____ _
! 3: # Project ___| | | | _ \| |
! 4: # / __| | | | |_) | |
! 5: # | (__| |_| | _ <| |___
! 6: # \___|\___/|_| \_\_____|
! 7: #
! 8: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: #
! 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.haxx.se/docs/copyright.html.
! 13: #
! 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.
! 17: #
! 18: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: # KIND, either express or implied.
! 20: #
! 21: ###########################################################################
! 22: include(CheckCSourceCompiles)
! 23: # The begin of the sources (macros and includes)
! 24: set(_source_epilogue "#undef inline")
! 25:
! 26: macro(add_header_include check header)
! 27: if(${check})
! 28: set(_source_epilogue "${_source_epilogue}\n#include <${header}>")
! 29: endif()
! 30: endmacro()
! 31:
! 32: set(signature_call_conv)
! 33: if(HAVE_WINDOWS_H)
! 34: add_header_include(HAVE_WINSOCK2_H "winsock2.h")
! 35: add_header_include(HAVE_WINDOWS_H "windows.h")
! 36: add_header_include(HAVE_WINSOCK_H "winsock.h")
! 37: set(_source_epilogue
! 38: "${_source_epilogue}\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif")
! 39: set(signature_call_conv "PASCAL")
! 40: if(HAVE_LIBWS2_32)
! 41: set(CMAKE_REQUIRED_LIBRARIES ws2_32)
! 42: endif()
! 43: else()
! 44: add_header_include(HAVE_SYS_TYPES_H "sys/types.h")
! 45: add_header_include(HAVE_SYS_SOCKET_H "sys/socket.h")
! 46: endif()
! 47:
! 48: set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
! 49:
! 50: check_c_source_compiles("${_source_epilogue}
! 51: int main(void) {
! 52: recv(0, 0, 0, 0);
! 53: return 0;
! 54: }" curl_cv_recv)
! 55: if(curl_cv_recv)
! 56: if(NOT DEFINED curl_cv_func_recv_args OR curl_cv_func_recv_args STREQUAL "unknown")
! 57: foreach(recv_retv "int" "ssize_t" )
! 58: foreach(recv_arg1 "SOCKET" "int" )
! 59: foreach(recv_arg2 "char *" "void *" )
! 60: foreach(recv_arg3 "int" "size_t" "socklen_t" "unsigned int")
! 61: foreach(recv_arg4 "int" "unsigned int")
! 62: if(NOT curl_cv_func_recv_done)
! 63: unset(curl_cv_func_recv_test CACHE)
! 64: check_c_source_compiles("
! 65: ${_source_epilogue}
! 66: #ifdef WINSOCK_API_LINKAGE
! 67: WINSOCK_API_LINKAGE
! 68: #endif
! 69: extern ${recv_retv} ${signature_call_conv}
! 70: recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4});
! 71: int main(void) {
! 72: ${recv_arg1} s=0;
! 73: ${recv_arg2} buf=0;
! 74: ${recv_arg3} len=0;
! 75: ${recv_arg4} flags=0;
! 76: ${recv_retv} res = recv(s, buf, len, flags);
! 77: (void) res;
! 78: return 0;
! 79: }"
! 80: curl_cv_func_recv_test)
! 81: message(STATUS
! 82: "Tested: ${recv_retv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})")
! 83: if(curl_cv_func_recv_test)
! 84: set(curl_cv_func_recv_args
! 85: "${recv_arg1},${recv_arg2},${recv_arg3},${recv_arg4},${recv_retv}")
! 86: set(RECV_TYPE_ARG1 "${recv_arg1}")
! 87: set(RECV_TYPE_ARG2 "${recv_arg2}")
! 88: set(RECV_TYPE_ARG3 "${recv_arg3}")
! 89: set(RECV_TYPE_ARG4 "${recv_arg4}")
! 90: set(RECV_TYPE_RETV "${recv_retv}")
! 91: set(HAVE_RECV 1)
! 92: set(curl_cv_func_recv_done 1)
! 93: endif()
! 94: endif()
! 95: endforeach()
! 96: endforeach()
! 97: endforeach()
! 98: endforeach()
! 99: endforeach()
! 100: else()
! 101: string(REGEX REPLACE "^([^,]*),[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG1 "${curl_cv_func_recv_args}")
! 102: string(REGEX REPLACE "^[^,]*,([^,]*),[^,]*,[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG2 "${curl_cv_func_recv_args}")
! 103: string(REGEX REPLACE "^[^,]*,[^,]*,([^,]*),[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG3 "${curl_cv_func_recv_args}")
! 104: string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,([^,]*),[^,]*$" "\\1" RECV_TYPE_ARG4 "${curl_cv_func_recv_args}")
! 105: string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" RECV_TYPE_RETV "${curl_cv_func_recv_args}")
! 106: endif()
! 107:
! 108: if(curl_cv_func_recv_args STREQUAL "unknown")
! 109: message(FATAL_ERROR "Cannot find proper types to use for recv args")
! 110: endif()
! 111: else()
! 112: message(FATAL_ERROR "Unable to link function recv")
! 113: endif()
! 114: set(curl_cv_func_recv_args "${curl_cv_func_recv_args}" CACHE INTERNAL "Arguments for recv")
! 115: set(HAVE_RECV 1)
! 116:
! 117: check_c_source_compiles("${_source_epilogue}
! 118: int main(void) {
! 119: send(0, 0, 0, 0);
! 120: return 0;
! 121: }" curl_cv_send)
! 122: if(curl_cv_send)
! 123: if(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown")
! 124: foreach(send_retv "int" "ssize_t" )
! 125: foreach(send_arg1 "SOCKET" "int" "ssize_t" )
! 126: foreach(send_arg2 "const char *" "const void *" "void *" "char *")
! 127: foreach(send_arg3 "int" "size_t" "socklen_t" "unsigned int")
! 128: foreach(send_arg4 "int" "unsigned int")
! 129: if(NOT curl_cv_func_send_done)
! 130: unset(curl_cv_func_send_test CACHE)
! 131: check_c_source_compiles("
! 132: ${_source_epilogue}
! 133: #ifdef WINSOCK_API_LINKAGE
! 134: WINSOCK_API_LINKAGE
! 135: #endif
! 136: extern ${send_retv} ${signature_call_conv}
! 137: send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4});
! 138: int main(void) {
! 139: ${send_arg1} s=0;
! 140: ${send_arg2} buf=0;
! 141: ${send_arg3} len=0;
! 142: ${send_arg4} flags=0;
! 143: ${send_retv} res = send(s, buf, len, flags);
! 144: (void) res;
! 145: return 0;
! 146: }"
! 147: curl_cv_func_send_test)
! 148: message(STATUS
! 149: "Tested: ${send_retv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})")
! 150: if(curl_cv_func_send_test)
! 151: string(REGEX REPLACE "(const) .*" "\\1" send_qual_arg2 "${send_arg2}")
! 152: string(REGEX REPLACE "const (.*)" "\\1" send_arg2 "${send_arg2}")
! 153: set(curl_cv_func_send_args
! 154: "${send_arg1},${send_arg2},${send_arg3},${send_arg4},${send_retv},${send_qual_arg2}")
! 155: set(SEND_TYPE_ARG1 "${send_arg1}")
! 156: set(SEND_TYPE_ARG2 "${send_arg2}")
! 157: set(SEND_TYPE_ARG3 "${send_arg3}")
! 158: set(SEND_TYPE_ARG4 "${send_arg4}")
! 159: set(SEND_TYPE_RETV "${send_retv}")
! 160: set(HAVE_SEND 1)
! 161: set(curl_cv_func_send_done 1)
! 162: endif()
! 163: endif()
! 164: endforeach()
! 165: endforeach()
! 166: endforeach()
! 167: endforeach()
! 168: endforeach()
! 169: else()
! 170: string(REGEX REPLACE "^([^,]*),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG1 "${curl_cv_func_send_args}")
! 171: string(REGEX REPLACE "^[^,]*,([^,]*),[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG2 "${curl_cv_func_send_args}")
! 172: string(REGEX REPLACE "^[^,]*,[^,]*,([^,]*),[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG3 "${curl_cv_func_send_args}")
! 173: string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,([^,]*),[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG4 "${curl_cv_func_send_args}")
! 174: string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*),[^,]*$" "\\1" SEND_TYPE_RETV "${curl_cv_func_send_args}")
! 175: string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" SEND_QUAL_ARG2 "${curl_cv_func_send_args}")
! 176: endif()
! 177:
! 178: if("${curl_cv_func_send_args}" STREQUAL "unknown")
! 179: message(FATAL_ERROR "Cannot find proper types to use for send args")
! 180: endif()
! 181: set(SEND_QUAL_ARG2 "const")
! 182: else()
! 183: message(FATAL_ERROR "Unable to link function send")
! 184: endif()
! 185: set(curl_cv_func_send_args "${curl_cv_func_send_args}" CACHE INTERNAL "Arguments for send")
! 186: set(HAVE_SEND 1)
! 187:
! 188: check_c_source_compiles("${_source_epilogue}
! 189: int main(void) {
! 190: int flag = MSG_NOSIGNAL;
! 191: (void)flag;
! 192: return 0;
! 193: }" HAVE_MSG_NOSIGNAL)
! 194:
! 195: if(NOT HAVE_WINDOWS_H)
! 196: add_header_include(HAVE_SYS_TIME_H "sys/time.h")
! 197: add_header_include(TIME_WITH_SYS_TIME "time.h")
! 198: add_header_include(HAVE_TIME_H "time.h")
! 199: endif()
! 200: check_c_source_compiles("${_source_epilogue}
! 201: int main(void) {
! 202: struct timeval ts;
! 203: ts.tv_sec = 0;
! 204: ts.tv_usec = 0;
! 205: (void)ts;
! 206: return 0;
! 207: }" HAVE_STRUCT_TIMEVAL)
! 208:
! 209: set(HAVE_SIG_ATOMIC_T 1)
! 210: set(CMAKE_REQUIRED_FLAGS)
! 211: if(HAVE_SIGNAL_H)
! 212: set(CMAKE_REQUIRED_FLAGS "-DHAVE_SIGNAL_H")
! 213: set(CMAKE_EXTRA_INCLUDE_FILES "signal.h")
! 214: endif()
! 215: check_type_size("sig_atomic_t" SIZEOF_SIG_ATOMIC_T)
! 216: if(HAVE_SIZEOF_SIG_ATOMIC_T)
! 217: check_c_source_compiles("
! 218: #ifdef HAVE_SIGNAL_H
! 219: # include <signal.h>
! 220: #endif
! 221: int main(void) {
! 222: static volatile sig_atomic_t dummy = 0;
! 223: (void)dummy;
! 224: return 0;
! 225: }" HAVE_SIG_ATOMIC_T_NOT_VOLATILE)
! 226: if(NOT HAVE_SIG_ATOMIC_T_NOT_VOLATILE)
! 227: set(HAVE_SIG_ATOMIC_T_VOLATILE 1)
! 228: endif()
! 229: endif()
! 230:
! 231: if(HAVE_WINDOWS_H)
! 232: set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h)
! 233: else()
! 234: set(CMAKE_EXTRA_INCLUDE_FILES)
! 235: if(HAVE_SYS_SOCKET_H)
! 236: set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
! 237: endif()
! 238: endif()
! 239:
! 240: check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE)
! 241: if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE)
! 242: set(HAVE_STRUCT_SOCKADDR_STORAGE 1)
! 243: endif()
! 244:
! 245: unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
! 246:
! 247: if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
! 248: # if not cross-compilation...
! 249: include(CheckCSourceRuns)
! 250: set(CMAKE_REQUIRED_FLAGS "")
! 251: if(HAVE_SYS_POLL_H)
! 252: set(CMAKE_REQUIRED_FLAGS "-DHAVE_SYS_POLL_H")
! 253: elseif(HAVE_POLL_H)
! 254: set(CMAKE_REQUIRED_FLAGS "-DHAVE_POLL_H")
! 255: endif()
! 256: check_c_source_runs("
! 257: #include <stdlib.h>
! 258: #include <sys/time.h>
! 259:
! 260: #ifdef HAVE_SYS_POLL_H
! 261: # include <sys/poll.h>
! 262: #elif HAVE_POLL_H
! 263: # include <poll.h>
! 264: #endif
! 265:
! 266: int main(void)
! 267: {
! 268: if(0 != poll(0, 0, 10)) {
! 269: return 1; /* fail */
! 270: }
! 271: else {
! 272: /* detect the 10.12 poll() breakage */
! 273: struct timeval before, after;
! 274: int rc;
! 275: size_t us;
! 276:
! 277: gettimeofday(&before, NULL);
! 278: rc = poll(NULL, 0, 500);
! 279: gettimeofday(&after, NULL);
! 280:
! 281: us = (after.tv_sec - before.tv_sec) * 1000000 +
! 282: (after.tv_usec - before.tv_usec);
! 283:
! 284: if(us < 400000) {
! 285: return 1;
! 286: }
! 287: }
! 288: return 0;
! 289: }" HAVE_POLL_FINE)
! 290: endif()
! 291:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>