From: Viktor Szakats Date: Mon, 24 Feb 2025 16:27:57 +0000 (+0100) Subject: cmake: restrict static CRT builds to static curl exe, test in CI X-Git-Tag: curl-8_13_0~366 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=edfa537100d6b5d2ac1b829c66757880afe59407;p=thirdparty%2Fcurl.git cmake: restrict static CRT builds to static curl exe, test in CI Static CRT crashes MSVCR* MSVC builds (in VS2008, VS2010, VS2012, VS2013) according to CI and local tests. The reproducible crash happens in `curl_mfprintf() -> fputc(s, stderr)` when trying to display the warning message in `curl -V`. `stderr` is non-NULL and resolves to `2`. This reproducer needs a debug-enabled build, but it's unrelated to debug features or curl's memory tracker. It happens regardless of unity build, CPU architecture or `DllMain()` use. Example from VS2013: ``` + _bld/src/Debug/curl.exe --disable --version ./appveyor.sh: line 124: 203 Segmentation fault "${curl}" --disable --version ``` Ref: https://ci.appveyor.com/project/curlorg/curl/builds/51570451/job/ojpdqrsm1hmpmq6a#L210 Another crash happened in an UCRT build (VS2017) with a couple of `printf()`s added to curl's `main()` function: ``` Microsoft Visual C++ Runtime Library Debug Assertion Failed! Program: C:/projects/curl/bld/src/Debug/curl.exe File: minkernel/crts/ucrt/src/appcrt/heap/debug_heap.cpp Line: 996 Expression: _act_first_block == header ``` (it hangs the job in CI due to the GUI popup) Ref: https://github.com/curl/curl/pull/16394#issuecomment-2677181716 To avoid actual and potential issues, this patch issues a warning on the shared-libcurl + static-CRT combination and falls back to the default, shared CRT. IOW a static CRT build now requires a static curl exe when using the `CURL_STATIC_CRT=ON` option. Follow-up to 4fc6ebe18a607764194ee23e5aa898a027fe3c60 #1621 Cherry-picked from #16394 (with more details there) Closes #16456 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 256b5d6679..be4a1822ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,13 +217,6 @@ option(ENABLE_ARES "Enable c-ares support" OFF) option(CURL_DISABLE_INSTALL "Disable installation targets" OFF) if(WIN32) - option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF) - if(CURL_STATIC_CRT AND MSVC) - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - string(APPEND CMAKE_C_FLAGS_RELEASE " -MT") - string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd") - endif() - option(ENABLE_UNICODE "Use the Unicode version of the Windows API functions" OFF) if(WINDOWS_STORE OR WINCE) set(ENABLE_UNICODE ON) @@ -356,6 +349,20 @@ else() set(LIB_SELECTED ${LIB_STATIC}) endif() +if(WIN32) + option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF) + if(CURL_STATIC_CRT AND MSVC) + if(BUILD_STATIC_CURL) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + string(APPEND CMAKE_C_FLAGS_RELEASE " -MT") + string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd") + else() + message(WARNING "Static CRT requires curl executable built with static libcurl " + "(BUILD_STATIC_LIBS=ON and BUILD_STATIC_CURL=ON).") + endif() + endif() +endif() + # Override to force-disable or force-enable the use of pkg-config. if((UNIX AND NOT ANDROID AND (NOT APPLE OR CMAKE_SYSTEM_NAME MATCHES "Darwin")) OR VCPKG_TOOLCHAIN OR diff --git a/appveyor.sh b/appveyor.sh index d1363e72e6..9388a6d33b 100644 --- a/appveyor.sh +++ b/appveyor.sh @@ -58,6 +58,7 @@ if [ "${BUILD_SYSTEM}" = 'CMake' ]; then -DCMAKE_UNITY_BUILD="${UNITY}" -DCURL_TEST_BUNDLES=ON \ -DCURL_WERROR=ON \ -DBUILD_SHARED_LIBS="${SHARED}" \ + -DCURL_STATIC_CRT=ON \ -DENABLE_DEBUG="${DEBUG}" \ -DENABLE_UNICODE="${ENABLE_UNICODE}" \ -DHTTP_ONLY="${HTTP_ONLY}" \ diff --git a/docs/INSTALL-CMAKE.md b/docs/INSTALL-CMAKE.md index e55d951496..4479d4a365 100644 --- a/docs/INSTALL-CMAKE.md +++ b/docs/INSTALL-CMAKE.md @@ -160,7 +160,7 @@ assumes that CMake generates `Makefile`: - `CURL_LIBCURL_VERSIONED_SYMBOLS`: Enable libcurl versioned symbols. Default: `OFF` - `CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX`: Override default versioned symbol prefix. Default: `_` or `MULTISSL_` - `CURL_LTO`: Enable compiler Link Time Optimizations. Default: `OFF` -- `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`). Default: `OFF` +- `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static curl executable). Default: `OFF` - `CURL_TARGET_WINDOWS_VERSION`: Minimum target Windows version as hex string. - `CURL_TEST_BUNDLES`: Bundle `libtest` and `unittest` tests into single binaries. Default: `OFF` - `CURL_WERROR`: Turn compiler warnings into errors. Default: `OFF`