branch: development
commit 4ded381a6f09cb761a05403450b5e34fec945f5a
Author: Ileana Dumitrescu <[email protected]>
AuthorDate: Tue Jan 7 19:34:11 2025 +0200
libtool: Fix mishandling compiler flags with MSVC tools
With MSVC, linker flags were not properly being linked in during a
compile command. A check has been added to verify if there are linker
flags set and then use a different command when linking.
Fixes applied for bug#74175.
* build-aux/ltmain.in: Fix command parser for '-Wl' option for MSVC.
* m4/libtool.m4: Fix MSVC compile commands.
* tests/flags.at: Use '$GREP --' instead of '$FGREP' when comparing with
stdout.
---
build-aux/ltmain.in | 18 ++++++++++++++----
m4/libtool.m4 | 20 ++++++++++++++++----
tests/flags.at | 8 ++++----
3 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in
index 38b56a71..d792be2b 100644
--- a/build-aux/ltmain.in
+++ b/build-aux/ltmain.in
@@ -5155,8 +5155,13 @@ func_mode_link ()
continue
;;
xlinker)
- func_append linker_flags " $qarg"
- func_append compiler_flags " $wl$qarg"
+ func_append linker_flags "$qarg,"
+ # Args in the var 'compiler_flags' causes warnings in MSVC
+ func_cc_basename "$CC"
+ case $func_cc_basename_result in
+ cl|cl.exe) ;;
+ *) func_append compiler_flags " $wl$qarg" ;;
+ esac
prev=
func_append compile_command " $wl$qarg"
func_append finalize_command " $wl$qarg"
@@ -5530,8 +5535,13 @@ func_mode_link ()
IFS=$save_ifs
func_quote_arg pretty "$flag"
func_append arg " $wl$func_quote_arg_result"
- func_append compiler_flags " $wl$func_quote_arg_result"
- func_append linker_flags " $func_quote_arg_result"
+ # Args in the var 'compiler_flags' causes warnings in MSVC
+ func_cc_basename "$CC"
+ case $func_cc_basename_result in
+ cl|cl.exe) ;;
+ *) func_append compiler_flags " $wl$func_quote_arg_result" ;;
+ esac
+ func_append linker_flags "$func_quote_arg_result,"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 8e0a46bc..c97fdd3b 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -5776,6 +5776,8 @@ _LT_EOF
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
+ # A check exists to verify if there are linker flags, which will use
+ # different commands when linking.
_LT_TAGVAR(archive_cmds, $1)='$CC -Fe$output_objdir/$soname $libobjs
$compiler_flags $deplibs
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
_LT_TAGVAR(archive_expsym_cmds, $1)='if
_LT_DLL_DEF_P([$export_symbols]); then
cp "$export_symbols" "$output_objdir/$soname.def";
@@ -5783,7 +5785,11 @@ _LT_EOF
else
$SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols >
$output_objdir/$soname.exp;
fi~
- $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs
"@$tool_output_objdir$soname.exp"
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ if test -z "$linker_flags"; then
+ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags
$deplibs "@$tool_output_objdir$soname.exp"
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib";
+ else
+ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags
$deplibs "@$tool_output_objdir$soname.exp"
-Wl,$linker_flags-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib";
+ fi~
linknames='
# The linker will not automatically build a static lib if we build a
DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
@@ -5815,7 +5821,7 @@ _LT_EOF
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags
`func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ _LT_TAGVAR(archive_cmds, $1)='$CC -Fe$lib $libobjs $compiler_flags
`func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
# The linker will automatically build a .lib file if we build a DLL.
_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
# FIXME: Should let the user specify the lib program.
@@ -6856,14 +6862,20 @@ if test yes != "$_lt_caught_CXX_error"; then
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs
$compiler_flags $deplibs
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ # A check exists to verify if there are linker flags, which will use
+ # different commands when linking.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -Fe$output_objdir/$soname $libobjs
$compiler_flags $deplibs
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
_LT_TAGVAR(archive_expsym_cmds, $1)='if
_LT_DLL_DEF_P([$export_symbols]); then
cp "$export_symbols" "$output_objdir/$soname.def";
echo "$tool_output_objdir$soname.def" >
"$output_objdir/$soname.exp";
else
$SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols >
$output_objdir/$soname.exp;
fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags
$deplibs "@$tool_output_objdir$soname.exp"
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ if test -z "$linker_flags"; then
+ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags
$deplibs "@$tool_output_objdir$soname.exp"
-Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib";
+ else
+ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags
$deplibs "@$tool_output_objdir$soname.exp"
-Wl,$linker_flags-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib";
+ fi~
linknames='
# The linker will not automatically build a static lib if we build a
DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
diff --git a/tests/flags.at b/tests/flags.at
index b13ed0bd..82cfd8a6 100644
--- a/tests/flags.at
+++ b/tests/flags.at
@@ -129,7 +129,7 @@ for flag in -Wc, -Wl, '-Xcompiler ' '-Xlinker '; do
-Wc, | -Xcompiler\ )
AT_CHECK([$LIBTOOL -n --tag=lt_tag --mode=compile $compile ]dnl
[$flag-foo -c $source], [], [stdout], [ignore])
- AT_CHECK([$FGREP " -foo" stdout], [], [ignore])
+ AT_CHECK([$GREP -- " -foo" stdout], [], [ignore])
flag_prefix_prog=
flag_prefix_lib=
flags_in_liblink=$compiler_flags_in_liblink
@@ -143,7 +143,7 @@ for flag in -Wc, -Wl, '-Xcompiler ' '-Xlinker '; do
AT_CHECK([$LIBTOOL -n --tag=lt_tag --mode=link $link ]dnl
[-o program$EXEEXT a.lo $flag-foo], [], [stdout], [ignore])
- AT_CHECK([$FGREP " $flag_prefix_prog-foo" stdout], [], [ignore])
+ AT_CHECK([$GREP -- "$flag_prefix_prog-foo" stdout], [], [ignore])
eval set x "$library_and_module"
for output
@@ -152,9 +152,9 @@ for flag in -Wc, -Wl, '-Xcompiler ' '-Xlinker '; do
AT_CHECK([$LIBTOOL -n --tag=lt_tag --mode=link $link ]dnl
[-o $output a.lo -rpath /nowhere $flag-foo], [], [stdout],
[ignore])
if $flags_in_liblink; then
- AT_CHECK([$FGREP " $flag_prefix_lib-foo" stdout], [], [ignore])
+ AT_CHECK([$GREP -- "$flag_prefix_lib-foo" stdout], [], [ignore])
else
- AT_CHECK([$FGREP " $flag_prefix_lib-foo" stdout], [1])
+ AT_CHECK([$GREP -- " $flag_prefix_lib-foo" stdout], [1])
fi
done
done