autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Do not remove MinGW libraries from Fortran default linker flags


From: Markus Mützel
Subject: Re: Do not remove MinGW libraries from Fortran default linker flags
Date: Sun, 5 Jan 2025 18:14:19 +0000

I hope it is ok to CC Paul Eggert who applied the patch that broke
this as far as I understand.

Is the change below acceptable?

It is needed when building Octave targeting Windows. Without it, the
implementation of `casin` from the Windows runtime is used instead of the
replacement from MinGW-w64.
That means that results for the `casin` function are wrong without
that change.

Markus


Rebased on the current head of the master branch:


[PATCH] Keep "-lmingwex" and "-lmoldname" in linker flags for MinGW

* lib/autoconf/fortran.m4: Do not remove "-lmingwex" or "-lmoldname"
from the linker flags when targeting MinGW.  Removing "-lmingwex" causes
an incorrect linker resolution for functions like "casin" for projects
that consist of Fortran and C++ sources.  Removing "-lmoldname" causes
issues for Fortran projects that try to use POSIX-like C functions
without a `_` symbol prefix when targeting MinGW.
---
 lib/autoconf/fortran.m4 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/autoconf/fortran.m4 b/lib/autoconf/fortran.m4
index 75631492..0fc7545d 100644
--- a/lib/autoconf/fortran.m4
+++ b/lib/autoconf/fortran.m4
@@ -666,7 +666,7 @@ while test $[@%:@] != 1; do
        -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \
          |-LANG:=* | -LIST:* | -LNO:* | -link)
          ;;
-       -lkernel32 | -lmingw* | -lmoldname)
+       -lkernel32)
          # Ignore this library only on Windows-like systems.
          case $host_os in
          cygwin* | msys* | mingw* | windows*) ;;
-- 
2.44.0.windows.1




Am 12. Dezember 2024 um 13:42 schrieb "Markus Mützel":
> Stripping `-lmingwex` from the Fortran default linker flags can lead to
> a situation where the first `-lmsvcrt` appears before the first
> `-lmingwex` for a library that consists of Fortran and C++ sources.
> That means that the linker picks some functions from the Windows CRT that
> should instead be picked from `libmingwex.a`.
> 
> It took quite some time to figure out an odd behavior when calling
> `std::asin` with a complex double precision value with a real part larger
> than 1.0 and an imaginary part of 0.0 in such a library.
> See also: https://octave.discourse.group/t/6026/75
> 
> Also don't strip `-lmoldname` from these flags because omitting that
> library could result in issues when Fortran code tries to call POSIX-like
> C functions without a `_` prefix when targeting MinGW.
> 
> The following change fixes these issues by essentially reverting the
> changes from:
> https://lists.gnu.org/r/autoconf-patches/2021-09/msg00000.html
> 
> I'm not sure why `-lkernel32` needs to be removed from the linker flags
> when targeting MinGW. But we didn't observe an issue with that, so I left
> that as applied in that changeset.
> 
> diff -urN autoconf-2.72/lib/autoconf/fortran.m4.orig 
> autoconf-2.72/lib/autoconf/fortran.m4
> --- autoconf-2.72/lib/autoconf/fortran.m4.orig        2024-10-30 
> 13:31:24.456674400 +0100
> +++ autoconf-2.72/lib/autoconf/fortran.m4     2024-12-11 16:08:46.415095400 
> +0100
> @@ -705,7 +705,7 @@
>       -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \
>         |-LANG:=* | -LIST:* | -LNO:* | -link)
>         ;;
> -     -lkernel32 | -lmingw* | -lmoldname)
> +     -lkernel32)
>         # Ignore this library only on Windows-like systems.
>         case $host_os in
>         cygwin* | msys* | mingw* | windows*) ;;
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]