From e5dfc88eb81e5277753c56f4ed74b2bc190261fc Mon Sep 17 00:00:00 2001 From: Gregor Jasny Date: Mon, 31 May 2021 21:36:37 +0200 Subject: cmake: try well-known send/recv signature for Apple The CMake `try_compile` command is especially slow for the Xcode generator. With this patch applied it first tests for the currently used (and Open Group specified) send/recv signature. In case this fails testing falls-back to the permutations. speed-up: ``` time cmake .. -GNinja -DCMAKE_USE_SECTRANSP=ON -DHTTP_ONLY=ON -DCMAKE_USE_LIBSSH2=OFF before: 11.64s user 11.09s system 55% cpu 40.754 total after: 7.84s user 6.57s system 51% cpu 28.074 total ``` ``` time cmake .. -GXcode -DCMAKE_USE_SECTRANSP=ON -DHTTP_ONLY=ON -DCMAKE_USE_LIBSSH2=OFF before: 217.07s user 104.15s system 60% cpu 8:51.79 total after: 108.76s user 51.80s system 58% cpu 4:32.58 total ``` Closes #7158 --- CMake/OtherTests.cmake | 142 +++++++++++++++++++++++++++---------------------- 1 file changed, 78 insertions(+), 64 deletions(-) (limited to 'CMake') diff --git a/CMake/OtherTests.cmake b/CMake/OtherTests.cmake index 80c0b7275..fed86d8ca 100644 --- a/CMake/OtherTests.cmake +++ b/CMake/OtherTests.cmake @@ -47,6 +47,40 @@ endif() set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +function(curl_cv_func_recv_run_test recv_retv recv_arg1 recv_arg2 recv_arg3 recv_arg4) + unset(curl_cv_func_recv_test CACHE) + check_c_source_compiles(" + ${_source_epilogue} + #ifdef WINSOCK_API_LINKAGE + WINSOCK_API_LINKAGE + #endif + extern ${recv_retv} ${signature_call_conv} + recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4}); + int main(void) { + ${recv_arg1} s=0; + ${recv_arg2} buf=0; + ${recv_arg3} len=0; + ${recv_arg4} flags=0; + ${recv_retv} res = recv(s, buf, len, flags); + (void) res; + return 0; + }" + curl_cv_func_recv_test) + message(STATUS + "Tested: ${recv_retv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})") + if(curl_cv_func_recv_test) + set(curl_cv_func_recv_args + "${recv_arg1},${recv_arg2},${recv_arg3},${recv_arg4},${recv_retv}" PARENT_SCOPE) + set(RECV_TYPE_ARG1 "${recv_arg1}" PARENT_SCOPE) + set(RECV_TYPE_ARG2 "${recv_arg2}" PARENT_SCOPE) + set(RECV_TYPE_ARG3 "${recv_arg3}" PARENT_SCOPE) + set(RECV_TYPE_ARG4 "${recv_arg4}" PARENT_SCOPE) + set(RECV_TYPE_RETV "${recv_retv}" PARENT_SCOPE) + set(HAVE_RECV 1 PARENT_SCOPE) + set(curl_cv_func_recv_done 1 PARENT_SCOPE) + endif() +endfunction() + check_c_source_compiles("${_source_epilogue} int main(void) { recv(0, 0, 0, 0); @@ -54,43 +88,16 @@ int main(void) { }" curl_cv_recv) if(curl_cv_recv) if(NOT DEFINED curl_cv_func_recv_args OR curl_cv_func_recv_args STREQUAL "unknown") + if(APPLE) + curl_cv_func_recv_run_test("ssize_t" "int" "void *" "size_t" "int") + endif() foreach(recv_retv "int" "ssize_t" ) foreach(recv_arg1 "SOCKET" "int" ) foreach(recv_arg2 "char *" "void *" ) foreach(recv_arg3 "int" "size_t" "socklen_t" "unsigned int") foreach(recv_arg4 "int" "unsigned int") if(NOT curl_cv_func_recv_done) - unset(curl_cv_func_recv_test CACHE) - check_c_source_compiles(" - ${_source_epilogue} - #ifdef WINSOCK_API_LINKAGE - WINSOCK_API_LINKAGE - #endif - extern ${recv_retv} ${signature_call_conv} - recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4}); - int main(void) { - ${recv_arg1} s=0; - ${recv_arg2} buf=0; - ${recv_arg3} len=0; - ${recv_arg4} flags=0; - ${recv_retv} res = recv(s, buf, len, flags); - (void) res; - return 0; - }" - curl_cv_func_recv_test) - message(STATUS - "Tested: ${recv_retv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})") - if(curl_cv_func_recv_test) - set(curl_cv_func_recv_args - "${recv_arg1},${recv_arg2},${recv_arg3},${recv_arg4},${recv_retv}") - set(RECV_TYPE_ARG1 "${recv_arg1}") - set(RECV_TYPE_ARG2 "${recv_arg2}") - set(RECV_TYPE_ARG3 "${recv_arg3}") - set(RECV_TYPE_ARG4 "${recv_arg4}") - set(RECV_TYPE_RETV "${recv_retv}") - set(HAVE_RECV 1) - set(curl_cv_func_recv_done 1) - endif() + curl_cv_func_recv_run_test(${recv_retv} ${recv_arg1} ${recv_arg2} ${recv_arg3} ${recv_arg4}) endif() endforeach() endforeach() @@ -114,6 +121,42 @@ endif() set(curl_cv_func_recv_args "${curl_cv_func_recv_args}" CACHE INTERNAL "Arguments for recv") set(HAVE_RECV 1) +function(curl_cv_func_send_run_test send_retv send_arg1 send_arg2 send_arg3 send_arg4) + unset(curl_cv_func_send_test CACHE) + check_c_source_compiles(" + ${_source_epilogue} + #ifdef WINSOCK_API_LINKAGE + WINSOCK_API_LINKAGE + #endif + extern ${send_retv} ${signature_call_conv} + send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4}); + int main(void) { + ${send_arg1} s=0; + ${send_arg2} buf=0; + ${send_arg3} len=0; + ${send_arg4} flags=0; + ${send_retv} res = send(s, buf, len, flags); + (void) res; + return 0; + }" + curl_cv_func_send_test) + message(STATUS + "Tested: ${send_retv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})") + if(curl_cv_func_send_test) + string(REGEX REPLACE "(const) .*" "\\1" send_qual_arg2 "${send_arg2}") + string(REGEX REPLACE "const (.*)" "\\1" send_arg2 "${send_arg2}") + set(curl_cv_func_send_args + "${send_arg1},${send_arg2},${send_arg3},${send_arg4},${send_retv},${send_qual_arg2}" PARENT_SCOPE) + set(SEND_TYPE_ARG1 "${send_arg1}" PARENT_SCOPE) + set(SEND_TYPE_ARG2 "${send_arg2}" PARENT_SCOPE) + set(SEND_TYPE_ARG3 "${send_arg3}" PARENT_SCOPE) + set(SEND_TYPE_ARG4 "${send_arg4}" PARENT_SCOPE) + set(SEND_TYPE_RETV "${send_retv}" PARENT_SCOPE) + set(HAVE_SEND 1 PARENT_SCOPE) + set(curl_cv_func_send_done 1 PARENT_SCOPE) + endif() +endfunction() + check_c_source_compiles("${_source_epilogue} int main(void) { send(0, 0, 0, 0); @@ -121,45 +164,16 @@ int main(void) { }" curl_cv_send) if(curl_cv_send) if(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown") + if(APPLE) + curl_cv_func_send_run_test("ssize_t" "int" "const void *" "size_t" "int") + endif() foreach(send_retv "int" "ssize_t" ) foreach(send_arg1 "SOCKET" "int" "ssize_t" ) foreach(send_arg2 "const char *" "const void *" "void *" "char *") foreach(send_arg3 "int" "size_t" "socklen_t" "unsigned int") foreach(send_arg4 "int" "unsigned int") if(NOT curl_cv_func_send_done) - unset(curl_cv_func_send_test CACHE) - check_c_source_compiles(" - ${_source_epilogue} - #ifdef WINSOCK_API_LINKAGE - WINSOCK_API_LINKAGE - #endif - extern ${send_retv} ${signature_call_conv} - send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4}); - int main(void) { - ${send_arg1} s=0; - ${send_arg2} buf=0; - ${send_arg3} len=0; - ${send_arg4} flags=0; - ${send_retv} res = send(s, buf, len, flags); - (void) res; - return 0; - }" - curl_cv_func_send_test) - message(STATUS - "Tested: ${send_retv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})") - if(curl_cv_func_send_test) - string(REGEX REPLACE "(const) .*" "\\1" send_qual_arg2 "${send_arg2}") - string(REGEX REPLACE "const (.*)" "\\1" send_arg2 "${send_arg2}") - set(curl_cv_func_send_args - "${send_arg1},${send_arg2},${send_arg3},${send_arg4},${send_retv},${send_qual_arg2}") - set(SEND_TYPE_ARG1 "${send_arg1}") - set(SEND_TYPE_ARG2 "${send_arg2}") - set(SEND_TYPE_ARG3 "${send_arg3}") - set(SEND_TYPE_ARG4 "${send_arg4}") - set(SEND_TYPE_RETV "${send_retv}") - set(HAVE_SEND 1) - set(curl_cv_func_send_done 1) - endif() + curl_cv_func_send_run_test("${send_retv}" "${send_arg1}" "${send_arg2}" "${send_arg3}" "${send_arg4}") endif() endforeach() endforeach() -- cgit v1.2.1