libtool-patches
[Top][All Lists]
Advanced

[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: Mon, 22 Feb 2010 22:44:54 +0100
User-agent: Mutt/1.5.20 (2009-10-28)

* Pierre Ossman wrote on Mon, Feb 22, 2010 at 11:13:41AM CET:
> On Sat, 20 Feb 2010 10:32:27 +0100 Ralf Wildenhues wrote:
> > * Pierre Ossman wrote on Mon, Feb 15, 2010 at 11:01:40AM CET:
> > > The "normal" check was fixed some time ago, but the fallback code was
> > > overlooked. This patch fixes that as well.
> > 
> > So that means you've encountered it with some code, on some system.
> > Does your patch fix a testcase there, and if not, care to add (or
> > describe) one?

> My build system simply lacked the "file" command, so the fallback was
> used. I've since added "file", but I figured I could be a good citizen
> and fix the fallback in case anyone else stumbles upon it.

Great!  So we'd need a test that removes the 'file' command.
Can you please try the patch below and see that it works for you
and that it exposes the bug without your fix?  Thanks.

The test doesn't include a negative example yet (where linking ought to
fail); I'm not sure about this, or its desirability.

> > Then, I'm seeing a small inconsistency between func_win32_libid and the
> > libtool.m4 text (taken post-patch, but the inconsistency was there
> > before):
> > 
> >   (pe-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)
> > (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)
> > 
> > Which one's right?

> I have no idea why the latter looks the way it does. The latest
> binutils gives an output matching the first line.

Let's use the latter, it's more forgiving.

> (also, the "architecture" part is on a separate line in current
> binutils and not relevant for this expression)
> 
> I didn't dare change it in case it broke some old binutils people were
> relying on.

Yeah, likely.

> > AFAICS copyright papers are not in place for you yet; more about this
> > off-list (but please don't send more patch text until this is sorted
> > out).
> 
> Correct. I've started the process and I'll get back to you once it is
> done.

Thanks.

Cheers,
Ralf

2010-02-22  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.

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/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 29f1222..fa8edc7 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..74ad57b
--- /dev/null
+++ b/tests/deplibs-mingw.at
@@ -0,0 +1,97 @@
+# 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 (); }
+]])
+AT_DATA([m.c],
+[[extern int b ();
+int main () { return b (); }
+]])
+
+for file in a.c b.c; do
+  $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file
+done
+$CC $CPPFLAGS $CFLAGS -c m.c
+AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la a.lo -rpath 
$libdir],
+        [], [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([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o m$EXEEXT m.$OBJEXT 
libb.la]dnl
+          [], [ignore], [ignore])
+
+  LT_AT_EXEC_CHECK([./m])
+
+  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 || 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 liba.la a.lo 
-rpath $libdir] dnl
+              [|| exit 77], [], [ignore], [ignore])
+    else
+      break;
+    fi;;
+  *)
+    break;;
+  esac
+done
+
+AT_CLEANUP




reply via email to

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