bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: relocatable-prog status


From: Ben Pfaff
Subject: Re: relocatable-prog status
Date: Mon, 21 Oct 2013 22:51:38 -0700
User-agent: Mutt/1.5.21 (2010-09-15)

On Mon, Oct 21, 2013 at 08:08:26PM +0200, Sylvain wrote:
> Hi,
> 
> On Sun, Oct 20, 2013 at 01:48:19PM -0700, Ben Pfaff wrote:
> > Sylvain <address@hidden> writes:
> > 
> > > It's been a while (1 year 1/2) since
> > > http://lists.debian.org/debian-bsd/2012/05/msg00032.html and I still
> > > need to manually patch gnulib before releasing.
> > >
> > > If I assume the relocatable-prog module is not maintained, that I'm
> > > probably the only person on earth to use it, and that I should just
> > > drop it from my package, am I wrong? ;)
> > 
> > No, we use relocatable-prog in GNU PSPP as well.  I build with it
> > all the time.  But I don't use Debian/kFreeBSD or Debian/Hurd, so
> > I don't see this problem.
> 
> I don't use them either, but the Debian autobuilder does :)
> In the case of pspp, I see that it compiles fine on these
> platforms, e,g.:
> https://buildd.debian.org/status/fetch.php?pkg=pspp&arch=kfreebsd-amd64&ver=0.7.9%2bgit20120620-1.2&stamp=1369659905
> 
> AFAIU you'll hit the bug as soon as you have more than 1 program in a
> bin_PROGRAMS statement.  Mine is:
>   bin_PROGRAMS = freedink freedinkedit
> 
> In this case automake makes 1 call to 'install' with multiple
> arguments, but 'install-reloc' only support one. Bruno's patch adds
> support for multiple arguments.  It's as simple as that.
> 
> 
> > I do read this list, and I am a maintainer of relocatable-prog,
> > but somehow I missed the discussion.  Maybe I thought that Bruno
> > was going to take care of it, since he suggested the patch.
> > 
> > Are you still happy with install-reloc with Bruno's patch?  If
> > so, then I will commit it to gnulib.
> 
> The patch is manually applied for each FreeDink release and compiles
> on all Debian architectures (as well as other distros and OSes).
> 
> When discussing with Bruno at GHM 2012, he told me he absolutely
> wanted to write a test case first.  But after this much time I wonder
> why a non-test-cased bug should prevail over an non-test-cased fix ;)
> 
> So as far as I'm concerned, I'd be happy to see this fix committed :)

That sounds reasonable to me.

Here is what I plan to commit.  Does anyone see anything I should change
beforehand?  It has been a long time since I did much work on gnulib
(mainly because "it just works" for me these days), so I want to make
sure I'm not overlooking something.

All of the substantive change in the patch is by Bruno, hence I am
making him the author of the commit (I will be the committer, if I push
it).

Thanks,

Ben.

--8<--------------------------cut here-------------------------->8--

From: Bruno Haible <address@hidden>
Date: Mon, 21 Oct 2013 22:48:35 -0700
Subject: [PATCH] install-reloc: Support multi-binary installation.

* build-aux/install-reloc: Support installing multiple programs in
one invocation, as done by Automake starting with commit
4295fe33eb23f (Multi-file install for PROGRAMS.).  From Bruno
Haible <address@hidden>, archived at
http://lists.debian.org/debian-bsd/2012/05/msg00032.html.
Reported by Sylvain <address@hidden>.
---
 ChangeLog               |   10 ++
 build-aux/install-reloc |  272 ++++++++++++++++++++++++++++++-----------------
 2 files changed, 184 insertions(+), 98 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1c6a7af..31aaacc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-10-21  Ben Pfaff  <address@hidden>
+
+       install-reloc: Support multi-binary installation.
+       * build-aux/install-reloc: Support installing multiple programs in
+       one invocation, as done by Automake starting with commit
+       4295fe33eb23f (Multi-file install for PROGRAMS.).  From Bruno
+       Haible <address@hidden>, archived at
+       http://lists.debian.org/debian-bsd/2012/05/msg00032.html.
+       Reported by Sylvain <address@hidden>.
+
 2013-10-21  Jim Meyering  <address@hidden>
 
        regex: also remove dependency on HAVE_WCSCOLL
