#! /bin/sh
# hardcode.test - check to see what the system linker hardcodes

# Test script header.
need_prefix=yes
if test -z "$srcdir"; then
  srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
  test "$srcdir" = "$0" && srcdir=.
  test "${VERBOSE+set}" != "set" && VERBOSE=yes
fi
. $srcdir/defs || exit 1

# Check that things are built.
if test -f $prefix/lib/libhello.la && cd ../demo; then :
else
  echo "You must run demo-inst.test before $0" 1>&2
  exit 77
fi

# Unfortunately, we need access to libtool internals for this test.
objdir=NONE
eval `grep '^objdir=' ./libtool 2>/dev/null`
if test "$objdir" = NONE; then
  echo "objdir not set in ../demo/libtool" 1>&2
  exit 1
fi

# Check to make sure we have a dynamic library.
library_names=NONE
eval `grep '^library_names=' ./libhello.la 2>/dev/null`

if test "$library_names" = NONE; then
  echo "library_names not set in ../demo/libhello.la" 1>&2
  exit 1
elif test -z "$library_names"; then
  echo "= Exiting: ../demo/libhello.la is not a shared library"
  exit 0
fi

echo "= Running $make hardcode in ../demo"
$make hardcode || exit 1

echo "= Finding libtool.m4's guesses at hardcoding values"
status=0
hardcode_direct=NONE
hardcode_minus_L=NONE
hardcode_shlibpath_var=NONE
hardcode_libdir_flag_spec=NONE

# Suck in all the hardcode_* variable settings.
eval `./libtool --config | grep '^hardcode_' 2>/dev/null`

if test "$hardcode_direct" = NONE; then
  echo "hardcode_direct not set in ../demo/libtool" 1>&2
  status=1
fi

if test "$hardcode_minus_L" = NONE; then
  echo "hardcode_minus_L not set in ../demo/libtool" 1>&2
  status=1
fi

if test "$hardcode_shlibpath_var" = NONE; then
  echo "hardcode_shlibpath_var not set in ../demo/libtool" 1>&2
  status=1
fi

if test "$hardcode_libdir_flag_spec" = NONE; then
  echo "hardcode_libdir_flag_spec not set in ../demo/libtool" 1>&2
  status=1
fi

test $status -eq 0 || exit $status

echo "= Searching for hardcoded library directories in each program"
for file in hc-*; do
  case "$file" in
  hc-direct) expected="$hardcode_direct" ;;
  hc-libpath) expected="$hardcode_shlibpath_var" ;;
  hc-minusL) expected="$hardcode_minus_L" ;;

  hc-libflag)
    if test -n "$hardcode_libdir_flag_spec"; then
      expected=yes
    else
      expected=unsupported
    fi
    ;;

  *)
    continue
    ;;
  esac

  # Discover whether the objdir really was hardcoded.
  hardcoded=no

  # At least AIX fgrep doesn't work for binary files, and AIX also
  # doesn't have strings(1), so we need this strange conversion
  # (which only works on ASCII).
  # AIX fgrep also has a limited line length, so we turn unprintable
  # characters into newlines.
  if cat $file | (tr '\000-\037\200-\377' '\n' || cat) 2>/dev/null \
	       | $FGREP "$objdir" > /dev/null 2>&1; then
    hardcoded=yes
  elif $FGREP "$objdir" $file > /dev/null 2>&1; then
    # We retry fgrep without tr, in case the above lead to a false negative.
    hardcoded=yes
  elif (sed -e '1!d' $file | grep 'unsupported') >/dev/null 2>&1; then
    hardcoded=unsupported
  fi

  # Check the result.
  case "$hardcoded" in
  yes)
    if test $expected = yes; then
      echo "$objdir was hardcoded in \`$file', as libtool expected"
    else
      echo "$objdir was hardcoded in \`$file', which fooled libtool" 1>&2
      status=1
    fi
    ;;

  no)
    if test $expected = no; then
      echo "$objdir was not hardcoded in \`$file', as libtool expected"
    else
      echo "$objdir was not hardcoded in \`$file', which fooled libtool" 1>&2
      status=1
    fi
    ;;

  unsupported)
    if test $expected = unsupported; then
      echo "\`$file' was not linked properly, as libtool expected"
    else
      echo "\`$file' was not linked properly, which fooled libtool" 1>&2
      status=1
    fi
    ;;
  esac
done

exit $status
