From: Viktor Szakats Date: Sat, 5 Oct 2024 23:01:22 +0000 (+0200) Subject: cmake: untangle feature detection interdependencies X-Git-Tag: curl-8_11_0~171 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8e345057761a8f796403923a96f2c8fd3edca647;p=thirdparty%2Fcurl.git cmake: untangle feature detection interdependencies - reduce `check_include_file_concat()` use to those headers that either depend on a previously detected header, or another header or symbol detection depend on it. - replace `check_symbol_exists()` with `check_function_exists()` for functions that are detected with `AC_CHECK_FUNCS()` in `./configure`. This makes `setmode()` no longer be detected with MSYS, syncing this with `./configure`. Instead `_setmode()` is used now also in CMake MSYS builds. This is consistent with Cygwin builds also. - add comment about which header/symbol detection depends on what header. Based on `./configure` mainly. - form `CURL_TEST_DEFINES` manually, and include only those macros which are actually used in `CMake/CurlTests.c`. - change `curl_internal_test()` to use `CMAKE_REQUIRED_DEFINITIONS`, instead of `CMAKE_REQUIRED_FLAGS` to simplify the logic, and to allow dropping the latter macro completely. - drop `windows.h` from header and symbol checks. - `./configure`: add comment about whether `netinet/in6.h`, `sys/un.h` are indeed meant to be included for all detections. There is a chance they were added there by accident. Detection resuls were cross-checked between 436bbbe7abebf0ee3a2b0bfb3ec5db7ce8c8db4c (master) and 48ff4694e608ccfdedf7ce5bab2b96d6b2c23cda (this PR), for CI GHA Linux, Linux HTTP/3, non-native, macOS and Windows jobs. Closes #15164 --- diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake index 62e0898df7..04f6ed92a0 100644 --- a/CMake/Macros.cmake +++ b/CMake/Macros.cmake @@ -31,7 +31,6 @@ macro(check_include_file_concat _file _variable) check_include_files("${CURL_INCLUDES};${_file}" ${_variable}) if(${_variable}) set(CURL_INCLUDES ${CURL_INCLUDES} ${_file}) - set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D${_variable}") # Apply to curl_internal_test() endif() endmacro() @@ -39,8 +38,7 @@ endmacro() # Return result in variable: CURL_TEST_OUTPUT macro(curl_internal_test _curl_test) if(NOT DEFINED "${_curl_test}") - set(_macro_check_function_definitions - "-D${_curl_test} ${CURL_TEST_DEFINES} ${CMAKE_REQUIRED_FLAGS}") + string(REPLACE ";" " " _cmake_required_definitions "${CMAKE_REQUIRED_DEFINITIONS}") if(CMAKE_REQUIRED_LIBRARIES) set(_curl_test_add_libraries "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") @@ -51,7 +49,7 @@ macro(curl_internal_test _curl_test) ${CMAKE_BINARY_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/CMake/CurlTests.c" CMAKE_FLAGS - "-DCOMPILE_DEFINITIONS:STRING=${_macro_check_function_definitions}" + "-DCOMPILE_DEFINITIONS:STRING=-D${_curl_test} ${CURL_TEST_DEFINES} ${_cmake_required_definitions}" "${_curl_test_add_libraries}" OUTPUT_VARIABLE CURL_TEST_OUTPUT) if(${_curl_test}) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a7e14f55a..515e3ba88c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,7 +169,6 @@ if(WIN32) if(CURL_TARGET_WINDOWS_VERSION) add_definitions("-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}") list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}") # Apply to all feature checks - set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}") # Apply to curl_internal_test() endif() # Detect actual value of _WIN32_WINNT and store as HAVE_WIN32_WINNT @@ -1410,7 +1409,6 @@ endif() if(WIN32) set(CURL_INCLUDES ${CURL_INCLUDES} "winsock2.h") set(CURL_INCLUDES ${CURL_INCLUDES} "ws2tcpip.h") - set(CURL_INCLUDES ${CURL_INCLUDES} "windows.h") if(HAVE_WIN32_WINNT) if(HAVE_WIN32_WINNT LESS 0x0501) @@ -1433,52 +1431,73 @@ if(WIN32) endif() endif() -check_include_file_concat("sys/eventfd.h" HAVE_SYS_EVENTFD_H) -check_include_file_concat("sys/filio.h" HAVE_SYS_FILIO_H) -check_include_file_concat("sys/wait.h" HAVE_SYS_WAIT_H) -check_include_file_concat("sys/ioctl.h" HAVE_SYS_IOCTL_H) -check_include_file_concat("sys/param.h" HAVE_SYS_PARAM_H) -check_include_file_concat("sys/poll.h" HAVE_SYS_POLL_H) -check_include_file_concat("sys/resource.h" HAVE_SYS_RESOURCE_H) +# Detect headers + +# Use check_include_file_concat() for headers required by subsequent +# check_include_file_concat() or check_symbol_exists() detections. +# Order for these is significant. +check_include_file("sys/eventfd.h" HAVE_SYS_EVENTFD_H) +check_include_file("sys/filio.h" HAVE_SYS_FILIO_H) +check_include_file("sys/wait.h" HAVE_SYS_WAIT_H) +check_include_file("sys/ioctl.h" HAVE_SYS_IOCTL_H) +check_include_file("sys/param.h" HAVE_SYS_PARAM_H) +check_include_file("sys/poll.h" HAVE_SYS_POLL_H) +check_include_file("sys/resource.h" HAVE_SYS_RESOURCE_H) check_include_file_concat("sys/select.h" HAVE_SYS_SELECT_H) check_include_file_concat("sys/socket.h" HAVE_SYS_SOCKET_H) -check_include_file_concat("sys/sockio.h" HAVE_SYS_SOCKIO_H) -check_include_file_concat("sys/stat.h" HAVE_SYS_STAT_H) +check_include_file("sys/sockio.h" HAVE_SYS_SOCKIO_H) +check_include_file("sys/stat.h" HAVE_SYS_STAT_H) check_include_file_concat("sys/time.h" HAVE_SYS_TIME_H) check_include_file_concat("sys/types.h" HAVE_SYS_TYPES_H) -check_include_file_concat("sys/un.h" HAVE_SYS_UN_H) -check_include_file_concat("sys/utime.h" HAVE_SYS_UTIME_H) -check_include_file_concat("sys/xattr.h" HAVE_SYS_XATTR_H) +check_include_file("sys/un.h" HAVE_SYS_UN_H) +check_include_file("sys/utime.h" HAVE_SYS_UTIME_H) +check_include_file("sys/xattr.h" HAVE_SYS_XATTR_H) + check_include_file_concat("arpa/inet.h" HAVE_ARPA_INET_H) -check_include_file_concat("dirent.h" HAVE_DIRENT_H) -check_include_file_concat("fcntl.h" HAVE_FCNTL_H) +check_include_file("dirent.h" HAVE_DIRENT_H) +check_include_file("fcntl.h" HAVE_FCNTL_H) check_include_file_concat("ifaddrs.h" HAVE_IFADDRS_H) -check_include_file_concat("io.h" HAVE_IO_H) +check_include_file("io.h" HAVE_IO_H) check_include_file_concat("libgen.h" HAVE_LIBGEN_H) -check_include_file_concat("locale.h" HAVE_LOCALE_H) -check_include_file_concat("net/if.h" HAVE_NET_IF_H) +check_include_file("linux/tcp.h" HAVE_LINUX_TCP_H) +check_include_file("locale.h" HAVE_LOCALE_H) +check_include_file("net/if.h" HAVE_NET_IF_H) check_include_file_concat("netdb.h" HAVE_NETDB_H) check_include_file_concat("netinet/in.h" HAVE_NETINET_IN_H) -check_include_file_concat("netinet/in6.h" HAVE_NETINET_IN6_H) -check_include_file_concat("netinet/tcp.h" HAVE_NETINET_TCP_H) -check_include_file_concat("netinet/udp.h" HAVE_NETINET_UDP_H) -check_include_file("linux/tcp.h" HAVE_LINUX_TCP_H) - -check_include_file_concat("poll.h" HAVE_POLL_H) -check_include_file_concat("pwd.h" HAVE_PWD_H) -check_include_file_concat("stdatomic.h" HAVE_STDATOMIC_H) -check_include_file_concat("stdbool.h" HAVE_STDBOOL_H) -check_include_file_concat("strings.h" HAVE_STRINGS_H) -check_include_file_concat("stropts.h" HAVE_STROPTS_H) -check_include_file_concat("termio.h" HAVE_TERMIO_H) -check_include_file_concat("termios.h" HAVE_TERMIOS_H) +check_include_file("netinet/in6.h" HAVE_NETINET_IN6_H) +check_include_file_concat("netinet/tcp.h" HAVE_NETINET_TCP_H) # sys/types.h (e.g. Cygwin) netinet/in.h +check_include_file_concat("netinet/udp.h" HAVE_NETINET_UDP_H) # sys/types.h (e.g. Cygwin) +check_include_file("poll.h" HAVE_POLL_H) +check_include_file("pwd.h" HAVE_PWD_H) +check_include_file("stdatomic.h" HAVE_STDATOMIC_H) +check_include_file("stdbool.h" HAVE_STDBOOL_H) +check_include_file("strings.h" HAVE_STRINGS_H) +check_include_file("stropts.h" HAVE_STROPTS_H) +check_include_file("termio.h" HAVE_TERMIO_H) +check_include_file("termios.h" HAVE_TERMIOS_H) check_include_file_concat("unistd.h" HAVE_UNISTD_H) -check_include_file_concat("utime.h" HAVE_UTIME_H) +check_include_file("utime.h" HAVE_UTIME_H) if(CMAKE_SYSTEM_NAME MATCHES "AmigaOS") check_include_file_concat("proto/bsdsocket.h" HAVE_PROTO_BSDSOCKET_H) endif() +# Pass these detection results to curl_internal_test() for use in CurlTests.c +# Add here all feature flags referenced from CurlTests.c +foreach(_variable IN ITEMS + HAVE_STDATOMIC_H + HAVE_STDBOOL_H + HAVE_STROPTS_H + HAVE_SYS_IOCTL_H + HAVE_SYS_SOCKET_H + HAVE_SYS_TYPES_H + HAVE_UNISTD_H + ) + if(${_variable}) + set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D${_variable}") + endif() +endforeach() + check_type_size("size_t" SIZEOF_SIZE_T) check_type_size("ssize_t" SIZEOF_SSIZE_T) check_type_size("long long" SIZEOF_LONG_LONG) @@ -1511,67 +1530,67 @@ elseif(HAVE_LIBSOCKET) list(APPEND CMAKE_REQUIRED_LIBRARIES "socket") # Apply to all feature checks endif() -check_symbol_exists("fnmatch" "${CURL_INCLUDES};fnmatch.h" HAVE_FNMATCH) -check_symbol_exists("basename" "${CURL_INCLUDES};string.h" HAVE_BASENAME) -check_symbol_exists("opendir" "${CURL_INCLUDES};dirent.h" HAVE_OPENDIR) -check_symbol_exists("poll" "${CURL_INCLUDES}" HAVE_POLL) -check_symbol_exists("socket" "${CURL_INCLUDES}" HAVE_SOCKET) -check_symbol_exists("sched_yield" "${CURL_INCLUDES};sched.h" HAVE_SCHED_YIELD) -check_symbol_exists("socketpair" "${CURL_INCLUDES}" HAVE_SOCKETPAIR) -check_symbol_exists("recv" "${CURL_INCLUDES}" HAVE_RECV) -check_symbol_exists("send" "${CURL_INCLUDES}" HAVE_SEND) -check_symbol_exists("sendmsg" "${CURL_INCLUDES}" HAVE_SENDMSG) -check_symbol_exists("sendmmsg" "sys/socket.h" HAVE_SENDMMSG) -check_symbol_exists("select" "${CURL_INCLUDES}" HAVE_SELECT) -check_symbol_exists("strdup" "${CURL_INCLUDES};string.h" HAVE_STRDUP) -check_symbol_exists("strtok_r" "${CURL_INCLUDES};string.h" HAVE_STRTOK_R) -check_symbol_exists("strcasecmp" "${CURL_INCLUDES};string.h" HAVE_STRCASECMP) -check_symbol_exists("stricmp" "${CURL_INCLUDES};string.h" HAVE_STRICMP) -check_symbol_exists("strcmpi" "${CURL_INCLUDES};string.h" HAVE_STRCMPI) -check_symbol_exists("memrchr" "${CURL_INCLUDES};string.h" HAVE_MEMRCHR) -check_symbol_exists("alarm" "${CURL_INCLUDES}" HAVE_ALARM) -check_symbol_exists("fcntl" "${CURL_INCLUDES}" HAVE_FCNTL) -check_symbol_exists("getppid" "${CURL_INCLUDES}" HAVE_GETPPID) -check_symbol_exists("utimes" "${CURL_INCLUDES}" HAVE_UTIMES) - -check_symbol_exists("gettimeofday" "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY) -check_symbol_exists("closesocket" "${CURL_INCLUDES}" HAVE_CLOSESOCKET) -check_symbol_exists("sigsetjmp" "${CURL_INCLUDES};setjmp.h" HAVE_SIGSETJMP) -check_symbol_exists("getpass_r" "${CURL_INCLUDES}" HAVE_GETPASS_R) -check_symbol_exists("getpwuid" "${CURL_INCLUDES}" HAVE_GETPWUID) -check_symbol_exists("getpwuid_r" "${CURL_INCLUDES}" HAVE_GETPWUID_R) -check_symbol_exists("geteuid" "${CURL_INCLUDES}" HAVE_GETEUID) -check_symbol_exists("utime" "${CURL_INCLUDES}" HAVE_UTIME) -check_symbol_exists("gmtime_r" "${CURL_INCLUDES};stdlib.h;time.h" HAVE_GMTIME_R) - -check_symbol_exists("gethostbyname_r" "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R) - -check_symbol_exists("signal" "${CURL_INCLUDES};signal.h" HAVE_SIGNAL) -check_symbol_exists("strtoll" "${CURL_INCLUDES};stdlib.h" HAVE_STRTOLL) -check_symbol_exists("strerror_r" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_STRERROR_R) +check_function_exists("fnmatch" HAVE_FNMATCH) +check_symbol_exists("basename" "${CURL_INCLUDES};string.h" HAVE_BASENAME) # libgen.h unistd.h +check_symbol_exists("opendir" "dirent.h" HAVE_OPENDIR) +check_function_exists("poll" HAVE_POLL) # poll.h +check_symbol_exists("socket" "${CURL_INCLUDES}" HAVE_SOCKET) # winsock2.h sys/socket.h +check_function_exists("sched_yield" HAVE_SCHED_YIELD) +check_symbol_exists("socketpair" "${CURL_INCLUDES}" HAVE_SOCKETPAIR) # sys/socket.h +check_symbol_exists("recv" "${CURL_INCLUDES}" HAVE_RECV) # proto/bsdsocket.h sys/types.h sys/socket.h +check_symbol_exists("send" "${CURL_INCLUDES}" HAVE_SEND) # proto/bsdsocket.h sys/types.h sys/socket.h +check_function_exists("sendmsg" HAVE_SENDMSG) +check_function_exists("sendmmsg" HAVE_SENDMMSG) +check_symbol_exists("select" "${CURL_INCLUDES}" HAVE_SELECT) # proto/bsdsocket.h sys/select.h sys/socket.h +check_symbol_exists("strdup" "string.h" HAVE_STRDUP) +check_symbol_exists("strtok_r" "string.h" HAVE_STRTOK_R) +check_symbol_exists("strcasecmp" "string.h" HAVE_STRCASECMP) +check_symbol_exists("stricmp" "string.h" HAVE_STRICMP) +check_symbol_exists("strcmpi" "string.h" HAVE_STRCMPI) +check_symbol_exists("memrchr" "string.h" HAVE_MEMRCHR) +check_symbol_exists("alarm" "unistd.h" HAVE_ALARM) +check_symbol_exists("fcntl" "fcntl.h" HAVE_FCNTL) +check_function_exists("getppid" HAVE_GETPPID) +check_function_exists("utimes" HAVE_UTIMES) + +check_function_exists("gettimeofday" HAVE_GETTIMEOFDAY) # sys/time.h +check_symbol_exists("closesocket" "${CURL_INCLUDES}" HAVE_CLOSESOCKET) # winsock2.h +check_symbol_exists("sigsetjmp" "setjmp.h" HAVE_SIGSETJMP) +check_function_exists("getpass_r" HAVE_GETPASS_R) +check_function_exists("getpwuid" HAVE_GETPWUID) +check_function_exists("getpwuid_r" HAVE_GETPWUID_R) +check_function_exists("geteuid" HAVE_GETEUID) +check_function_exists("utime" HAVE_UTIME) +check_symbol_exists("gmtime_r" "stdlib.h;time.h" HAVE_GMTIME_R) + +check_symbol_exists("gethostbyname_r" "netdb.h" HAVE_GETHOSTBYNAME_R) + +check_symbol_exists("signal" "signal.h" HAVE_SIGNAL) +check_symbol_exists("strtoll" "stdlib.h" HAVE_STRTOLL) +check_symbol_exists("strerror_r" "stdlib.h;string.h" HAVE_STRERROR_R) check_symbol_exists("sigaction" "signal.h" HAVE_SIGACTION) -check_symbol_exists("siginterrupt" "${CURL_INCLUDES};signal.h" HAVE_SIGINTERRUPT) -check_symbol_exists("getaddrinfo" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_GETADDRINFO) -check_symbol_exists("getifaddrs" "${CURL_INCLUDES};stdlib.h" HAVE_GETIFADDRS) -check_symbol_exists("freeaddrinfo" "${CURL_INCLUDES}" HAVE_FREEADDRINFO) -check_symbol_exists("pipe" "${CURL_INCLUDES}" HAVE_PIPE) -check_symbol_exists("eventfd" "${CURL_INCLUDES};sys/eventfd.h" HAVE_EVENTFD) -check_symbol_exists("ftruncate" "${CURL_INCLUDES}" HAVE_FTRUNCATE) -check_symbol_exists("_fseeki64" "${CURL_INCLUDES};stdio.h" HAVE__FSEEKI64) -check_symbol_exists("getpeername" "${CURL_INCLUDES}" HAVE_GETPEERNAME) -check_symbol_exists("getsockname" "${CURL_INCLUDES}" HAVE_GETSOCKNAME) -check_symbol_exists("if_nametoindex" "${CURL_INCLUDES}" HAVE_IF_NAMETOINDEX) -check_symbol_exists("getrlimit" "${CURL_INCLUDES}" HAVE_GETRLIMIT) -check_symbol_exists("setlocale" "${CURL_INCLUDES}" HAVE_SETLOCALE) -check_symbol_exists("setmode" "${CURL_INCLUDES}" HAVE_SETMODE) -check_symbol_exists("setrlimit" "${CURL_INCLUDES}" HAVE_SETRLIMIT) +check_symbol_exists("siginterrupt" "signal.h" HAVE_SIGINTERRUPT) +check_symbol_exists("getaddrinfo" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_GETADDRINFO) # ws2tcpip.h sys/socket.h netdb.h +check_symbol_exists("getifaddrs" "${CURL_INCLUDES};stdlib.h" HAVE_GETIFADDRS) # ifaddrs.h +check_symbol_exists("freeaddrinfo" "${CURL_INCLUDES}" HAVE_FREEADDRINFO) # ws2tcpip.h sys/socket.h netdb.h +check_function_exists("pipe" HAVE_PIPE) +check_function_exists("eventfd" HAVE_EVENTFD) +check_symbol_exists("ftruncate" "unistd.h" HAVE_FTRUNCATE) +check_function_exists("_fseeki64" HAVE__FSEEKI64) +check_symbol_exists("getpeername" "${CURL_INCLUDES}" HAVE_GETPEERNAME) # winsock2.h unistd.h proto/bsdsocket.h +check_symbol_exists("getsockname" "${CURL_INCLUDES}" HAVE_GETSOCKNAME) # winsock2.h unistd.h proto/bsdsocket.h +check_function_exists("if_nametoindex" HAVE_IF_NAMETOINDEX) # winsock2.h net/if.h +check_function_exists("getrlimit" HAVE_GETRLIMIT) +check_function_exists("setlocale" HAVE_SETLOCALE) +check_function_exists("setmode" HAVE_SETMODE) +check_function_exists("setrlimit" HAVE_SETRLIMIT) if(WIN32 OR CYGWIN) check_function_exists("_setmode" HAVE__SETMODE) endif() if(CMAKE_SYSTEM_NAME MATCHES "AmigaOS") - check_symbol_exists("CloseSocket" "${CURL_INCLUDES}" HAVE_CLOSESOCKET_CAMEL) + check_symbol_exists("CloseSocket" "${CURL_INCLUDES}" HAVE_CLOSESOCKET_CAMEL) # sys/socket.h proto/bsdsocket.h endif() if(NOT _ssl_enabled) @@ -1580,16 +1599,16 @@ endif() if(NOT MSVC OR (MSVC_VERSION GREATER_EQUAL 1900)) # Earlier MSVC compilers had faulty snprintf implementations - check_symbol_exists("snprintf" "stdio.h" HAVE_SNPRINTF) + check_function_exists("snprintf" HAVE_SNPRINTF) endif() check_function_exists("mach_absolute_time" HAVE_MACH_ABSOLUTE_TIME) -check_symbol_exists("inet_ntop" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_NTOP) +check_symbol_exists("inet_ntop" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_NTOP) # arpa/inet.h if(MSVC AND (MSVC_VERSION LESS_EQUAL 1600)) set(HAVE_INET_NTOP OFF) endif() -check_symbol_exists("inet_pton" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_PTON) +check_symbol_exists("inet_pton" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_PTON) # arpa/inet.h -check_symbol_exists("fsetxattr" "${CURL_INCLUDES}" HAVE_FSETXATTR) +check_symbol_exists("fsetxattr" "sys/xattr.h" HAVE_FSETXATTR) if(HAVE_FSETXATTR) curl_internal_test(HAVE_FSETXATTR_5) curl_internal_test(HAVE_FSETXATTR_6) @@ -1638,7 +1657,7 @@ endforeach() cmake_push_check_state() if(HAVE_FILE_OFFSET_BITS) set(_FILE_OFFSET_BITS 64) - set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64") + set(CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64") endif() check_type_size("off_t" SIZEOF_OFF_T) diff --git a/configure.ac b/configure.ac index 4a9a7fc5f8..1632470744 100644 --- a/configure.ac +++ b/configure.ac @@ -3928,10 +3928,10 @@ dnl default includes #include #endif #ifdef HAVE_NETINET_IN6_H -#include +#include /* is this really required to detect other headers? */ #endif #ifdef HAVE_SYS_UN_H -#include +#include /* is this really required to detect other headers? */ #endif ] )