#! /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-2003 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*)
    ;;
  freebsd*-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
    ;;
  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

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

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

EOF
