#!/bin/sh

LINKER="$1"
shift
RPATH=""
LPATH=""
LPATHS="::"
LOPTS=""

#Special hack for HP-UX
LD_PXDB=/dev/null
export LD_PXDB

#Special hack for SGI
if test "x$SGI_ABI" = "x"; then
  SGI_ABI=-n32
fi
export SGI_ABI

#set -x

SET_N32=""

case "/$LINKER " in
  */ld\ *)
    LINKER_IS_LD=yes
  ;;
  *)
    LINKER_IS_LD=no
  ;;
esac

DEBUG_FLAGS=""
COMPILING="yes"

while test "$#" != 0; do
  case $1 in
    -R*)
     if test x$1 = x-R ; then
       tmp="$2"
       shift
     else
       tmp=`echo $1 | sed -e 's/^-R//g'`
     fi
     RPATH="$RPATH:$tmp"
    ;;
    -n32)
     SET_N32="-n32"
    ;;

    -L*)
     if test x$1 = x-L ; then
       tmp="$2"
       shift
     else
       tmp=`echo $1 | sed -e 's/^-L//g'`
     fi

     case $LDPATHS in
       *:$tmp:*)
         ;;
       *)     
         LDPATHS="$LDPATHS$tmp:"
        LDOPTS="$LDOPTS -L$tmp"
       ;;
    esac
    ;;

    -n32)
     SET_N32="-n32"
    ;;


    -Wl,*)
      # Strip '-Wl,' if the linker is ld

      if test $LINKER_IS_LD = yes; then
        LDOPTS="$LDOPTS `echo $1|sed -e 's/^-Wl,//'|sed -e 's/,/ /g'`"
      else
        LDOPTS="$LDOPTS $1"
      fi
    ;;
    -g|-ggdb3)
      DEBUG_FLAGS="$DEBUG_FLAGS $1"
    ;;
    *.s|*.S|*.asm)
      COMPILING="no";
      LDOPTS="$LDOPTS $1"
    ;;
    *)
      LDOPTS="$LDOPTS $1"
    ;;
  esac
  shift
done

if test "x$COMPILING" = "xyes"; then
  LDOPTS="$LDOPTS $DEBUG_FLAGS"
fi

LDOPTS="$SET_N32 $LDOPTS"

RPATH="$RPATH:${LD_LIBRARY_PATH-}"

OLDIFS="$IFS"
IFS=:
set dummy $RPATH
shift
IFS="$OLDIFS"

while test x$1 = x -a x$# != x0; do
  shift
done

if test -x /usr/bin/uname 2>/dev/null; then
  UNAME=`/usr/bin/uname -sr`
elif test -x /bin/uname 2>/dev/null; then
  UNAME=`/bin/uname -sr`
else
  UNAME=unknown
fi

if test x$# != x0 ; then

  done="::$1:"
  RPATH="$1"
  shift

  while test x$# != x0 ;
  do
    case $done in
      *:$1:*) ;;
      *)
       RPATH="$RPATH:$1"
       done="$done$1:"
      ;;
    esac
    shift
  done

  case "$LINKER $LDOPTS " in
    *\ -c\ * | cpp\ * | *\ -E\ *)
      LINKING=no
    ;;

    *)
      LINKING=maybe
    ;;
  esac

  case "$UNAME" in
   OSF1\ V4.*)
     LDOPTS="$LDOPTS -rpath $RPATH"
   ;;
   IRIX\ 6.*)
     LDOPTS="$LDOPTS -rpath $RPATH"
   ;;
   IRIX\ 5.*)
     LDOPTS="$LDOPTS -rpath $RPATH"
   ;;
   SunOS\ 5.*)
     LDOPTS="$LDOPTS -R$RPATH"
   ;;
   Linux\ 1.*)
     LD_LIBRARY_PATH="$RPATH"
     LD_RUN_PATH="$RPATH"
     export LD_LIBRARY_PATH LD_RUN_PATH
   ;;
   Linux\ *)
     if test x$LINKING != xno -a "x$RPATH" != x ; then
      LDOPTS="$LDOPTS -Wl,-rpath,$RPATH"
     fi
   ;;
   UnixWare\ 7.*)
     if test x$LINKING != xno -a "x$RPATH" != x ; then
       LDOPTS="$LDOPTS -Xlinker -YP, -Xlinker $RPATH"
     fi
   ;;
   Darwin\ *|NetBSD\ *)
    if test x$LINKING != xno -a "x$RPATH" != x ; then
      OIFS="$IFS"
      IFS=":"
      RPP="$PATH"
      for RP in $RPATH ; do
       LDOPTS="$LDOPTS -Wl,-rpath,$RP"
     done
     IFS="$OIFS"
     fi
   ;;
   *)
    LD_LIBRARY_PATH="$RPATH"
    LD_RUN_PATH="$RPATH"
    export LD_LIBRARY_PATH LD_RUN_PATH
   ;;
  esac
fi

#case "x$UNAME" in
#  AIX*)
#    # AIX cc doesn't work with ulimit set
#    :
#  ;;
#  *)
#    if test "x$NO_ULIMIT" = "x"; then
#      # Limit data segment size to 48MB.
#      ulimit -d 49152 >/dev/null 2>&1
#    fi
#  ;;
#esac

case "$UNAME" in
  Darwin\ 1[3-9]*|Darwin\ [2-9][0-9]*)
    # C++ Name mangling changed here, need to be able to interoperate with modern libs
    if test "x$MACOSX_DEPLOYMENT_TARGET" = "x" ; then
      export MACOSX_DEPLOYMENT_TARGET=10.9
    fi
  ;;
  Darwin\ [7-9]*|Darwin\ [1-9][0-9]*)
    # Needs to be 10.3 or better for ld to accept "-undefined dynamic_lookup"
    if test "x$MACOSX_DEPLOYMENT_TARGET" = "x" ; then
      export MACOSX_DEPLOYMENT_TARGET=10.3
    fi
  ;;
  *)
  ;;
esac

#echo $LINKER $LDOPTS

# exec $LINKER $LDOPTS
# Used to be exec, but Digital-Unix's stupid sh has buggy variable-expansion.
# /grubba
# eval $LINKER $LDOPTS
# Used to be eval, but then quoting won't work.
# /grubba 1998-12-16
$LINKER $LDOPTS
exit $?
