#! /bin/sh
# demo-hardcode.test - check to see what the system linker hardcodes
#
#   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
#   Written by Gary V. Vaughan, 2003
#
#   This file is part of GNU Libtool.
#
# GNU Libtool 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 2 of
# the License, or (at your option) any later version.
#
# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####

. tests/defs || exit 1

func_require "demo-inst" "$prefix/lib/libhello.la"

func_mkprefixdir
func_cd "tests/demo"

# Check to make sure we have a dynamic library.
func_get_config "library_names" "cat ./libhello.la"
test -z "$library_names" \
  && func_skip "Exiting: demo/libhello.la is not a shared library"

func_make "hardcode"

# Extra tools we might need
: ${DUMPSTABS=dumpstabs}

# Suck in all the hardcode_* variable settings.
func_msg "Finding libtool.m4's guesses at hardcoding values"
func_get_config 'hardcode_direct
hardcode_minus_L
hardcode_shlibpath_var
hardcode_libdir_flag_spec' "./libtool --config" ": fatal"

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

  # Solaris cc may store the command line in a debugging section,
  # which leads to false positives.  Unfortunately, Solaris strip
  # is not capable to remove the section (unlike GNU binutils strip).
  # So we use dumpstabs if it seems to work.
  if { $DUMPSTABS -d $file; } >/dev/null 2>&1; then
    if $DUMPSTABS -d $file 2>/dev/null | $FGREP "$objdir" >/dev/null 2>&1; then
      hardcoded=yes
    else
      hardcoded=no
    fi
  # 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.
  elif 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
      exit_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
      exit_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
      exit_status=1
    fi
    ;;
  esac
done

exit $exit_status
