]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add MinGW option -mcrtdll= for choosing C RunTime DLL library
authorPali Rohár <pali@kernel.org>
Wed, 14 Jun 2023 16:09:17 +0000 (18:09 +0200)
committerJonathan Yong <10walls@gmail.com>
Fri, 16 Jun 2023 10:16:33 +0000 (10:16 +0000)
It adjust preprocess, compile and link flags, which allows to change
default -lmsvcrt library by another provided by MinGW runtime.

gcc/ChangeLog:

* config/i386/mingw-w64.h (CPP_SPEC): Adjust for -mcrtdll=.
(REAL_LIBGCC_SPEC): New define.
* config/i386/mingw.opt: Add mcrtdll=
* config/i386/mingw32.h (CPP_SPEC): Adjust for -mcrtdll=.
(REAL_LIBGCC_SPEC): Adjust for -mcrtdll=.
(STARTFILE_SPEC): Adjust for -mcrtdll=.
* doc/invoke.texi: Add mcrtdll= documentation.

Signed-off-by: Jonathan Yong <10walls@gmail.com>
gcc/config/i386/mingw-w64.h
gcc/config/i386/mingw.opt
gcc/config/i386/mingw32.h
gcc/doc/invoke.texi

index 3a21cec3f8cd1b381090e0437b805681ca6ec6d8..0146ed4f793e1d6d4e47601ade73607a9521ca20 100644 (file)
@@ -25,7 +25,27 @@ along with GCC; see the file COPYING3.  If not see
 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} " \
                 "%{municode:-DUNICODE} " \
                 "%{" SPEC_PTHREAD1 ":-D_REENTRANT} " \
-                "%{" SPEC_PTHREAD2 ":-U_REENTRANT} "
+                "%{" SPEC_PTHREAD2 ":-U_REENTRANT} " \
+                "%{mcrtdll=crtdll*:-U__MSVCRT__ -D__CRTDLL__} " \
+                "%{mcrtdll=msvcrt10*:-D__MSVCRT_VERSION__=0x100} " \
+                "%{mcrtdll=msvcrt20*:-D__MSVCRT_VERSION__=0x200} " \
+                "%{mcrtdll=msvcrt40*:-D__MSVCRT_VERSION__=0x400} " \
+                "%{mcrtdll=msvcrt-os*:-D__MSVCRT_VERSION__=0x700} " \
+                "%{mcrtdll=msvcr70*:-D__MSVCRT_VERSION__=0x700} " \
+                "%{mcrtdll=msvcr71*:-D__MSVCRT_VERSION__=0x701} " \
+                "%{mcrtdll=msvcr80*:-D__MSVCRT_VERSION__=0x800} " \
+                "%{mcrtdll=msvcr90*:-D__MSVCRT_VERSION__=0x900} " \
+                "%{mcrtdll=msvcr100*:-D__MSVCRT_VERSION__=0xA00} " \
+                "%{mcrtdll=msvcr110*:-D__MSVCRT_VERSION__=0xB00} " \
+                "%{mcrtdll=msvcr120*:-D__MSVCRT_VERSION__=0xC00} " \
+                "%{mcrtdll=ucrt*:-D_UCRT} "
+
+#undef REAL_LIBGCC_SPEC
+#define REAL_LIBGCC_SPEC \
+  "%{mthreads:-lmingwthrd} -lmingw32 \
+   " SHARED_LIBGCC_SPEC " \
+   -lmingwex %{!mcrtdll=*:-lmsvcrt} %{mcrtdll=*:-l%*} \
+   -lkernel32 " MCFGTHREAD_SPEC
 
 #undef STARTFILE_SPEC
 #define STARTFILE_SPEC "%{shared|mdll:dllcrt2%O%s} \
index 0ae026a66bd642f0f51fb2713084ce23162670e9..dd66a50aec003112f7bcc7f1f14d4e191b615258 100644 (file)
 ; along with GCC; see the file COPYING3.  If not see
 ; <http://www.gnu.org/licenses/>.
 
+mcrtdll=
+Target RejectNegative Joined
+Preprocess, compile or link with specified C RunTime DLL library.
+
 pthread
 Driver
 