diff --git a/build-aux/install-reloc b/build-aux/install-reloc
index 7edc541..0eb1326 100755
--- a/build-aux/install-reloc
+++ b/build-aux/install-reloc
@@ -16,11 +16,11 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# Usage:
-#   install-reloc library_path_var library_path_value prefix destdir \
-#                 compile_command srcdir builddir config_h_dir exeext \
-#                 strip_command \
-#                 install_command... destprog
+# Usage 1:
+#   install-reloc -- library_path_var library_path_value prefix destdir \
+#                    compile_command srcdir builddir config_h_dir exeext \
+#                    strip_command \
+#                    install_command... destprog
 # where
 #   - library_path_var is the platform dependent runtime library path variable
 #   - library_path_value is a colon separated list of directories that contain
@@ -39,51 +39,67 @@
 #     stripping is desired
 #   - install_command is the install command line, excluding the final destprog
 #   - destprog is the destination program name
+# Usage 2:
+#   env RELOC_LIBRARY_PATH_VAR=library_path_var \
+#       RELOC_LIBRARY_PATH_VALUE=library_path_value \
+#       RELOC_PREFIX=prefix \
+#       RELOC_DESTDIR=destdir \
+#       RELOC_COMPILE_COMMAND=compile_command \
+#       RELOC_SRCDIR=srcdir \
+#       RELOC_BUILDDIR=builddir \
+#       RELOC_CONFIG_H_DIR=config_h_dir \
+#       RELOC_EXEEXT=exeext \
+#       RELOC_STRIP_PROG=strip_command \
+#       RELOC_INSTALL_PROG=install_command... \
+#   install-reloc prog1 ... destprog
+#   where destprog is either the destination program name (when only one 
program
+#   is specified) or the destination directory for all programs.
 # install-reloc renames destprog to destprog.bin and installs a relocating
 # wrapper in the place of destprog.
 
 progname=$0
 
-if test $# -eq 2; then
-  # Get arguments from environment variables.
-  library_path_var=$RELOC_LIBRARY_PATH_VAR
-  library_path_value=$RELOC_LIBRARY_PATH_VALUE
-  prefix=$RELOC_PREFIX
-  destdir=$RELOC_DESTDIR
-  compile_command=$RELOC_COMPILE_COMMAND
-  srcdir=$RELOC_SRCDIR
-  builddir=$RELOC_BUILDDIR
-  config_h_dir=$RELOC_CONFIG_H_DIR
-  exeext=$RELOC_EXEEXT
-  strip_prog=$RELOC_STRIP_PROG
-  install_prog=$RELOC_INSTALL_PROG # including the "-c" option
+if test $# -ge 12 && test "x$1" = "x--"; then
+  # Get fixed position arguments.
+  shift
+  library_path_var=$1
+  library_path_value=$2
+  prefix=$3
+  destdir=$4
+  shift
+  shift
+  shift
+  shift
+  compile_command=$1
+  srcdir=$2
+  builddir=$3
+  config_h_dir=$4
+  exeext=$5
+  shift
+  shift
+  shift
+  shift
+  shift
+  strip_prog=$1
+  shift
+  install_prog=$1 # maybe not including the "-c" option
+  shift
 else
-  if test $# -ge 11; then
-    # Get fixed position arguments.
-    library_path_var=$1
-    library_path_value=$2
-    prefix=$3
-    destdir=$4
-    shift
-    shift
-    shift
-    shift
-    compile_command=$1
-    srcdir=$2
-    builddir=$3
-    config_h_dir=$4
-    exeext=$5
-    shift
-    shift
-    shift
-    shift
-    shift
-    strip_prog=$1
-    shift
-    install_prog=$1 # maybe not including the "-c" option
-    shift
+  if test $# -ge 2; then
+    # Get arguments from environment variables.
+    library_path_var=$RELOC_LIBRARY_PATH_VAR
+    library_path_value=$RELOC_LIBRARY_PATH_VALUE
+    prefix=$RELOC_PREFIX
+    destdir=$RELOC_DESTDIR
+    compile_command=$RELOC_COMPILE_COMMAND
+    srcdir=$RELOC_SRCDIR
+    builddir=$RELOC_BUILDDIR
+    config_h_dir=$RELOC_CONFIG_H_DIR
+    exeext=$RELOC_EXEEXT
+    strip_prog=$RELOC_STRIP_PROG
+    install_prog=$RELOC_INSTALL_PROG # including the "-c" option
   else
