#!/bin/sh
# libtool-reloc - libtool wrapper with support for relocatable programs
# Copyright (C) 2019-2025 Free Software Foundation, Inc.
# Written by Bruno Haible <bruno@clisp.org>, 2019.
#
# 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/>.

# func_usage
# outputs to stdout the --help usage message.
func_usage ()
{
  echo "\
Usage: libtool-reloc [OPTION]... libtool LIBTOOL_ARGUMENTS

Invokes GNU libtool, with support for relocatable programs.

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 "libtool-reloc (GNU gnulib, module 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 "libtool-reloc: *** $1" 1>&2
  echo "libtool-reloc: *** Stop." 1>&2
  exit 1
}

# Outputs a command and runs it.
func_verbose ()
{
  # Make it easy to copy&paste the printed command into a shell in most cases,
  # by escaping '\\', '"', and '$'. This is not perfect, just good enough.
  echo "$@" | sed -e 's/\([\\"$]\)/\\\1/g'
  "$@"
}

# 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 $# -lt 1; then
  func_fatal_error "too few arguments"
fi

# Determine the mode from the arguments.
mode=
for arg
do
  case "$arg" in
    --mode=link) mode=link ;;
  esac
done

if test "$mode" = link; then
  # Determine the target from the arguments.
  target=
  next_is_target=false
  for arg
  do
    if $next_is_target; then
      target="$arg"
      next_is_target=false
    else
      case "$arg" in
        -o) next_is_target=true ;;
        *) next_is_target=false ;;
      esac
    fi
  done
  case "$target" in
    *.la)
      # When creating a library:
      # 1. Add a '-Wl,-rpath,@loader_path' option.
      #    (A '-R @loader_path' option does not work: libtool produces
      #    an error "error: only absolute run-paths are allowed".)
      #    (Also note that 'install_name_tool -add_rpath @loader_path ...'
      #    does not work on Mac OS X 10.5.)
      #    This is done through the RELOCATABLE_LDFLAGS macro.
      # 2. After creating the library, run
      #    install_name_tool -id @rpath/$dlname $target_dir/.libs/$dlname
      #    (This is easier than to modify the libtool script to emit a different
      #    install_name. Also, an option '-Wl,-install_name,@rpath/$dlname' does
      #    not work since libtool emits another option '-Wl,-install_name,...'
      #    after it.
      "$@" && {
        dlname_assignment=`grep '^dlname=' "$target"`
        dlname=
        eval "$dlname_assignment"
        # Nothing to do when --disable-shared was specified.
        if test -n "$dlname"; then
          target_dir=`dirname "$target"`
          if test -f "$target_dir/.libs/$dlname"; then
            func_verbose install_name_tool -id "@rpath/$dlname" "$target_dir/.libs/$dlname"
          fi
        fi
      }
      ;;
    *)
      "$@"
      ;;
  esac
else
  "$@"
fi
