branch: development commit 4ded381a6f09cb761a05403450b5e34fec945f5a Author: Ileana Dumitrescu <ileanadumitresc...@gmail.com> 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