> This is a revised version, incorporating the additional changes
> suggested by Eric and Noah. I re-ran the testsuite on cygwin, mingw,
> and linux and the results were identical to those posted here:
> http://lists.gnu.org/archive/html/libtool-patches/2007-06/msg00019.html
Looks good to me. Feel free to check it in when ready.
--
Eric Blake
--- Begin Message ---
Index: libltdl/config/ltmain.m4sh
===================================================================
RCS file: /cvsroot/libtool/libtool/libltdl/config/ltmain.m4sh,v
retrieving revision 1.78
diff -u -r1.78 ltmain.m4sh
--- libltdl/config/ltmain.m4sh 7 Jun 2007 08:50:17 -0000 1.78
+++ libltdl/config/ltmain.m4sh 9 Jun 2007 01:12:07 -0000
@@ -2209,15 +2209,27 @@
test "$mode" = install && func_mode_install ${1+"$@"}
-# func_emit_libtool_wrapper_script
+# func_emit_libtool_wrapper_script arg
+#
# emit a libtool wrapper script on stdout
# don't directly open a file because we may want to
# incorporate the script contents within a cygwin/mingw
# wrapper executable. Must ONLY be called from within
# func_mode_link because it depends on a number of variable
# set therein.
+#
+# arg is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take. If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the '.lib' directory. This is a cygwin/mingw-specific
+# behavior.
func_emit_libtool_wrapper_script ()
{
+ func_emit_libtool_wrapper_script_arg1=no
+ if test -n "$1" ; then
+ func_emit_libtool_wrapper_script_arg1=$1
+ fi
+
$ECHO "\
#! $SHELL
@@ -2301,8 +2313,9 @@
file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
done
- # cygwin/mingw cwrapper will rewrite this line:
- WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_libtool_wrapper_script_arg1
if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
# special case for '.'
if test \"\$thisdir\" = \".\"; then
@@ -2463,6 +2476,13 @@
# define LT_PATHMAX 1024
#endif
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
#ifndef DIR_SEPARATOR
# define DIR_SEPARATOR '/'
# define PATH_SEPARATOR ':'
@@ -2499,9 +2519,17 @@
#undef LTWRAPPER_DEBUGPRINTF
#if defined DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(format, ...) fprintf(stderr, format,
__VA_ARGS__)
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+ va_list args;
+ va_start (args, fmt);
+ (void) vfprintf (stderr, fmt, args);
+ va_end (args);
+}
#else
-# define LTWRAPPER_DEBUGPRINTF(format, ...)
+# define LTWRAPPER_DEBUGPRINTF(args)
#endif
const char *program_name = NULL;
@@ -2519,9 +2547,8 @@
static const char *script_text =
EOF
- func_emit_libtool_wrapper_script |
+ func_emit_libtool_wrapper_script yes |
$SED -e 's/\([\\"]\)/\\\1/g' \
- -e 's/\(WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\)=.*/\1=yes/' \
-e 's/^/ "/' -e 's/$/\\n"/'
echo ";"
@@ -2540,8 +2567,8 @@
int i;
program_name = (char *) xstrdup (base_name (argv[0]));
- LTWRAPPER_DEBUGPRINTF ("(main) argv[0] : %s\n", argv[0]);
- LTWRAPPER_DEBUGPRINTF ("(main) program_name : %s\n", program_name);
+ LTWRAPPER_DEBUGPRINTF (("(main) argv[0] : %s\n", argv[0]));
+ LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
/* very simple arg parsing; don't want to rely on getopt */
for (i = 1; i < argc; i++)
@@ -2582,12 +2609,12 @@
tmp_pathspec = find_executable (argv[0]);
if (tmp_pathspec == NULL)
lt_fatal ("Couldn't find %s", argv[0]);
- LTWRAPPER_DEBUGPRINTF ("(main) found exe (before symlink chase) at : %s\n",
- tmp_pathspec);
+ LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+ tmp_pathspec));
actual_cwrapper_path = chase_symlinks (tmp_pathspec);
- LTWRAPPER_DEBUGPRINTF ("(main) found exe (after symlink chase) at : %s\n",
- actual_cwrapper_path);
+ LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+ actual_cwrapper_path));
XFREE (tmp_pathspec);
shwrapper_name = (char *) xstrdup (base_name (actual_cwrapper_path));
@@ -2602,8 +2629,8 @@
XFREE (shwrapper_name);
shwrapper_name = tmp_pathspec;
tmp_pathspec = 0;
- LTWRAPPER_DEBUGPRINTF ("(main) libtool shell wrapper name: %s\n",
- shwrapper_name);
+ LTWRAPPER_DEBUGPRINTF (("(main) libtool shell wrapper name: %s\n",
+ shwrapper_name));
EOF
cat <<EOF
@@ -2653,7 +2680,7 @@
for (i = 0; i < argc + 1; i++)
{
- LTWRAPPER_DEBUGPRINTF ("(main) newargz[%d] : %s\n", i, newargz[i]);
+ LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, newargz[i]));
}
EOF
@@ -2714,20 +2741,13 @@
{
struct stat st;
- LTWRAPPER_DEBUGPRINTF ("(check_executable) : %s\n",
- path ? (*path ? path : "EMPTY!") : "NULL!");
+ LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n",
+ path ? (*path ? path : "EMPTY!") : "NULL!"));
if ((!path) || (!*path))
return 0;
- if ((stat (path, &st) >= 0) && (
- /* MinGW & native WIN32 do not support
S_IXOTH or S_IXGRP */
-#if defined (S_IXOTH)
- ((st.st_mode & S_IXOTH) == S_IXOTH) ||
-#endif
-#if defined (S_IXGRP)
- ((st.st_mode & S_IXGRP) == S_IXGRP) ||
-#endif
- ((st.st_mode & S_IXUSR) == S_IXUSR)))
+ if ((stat (path, &st) >= 0)
+ && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
return 1;
else
return 0;
@@ -2739,24 +2759,14 @@
int rval = 0;
struct stat st;
- /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
- int S_XFLAGS =
-#if defined (S_IXOTH)
- S_IXOTH ||
-#endif
-#if defined (S_IXGRP)
- S_IXGRP ||
-#endif
- S_IXUSR;
-
- LTWRAPPER_DEBUGPRINTF ("(make_executable) : %s\n",
- path ? (*path ? path : "EMPTY!") : "NULL!");
+ LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n",
+ path ? (*path ? path : "EMPTY!") : "NULL!"));
if ((!path) || (!*path))
return 0;
if (stat (path, &st) >= 0)
{
- rval = chmod (path, st.st_mode | S_XFLAGS);
+ rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
}
return rval;
}
@@ -2776,8 +2786,8 @@
int tmp_len;
char *concat_name;
- LTWRAPPER_DEBUGPRINTF ("(find_executable) : %s\n",
- wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+ LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n",
+ wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
if ((wrapper == NULL) || (*wrapper == '\0'))
return NULL;
@@ -2882,8 +2892,8 @@
int has_symlinks = 0;
while (strlen (tmp_pathspec) && !has_symlinks)
{
- LTWRAPPER_DEBUGPRINTF ("checking path component for symlinks: %s\n",
- tmp_pathspec);
+ LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+ tmp_pathspec));
if (lstat (tmp_pathspec, &s) == 0)
{
if (S_ISLNK (s.st_mode) != 0)
@@ -6718,7 +6728,7 @@
$RM $output
trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
- func_emit_libtool_wrapper_script > $output
+ func_emit_libtool_wrapper_script no > $output
chmod +x $output
}
exit $EXIT_SUCCESS
--- End Message ---