#! /bin/sh
# Output a system dependent linker command for putting a relocatable library
# search path into an executable.
#
#   Copyright 2003, 2009-2011 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 3 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, see <http://www.gnu.org/licenses/>.
#
#   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
