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 <b...@beuc.net> 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 <br...@clisp.org> 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 <br...@clisp.org>, archived at http://lists.debian.org/debian-bsd/2012/05/msg00032.html. Reported by Sylvain <b...@gnu.org>. --- 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 <b...@cs.stanford.edu> + + 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 <br...@clisp.org>, archived at + http://lists.debian.org/debian-bsd/2012/05/msg00032.html. + Reported by Sylvain <b...@gnu.org>. + 2013-10-21 Jim Meyering <meyer...@fb.com> 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