#! /bin/sh
# Output a system dependent linker command for putting a relocatable library
# search path into an executable.
#
#   Copyright 2003-2019 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 <https://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

origin_token=
case "$host_os" in
  linux* | gnu* | kfreebsd* | \
  freebsd* | dragonfly* | \
  netbsd* | \
  openbsd* | \
  solaris* | \
  haiku*)
    origin_token='$ORIGIN'
    ;;
  darwin*)
    origin_token='@loader_path'
    ;;
esac
if test -n "$origin_token"; then
  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_token"`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
    case "$host_os" in
      # At least some versions of FreeBSD, DragonFly, and OpenBSD need the
      # linker option "-z origin". See <https://lekensteyn.nl/rpath.html>.
      freebsd* | dragonfly* | openbsd*)
        echo "-Wl,-z,origin -Wl,-rpath,$rpath" ;;
      *)
        echo "-Wl,-rpath,$rpath" ;;
    esac
  fi
else
  echo "relocation via rpath not supported on this system: $host" 1>&2
  exit 1
fi

exit 0
