[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Make deplibs check fallback work for 64-bit Windows and Windows CE
From: |
Ralf Wildenhues |
Subject: |
Re: Make deplibs check fallback work for 64-bit Windows and Windows CE |
Date: |
Sun, 28 Feb 2010 05:49:00 +0100 |
User-agent: |
Mutt/1.5.20 (2009-10-28) |
* Pierre Ossman wrote on Thu, Feb 25, 2010 at 11:21:54AM CET:
> On Wed, 24 Feb 2010 22:31:07 +0100 > Ralf Wildenhues wrote:
>
> > I managed to send out a broken version of the patch. Please forget that
> > one, this one has a testcase that should work better. Can you retry
> > with it? You can use something like
> >
> > make all check-local TESTSUITEFLAGS='-v -d -x -k "deplibs without file
> > command"'
> >
> > and it should pass if your libtool.m4 change is included and fail
> > without. With a cross compiler and wine, it skips, native it should
> > fail, but I can't test that ATM.
>
> I'm afraid I don't understand the principle of your test, as it seems
> to me that it should succeed in every case (it'll just link against a
> static libb instead of a dynamic one).
Ah, yes, I knew I was missing something there, but wasn't sure what.
> I've changed the test to instead try to determine if it was able to
> create a dynamic libb or not. It does this by looking at the
> library_names field in libb.la.
>
> I've confirmed that this test catches the bug here.
Great!
I've tweaked the test a bit more to skip on systems without shared
libraries at all (or when --disable-shared was used), to ensure
library_names is always initialized and to source only files from the
current directory, added a NEWS entry, and committed the patch as below.
Thanks again,
Ralf
2010-02-28 Pierre Ossman <address@hidden> (tiny change)
Ralf Wildenhues <address@hidden>
Fix deplibs check fallback for 64-bit Windows and Windows CE.
* libltdl/m4/libtool.m4 (_LT_CHECK_MAGIC_METHOD): Accept file formats
'pe-arm-wince' and 'pe-x86-64'. Add note about consistency with ...
* libltdl/config/ltmain.m4sh (func_win32_libid): ... the respective
pattern here; sync pattern from the former.
* tests/deplibs-mingw.at (deplibs without file command): New
file, new test.
* Makefile.am (TESTSUITE_AT): Update.
* NEWS: Update.
diff --git a/Makefile.am b/Makefile.am
index 29a639a..a7de46d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -504,7 +504,8 @@ TESTSUITE_AT = tests/testsuite.at \
tests/configure-iface.at \
tests/stresstest.at \
tests/cmdline_wrap.at \
- tests/darwin.at
+ tests/darwin.at \
+ tests/deplibs-mingw.at
EXTRA_DIST += $(srcdir)/$(TESTSUITE) $(TESTSUITE_AT)
$(srcdir)/tests/package.m4
diff --git a/NEWS b/NEWS
index 61638fd..00ab5c1 100644
--- a/NEWS
+++ b/NEWS
@@ -64,6 +64,7 @@ New in 2.2.8 2010-??-??: git version 2.2.7a, Libtool team:
when using the compiler driver to link programs. Now "-Wc," is stripped
just as it is when linking libraries through the compiler driver.
- Symbol versioning works with the GNU gold linker now.
+ - Fixes for detection of shared library dependencies on MinGW systems.
* Miscellaneous changes:
diff --git a/libltdl/config/ltmain.m4sh b/libltdl/config/ltmain.m4sh
index 56b7497..8fcedc9 100644
--- a/libltdl/config/ltmain.m4sh
+++ b/libltdl/config/ltmain.m4sh
@@ -2189,8 +2189,9 @@ func_win32_libid ()
win32_libid_type="x86 archive import"
;;
*ar\ archive*) # could be an import, or static
+ # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
- $EGREP 'file format (pe-i386(.*architecture:
i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+ $EGREP 'file format (pei*-i386(.*architecture:
i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
win32_nmres=`eval $NM -f posix -A $1 |
$SED -n -e '
1,100{
diff --git a/libltdl/m4/libtool.m4 b/libltdl/m4/libtool.m4
index b538fa6..f99e618 100644
--- a/libltdl/m4/libtool.m4
+++ b/libltdl/m4/libtool.m4
@@ -3009,7 +3009,8 @@ mingw* | pw32*)
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
else
- lt_cv_deplibs_check_method='file_magic file format
pei*-i386(.*architecture: i386)?'
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format
(pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
lt_cv_file_magic_cmd='$OBJDUMP -f'
fi
;;
diff --git a/tests/deplibs-mingw.at b/tests/deplibs-mingw.at
new file mode 100644
index 0000000..68e8386
--- /dev/null
+++ b/tests/deplibs-mingw.at
@@ -0,0 +1,93 @@
+# deplibs-mingw.at -- -*- Autotest -*-
+
+# Copyright (C) 2010 Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING. If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+####
+
+# Check that deplibs are detected correctly even if there is no `file'
+# command installed.
+
+AT_SETUP([deplibs without file command])
+AT_KEYWORDS([libtool])
+
+cwd=`pwd`
+instdir=$cwd/inst
+libdir=$instdir/lib
+bindir=$instdir/bin
+LDFLAGS="$LDFLAGS -no-undefined"
+
+mkdir inst inst/bin inst/lib
+
+AT_DATA([a.c],
+[[int a () { return 0; }
+]])
+AT_DATA([b.c],
+[[extern int a ();
+int b () { return a (); }
+]])
+
+for file in a.c b.c; do
+ $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file
+done
+AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la a.lo -rpath
$libdir],
+ [], [ignore], [ignore])
+AT_CHECK([library_names= && . ./liba.la && if test -z "$library_names"; then
exit 77; fi ],
+ [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=install cp liba.la $libdir], [], [ignore], [ignore])
+AT_CHECK([$LIBTOOL --mode=clean rm -f liba.la], [], [ignore], [ignore])
+rm -f $libdir/liba.la
+
+# check once with `file' (if present) and once without, if on MinGW.
+for try in with-file without-file; do
+ AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o libb.la b.lo -rpath
$libdir ]dnl
+ [-L$libdir -la],
+ [], [ignore], [ignore])
+ AT_CHECK([library_names= && . ./libb.la && if test -z "$library_names"; then
exit 99; fi ],
+ [], [ignore], [ignore])
+
+ case $host_os in
+ mingw*)
+ if file /; then
+ mkdir bin new-libtool
+
+ cat >bin/file <<\EOF
+#! /bin/sh
+exit 1
+EOF
+ chmod +x bin/file
+ PATH=`pwd`/bin${PATH_SEPARATOR-:}$PATH
+ cd new-libtool
+ AT_CHECK(["$abs_top_srcdir"/configure $configure_options || exit 77],
+ [], [ignore], [ignore])
+ cd ..
+ LIBTOOL=new-libtool/libtool
+ export LIBTOOL
+ # Check whether the generated script is usable; otherwise, skip.
+ AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o libunrelated.la
a.lo -rpath $libdir] dnl
+ [|| exit 77], [], [ignore], [ignore])
+ else
+ break;
+ fi;;
+ *)
+ break;;
+ esac
+done
+
+AT_CLEANUP