-    echo "Usage: $0 library_path_var library_path_value prefix destdir" \
+    echo "Usage: $0 -- library_path_var library_path_value prefix destdir" \
          "compile_command srcdir builddir config_h_dir exeext" \
          "strip_command" \
          "install_command... destprog" 1>&2
@@ -97,11 +113,26 @@ for arg
 do
   destprog=$arg
 done
-# Remove trailing $exeext, if present.
+# Determine whether destprog is a program name or a directory name.
+if test -d "$destprog"; then
+  sed_remove_trailing_slashes='s|//*$||'
+  destprog_directory=`echo "$destprog" | sed -e "$sed_remove_trailing_slashes"`
+  if test -z "$destprog_directory"; then
+    destprog_directory='/'
+  fi
+else
+  destprog_directory=
+fi
+# Prepare for remove trailing $exeext, if present.
 if test -n "$exeext"; then
   sed_quote='s,\.,\\.,g'
   sed_remove_exeext='s|'`echo "$exeext" | sed -e "$sed_quote"`'$||'
-  destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
+fi
+if test -z "$destprog_directory"; then
+  # Remove trailing $exeext, if present.
+  if test -n "$exeext"; then
+    destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
+  fi
 fi
 
 # Outputs a command and runs it.
@@ -114,8 +145,39 @@ func_verbose ()
 # Run install_command.
 func_verbose $install_prog "$@" || exit $?
 
+# Iterate over all destination program names.
+# func_iterate f
+# applies f to each destination program names, after setting destprog.
+sed_basename_of_file='s|^.*/||'
+func_iterate ()
+{
+  if test -n "$destprog_directory"; then
+    prev_arg=
+    for arg
+    do
+      if test -n "prev_arg"; then
+        destprog="$destprog_directory"/`echo "$prev_arg" | sed -e 
"$sed_basename_of_file"`
+        $1
+      fi
+      prev_arg="$arg"
+    done
+  else
+    $1
+  fi
+}
+
 # Run strip_command.
-test "$strip_prog" = ':' || func_verbose "$strip_prog" "$destprog$exeext" || 
exit $?
+func_strip ()
+{
+  # Remove trailing $exeext, if present.
+  if test -n "$exeext"; then
+    destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
+  fi
+  func_verbose "$strip_prog" "$destprog$exeext" || exit $?
+}
+if test "$strip_prog" != ':'; then
+  func_iterate func_strip
+fi
 
 # If the platform doesn't support LD_LIBRARY_PATH or similar, we cannot build
 # a wrapper.
@@ -138,63 +200,77 @@ IFS="$save_IFS"
 test -n "$libdirs" || exit 0
 
 # Determine installdir from destprog, removing a leading destdir if present.
-installdir=`echo "$destprog" | sed -e 's,/[^/]*$,,'`
+if test -n "$destprog_directory"; then
+  installdir="$destprog_directory"
+else
+  installdir=`echo "$destprog" | sed -e 's,/[^/]*$,,'`
+fi
 if test -n "$destdir"; then
   sed_quote='s,\([|.\*^$[]\),\\\1,g'
   sed_remove_destdir='s|^'`echo "$destdir" | sed -e "$sed_quote"`'||'
   installdir=`echo "$installdir" | sed -e "$sed_remove_destdir"`
 fi
 