index 6a55baaa4587e926c7e0f83583410c9e0efc18fa..a1ee001983a7cd7a90ac3f6be858914f85dac694 100644 (file)
@@ -89,7 +89,20 @@ along with GCC; see the file COPYING3.  If not see
 #undef CPP_SPEC
 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} " \
                 "%{" SPEC_PTHREAD1 ":-D_REENTRANT} " \
-                "%{" SPEC_PTHREAD2 ": } "
+                "%{" SPEC_PTHREAD2 ": } " \
+                "%{mcrtdll=crtdll*:-U__MSVCRT__ -D__CRTDLL__} " \
+                "%{mcrtdll=msvcrt10*:-D__MSVCRT_VERSION__=0x100} " \
+                "%{mcrtdll=msvcrt20*:-D__MSVCRT_VERSION__=0x200} " \
+                "%{mcrtdll=msvcrt40*:-D__MSVCRT_VERSION__=0x400} " \
+                "%{mcrtdll=msvcrt-os*:-D__MSVCRT_VERSION__=0x700} " \
+                "%{mcrtdll=msvcr70*:-D__MSVCRT_VERSION__=0x700} " \
+                "%{mcrtdll=msvcr71*:-D__MSVCRT_VERSION__=0x701} " \
+                "%{mcrtdll=msvcr80*:-D__MSVCRT_VERSION__=0x800} " \
+                "%{mcrtdll=msvcr90*:-D__MSVCRT_VERSION__=0x900} " \
+                "%{mcrtdll=msvcr100*:-D__MSVCRT_VERSION__=0xA00} " \
+                "%{mcrtdll=msvcr110*:-D__MSVCRT_VERSION__=0xB00} " \
+                "%{mcrtdll=msvcr120*:-D__MSVCRT_VERSION__=0xC00} " \
+                "%{mcrtdll=ucrt*:-D_UCRT} "
 
 /* For Windows applications, include more libraries, but always include
    kernel32.  */
@@ -184,11 +197,18 @@ along with GCC; see the file COPYING3.  If not see
 #define REAL_LIBGCC_SPEC \
   "%{mthreads:-lmingwthrd} -lmingw32 \
    " SHARED_LIBGCC_SPEC " \
-   -lmoldname -lmingwex -lmsvcrt -lkernel32 " MCFGTHREAD_SPEC
+   %{mcrtdll=crtdll*:-lcoldname} %{!mcrtdll=crtdll*:-lmoldname} \
+   -lmingwex %{!mcrtdll=*:-lmsvcrt} %{mcrtdll=*:-l%*} \
+   -lkernel32 " MCFGTHREAD_SPEC
 
 #undef STARTFILE_SPEC
-#define STARTFILE_SPEC "%{shared|mdll:dllcrt2%O%s} \
-  %{!shared:%{!mdll:crt2%O%s}} %{pg:gcrt2%O%s} \
+#define STARTFILE_SPEC " \
+  %{shared|mdll:%{mcrtdll=crtdll*:dllcrt1%O%s}} \
+  %{shared|mdll:%{!mcrtdll=crtdll*:dllcrt2%O%s}} \
+  %{!shared:%{!mdll:%{mcrtdll=crtdll*:crt1%O%s}}} \
+  %{!shared:%{!mdll:%{!mcrtdll=crtdll*:crt2%O%s}}} \
+  %{pg:%{mcrtdll=crtdll*:gcrt1%O%s}} \
+  %{pg:%{!mcrtdll=crtdll*:gcrt2%O%s}} \
   crtbegin.o%s \
   %{fvtable-verify=none:%s; \
     fvtable-verify=preinit:vtv_start.o%s; \
index 9ecbd32a228c1051df5a9bce4d4d7e6019762508..19d8c1c9aa5b0f75655c96b1447df35e63e5aadc 100644 (file)
@@ -1458,7 +1458,7 @@ See RS/6000 and PowerPC Options.
 -munroll-only-small-loops -mlam=@var{choice}}
 
 @emph{x86 Windows Options}
-@gccoptlist{-mconsole  -mcygwin  -mno-cygwin  -mdll
+@gccoptlist{-mconsole  -mcrtdll=@var{library}  -mcygwin  -mno-cygwin  -mdll
 -mnop-fun-dllimport  -mthread
 -municode  -mwin32  -mwindows  -fno-set-stack-executable}
 
@@ -34292,6 +34292,28 @@ required for console applications.
 This option is available for Cygwin and MinGW targets and is
 enabled by default on those targets.
 
+@opindex mcrtdll
+@item -mcrtdll=@var{library}
+Preprocess, compile or link with specified C RunTime DLL @var{library}.
+This option adjust predefined macros @code{__CRTDLL__}, @code{__MSVCRT__}
+and @code{__MSVCRT_VERSION__} for specified CRT @var{library}, choose
+start file for CRT @var{library} and link with CRT @var{library}.
+Recognized CRT library names for proprocessor are:
+@code{crtdll}, @code{msvcrt10}, @code{msvcrt20}, @code{msvcrt40},
+@code{msvcrt-os}, @code{msvcr70}, @code{msvcr80}, @code{msvcr90},
+@code{msvcr100}, @code{msvcr110}, @code{msvcr120} and @code{ucrt}.
+If this options is not specified then the default MinGW import library
+@code{msvcrt} is used for linking and no other adjustment for
+preprocessor is done. MinGW import library @code{msvcrt} is just a
+symlink to (or a copy of) another MinGW CRT import library
+chosen during MinGW compilation. MinGW import library @code{msvcrt-os}
+is for Windows system CRT DLL library @code{msvcrt.dll} and
+in most cases is the default MinGW import library.
+Generally speaking, changing the CRT DLL requires recompiling
+the entire MinGW CRT. This option is for experimental and testing
+purposes only.
+This option is available for MinGW targets.
+
 @opindex mdll
 @item -mdll
 This option is available for Cygwin and MinGW targets.  It