summaryrefslogtreecommitdiff
path: root/build-aux/install-reloc
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2013-10-21 22:48:35 -0700
committerBen Pfaff <blp@cs.stanford.edu>2013-10-24 20:08:36 -0700
commit5191b3546cfb6c163228c23f214e325ddf60d46f (patch)
treee22fa0cc933dd540d8c636c8cc90355fa19f4507 /build-aux/install-reloc
parent25fb29a19d9993a32075b7c3fefa959e3345ab64 (diff)
downloadgnulib-5191b3546cfb6c163228c23f214e325ddf60d46f.tar.gz
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 <bruno@clisp.org>, archived at http://lists.debian.org/debian-bsd/2012/05/msg00032.html. Reported by Sylvain <beuc@gnu.org>.
Diffstat (limited to 'build-aux/install-reloc')
-rwxr-xr-xbuild-aux/install-reloc272
1 files changed, 174 insertions, 98 deletions
diff --git a/build-aux/install-reloc b/build-aux/install-reloc
index 7edc541afb..0eb13269ab 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