Re: [PATCH] Correct DLL Installation Path for x86_64-w64-mingw32 Multilib
Thank you for the patch! I have run this through some testing, and I have not seen any regressions with libtool's testsuite. It does seem like this standardizes libtool's behaviour with how library paths are usually defined for multiarch. You should see it in the next release of libtool, unless issues are found. On 19/05/2024 09:28, trcrsired wrote: From: cqwrteur <100043421+trcrsi...@users.noreply.github.com> GCC folks ask me to submit it to upstream. see: https://gcc.gnu.org/pipermail/gcc-patches/2024-May/651670.html When building native GCC for the x86_64-w64-mingw32 host, the compiler copies its library DLLs to the `bin` directory. However, in the case of a multilib configuration, both 32-bit and 64-bit libraries end up in the same `bin` directory, leading to conflicts where 64-bit DLLs are overridden by their 32-bit counterparts. This patch addresses the issue by adjusting the installation path for the libraries. Specifically, it installs the libraries to separate directories: `lib` for 64-bit and `lib32` for 32-bit. This behavior aligns with how libraries are installed when creating an x86_64-w64-mingw32 cross-compiler without copying them to the `bin` directory if it is a multilib build. --- m4/libtool.m4 | 14 ++ 1 file changed, 14 insertions(+) diff --git a/m4/libtool.m4 b/m4/libtool.m4 index c5be6436..3f5203a7 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -2546,6 +2546,19 @@ cygwin* | mingw* | windows* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds +# If user builds GCC with mulitlibs enabled, +# it should just install on $(libdir) +# not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. +if test ${multilib} = yes; then +postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + $install_prog $dir/$dlname $destdir/$dlname~ + chmod a+x $destdir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +eval '\''$striplib $destdir/$dlname'\'' || exit \$?; + fi' +else postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ @@ -2555,6 +2568,7 @@ cygwin* | mingw* | windows* | pw32* | cegcc*) if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' +fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' -- Ileana Dumitrescu GPG Public Key: FA26 CA78 4BE1 8892 7F22 B99F 6570 EA01 146F 7354 OpenPGP_0x6570EA01146F7354.asc Description: OpenPGP public key OpenPGP_signature.asc Description: OpenPGP digital signature
Re: [PATCH] Correct DLL Installation Path for x86_64-w64-mingw32 Multilib
На 19.05.24 г. в 9:28 ч., trcrsired написа: From: cqwrteur <100043421+trcrsi...@users.noreply.github.com> GCC folks ask me to submit it to upstream. see: https://gcc.gnu.org/pipermail/gcc-patches/2024-May/651670.html When building native GCC for the x86_64-w64-mingw32 host, the compiler copies its library DLLs to the `bin` directory. However, in the case of a multilib configuration, both 32-bit and 64-bit libraries end up in the same `bin` directory, leading to conflicts where 64-bit DLLs are overridden by their 32-bit counterparts. This patch addresses the issue by adjusting the installation path for the libraries. Specifically, it installs the libraries to separate directories: `lib` for 64-bit and `lib32` for 32-bit. This behavior aligns with how libraries are installed when creating an x86_64-w64-mingw32 cross-compiler without copying them to the `bin` directory if it is a multilib build. [SNIP] In specified case shared library (DLL) must be installed into same location(path) as binary. Specified OS lacks LD_LIBRARY_PATH or similar functionality. It uses PATH instead. So proposed patch is conceptually wrong. I'm sure that patch will break regression tests. For sure cross-build libtool 2.4.6 tests pass in emulated environment (wine). Roumen
[PATCH] Correct DLL Installation Path for x86_64-w64-mingw32 Multilib
From: cqwrteur <100043421+trcrsi...@users.noreply.github.com> GCC folks ask me to submit it to upstream. see: https://gcc.gnu.org/pipermail/gcc-patches/2024-May/651670.html When building native GCC for the x86_64-w64-mingw32 host, the compiler copies its library DLLs to the `bin` directory. However, in the case of a multilib configuration, both 32-bit and 64-bit libraries end up in the same `bin` directory, leading to conflicts where 64-bit DLLs are overridden by their 32-bit counterparts. This patch addresses the issue by adjusting the installation path for the libraries. Specifically, it installs the libraries to separate directories: `lib` for 64-bit and `lib32` for 32-bit. This behavior aligns with how libraries are installed when creating an x86_64-w64-mingw32 cross-compiler without copying them to the `bin` directory if it is a multilib build. --- m4/libtool.m4 | 14 ++ 1 file changed, 14 insertions(+) diff --git a/m4/libtool.m4 b/m4/libtool.m4 index c5be6436..3f5203a7 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -2546,6 +2546,19 @@ cygwin* | mingw* | windows* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds +# If user builds GCC with mulitlibs enabled, +# it should just install on $(libdir) +# not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. +if test ${multilib} = yes; then +postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + $install_prog $dir/$dlname $destdir/$dlname~ + chmod a+x $destdir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +eval '\''$striplib $destdir/$dlname'\'' || exit \$?; + fi' +else postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ @@ -2555,6 +2568,7 @@ cygwin* | mingw* | windows* | pw32* | cegcc*) if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' +fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' -- 2.34.1