Annotation of embedaddon/curl/CMake/OtherTests.cmake, revision 1.1.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>