configure: Use ucrt for msvcrt by default.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
This commit is contained in:
Jacek Caban 2023-06-03 20:51:47 +02:00
parent d7877cbd2e
commit 82b8edc101
5 changed files with 76 additions and 19 deletions

View File

@ -1513,7 +1513,7 @@ Optional Packages:
--with-genlib=PATH Whether to build import libraries via the genlib
tool (default: no)
--with-default-msvcrt=LIB
Lib to provide as libmsvcrt.a (default: msvcrt-os)
Lib to provide as libmsvcrt.a (default: ucrt)
Some influential environment variables:
CC C compiler command
@ -2068,9 +2068,7 @@ struct stat;
/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
struct buf { int x; };
struct buf * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
static char *e (char **p, int i)
{
return p[i];
}
@ -2121,6 +2119,7 @@ extern int puts (const char *);
extern int printf (const char *, ...);
extern int dprintf (int, const char *, ...);
extern void *malloc (size_t);
extern void free (void *);
// Check varargs macros. These examples are taken from C99 6.10.3.5.
// dprintf is used instead of fprintf to avoid needing to declare
@ -6787,7 +6786,7 @@ if test ${with_default_msvcrt+y}
then :
withval=$with_default_msvcrt;
else $as_nop
with_default_msvcrt=msvcrt-os
with_default_msvcrt=ucrt
fi
if test "$with_default_msvcrt" = "msvcrt"; then

View File

@ -267,9 +267,9 @@ AC_MSG_RESULT([$enable_delay_import_libs])
AC_MSG_CHECKING([what to provide as libmsvcrt.a])
AC_ARG_WITH([default-msvcrt],
[AS_HELP_STRING([--with-default-msvcrt=LIB],
[Lib to provide as libmsvcrt.a (default: msvcrt-os)])],
[Lib to provide as libmsvcrt.a (default: ucrt)])],
[],
[with_default_msvcrt=msvcrt-os])
[with_default_msvcrt=ucrt])
if test "$with_default_msvcrt" = "msvcrt"; then
with_default_msvcrt=msvcrt-os
fi

View File

@ -0,0 +1,58 @@
== Summary ==
Starting from mingw-w64 version 12 and onwards, UCRT (Universal C Runtime) will
be the default CRT runtime, unless specified otherwise during the minwgw-64
build process. We believe that this configuration is the best choice for the
majority of users. While we encourage users to consider switching to UCRT, we
understand that it may not always be desirable, especially for compatibility
reasons. Therefore, all previously supported configurations will continue to
be supported. Users who wish to continue using msvcrt.dll can easily do so by
adding the --with-default-msvcrt=msvcrt argument to both the
mingw-w64-headers and mingw-w64-crt configure scripts.
== Background ==
mingw-w64 provides C runtime libraries that directly or indirectly utilize
Microsoft DLLs at runtime. Over the years, Microsoft has released various
versions of these DLLs, some of which were designed for specific MSVC versions
while others aimed for backward compatibility. When building the mingw-w64
toolchain, users can specify a version of the runtime DLL using the
--with-default-msvcrt= configure option. The most commonly used versions are
ucrt (utilizing ucrtbase.dll) and msvcrt (utilizing msvcrt.dll).
The implementation of msvcrt.dll dates back to the Windows 9x era. While it has
been extended for a period, it eventually became frozen in favor of providing
separate DLLs for future MSVC versions. Although msvcrt.dll continues to be
shipped with modern Windows versions, it remains compatible with the version
from the 1990s. msvcrt.dll is known to deviate from standard behavior in many
aspects. mingw-w64 includes compatibility wrappers and extensions to improve
standard compatibility, but there are limitations to what can be practically
achieved.
On the other hand, ucrtbase.dll was introduced with MSVC 14 and is currently
included with all Windows versions supported by Microsoft. It is also available
as a redistributable package for older versions of Windows. ucrtbase.dll aims to
replace MSVC version-specific DLLs and has been used by all MSVC versions since
its introduction. It offers a more modern approach compared to msvcrt.dll and
provides better standard compatibility out of the box, reducing overhead on the
mingw-w64 side.
== Compatibility ==
When switching between toolchains that use different runtime libraries, it is
generally advised not to mix static libraries, unless certain exceptions apply.
If in doubt, it is recommended to rebuild all static libraries when switching
the toolchain's runtime DLL.
Dynamic libraries are less likely to be affected. If the CRT is not part of the
ABI of a library you intend to use, meaning it does not involve passing FILE
structs or similar types between modules or depending on the CRT allocator of
other modules, it should remain unaffected. Otherwise, a compatible build of
that library will be required.
== See Also ==
"MSVCRT vs UCRT": https://www.msys2.org/docs/environments/

View File

@ -1387,7 +1387,7 @@ Optional Packages:
--with-default-win32-winnt=VER
Default value of _WIN32_WINNT (default: 0xa00)
--with-default-msvcrt=LIB
Default msvcrt to target (default: msvcrt)
Default msvcrt to target (default: ucrt)
Report bugs to <mingw-w64-public@lists.sourceforge.net>.
_ACEOF
@ -3002,7 +3002,7 @@ if test ${with_default_msvcrt+y}
then :
withval=$with_default_msvcrt;
else $as_nop
with_default_msvcrt=msvcrt
with_default_msvcrt=ucrt
fi
case $with_default_msvcrt in
@ -3036,12 +3036,12 @@ msvcr110*)
msvcr120*)
default_msvcrt_version=0xC00
;;
ucrt*)
default_msvcrt_version=0xE00
;;
msvcrt|*)
msvcrt*)
default_msvcrt_version=0x700
;;
ucrt*|*)
default_msvcrt_version=0xE00
;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_default_msvcrt ($default_msvcrt_version)" >&5
printf "%s\n" "$with_default_msvcrt ($default_msvcrt_version)" >&6; }

View File

@ -144,9 +144,9 @@ AC_SUBST([DEFAULT_WIN32_WINNT])
AC_MSG_CHECKING([default msvcrt])
AC_ARG_WITH([default-msvcrt],
[AS_HELP_STRING([--with-default-msvcrt=LIB],
[Default msvcrt to target (default: msvcrt)])],
[Default msvcrt to target (default: ucrt)])],
[],
[with_default_msvcrt=msvcrt])
[with_default_msvcrt=ucrt])
case $with_default_msvcrt in
msvcrt10*)
default_msvcrt_version=0x100
@ -178,12 +178,12 @@ msvcr110*)
msvcr120*)
default_msvcrt_version=0xC00
;;
ucrt*)
default_msvcrt_version=0xE00
;;
msvcrt|*)
msvcrt*)
default_msvcrt_version=0x700
;;
ucrt*|*)
default_msvcrt_version=0xE00
;;
esac
AC_MSG_RESULT([$with_default_msvcrt ($default_msvcrt_version)])
AS_VAR_SET([DEFAULT_MSVCRT_VERSION],[$default_msvcrt_version])