-# Compile wrapper.
-func_verbose $compile_command \
-             -I"$builddir" -I"$srcdir" -I"$config_h_dir" \
-             -DHAVE_CONFIG_H -DIN_RELOCWRAPPER -DNO_XMALLOC \
-             -D"INSTALLPREFIX=\"$prefix\"" -D"INSTALLDIR=\"$installdir\"" \
-             -D"LIBPATHVAR=\"$library_path_var\"" -D"LIBDIRS=$libdirs" \
-             -D"EXEEXT=\"$exeext\"" \
-             "$srcdir"/relocwrapper.c \
-             "$srcdir"/progname.c \
-             "$srcdir"/progreloc.c \
-             "$srcdir"/areadlink.c \
-             "$srcdir"/careadlinkat.c \
-             "$srcdir"/allocator.c \
-             "$srcdir"/readlink.c \
-             "$srcdir"/canonicalize-lgpl.c \
-             "$srcdir"/malloca.c \
-             "$srcdir"/relocatable.c \
-             "$srcdir"/setenv.c \
-             "$srcdir"/strerror.c \
-             "$srcdir"/c-ctype.c \
-             -o "$destprog.wrapper$exeext"
-rc=$?
-# Clean up object files left over in the current directory by the native C
-# compilers on Solaris, HP-UX, OSF/1, IRIX.
-rm -f relocwrapper.o \
-      progname.o \
-      progreloc.o \
-      areadlink.o \
-      careadlinkat.o \
-      allocator.o \
-      readlink.o \
-      canonicalize-lgpl.o \
-      malloca.o \
-      relocatable.o \
-      setenv.o \
-      strerror.o \
-      c-ctype.o
-test $rc = 0 || exit $?
-# Clean up debugging information left over by the native C compiler on Mac OS 
X.
-rm -rf "$destprog.wrapper$exeext.dSYM"
-test $rc = 0 || exit $?
-
-# Strip wrapper.
-test "$strip_prog" = ':' || func_verbose "$strip_prog" 
"$destprog.wrapper$exeext" || exit $?
-
-# Rename $destprog.wrapper -> $destprog -> $destprog.bin.
-ln -f "$destprog$exeext" "$destprog.bin$exeext" \
-  || { rm -f "$destprog.bin$exeext" \
-       && cp -p "$destprog$exeext" "$destprog.bin$exeext"; } \
-  || exit 1
-mv "$destprog.wrapper$exeext" "$destprog$exeext" || exit 1
+# Compile and install wrapper.
+func_create_wrapper ()
+{
+  # Remove trailing $exeext, if present.
+  if test -n "$exeext"; then
+    destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
+  fi
+
+  # Compile wrapper.
+  func_verbose $compile_command \
+               -I"$builddir" -I"$srcdir" -I"$config_h_dir" \
+               -DHAVE_CONFIG_H -DIN_RELOCWRAPPER -DNO_XMALLOC \
+               -D"INSTALLPREFIX=\"$prefix\"" -D"INSTALLDIR=\"$installdir\"" \
+               -D"LIBPATHVAR=\"$library_path_var\"" -D"LIBDIRS=$libdirs" \
+               -D"EXEEXT=\"$exeext\"" \
+               "$srcdir"/relocwrapper.c \
+               "$srcdir"/progname.c \
+               "$srcdir"/progreloc.c \
+               "$srcdir"/areadlink.c \
+               "$srcdir"/careadlinkat.c \
+               "$srcdir"/allocator.c \
+               "$srcdir"/readlink.c \
+               "$srcdir"/canonicalize-lgpl.c \
+               "$srcdir"/malloca.c \
+               "$srcdir"/relocatable.c \
+               "$srcdir"/setenv.c \
+               "$srcdir"/strerror.c \
+               "$srcdir"/c-ctype.c \
+               -o "$destprog.wrapper$exeext"
+  rc=$?
+  # Clean up object files left over in the current directory by the native C
+  # compilers on Solaris, HP-UX, OSF/1, IRIX.
+  rm -f relocwrapper.o \
+        progname.o \
+        progreloc.o \
+        areadlink.o \
+        careadlinkat.o \
+        allocator.o \
+        readlink.o \
+        canonicalize-lgpl.o \
+        malloca.o \
+        relocatable.o \
+        setenv.o \
+        strerror.o \
+        c-ctype.o
+  test $rc = 0 || exit $?
+  # Clean up debugging information left over by the native C compiler on MacOS 
X.
+  rm -rf "$destprog.wrapper$exeext.dSYM"
+  test $rc = 0 || exit $?
+
+  # Strip wrapper.
+  test "$strip_prog" = ':' || func_verbose "$strip_prog" 
"$destprog.wrapper$exeext" || exit $?
+
+  # Rename $destprog.wrapper -> $destprog -> $destprog.bin.
+  ln -f "$destprog$exeext" "$destprog.bin$exeext" \
+    || { rm -f "$destprog.bin$exeext" \
+         && cp -p "$destprog$exeext" "$destprog.bin$exeext"; } \
+    || exit 1
+  mv "$destprog.wrapper$exeext" "$destprog$exeext" || exit 1
+}
+func_iterate func_create_wrapper
 
 exit 0
-- 
1.7.10.4




reply via email to

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