diff build-aux/reloc-ldflags @ 8265:20006894dae4

Infrastructure for relocatable installation, from GNU gettext. See http://lists.gnu.org/archive/html/bug-gnulib/2003-03/msg00020.html
author Bruno Haible <bruno@clisp.org>
date Thu, 01 Mar 2007 01:15:40 +0000
parents
children bbbbbf4cd1c5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build-aux/reloc-ldflags	Thu Mar 01 01:15:40 2007 +0000
@@ -0,0 +1,102 @@
+#! /bin/sh
+# Output a system dependent linker command for putting a relocatable library
+# search path into an executable.
+#
+#   Copyright 2003 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 of the License, 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.
+#
+#   As a special exception to the GNU General Public License, if you
+#   distribute this file as part of a program that contains a
+#   configuration script generated by Autoconf, you may include it under
+#   the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variable LD should be set by the caller.
+#
+# The second argument is a colon separated list of directories that contain
+# the libraries at installation time.
+#
+# The third argument is the directory into which the executable is going to be
+# installed.
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+library_path_value=$2
+
+installdir=$3
+
+# Verify that installdir is absolute.
+case "$installdir" in
+  /*) ;;
+  *)
+    echo "installdir is not absolute: $installdir" 1>&2
+    exit 1
+    ;;
+esac
+
+case "$host_os" in
+  linux*) # Supported since Linux 2.1 and glibc 2.1.
+    rpath=
+    save_IFS="$IFS"; IFS=":"
+    for dir in $library_path_value; do
+      IFS="$save_IFS"
+      case "$dir" in
+        /*)
+          # Make dir relative to installdir. (Works only if dir is absolute.)
+          idir="$installdir"
+          while true; do
+            dfirst=`echo "$dir" | sed -n -e 's,^//*\([^/]*\).*$,/\1,p'`
+            ifirst=`echo "$idir" | sed -n -e 's,^//*\([^/]*\).*$,/\1,p'`
+            if test -z "$dfirst" || test -z "$ifirst"; then
+              break
+            fi
+            if test "$dfirst" != "$ifirst"; then
+              break
+            fi
+            dir=`echo "$dir" | sed -e 's,^//*[^/]*,,'`
+            idir=`echo "$idir" | sed -e 's,^//*[^/]*,,'`
+          done
+          dir="\$ORIGIN"`echo "$idir" | sed -e 's,//*[^/]*,/..,g'`"$dir"
+          # Add dir to rpath.
+          rpath="${rpath}${rpath:+ }$dir"
+          ;;
+        *)
+          if test -n "$dir"; then
+            echo "libdir is not absolute: $dir" 1>&2
+          fi
+          ;;
+      esac
+    done
+    IFS="$save_IFS"
+    # Output it.
+    if test -n "$rpath"; then
+      echo "-Wl,-rpath,$rpath"
+    fi
+    ;;
+  *)
+    echo "relocation via rpath not supported on this system: $host" 1>&2
+    exit 1
+    ;;
+esac
+
+exit 0