#! /bin/sh
#
# link.sh -- try linking Vim with different sets of libraries, finding the
# minimal set for fastest startup.  The problem is that configure adds a few
# libraries when they exist, but this doesn't mean they are needed for Vim.
#
#      Author: Bram Moolenaar
# Last change: 2010 Nov 03
#     License: Public domain
#
# Warning: This fails miserably if the linker doesn't return an error code!
#
# Otherwise this script is fail-safe, falling back to the original full link
# command if anything fails.

echo "$LINK " >link.cmd
exit_value=0

if test "$LINK_AS_NEEDED" = yes; then
  echo "link.sh: \$LINK_AS_NEEDED set to 'yes': invoking linker directly."
  cat link.cmd
  if sh link.cmd; then
    exit_value=0
    echo "link.sh: Linked fine"
  else
    exit_value=$?
    echo "link.sh: Linking failed"
  fi
else
  if test -f auto/link.sed; then

#
# If auto/link.sed already exists, use it.  We assume a previous run of
# link.sh has found the correct set of libraries.
#
  echo "link.sh: The file 'auto/link.sed' exists, which is going to be used now."
  echo "link.sh: If linking fails, try deleting the auto/link.sed file."
  echo "link.sh: If this fails too, try creating an empty auto/link.sed file."
else

# If linking works with the full link command, try removing some libraries,
# that are known not to be needed on at least one system.
# Remove auto/pathdef.c if there is a new link command and compile it again.
# There is a loop to remove libraries that appear several times.
#
# Notes:
# - Can't remove Xext; It links fine but will give an error when running gvim
#   with Motif.
# - Don't remove the last -lm: On HP-UX Vim links OK but crashes when the GTK
#   GUI is started, because the "floor" symbol could not be resolved.
#
  cat link.cmd
  if sh link.cmd; then
    touch auto/link.sed
    cp link.cmd linkit.sh
    for libname in SM ICE nsl dnet dnet_stub inet socket dir elf iconv Xt Xmu Xp Xpm X11 Xdmcp x w perl dl pthread thread readline m crypt attr; do
      cont=yes
      while test -n "$cont"; do
        if grep "l$libname " linkit.sh >/dev/null; then
          if test ! -f link1.sed; then
            echo "link.sh: OK, linking works, let's try omitting a few libraries."
            echo "link.sh: See auto/link.log for details."
            rm -f auto/link.log
          fi
          echo "s/-l$libname  *//" >link1.sed
          sed -f auto/link.sed <link.cmd >linkit2.sh
          sed -f link1.sed <linkit2.sh >linkit.sh
          # keep the last -lm
          if test $libname != "m" || grep "lm " linkit.sh >/dev/null; then
            echo "link.sh: Trying to omit the $libname library..."
            cat linkit.sh >>auto/link.log
            # Redirect this link output, it may contain error messages which
            # should be ignored.
            if sh linkit.sh >>auto/link.log 2>&1; then
              echo "link.sh: Vim doesn't need the $libname library!"
              cat link1.sed >>auto/link.sed
              rm -f auto/pathdef.c
            else
              echo "link.sh: Vim DOES need the $libname library."
              cont=
              cp link.cmd linkit.sh
            fi
          else
            cont=
            cp link.cmd linkit.sh
          fi
        else
          cont=
          cp link.cmd linkit.sh
        fi
      done
    done
    if test ! -f auto/pathdef.c; then
      $MAKE objects/pathdef.o
    fi
    if test ! -f link1.sed; then
      echo "link.sh: Linked fine, no libraries can be omitted"
      touch link3.sed
    fi
  else
    exit_value=$?
  fi
fi

#
# Now do the real linking.
#
if test -s auto/link.sed; then
  echo "link.sh: Using auto/link.sed file to omit a few libraries"
  sed -f auto/link.sed <link.cmd >linkit.sh
  cat linkit.sh
  if sh linkit.sh; then
    exit_value=0
    echo "link.sh: Linked fine with a few libraries omitted"
  else
    exit_value=$?
    echo "link.sh: Linking failed, making auto/link.sed empty and trying again"
    mv -f auto/link.sed link2.sed
    touch auto/link.sed
    rm -f auto/pathdef.c
    $MAKE objects/pathdef.o
  fi
fi
if test -f auto/link.sed -a ! -s auto/link.sed -a ! -f link3.sed; then
  echo "link.sh: Using unmodified link command"
  cat link.cmd
  if sh link.cmd; then
    exit_value=0
    echo "link.sh: Linked OK"
  else
    exit_value=$?
    if test -f link2.sed; then
      echo "link.sh: Linking doesn't work at all, removing auto/link.sed"
      rm -f auto/link.sed
    fi
  fi
fi

fi

#
# cleanup
#
rm -f link.cmd linkit.sh link1.sed link2.sed link3.sed linkit2.sh

#
# return an error code if something went wrong
#
exit $exit_value

# vim:set sw=2 et:
