#! /bin/sh
# Output a system dependent compiler option for putting a relocatable library
# search path into an executable.
#
#   Copyright 2003-2025 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.

# func_usage
# outputs to stdout the --help usage message.
func_usage ()
{
  echo "\
Usage: reloc-ldflags [OPTION]... HOST LIBRARY_PATH_VALUE INSTALLDIR

Prints a system dependent compiler option for putting a relocatable library
search path into an executable.

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 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.

The environment variable LD should be set by the caller.

Options:
      --help           print this help and exit
      --version        print version information and exit

Send patches and bug reports to <bug-gnulib@gnu.org>."
}

# func_version
# outputs to stdout the --version message.
func_version ()
{
  echo "reloc-ldflags (GNU gnulib, relocatable-prog)"
  echo "Copyright (C) 2025 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
  echo
  printf 'Written by %s.\n' "Bruno Haible"
}

# func_fatal_error message
# outputs to stderr a fatal error message, and terminates the program.
func_fatal_error ()
{
  echo "reloc-ldflags: *** $1" 1>&2
  echo "reloc-ldflags: *** Stop." 1>&2
  exit 1
}

# Command-line option processing.
while test $# -gt 0; do
  case "$1" in
    --help | --hel | --he | --h )
      func_usage
      exit 0 ;;
   --version | --versio | --versi | --vers | --ver | --ve | --v )
      func_version
      exit 0 ;;
    -- )      # Stop option processing
      shift; break ;;
    -* )
      func_fatal_error "unrecognized option: $1"
      ;;
    * )
      break ;;
  esac
done

if test $# -gt 3; then
  func_fatal_error "too many arguments"
fi
if test $# -lt 3; then
  func_fatal_error "too few arguments"
fi

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* | midnightbsd* | \
  netbsd* | \
  openbsd* | \
  solaris* | \
  haiku*)
    origin_token='$ORIGIN'
    ;;
  darwin*)
    origin_token='@loader_path'
    ;;
esac
if test -n "$origin_token"; then
  # We are not on AIX or HP-UX. Therefore the -rpath options are cumulative.
  rpath_options=
  saved_IFS="$IFS"; IFS=":"
  for dir in $library_path_value; do
    IFS="$saved_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"
        # Augment rpath_options with dir.
        rpath_options="${rpath_options}${rpath_options:+ }-Wl,-rpath,$dir"
        ;;
      *)
        if test -n "$dir"; then
          echo "libdir is not absolute: $dir" 1>&2
        fi
        ;;
    esac
  done
  IFS="$saved_IFS"
  # Output it.
  if test -n "$rpath_options"; 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*)
        rpath_options="-Wl,-z,origin $rpath_options" ;;
    esac
    echo "$rpath_options"
  fi
else
  echo "relocation via rpath not supported on this system: $host" 1>&2
  exit 1
fi

exit 0
