summaryrefslogtreecommitdiff
path: root/build-aux/install-reloc
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2007-03-01 01:15:40 +0000
committerBruno Haible <bruno@clisp.org>2007-03-01 01:15:40 +0000
commit86f544b2e68eefe1410f8c7db3be1819a18dbfb9 (patch)
tree79a9729df938c4642470320385f9f650d7314904 /build-aux/install-reloc
parent304e27459f8078ff1ed65350207f66eab8a6b949 (diff)
downloadgnulib-86f544b2e68eefe1410f8c7db3be1819a18dbfb9.tar.gz
Infrastructure for relocatable installation, from GNU gettext.
See http://lists.gnu.org/archive/html/bug-gnulib/2003-03/msg00020.html
Diffstat (limited to 'build-aux/install-reloc')
-rwxr-xr-xbuild-aux/install-reloc130
1 files changed, 130 insertions, 0 deletions
diff --git a/build-aux/install-reloc b/build-aux/install-reloc
new file mode 100755
index 0000000000..63b95e8bd4
--- /dev/null
+++ b/build-aux/install-reloc
@@ -0,0 +1,130 @@
+#!/bin/sh
+# install-reloc - install a program including a relocating wrapper
+# Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>, 2003.
+#
+# This program 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, or (at your option)
+# any later version.
+#
+# This program 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 this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage:
+# install-reloc library_path_var library_path_value prefix compile_command srcdir config_h_dir exeext 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
+# the libraries at installation time (use this instead of -rpath)
+# - prefix is the base directory at installation time
+# - compile_command is a C compiler compilation and linking command
+# - srcdir is the directory where to find relocwrapper.c and its dependencies
+# - builddir is the directory where to find built dependencies (namely,
+# alloca.h and stdbool.h)
+# - config_h_dir is the directory where to find config.h
+# - exeext is platform dependent suffix of executables
+# - install-command is the install command line, excluding the final destprog
+# - destprog is the destination program name
+# 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
+ compile_command=$RELOC_COMPILE_COMMAND
+ srcdir=$RELOC_SRCDIR
+ builddir=$RELOC_BUILDDIR
+ config_h_dir=$RELOC_CONFIG_H_DIR
+ exeext=$RELOC_EXEEXT
+ install_prog=$RELOC_INSTALL_PROG # including the "-c" option
+else
+ if test $# -ge 9; then
+ # Get fixed position arguments.
+ library_path_var=$1
+ library_path_value=$2
+ prefix=$3
+ compile_command=$4
+ srcdir=$5
+ builddir=$6
+ config_h_dir=$7
+ exeext=$8
+ install_prog=$9 # maybe not including the "-c" option
+ shift
+ shift
+ shift
+ shift
+ shift
+ shift
+ shift
+ shift
+ shift
+ else
+ echo "Usage: $0 library_path_var library_path_value prefix compile_command srcdir builddir config_h_dir exeext install_command... destprog" 1>&2
+ exit 1
+ fi
+fi
+
+# Get destprog, last argument.
+destprog=
+for arg
+do
+ destprog=$arg
+done
+# Remove trailing $exeext, if present.
+if test -n "$exeext"; then
+ sedexpr='s|'`echo "$exeext" | sed -e 's,\.,\\\.,g'`'$||'
+ destprog=`echo "$destprog" | sed -e "$sedexpr"`
+fi
+
+# Outputs a command and runs it.
+func_verbose ()
+{
+ echo "$@"
+ "$@"
+}
+
+# Run install_command.
+func_verbose $install_prog "$@" || exit $?
+
+# If the platform doesn't support LD_LIBRARY_PATH or similar, we cannot build
+# a wrapper.
+test -n "$library_path_var" || exit 0
+
+libdirs=
+save_IFS="$IFS"; IFS=":"
+for dir in $library_path_value; do
+ IFS="$save_IFS"
+ if test -n "$dir"; then
+ case "$libdirs" in
+ *"\"$dir\""*) ;; # remove duplicate
+ *) libdirs="$libdirs\"$dir\"," ;;
+ esac
+ fi
+done
+IFS="$save_IFS"
+# If there are no library directories to add at runtime, we don't need a
+# wrapper.
+test -n "$libdirs" || exit 0
+
+# Compile wrapper.
+installdir=`echo "$destprog" | sed -e 's,/[^/]*$,,'`
+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"/xreadlink.c "$srcdir"/readlink.c "$srcdir"/canonicalize-lgpl.c "$srcdir"/allocsa.c "$srcdir"/relocatable.c "$srcdir"/setenv.c "$srcdir"/strerror.c -o "$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
+
+exit 0