File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / CMake / OtherTests.cmake
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:16 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>