From: Viktor Szakats Date: Mon, 24 Feb 2025 23:01:35 +0000 (+0100) Subject: cmake: pre-fill known type sizes for Windows OSes X-Git-Tag: curl-8_13_0~352 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=29978df61fdfbb128217341ec3d9c9dfb1b4fc3a;p=thirdparty%2Fcurl.git cmake: pre-fill known type sizes for Windows OSes To save configuration time. After this patch, for mingw-w64 and MSVC curl's CMake builds pre-fill almost all type sizes without auto-detection. In most cases this leaves 3 type size auto-detections. Those depend on 64/32-bitness, and `time_t` also depends on CRT and custom options. Old mingw-w64 versions require some extra detections. We recommend v3.0 or newer to avoid them. For Windows CE, this patch pre-fills all type sizes. If this is causing any issue, please report it and disable pre-filling with `-D_CURL_PREFILL=OFF` in the meantime. Cherry-picked from #16394 Closes #16464 --- diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake index 8653f36b0a..fcc8f53e91 100644 --- a/CMake/Macros.cmake +++ b/CMake/Macros.cmake @@ -87,3 +87,10 @@ macro(curl_required_libpaths _libpaths_arg) list(APPEND CMAKE_REQUIRED_LINK_DIRECTORIES "${_libpaths_arg}") endif() endmacro() + +# Pre-fill variables set by a check_type_size() call. +macro(curl_prefill_type_size _type _size) + set(HAVE_SIZEOF_${_type} TRUE) + set(SIZEOF_${_type} ${_size}) + set(SIZEOF_${_type}_CODE "#define SIZEOF_${_type} ${_size}") +endmacro() diff --git a/CMake/win32-cache.cmake b/CMake/win32-cache.cmake index 05a209971d..a7070dca21 100644 --- a/CMake/win32-cache.cmake +++ b/CMake/win32-cache.cmake @@ -44,10 +44,6 @@ if(MINGW) set(HAVE_UTIME_H 1) # wrapper to sys/utime.h set(HAVE_DIRENT_H 1) set(HAVE_OPENDIR 1) - if(MINGW32CE) - set(HAVE_STRTOK_R 0) - set(HAVE_FILE_OFFSET_BITS 0) - endif() else() set(HAVE_LIBGEN_H 0) set(HAVE_FTRUNCATE 0) @@ -78,7 +74,6 @@ else() set(HAVE_SNPRINTF 0) endif() set(HAVE_BASENAME 0) - set(HAVE_FILE_OFFSET_BITS 0) endif() endif() @@ -196,6 +191,37 @@ set(STDC_HEADERS 1) set(HAVE_SIZEOF_SUSECONDS_T 0) set(HAVE_SIZEOF_SA_FAMILY_T 0) +if(MINGW OR MSVC) + curl_prefill_type_size("INT" 4) + curl_prefill_type_size("LONG" 4) + curl_prefill_type_size("LONG_LONG" 8) + curl_prefill_type_size("__INT64" 8) + curl_prefill_type_size("CURL_OFF_T" 8) + # CURL_SOCKET_T, SIZE_T: 8 for _WIN64, 4 otherwise + # TIME_T: 8 for _WIN64 or UCRT or MSVC and not Windows CE, 4 otherwise + # Also 4 for non-UCRT 32-bit when _USE_32BIT_TIME_T is set. + # mingw-w64 sets _USE_32BIT_TIME_T unless __MINGW_USE_VC2005_COMPAT is explicit defined. + if(MSVC) + set(HAVE_SIZEOF_SSIZE_T 0) + set(HAVE_FILE_OFFSET_BITS 0) + curl_prefill_type_size("OFF_T" 4) + curl_prefill_type_size("ADDRESS_FAMILY" 2) + else() + # SSIZE_T: 8 for _WIN64, 4 otherwise + if(MINGW64_VERSION) + if(NOT MINGW64_VERSION VERSION_LESS 3.0) + set(HAVE_FILE_OFFSET_BITS 1) + curl_prefill_type_size("OFF_T" 8) + endif() + if(NOT MINGW64_VERSION VERSION_LESS 2.0) + curl_prefill_type_size("ADDRESS_FAMILY" 2) + else() + set(HAVE_SIZEOF_ADDRESS_FAMILY 0) + endif() + endif() + endif() +endif() + if(WINCE) # Windows CE exceptions set(HAVE_LOCALE_H 0) set(HAVE_GETADDRINFO 0) @@ -204,7 +230,15 @@ if(WINCE) # Windows CE exceptions set(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 0) set(HAVE_SIGNAL 0) set(HAVE_SETMODE 0) + curl_prefill_type_size("CURL_SOCKET_T" 4) + curl_prefill_type_size("TIME_T" 4) + curl_prefill_type_size("SIZE_T" 4) if(MINGW32CE) + set(HAVE_STRTOK_R 0) set(HAVE__SETMODE 0) + set(HAVE_FILE_OFFSET_BITS 0) + set(HAVE_SIZEOF_ADDRESS_FAMILY 0) + curl_prefill_type_size("SSIZE_T" 4) + curl_prefill_type_size("OFF_T" 4) endif() endif()