From 86f544b2e68eefe1410f8c7db3be1819a18dbfb9 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 1 Mar 2007 01:15:40 +0000 Subject: Infrastructure for relocatable installation, from GNU gettext. See http://lists.gnu.org/archive/html/bug-gnulib/2003-03/msg00020.html --- build-aux/install-reloc | 130 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100755 build-aux/install-reloc (limited to 'build-aux/install-reloc') 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 , 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 -- cgit v1.2.1