#! /bin/sh
# Output a system dependent set of variables, describing how to set the
# run time search path of shared libraries in an executable at run time.
#
#   Copyright 1996-2005 Free Software Foundation, Inc.
#   Taken from GNU libtool, 2003
#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
#
#   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 2 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, write to the Free Software Foundation,
#   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
#   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 set of defined variables is at the end of this script.

host="$1"
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`

shlibpath_var=
case $host_os in
  aix3*)
    shlibpath_var=LIBPATH
    ;;
  aix4* | aix5*)
    if test "$host_cpu" = ia64; then
      # AIX 5 supports IA64
      shlibpath_var=LD_LIBRARY_PATH
    else
      shlibpath_var=LIBPATH
    fi
    ;;
  beos*)
    shlibpath_var=LIBRARY_PATH
    ;;
  bsdi4*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  cygwin* | mingw* | pw32*)
    # FIXME: first we should search . and the directory the executable is in
    shlibpath_var=PATH
    ;;
  darwin* | rhapsody*)
    shlibpath_var=DYLD_LIBRARY_PATH
    ;;
  freebsd1*)
    ;;
  kfreebsd*-gnu)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  freebsd*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  gnu*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  hpux9* | hpux10* | hpux11*)
    shlibpath_var=SHLIB_PATH
    ;;
  irix5* | irix6* | nonstopux*)
    case $host_os in
      irix5* | nonstopux*)
        shlibsuff=
        ;;
      *)
        case $LD in # libtool.m4 will add one of these switches to LD
          *-32|*"-32 ") shlibsuff= ;;
          *-n32|*"-n32 ") shlibsuff=N32 ;;
          *-64|*"-64 ") shlibsuff=64 ;;
          *) shlibsuff= ;;
        esac
        ;;
    esac
    shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
    ;;
  linux-gnu*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  knetbsd*-gnu)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  netbsd*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  newsos6)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  openbsd*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  os2*)
    shlibpath_var=LIBPATH
    ;;
  osf3* | osf4* | osf5*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  sco3.2v5*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  solaris*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  sunos4*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  uts4*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  dgux*)
    shlibpath_var=LD_LIBRARY_PATH
    ;;
  sysv4*MP*)
    if test -d /usr/nec ;then
      shlibpath_var=LD_LIBRARY_PATH
    fi
    ;;
esac

LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF

# This is the shared library path variable.
shlibpath_var=$shlibpath_var

EOF
