Hello Roberto,

* Roberto Bagnara wrote on Mon, Mar 03, 2008 at 09:14:48PM CET:
>
> $ cat mycommand
> #!/bin/sh
> echo "mycommand invoked with argument '$1'"
> $ mycommand ciao
> mycommand invoked with argument 'ciao'
> $ ./libtool --mode=execute mycommand ciao
> mycommand invoked with argument '/home/roberto/tppl/'
> $
>
> Note that /home/roberto/tppl/ is the directory where the libtool
> script is located.  I can also do
>
> $ cd interfaces/
> $ ../libtool --mode=execute ../mycommand ciao
> mycommand invoked with argument '/home/roberto/tppl/'
>
> Is this behavior normal?

No.  Thank you for the bug report.  I've applied the fix below.

FWIW, the ordering of the tests in execute-mode.at is such that the
first set still passes for 1.5.26.

> ./libtool is what has been created at configure time and a bzipped
> version of it is attached to this file.

It wasn't attached to the message, but that's not a problem.  :-)

Cheers,
Ralf

        * libltdl/config/ltmain.m4sh (func_mode_execute): Replace only
        arguments we have identified as shell or C wrappers.
        (func_emit_wrapper): Output error message on stderr.
        * tests/execute-mode.at: New file, with --mode=execute tests.
        * Makefile.am: Adjust.
        * NEWS: Update.
        Fixes 2.2 regression.  Report by Roberto Bagnara.

Index: Makefile.am
===================================================================
RCS file: /cvsroot/libtool/libtool/Makefile.am,v
retrieving revision 1.229
diff -u -r1.229 Makefile.am
--- Makefile.am 18 Jan 2008 10:49:40 -0000      1.229
+++ Makefile.am 4 Mar 2008 21:16:26 -0000
@@ -447,6 +447,7 @@
                  tests/search-path.at \
                  tests/indirect_deps.at \
                  tests/archive-in-archive.at \
+                 tests/execute-mode.at \
                  tests/destdir.at \
                  tests/old-m4-iface.at \
                  tests/am-subdir.at \
Index: NEWS
===================================================================
RCS file: /cvsroot/libtool/libtool/NEWS,v
retrieving revision 1.220
diff -u -r1.220 NEWS
--- NEWS        4 Mar 2008 21:00:18 -0000       1.220
+++ NEWS        4 Mar 2008 21:16:27 -0000
@@ -6,6 +6,9 @@
 
   - Fix 2.2 regression in libltdl that causes memory corruption upon
     repeated `lt_dlinit(); lt_dlexit()'.
+  - Fix 2.2 regression in that `libtool --mode=execute CMD ARGS' does not
+    transform ARGS that do not look like shell or C wrappers of libtool
+    programs.
 
 New in 2.2: 2008-03-01; CVS version 2.1c, Libtool team:
 
Index: libltdl/config/ltmain.m4sh
===================================================================
RCS file: /cvsroot/libtool/libtool/libltdl/config/ltmain.m4sh,v
retrieving revision 1.97
diff -u -r1.97 ltmain.m4sh
--- libltdl/config/ltmain.m4sh  28 Jan 2008 15:49:46 -0000      1.97
+++ libltdl/config/ltmain.m4sh  4 Mar 2008 21:16:29 -0000
@@ -1694,12 +1694,14 @@
        # Do a test to see if this is really a libtool program.
        if func_ltwrapper_script_p "$file"; then
          func_source "$file"
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
        elif func_ltwrapper_executable_p "$file"; then
          func_ltwrapper_scriptname "$file"
          func_source "$func_ltwrapper_scriptname_result"
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
        fi
-       # Transform arg to wrapped name.
-       file="$progdir/$program"
        ;;
       esac
       # Quote arguments (to preserve shell metacharacters).
@@ -2468,7 +2470,7 @@
          ;;
        esac
        $ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\"
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
       exit 1
     fi
   else
--- /dev/null   2008-03-02 10:33:19.200041011 +0100
+++ tests/execute-mode.at       2008-03-04 22:15:22.000000000 +0100
@@ -0,0 +1,92 @@
+# execute-mode.at -- libtool --mode=execute             -*- Autotest -*-
+#
+#   Copyright (C) 2008 Free Software Foundation, Inc.
+#   Written by Ralf Wildenhues, 2008
+#
+#   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.
+####
+
+AT_SETUP([execute mode])
+AT_KEYWORDS([libtool])
+
+AT_DATA([foo],
+[[#! /bin/sh
+if test $# -gt 0; then
+  echo "$@"
+else
+  :
+fi
+]])
+
+AT_DATA([lt-wrapper],
+[[#! /bin/sh
+# Generated by GNU libtool.
+# fake wrapper script.
+program=lt-real
+progdir=.
+if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+  # Run the actual program with our arguments.
+  exec "$progdir/$program" ${1+"$@"}
+  echo "$0: cannot exec $program $*" >&2
+  exit 1
+fi
+]])
+
+AT_DATA([lt-real],
+[[#! /bin/sh
+echo "$@"
+]])
+
+mkdir sub
+cp foo sub/foo
+chmod +x foo sub/foo lt-wrapper lt-real
+
+AT_CHECK([$LIBTOOL --mode=execute ./foo])
+AT_CHECK([$LIBTOOL --mode=execute sub/foo])
+AT_CHECK([$LIBTOOL --mode=execute ./foo foo], [], [foo
+])
+AT_CHECK([$LIBTOOL --mode=execute ./lt-wrapper foo], [], [foo
+])
+AT_CHECK([cd sub && $LIBTOOL --mode=execute ./foo ../foo], [], [../foo
+])
+# suppose that ./foo is gdb, and lt-wrapper is the wrapper script.
+AT_CHECK([$LIBTOOL --mode=execute ./foo lt-wrapper bar baz], [],
+        [./lt-real bar baz
+])
+
+# Check that a missing real program causes an error.
+# The error message and code are likely to be 126,
+# "No such file or directory" but system-dependent.
+mv -f lt-real lt-backup
+AT_CHECK([$LIBTOOL --mode=execute ./lt-wrapper foo || exit 1],
+        [1], [ignore], [ignore])
+mv -f lt-backup lt-real
+
+# Now use arguments that require decent quoting.
+AT_CHECK([$LIBTOOL --mode=execute ./foo "arg  with special chars: \$!&*\`'()"],
+        [], [arg  with special chars: $!&*`'()
+])
+AT_CHECK([$LIBTOOL --mode=execute ./lt-wrapper "arg  with special chars: 
\$!&*\`'()"],
+        [], [arg  with special chars: $!&*`'()
+])
+AT_CHECK([$LIBTOOL --mode=execute ./foo lt-wrapper "arg  with special chars: 
\$!&*\`'()"],
+        [], [./lt-real arg  with special chars: $!&*`'()
+])
+
+AT_CLEANUP


_______________________________________________
Bug-libtool mailing list
Bug-libtool@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-libtool

Reply via email to