# ltmain.sh - Provide generalized library-building support services.
# Generated automatically from ltmain.in by configure.
# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 name of this program.
progname=`$echo "$0" | sed 's%^.*/%%'`
modename="$progname"

# Constants.
PROGRAM=ltmain.sh
PACKAGE=libtool
VERSION=1.0h

default_mode=
help="Try \`$progname --help' for more information."
magic="%%%MAGIC variable%%%"
mkdir="mkdir"
mv="mv -f"
rm="rm -f"

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'

# NLS nuisances.
# Only set LANG and LC_ALL to C if already set.
# These must not be set unconditionally because not all systems understand
# e.g. LANG=C (notably SCO).
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi

if test "$LTCONFIG_VERSION" != "$VERSION"; then
  echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
  exit 1
fi

if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
  echo "$modename: not configured to build any kind of library" 1>&2
  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
  exit 1
fi

# Global variables.
mode=$default_mode
nonopt=
prev=
prevopt=
run=
show="$echo"
show_help=
execute_dlfiles=

# Parse our command line options once, thoroughly.
while test $# -gt 0
do
  arg="$1"
  shift

  case "$arg" in
  -*=*) optarg=`$echo "$arg" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) optarg= ;;
  esac

  # If the previous option needs an argument, assign it.
  if test -n "$prev"; then
    case "$prev" in
    execute_dlfiles)
      eval "$prev=\"\$$prev \$arg\""
      ;;
    *)
      eval "$prev=\$arg"
      ;;
    esac

    prev=
    prevopt=
    continue
  fi

  # Have we seen a non-optional argument yet?
  case "$arg" in
  --help)
    show_help=yes
    ;;

  --version)
    echo "$PROGRAM (GNU $PACKAGE) $VERSION"
    exit 0
    ;;

  --dry-run | -n)
    run=:
    ;;

  --features)
    echo "host: $host"
    if test "$build_libtool_libs" = yes; then
      echo "enable shared libraries"
    else
      echo "disable shared libraries"
    fi
    if test "$build_old_libs" = yes; then
      echo "enable static libraries"
    else
      echo "disable static libraries"
    fi
    exit 0
    ;;

  --finish) mode="finish" ;;

  --mode) prevopt="--mode" prev=mode ;;
  --mode=*) mode="$optarg" ;;

  --quiet | --silent)
    show=:
    ;;

  -dlopen)
    prevopt="-dlopen"
    prev=execute_dlfiles
    ;;

  -*)
    $echo "$modename: unrecognized option \`$arg'" 1>&2
    $echo "$help" 1>&2
    exit 1
    ;;

  *)
    nonopt="$arg"
    break
    ;;
  esac
done

if test -n "$prevopt"; then
  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
  $echo "$help" 1>&2
  exit 1
fi

if test -z "$show_help"; then

  # Infer the operation mode.
  if test -z "$mode"; then
    case "$nonopt" in
    *cc | *++)
      mode=link
      for arg
      do
        case "$arg" in
        -c)
           mode=compile
           break
           ;;
        esac
      done
      ;;
    *db | *dbx)
      mode=execute
      ;;
    *install*|cp)
      mode=install
      ;;
    *rm)
      mode=uninstall
      ;;
    *)
      # If we have no mode, but dlfiles were specified, then do execute mode.
      test -n "$execute_dlfiles" && mode=execute

      # Just use the default operation mode.
      if test -z "$mode"; then
        if test -n "$nonopt"; then
          $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
        else
          $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
        fi
      fi
      ;;
    esac
  fi

  # Only execute mode is allowed to have -dlopen flags.
  if test -n "$execute_dlfiles" && test "$mode" != execute; then
    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
    $echo "$help" 1>&2
    exit 1
  fi

  # Change the help message to a mode-specific one.
  generic_help="$help"
  help="Try \`$modename --help --mode=$mode' for more information."

  # These modes are in order of execution frequency so that they run quickly.
  case "$mode" in
  # libtool compile mode
  compile)
    modename="$modename: compile"
    # Get the compilation command and the source file.
    base_compile=
    lastarg=
    srcfile="$nonopt"
    suppress_output=

    for arg
    do
      # The only flag that cannot be specified is the output filename.
      if test "X$arg" = "X-o"; then
	$echo "$modename: you cannot specify the output filename with \`-o'" 1>&2
	$echo "$help" 1>&2
	exit 1
      fi

      # Accept the current argument as the source file.
      lastarg="$srcfile"
      srcfile="$arg"

      # Aesthetically quote the previous argument.

      # Backslashify any backslashes, double quotes, and dollar signs.
      # These are the only characters that are still specially
      # interpreted inside of double-quoted scrings.
      lastarg=`$echo "$lastarg" | sed "$sed_quote_subst"`

      # Double-quote args containing other shell metacharacters.
      # Many Bourne shells cannot handle close brackets correctly in scan
      # sets, so we specify it separately.
      case "$lastarg" in
      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
	lastarg="\"$lastarg\""
	;;
      esac

      # Add the previous argument to base_compile.
      if test -z "$base_compile"; then
	base_compile="$lastarg"
      else
	base_compile="$base_compile $lastarg"
      fi
    done

    # Get the name of the library object.
    libobj=`$echo "$srcfile" | sed -e 's%^.*/%%'`

    # Recognize several different file suffixes.
    xform='[cCFSfm]'
    case "$libobj" in
    *.c++) xform=c++ ;;
    *.cc) xform=cc ;;
    *.cpp) xform=cpp ;;
    *.cxx) xform=cxx ;;
    *.f90) xform=f90 ;;
    *.for) xform=for ;;
    esac

    libobj=`$echo "$libobj" | sed -e "s/\.$xform$/.lo/"`

    case "$libobj" in
    *.lo) obj=`$echo "$libobj" | sed -e 's/\.lo$/.o/'` ;;
    *)
      $echo "$modename: cannot determine name of library object from \`$srcfile'" 1>&2
      exit 1
      ;;
    esac

    if test -z "$base_compile"; then
      $echo "$modename: you must specify a compilation command" 1>&2
      $echo "$help" 1>&2
      exit 1
    fi

    # Delete any leftover library objects.
    if test "$build_old_libs" = yes; then
      $run $rm $obj $libobj
      trap "$run $rm $obj $libobj; exit 1" 1 2 15
    else
      $run $rm $libobj
      trap "$run $rm $libobj; exit 1" 1 2 15
    fi

    # Only build a PIC object if we are building libtool libraries.
    if test "$build_libtool_libs" = yes; then
      # Without this assignment, base_compile gets emptied.
      fbsd_hideous_sh_bug=$base_compile

      # All platforms use -DPIC, to notify preprocessed assembler code.
      $show "$base_compile$pic_flag -DPIC $srcfile"
      if $run eval "$base_compile\$pic_flag -DPIC \$srcfile"; then :
      else
        test -n "$obj" && $run $rm $obj
        exit 1
      fi

      # If we have no pic_flag, then copy the object into place and finish.
      if test -z "$pic_flag"; then
        $show "$LN_S $obj $libobj"
        $run $LN_S $obj $libobj
        exit $?
      fi

      # Just move the object, then go on to compile the next one
      $show "$mv $obj $libobj"
      $run $mv $obj $libobj || exit 1

      # Allow error messages only from the first compilation.
      suppress_output=' >/dev/null 2>&1'
    fi

    # Only build a position-dependent object if we build old libraries.
    if test "$build_old_libs" = yes; then
      # Suppress compiler output if we already did a PIC compilation.
      $show "$base_compile $srcfile$suppress_output"
      if $run eval "$base_compile \$srcfile$suppress_output"; then :
      else
        $run $rm $obj $libobj
        exit 1
      fi
    fi

    # Create an invalid libtool object if no PIC, so that we don't accidentally
    # link it into a program.
    if test "$build_libtool_libs" != yes; then
      $show "echo timestamp > $libobj"
      $run eval "echo timestamp > \$libobj" || exit $?
    fi

    exit 0
    ;;

  # libtool link mode
  link)
    modename="$modename: link"
    CC="$nonopt"
    allow_undefined=yes
    compile_command="$CC"
    finalize_command="$CC"

    compile_shlibpath=
    finalize_shlibpath=
    deplibs=
    dlfiles=
    dlprefiles=
    export_dynamic=no
    hardcode_libdirs=
    libobjs=
    link_against_libtool_libs=
    ltlibs=
    objs=
    prev=
    prevarg=
    rpath=
    perm_rpath=
    temp_rpath=
    vinfo=

    # We need to know -static, to get the right output filenames.
    for arg
    do
      case "$arg" in
      -all-static | -static)
        if test "X$arg" = "X-all-static" && test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
        fi
        build_libtool_libs=no
	build_old_libs=yes
        break
        ;;
      esac
    done

    # See if our shared archives depend on static archives.
    test -n "$old_archive_from_new_cmds" && build_old_libs=yes

    # Go through the arguments, transforming them on the way.
    for arg
    do
      # If the previous option needs an argument, assign it.
      if test -n "$prev"; then
        case "$prev" in
        output)
          compile_command="$compile_command @OUTPUT@"
          finalize_command="$finalize_command @OUTPUT@"
          ;;
        esac

        case "$prev" in
        dlfiles|dlprefiles)
          case "$arg" in
          *.la | *.lo) ;;  # We handle these cases below.
          *)
            dlprefiles="$dlprefiles $arg"
            test "$prev" = dlfiles && dlfiles="$dlfiles $arg"
            prev=
            ;;
          esac
          ;;
        rpath)
          rpath="$rpath $arg"
	  prev=
	  continue
	  ;;
        *)
          eval "$prev=\"\$arg\""
          prev=
          continue
          ;;
        esac
      fi

      prevarg="$arg"

      case "$arg" in
      -all-static)
	if test -n "$link_static_flag"; then
          compile_command="$compile_command $link_static_flag"
	  finalize_command="$finalize_command $link_static_flag"
        fi
        continue
	;;

      -allow-undefined)
	# FIXME: remove this flag sometime in the future.
	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
	continue
	;;

      -dlopen)
        prev=dlfiles
        continue
        ;;

      -dlpreopen)
        prev=dlprefiles
        continue
        ;;

      -export-dynamic)
        if test "$export_dynamic" != yes; then
          export_dynamic=yes
	  if test -n "$export_dynamic_flag_spec"; then
	    arg=`eval \\$echo "$export_dynamic_flag_spec"`
	  else
	    arg=
	  fi

          # Add the symbol object into the linking commands.
	  compile_command="$compile_command @SYMFILE@"
	  finalize_command="$finalize_command @SYMFILE@"
        fi
        ;;

      -L*)
        dir=`$echo "$arg" | sed 's%^-L\(.*\)$%\1%'`
        case "$dir" in
        /*)
	  # Add the corresponding hardcode_libdir_flag, if it is not identical.
          ;;
        *)
          $echo "$modename: \`-L$dir' cannot specify a relative directory" 1>&2
          exit 1
          ;;
        esac
        deplibs="$deplibs $arg"
        ;;

      -l*) deplibs="$deplibs $arg" ;;

      -no-undefined)
	allow_undefined=no
	continue
	;;

      -o) prev=output ;;

      -rpath)
        prev=rpath
        continue
        ;;

      -static)
	# If we have no pic_flag, then this is the same as -all-static.
	if test -z "$pic_flag" && test -n "$link_static_flag"; then
          compile_command="$compile_command $link_static_flag"
	  finalize_command="$finalize_command $link_static_flag"
        fi
	continue
	;;

      -version-info)
        prev=vinfo
        continue
        ;;

      # Some other compiler flag.
      -* | +*)
	# Unknown arguments in both finalize_command and compile_command need
	# to be aesthetically quoted because they are evaled later.
	arg=`$echo "$arg" | sed "$sed_quote_subst"`
	case "$arg" in
	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
	  arg="\"$arg\""
	  ;;
	esac
        ;;

      *.o | *.a)
        # A standard object.
        objs="$objs $arg"
        ;;

      *.lo)
        # A library object.
	if test "$prev" = dlfiles; then
	  dlfiles="$dlfiles $arg"
	  if test "$build_libtool_libs" = yes; then
	    prev=
	    continue
	  else
	    # If libtool objects are unsupported, then we need to preload.
	    prev=dlprefiles
	  fi
	fi

	if test "$prev" = dlprefiles; then
	  # Preload the old-style object.
	  dlprefiles="$dlprefiles "`$echo "$arg" | sed 's/\.lo$/\.o/'`
	  prev=
	fi
	libobjs="$libobjs $arg"
        ;;

      *.la)
        # A libtool-controlled library.

        dlname=
        libdir=
        library_names=
        old_library=

        # Check to see that this really is a libtool archive.
        if egrep '^# Generated by ltmain.sh' $arg >/dev/null 2>&1; then :
        else
          $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
          exit 1
        fi

        # If there is no directory component, then add one.
        case "$arg" in
        */*) . $arg ;;
        *) . ./$arg ;;
        esac

        if test -z "$libdir"; then
          $echo "$modename: \`$arg' contains no -rpath information" 1>&2
          exit 1
        fi

        # Get the name of the library we link against.
        linklib=
        for l in $old_library $library_names; do
          linklib="$l"
        done

        if test -z "$linklib"; then
          $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
          exit 1
        fi

        # Find the relevant object directory and library name.
        name=`$echo "$arg" | sed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
        dir=`$echo "$arg" | sed 's%/[^/]*$%%'`
        if test "X$dir" = "X$arg"; then
          dir="$objdir"
        else
          dir="$dir/$objdir"
        fi

        # This library was specified with -dlopen.
        if test "$prev" = dlfiles; then
          dlfiles="$dlfiles $arg"
          if test -z "$dlname"; then
            # If there is no dlname, we need to preload.
            prev=dlprefiles
          else
            # We should not create a dependency on this library.
            prev=
            continue
          fi
        fi

        # The library was specified with -dlpreopen.
        if test "$prev" = dlprefiles; then
          # Prefer using a static library (so that no silly _DYNAMIC symbols
          # are required to link).
          if test -n "$old_library"; then
            dlprefiles="$dlprefiles $dir/$old_library"
          else
            dlprefiles="$dlprefiles $dir/$linklib"
          fi
          prev=
        fi

        if test "$build_libtool_libs" = yes && test -n "$library_names"; then
          link_against_libtool_libs="$link_against_libtool_libs $arg"
          if test -n "$shlibpath_var"; then
            # Make sure the rpath contains only unique directories.
            case "$temp_rpath " in
            *" $dir "*) ;;
            *) temp_rpath="$temp_rpath $dir" ;;
            esac
          fi

	  # This is the magic to use -rpath.
          if test -n "$hardcode_libdir_flag_spec"; then
            if test -n "$hardcode_libdir_separator"; then
              if test -z "$hardcode_libdirs"; then
                # Put the magic libdir with the hardcode flag.
                hardcode_libdirs="$libdir"
                libdir="@HARDCODE_LIBDIRS@"
              else
                # Just accumulate the unique libdirs.
		case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
		*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
		  ;;
		*)
		  hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
		  ;;
		esac
                libdir=
              fi
            fi

            if test -n "$libdir"; then
              flag=`eval \\$echo \"$hardcode_libdir_flag_spec\"`

              compile_command="$compile_command $flag"
              finalize_command="$finalize_command $flag"
            fi
          elif test "$hardcode_runpath_var" = yes; then
            # Do the same for the permanent run path.
            case "$perm_rpath " in
            *" $libdir "*) ;;
            *) perm_rpath="$perm_rpath $libdir" ;;
            esac
          fi


          case "$hardcode_action" in
          immediate)
            if test "$hardcode_direct" = no; then
              compile_command="$compile_command $dir/$linklib"
            elif test "$hardcode_minus_L" = no; then
              compile_command="$compile_command -L$dir -l$name"
            elif test "$hardcode_shlibpath_var" = no; then
              compile_shlibpath="$compile_shlibpath$dir:"
              compile_command="$compile_command -l$name"
            fi
            ;;

          relink)
            # We need an absolute path.
            case "$dir" in
            /*) ;;
            *)
              absdir=`cd "$dir" && pwd`
              if test -z "$absdir"; then
                $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
                exit 1
              fi
              dir="$absdir"
              ;;
            esac

            if test "$hardcode_direct" = yes; then
              compile_command="$compile_command $dir/$linklib"
            elif test "$hardcode_minus_L" = yes; then
              compile_command="$compile_command -L$dir -l$name"
            elif test "$hardcode_shlibpath_var" = yes; then
              compile_shlibpath="$compile_shlibpath$dir:"
              compile_command="$compile_command -l$name"
            fi
            ;;

          *)
            $echo "$modename: \`$hardcode_action' is an unknown hardcode action" 1>&2
            exit 1
            ;;
          esac

          # Finalize command for both is simple: just hardcode it.
          if test "$hardcode_direct" = yes; then
            finalize_command="$finalize_command $libdir/$linklib"
          elif test "$hardcode_minus_L" = yes; then
            finalize_command="$finalize_command -L$libdir -l$name"
          elif test "$hardcode_shlibpath_var" = yes; then
            finalize_shlibpath="$finalize_shlibpath$libdir:"
            finalize_command="$finalize_command -l$name"
          else
            # We can't seem to hardcode it, guess we'll fake it.
            finalize_command="$finalize_command -L$libdir -l$name"
          fi
        else
          # Transform directly to old archives if we don't build new libraries.
          if test -n "$pic_flag" && test -z "$old_library"; then
            $echo "$modename: cannot find static library for \`$arg'" 1>&2
            exit 1
          fi

	  # Here we assume that one of hardcode_direct or hardcode_minus_L
	  # is not unsupported.  This is valid on all known static and
	  # shared platforms.
	  if test "$hardcode_direct" != unsupported; then
	    test -n "$old_library" && linklib="$old_library"
	    compile_command="$compile_command $dir/$linklib"
	    finalize_command="$finalize_command $dir/$linklib"
	  else
	    compile_command="$compile_command -L$dir -l$name"
	    finalize_command="$finalize_command -L$dir -l$name"
	  fi
        fi
	continue
        ;;

      # Some other compiler argument.
      *)
	# Unknown arguments in both finalize_command and compile_command need
	# to be aesthetically quoted because they are evaled later.
	arg=`$echo "$arg" | sed "$sed_quote_subst"`
	case "$arg" in
	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
	  arg="\"$arg\""
	  ;;
	esac
        ;;
      esac

      # Now actually substitute the argument into the commands.
      if test -n "$arg"; then
	compile_command="$compile_command $arg"
	finalize_command="$finalize_command $arg"
      fi
    done

    if test -n "$prev"; then
      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
      $echo "$help" 1>&2
      exit 1
    fi

    oldlib=
    oldobjs=
    case "$output" in
    "")
      $echo "$modename: you must specify an output file" 1>&2
      $echo "$help" 1>&2
      exit 1
      ;;

    */*)
      $echo "$modename: output file \`$output' must have no directory components" 1>&2
      exit 1
      ;;

    *.la)
      # Make sure we only generate libraries of the form `libNAME.la'.
      case "$output" in
      lib*) ;;
      *)
	$echo "$modename: libtool library \`$arg' must begin with \`lib'" 1>&2
	$echo "$help" 1>&2
	exit 1
	;;
      esac

      name=`$echo "$output" | sed -e 's/\.la$//' -e 's/^lib//'`
      libname=`eval \\$echo \"$libname_spec\"`

      # All the library-specific variables (install_libdir is set above).
      library_names=
      old_library=
      dlname=
      current=0
      revision=0
      age=0

      if test -n "$objs"; then
        $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
        exit 1
      fi

      # How the heck are we supposed to write a wrapper for a shared library?
      if test -n "$link_against_libtool_libs"; then
        $echo "$modename: libtool library \`$output' may not depend on uninstalled libraries:$link_against_libtool_libs" 1>&2
        exit 1
      fi

      # Add libc to deplibs on all systems.
      deplibs="$deplibs -lc"

      if test -n "$dlfiles$dlprefiles"; then
        $echo "$modename: warning: \`-dlopen' is ignored while creating libtool libraries" 1>&2
        # Nullify the symbol file.
        compile_command=`$echo "$compile_command" | sed "s% @SYMFILE@%%"`
        finalize_command=`$echo "$finalize_command" | sed "s% @SYMFILE@%%"`
      fi

      if test -z "$rpath"; then
        $echo "$modename: you must specify an installation directory with \`-rpath'" 1>&2
	$echo "$help" 1>&2
        exit 1
      fi

      set dummy $rpath
      if test $# -gt 2; then
	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
      fi
      install_libdir="$2"

      # Parse the version information argument.
      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=':'
      set dummy $vinfo
      IFS="$save_ifs"

      if test -n "$5"; then
        $echo "$modename: too many parameters to \`-version-info'" 1>&2
        $echo "$help" 1>&2
        exit 1
      fi

      test -n "$2" && current="$2"
      test -n "$3" && revision="$3"
      test -n "$4" && age="$4"

      # Check that each of the things are valid numbers.
      case "$current" in
      0 | [1-9] | [1-9][0-9]*) ;;
      *)
        $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
        exit 1
        ;;
      esac

      case "$revision" in
      0 | [1-9] | [1-9][0-9]*) ;;
      *)
        $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
        exit 1
        ;;
      esac

      case "$age" in
      0 | [1-9] | [1-9][0-9]*) ;;
      *)
        $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
        exit 1
        ;;
      esac

      if test $age -gt $current; then
        $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
        exit 1
      fi

      # Calculate the version variables.
      version_vars="version_type current age revision"
      case "$version_type" in
      none) ;;

      linux)
        version_vars="$version_vars major versuffix"
        major=`expr $current - $age`
        versuffix="$major.$age.$revision"
        ;;

      osf)
        version_vars="$version_vars versuffix verstring"
        major=`expr $current - $age`
        versuffix="$current.$age.$revision"
        verstring="$versuffix"

        # Add in all the interfaces that we are compatible with.
        loop=$age
        while test $loop != 0; do
          iface=`expr $current - $loop`
          loop=`expr $loop - 1`
          verstring="$verstring:${iface}.0"
        done

        # Make executables depend on our current version.
        verstring="$verstring:${current}.0"
        ;;

      sunos)
        version_vars="$version_vars major versuffix"
        major="$current"
        versuffix="$current.$revision"
        ;;

      *)
        $echo "$modename: unknown library version type \`$version_type'" 1>&2
        echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
        exit 1
        ;;
      esac

      # Create the output directory, or remove our outputs if we need to.
      if test -d $objdir; then
        $show "$rm $objdir/$output $objdir/$libname.*"
        $run $rm $objdir/$output $objdir/$libname.*
      else
        $show "$mkdir $objdir"
        $run $mkdir $objdir
	status=$?
	if test $status -eq 0 || test -d $objdir; then :
	else
	  exit $status
	fi
      fi

      # Check to see if the archive will have undefined symbols.
      if test "$allow_undefined" = yes; then
        if test "$allow_undefined_flag" = unsupported; then
          $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
          build_libtool_libs=no
	  build_old_libs=yes
        fi
      else
        # Clear the flag.
        allow_undefined_flag=
      fi

      if test "$build_libtool_libs" = yes; then
        # Get the real and link names of the library.
        library_names=`eval \\$echo \"$library_names_spec\"`
        set dummy $library_names
        realname="$2"
        shift; shift

        if test -n "$soname_spec"; then
          soname=`eval \\$echo \"$soname_spec\"`
        else
          soname="$realname"
        fi

        lib="$objdir/$realname"
	for link
	do
	  linknames="$linknames $link"
	done

        # Use standard objects if they are PIC.
        test -z "$pic_flag" && libobjs=`$echo "$libobjs " | sed -e 's/\.lo /.o /g' -e 's/ $//g'`

        # Do each of the archive commands.
        cmds=`eval \\$echo \"$archive_cmds\"`
        IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
        for cmd in $cmds; do
          IFS="$save_ifs"
          $show "$cmd"
          $run eval "$cmd" || exit $?
        done
        IFS="$save_ifs"

        # Create links to the real library.
        for linkname in $linknames; do
          $show "(cd $objdir && $LN_S $realname $linkname)"
          $run eval '(cd $objdir && $LN_S $realname $linkname)' || exit $?
        done

        # If -export-dynamic was specified, set the dlname.
        if test "$export_dynamic" = yes; then
          # On all known operating systems, these are identical.
          dlname="$soname"
        fi
      fi
      ;;

    *.lo | *.o)
      if test -n "$link_against_libtool_libs"; then
        $echo "$modename: error: cannot link libtool libraries into reloadable objects" 1>&2
        exit 1
      fi

      if test -n "$deplibs"; then
        $echo "$modename: warning: \`-l' and \`-L' are ignored while creating objects" 1>&2
      fi

      if test -n "$dlfiles$dlprefiles"; then
        $echo "$modename: warning: \`-dlopen' is ignored while creating objects" 1>&2
        # Nullify the symbol file.
        compile_command=`$echo "$compile_command" | sed "s% @SYMFILE@%%"`
        finalize_command=`$echo "$finalize_command" | sed "s% @SYMFILE@%%"`
      fi

      if test -n "$rpath"; then
        $echo "$modename: warning: \`-rpath' is ignored while creating objects" 1>&2
      fi

      if test -n "$vinfo"; then
        $echo "$modename: warning: \`-version-info' is ignored while creating objects" 1>&2
      fi

      case "$output" in
      *.lo)
        if test -n "$objs"; then
          $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
          exit 1
        fi
        libobj="$output"
        obj=`$echo "$output" | sed 's/\.lo$/.o/'`
        ;;
      *)
        libobj=
        obj="$output"
        ;;
      esac

      # Delete the old objects.
      $run $rm $obj $libobj

      # Create the old-style object.
      reload_objs="$objs"`$echo "$libobjs " | sed -e 's/[^       ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`

      output="$obj"
      cmds=`eval \\$echo \"$reload_cmds\"`
      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
      for cmd in $cmds; do
        IFS="$save_ifs"
        $show "$cmd"
        $run eval "$cmd" || exit $?
      done
      IFS="$save_ifs"

      # Exit if we aren't doing a library object file.
      test -z "$libobj" && exit 0

      if test "$build_libtool_libs" != yes; then
        # Create an invalid libtool object if no PIC, so that we don't
        # accidentally link it into a program.
        $show "echo timestamp > $libobj"
        $run eval "echo timestamp > $libobj" || exit $?
        exit 0
      fi

      if test -n "$pic_flag"; then
        # Only do commands if we really have different PIC objects.
        reload_objs="$libobjs"
        output="$libobj"
        cmds=`eval \\$echo \"$reload_cmds\"`
        IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
        for cmd in $cmds; do
          IFS="$save_ifs"
          $show "$cmd"
          $run eval "$cmd" || exit $?
        done
        IFS="$save_ifs"
      else
        # Just create a symlink.
        $show "$LN_S $obj $libobj"
        $run $LN_S $obj $libobj || exit 1
      fi

      exit 0
      ;;

    *)
      if test -n "$vinfo"; then
        $echo "$modename: warning: \`-version-info' is ignored while linking programs" 1>&2
      fi

      if test -n "$rpath"; then
	# If the user specified any rpath flags, then add them.
	for libdir in $rpath; do
          if test -n "$hardcode_libdir_flag_spec"; then
            if test -n "$hardcode_libdir_separator"; then
              if test -z "$hardcode_libdirs"; then
                # Put the magic libdir with the hardcode flag.
                hardcode_libdirs="$libdir"
                libdir="@HARDCODE_LIBDIRS@"
              else
                # Just accumulate the unique libdirs.
		case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
		*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
		  ;;
		*)
		  hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
		  ;;
		esac
                libdir=
              fi
            fi

            if test -n "$libdir"; then
              flag=`eval \\$echo \"$hardcode_libdir_flag_spec\"`

              compile_command="$compile_command $flag"
              finalize_command="$finalize_command $flag"
            fi
          elif test "$hardcode_runpath_var" = yes; then
            case "$perm_rpath " in
            *" $libdir "*) ;;
            *) perm_rpath="$perm_rpath $libdir" ;;
            esac
          fi
	done
      fi

      # Substitute the hardcoded libdirs into the compile commands.
      if test -n "$hardcode_libdir_separator"; then
	compile_command=`$echo "$compile_command" | sed "s%@HARDCODE_LIBDIRS@%$hardcode_libdirs%g"`
	finalize_command=`$echo "$finalize_command" | sed "s%@HARDCODE_LIBDIRS@%$hardcode_libdirs%g"`
      fi

      if test -n "$libobjs" && test "$build_old_libs" = yes; then
        # Transform all the library objects into standard objects.
        compile_command=`$echo "$compile_command " | sed -e 's/\.lo /.o /g' -e 's/ $//'`
        finalize_command=`$echo "$finalize_command " | sed -e 's/\.lo /.o /g' -e 's/ $//'`
      fi

      if test "$export_dynamic" = yes && test -n "$NM" && test -n "$global_symbol_pipe"; then
        dlsyms="${output}S.c"
      else
        dlsyms=
      fi

      if test -n "$dlsyms"; then
        # Add our own program objects to the preloaded list.
        dlprefiles=`$echo "$objs$dlprefiles " | sed -e 's/\.lo /.o /g' -e 's/ $//'`

	# Discover the nlist of each of the dlfiles.
        nlist="$objdir/${output}.nm"

	if test -d $objdir; then
	  $show "$rm $nlist ${nlist}T"
	  $run $rm "$nlist" "${nlist}T"
	else
	  $show "$mkdir $objdir"
	  $run $mkdir $objdir
	  status=$?
	  if test $status -eq 0 || test -d $objdir; then :
	  else
	    exit $status
	  fi
	fi

        for arg in $dlprefiles; do
	  $show "extracting global C symbols from \`$arg'"
	  $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
        done

        # Parse the name list into a source file.
        $show "creating $objdir/$dlsyms"
        if test -z "$run"; then
	  # Make sure we at least have an empty file.
	  test -f "$nlist" || : > "$nlist"

	  # Try sorting and uniquifying the output.
	  if sort "$nlist" | uniq > "$nlist"T; then
	    mv -f "$nlist"T "$nlist"
	    wcout=`wc "$nlist" 2>/dev/null`
	    count=`echo "$wcout" | sed 's/^[ 	]*\([0-9][0-9]*\).*$/\1/'`
	    (test "$count" -ge 0) 2>/dev/null || count=-1
	  else
	    $rm "$nlist"T
	    count=-1
	  fi

	  case "$dlsyms" in
	  "") ;;
	  *.c)
	    cat <<EOF > "$objdir/$dlsyms"
/* $dlsyms - symbol resolution table for \`$output' dlsym emulation. */
/* Generated by $PROGRAM - GNU $PACKAGE $VERSION */

#ifdef __cplusplus
extern "C" {
#endif

/* Prevent the only kind of declaration conflicts we can make. */
#define dld_preloaded_symbol_count some_other_symbol
#define dld_preloaded_symbols some_other_symbol

/* External symbol declarations for the compiler. */
EOF
	    if test -f "$nlist"; then
	      sed -e 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> "$objdir/$dlsyms"
	    else
	      echo '/* NONE */' >> "$objdir/$dlsyms"
EOF
	    fi

	    cat <<EOF >> "$objdir/$dlsyms"

#undef dld_preloaded_symbol_count
#undef dld_preloaded_symbols

#if defined (__STDC__) && __STDC__
# define __ptr_t void *
#else
# define __ptr_t char *
#endif

/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
int dld_preloaded_symbol_count = $count;

/* The mapping between symbol names and symbols. */
struct {
  char *name;
  __ptr_t address;
}
dld_preloaded_symbols[] =
{
EOF

	    if test -f "$nlist"; then
	      sed 's/^\(.*\) \(.*\)$/  {"\1", (__ptr_t) \&\2},/' < "$nlist" >> "$objdir/$dlsyms"
	    fi

	    cat <<\EOF >> "$objdir/$dlsyms"
  {0},
};

#ifdef __cplusplus
}
#endif
EOF
	    ;;

	  *)
	    $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
	    exit 1
	    ;;
	  esac
        fi

        # Now compile the dynamic symbol file.
        $show "(cd $objdir && $CC -c$no_builtin_flag \"$dlsyms\")"
        $run eval '(cd $objdir && $CC -c$no_builtin_flag "$dlsyms")' || exit $?

        # Transform the symbol file into the correct name.
        compile_command=`$echo "$compile_command" | sed "s%@SYMFILE@%$objdir/${output}S.o%"`
        finalize_command=`$echo "$finalize_command" | sed "s%@SYMFILE@%$objdir/${output}S.o%"`
      elif test "$export_dynamic" != yes; then
        test -n "$dlfiles$dlprefiles" && $echo "$modename: warning: \`-dlopen' and \`-dlpreopen' are ignored without \`-export-dynamic'" 1>&2
      else
        # We keep going just in case the user didn't refer to
        # dld_preloaded_symbols.  The linker will fail if global_symbol_pipe
        # really was required.
        $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2

        # Nullify the symbol file.
        compile_command=`$echo "$compile_command" | sed "s% @SYMFILE@%%"`
        finalize_command=`$echo "$finalize_command" | sed "s% @SYMFILE@%%"`
      fi

      if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
        # Replace the output file specification.
        compile_command=`$echo "$compile_command" | sed 's%@OUTPUT@%'"$output"'%g'`
        finalize_command=`$echo "$finalize_command" | sed 's%@OUTPUT@%'"$output"'%g'`

        # We have no uninstalled library dependencies, so finalize right now.
        $show "$compile_command"
        $run eval "$compile_command"
        exit $?
      fi

      # Replace the output file specification.
      compile_command=`$echo "$compile_command" | sed 's%@OUTPUT@%'"$objdir/$output"'%g'`
      finalize_command=`$echo "$finalize_command" | sed 's%@OUTPUT@%'"$objdir/$output"'T%g'`

      # Create the binary in the object directory, then wrap it.
      if test -d $objdir; then :
      else
        $show "$mkdir $objdir"
        $run $mkdir $objdir || exit $?
      fi

      if test -n "$shlibpath_var"; then
        # We should set the shlibpath_var
        rpath=
        for dir in $temp_rpath; do
          case "$dir" in
          /*)
            # Absolute path.
            rpath="$rpath$dir:"
            ;;
          *)
            # Relative path: add a thisdir entry.
            rpath="$rpath\$thisdir/$dir:"
            ;;
          esac
        done
        temp_rpath="$rpath"
      fi

      # Delete the old output file.
      $run $rm $output

      if test -n "$compile_shlibpath"; then
        compile_command="$shlibpath_var=\"$compile_shlibpath\$$shlibpath_var\" $compile_command"
      fi
      if test -n "$finalize_shlibpath"; then
        finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
      fi

      if test -n "$perm_rpath"; then
        # We should set the runpath_var.
        rpath=
        for dir in $perm_rpath; do
          rpath="$rpath$dir:"
        done
        compile_command="$runpath_var=\"$rpath\$$runpath_var\" $compile_command"
        finalize_command="$runpath_var=\"$rpath\$$runpath_var\" $finalize_command"
      fi

      case "$hardcode_action" in
      relink)
        # AGH! Flame the AIX and HP-UX people for me, will ya?
        $echo "$modename: warning: using a buggy system linker" 1>&2
        $echo "$modename: relinking will be required before \`$output' can be installed" 1>&2
        ;;
      esac

      $show "$compile_command"
      $run eval "$compile_command" || exit $?

      # Now create the wrapper script.
      $show "creating $output"

      # Quote the finalize command for shipping.
      finalize_command=`$echo "$finalize_command" | sed "$sed_quote_subst"`

      # Only actually do things if our run command is non-null.
      if test -z "$run"; then
        $rm $output
        trap "$rm $output; exit 1" 1 2 15

        cat > $output <<EOF
#! /bin/sh

# $output - temporary wrapper script for $objdir/$output
# Generated by ltmain.sh - GNU $PACKAGE $VERSION
#
# The $output program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of \``pwd`'.
# If it is, it will not operate correctly.

# This environment variable determines our operation mode.
if test "\$libtool_install_magic" = "$magic"; then
  # install mode needs the following variables:
  link_against_libtool_libs='$link_against_libtool_libs'
  finalize_command="$finalize_command"
else
  # When we are sourced in execute mode, \$file and \$echo are already set.
  if test "\$libtool_execute_magic" = "$magic"; then :
  else
    echo='$echo'
    file="\$0"
  fi

  # Find the directory that this script lives in.
  thisdir=\`\$echo "\$file" | sed 's%/[^/]*$%%'\`
  test "x\$thisdir" = "x\$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=\`ls -ld "\$file" | sed -n 's/.*-> //p'\`
  while test -n "\$file"; do
    destdir=\`\$echo "\$file" | sed 's%/[^/]*\$%%'\`

    # If there was a directory component, then change thisdir.
    if test "x\$destdir" != "x\$file"; then
      case "\$destdir" in
      /*) thisdir="\$destdir" ;;
      *) thisdir="\$thisdir/\$destdir" ;;
      esac
    fi

    file=\`\$echo "\$file" | sed 's%^.*/%%'\`
    file=\`ls -ld "\$thisdir/\$file" | sed -n 's/.*-> //p'\`
  done

  # Try to get the absolute directory name.
  absdir=\`cd "\$thisdir" && pwd\`
  test -n "\$absdir" && thisdir="\$absdir"

  progdir="\$thisdir/$objdir"
  program='$output'

  if test -f "\$progdir/\$program"; then
EOF

        # Export our shlibpath_var if we have one.
        if test -n "$shlibpath_var" && test -n "$temp_rpath"; then
          cat >> $output <<EOF
    # Add our own library path to $shlibpath_var
    $shlibpath_var="$temp_rpath\$$shlibpath_var"

    # Some systems cannot cope with colon-terminated $shlibpath_var
    $shlibpath_var=\`\$echo \$$shlibpath_var | sed -e 's/:*\$//'\`

    export $shlibpath_var

EOF
        fi

        cat >> $output <<EOF
    if test "\$libtool_execute_magic" != "$magic"; then
      # Run the actual program with our arguments.
      args=
      for arg
      do
        # Quote arguments (to preserve shell metacharacters).
	sed_quote_subst='$sed_quote_subst'
	arg=\`\$echo "\$arg" | sed "\$sed_quote_subst"\`
        args="\$args \\"\$arg\\""
      done

      # Export the path to the program.
      PATH="\$progdir:\$PATH"
      export PATH

      eval "exec \$program \$args"

      \$echo "\$0: cannot exec \$program \$args"
      exit 1
    fi
  else
    # The program doesn't exist.
    \$echo "\$0: error: \$progdir/\$program does not exist" 1>&2
    \$echo "This script is just a wrapper for \$program." 1>&2
    echo "See the $PACKAGE documentation for more information." 1>&2
    exit 1
  fi
fi
EOF
        chmod +x $output
      fi
      exit 0
      ;;
    esac


    # See if we need to build an old-fashioned archive.
    if test "$build_old_libs" = "yes"; then
      # Now set the variables for building old libraries.
      oldlib="$objdir/$libname.a"

      # Transform .lo files to .o files.
      oldobjs="$objs"`$echo "$libobjs " | sed -e 's/[^   ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`

      if test -d "$objdir"; then
        $show "$rm $oldlib"
        $run $rm $oldlib
      else
        $show "$mkdir $objdir"
        $run $mkdir $objdir
      fi

      # Do each command in the archive commands.
      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
	cmds=`eval \\$echo \"$old_archive_from_new_cmds\"`
      else
	cmds=`eval \\$echo \"$old_archive_cmds\"`
      fi
      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
      for cmd in $cmds; do
        IFS="$save_ifs"
        $show "$cmd"
        $run eval "$cmd" || exit $?
      done
      IFS="$save_ifs"
    fi

    # Now create the libtool archive.
    case "$output" in
    *.la)
      old_library=
      test "$build_old_libs" = yes && old_library="$libname.a"

      $show "creating $output"

      # Only create the output if not a dry run.
      if test -z "$run"; then
        cat > $output <<EOF
# $output - a libtool library file
# Generated by ltmain.sh - GNU $PACKAGE $VERSION

# The name that we can dlopen(3).
dlname='$dlname'

# Names of this library.
library_names='$library_names'

# The name of the static archive.
old_library='$old_library'

# Version information for $libname.
current=$current
age=$age
revision=$revision

# Directory that this library needs to be installed in:
libdir='$install_libdir'
EOF
      fi

      # Do a symbolic link so that the libtool archive can be found in
      # LD_LIBRARY_PATH before the program is installed.
      $show "(cd $objdir && $LN_S ../$output $output)"
      $run eval "(cd $objdir && $LN_S ../$output $output)" || exit 1
      ;;
    esac
    exit 0
    ;;

  # libtool install mode
  install)
    modename="$modename: install"

    # There may be an optional /bin/sh argument at the beginning of
    # install_prog (especially on Windows NT).
    if test "$nonopt" = "$SHELL"; then
      # Aesthetically quote it.
      arg=`$echo "$nonopt" | sed "$sed_quote_subst"`
      case "$arg" in
      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
	arg="\"$arg\""
	;;
      esac
      install_prog="$arg "
      arg="$1"
      shift
    else
      install_prog=
      arg="$nonopt"
    fi

    # The real first argument should be the name of the installation program.
    # Aesthetically quote it.
    arg=`$echo "$arg" | sed "$sed_quote_subst"`
    case "$arg" in
    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
      arg="\"$arg\""
      ;;
    esac
    install_prog="$install_prog$arg"

    # We need to accept at least all the BSD install flags.
    dest=
    files=
    opts=
    prev=
    install_type=
    isdir=
    stripme=
    for arg
    do
      if test -n "$dest"; then
        files="$files $dest"
        dest="$arg"
        continue
      fi

      case "$arg" in
      -d) isdir=yes ;;
      -f) prev="-f" ;;
      -g) prev="-g" ;;
      -m) prev="-m" ;;
      -o) prev="-o" ;;
      -s)
        stripme=" -s"
        continue
        ;;
      -*) ;;

      *)
        # If the previous option needed an argument, then skip it.
        if test -n "$prev"; then
          prev=
        else
          dest="$arg"
          continue
        fi
        ;;
      esac

      # Aesthetically quote the argument.
      arg=`$echo "$arg" | sed "$sed_quote_subst"`
      case "$arg" in
      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
	arg="\"$arg\""
	;;
      esac
      install_prog="$install_prog $arg"
    done

    if test -z "$install_prog"; then
      $echo "$modename: you must specify an install program" 1>&2
      $echo "$help" 1>&2
      exit 1
    fi

    if test -n "$prev"; then
      $echo "$modename: the \`$prev' option requires an argument" 1>&2
      $echo "$help" 1>&2
      exit 1
    fi

    if test -z "$files"; then
      if test -z "$dest"; then
        $echo "$modename: no file or destination specified" 1>&2
      else
        $echo "$modename: you must specify a destination" 1>&2
      fi
      $echo "$help" 1>&2
      exit 1
    fi

    # Strip any trailing slash from the destination.
    dest=`$echo "$dest" | sed 's%/$%%'`

    # Check to see that the destination is a directory.
    test -d "$dest" && isdir=yes
    if test -n "$isdir"; then
      destdir="$dest"
      destname=
    else
      destdir=`$echo "$dest" | sed 's%/[^/]*$%%'`
      test "X$destdir" = "X$dest" && destdir=.
      destname=`$echo "$dest" | sed 's%^.*/%%'`

      # Not a directory, so check to see that there is only one file specified.
      set dummy $files
      if test $# -gt 2; then
        $echo "$modename: \`$dest' is not a directory" 1>&2
        $echo "$help" 1>&2
        exit 1
      fi
    fi
    case "$destdir" in
    /*) ;;
    *)
      for file in $files; do
        case "$file" in
        *.lo) ;;
        *)
          $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
          $echo "$help" 1>&2
          exit 1
          ;;
        esac
      done
      ;;
    esac

    # This variable tells wrapper scripts just to set variables rather
    # than running their programs.
    libtool_install_magic="$magic"

    staticlibs=
    future_libdirs=
    current_libdirs=
    for file in $files; do

      # Do each installation.
      case "$file" in
      *.a)
        # Do the static libraries later.
        staticlibs="$staticlibs $file"
        ;;

      *.la)
        # Check to see that this really is a libtool archive.
        if egrep '^# Generated by ltmain.sh' $file >/dev/null 2>&1; then :
        else
          $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
          $echo "$help" 1>&2
          exit 1
        fi

        library_names=
        old_library=
        # If there is no directory component, then add one.
        case "$file" in
        */*) . $file ;;
        *) . ./$file ;;
        esac

        # Add the libdir to current_libdirs if it is the destination.
        if test "X$destdir" = "X$libdir"; then
          case "$current_libdirs " in
          *" $libdir "*) ;;
          *) current_libdirs="$current_libdirs $libdir" ;;
          esac
        else
          # Note the libdir as a future libdir.
          case "$future_libdirs " in
          *" $libdir "*) ;;
          *) future_libdirs="$future_libdirs $libdir" ;;
          esac
        fi

        dir="`$echo "$file" | sed 's%/[^/]*$%%'`/"
        test "X$dir" = "X$file/" && dir=
        dir="$dir$objdir"

        # See the names of the shared library.
        set dummy $library_names
        if test -n "$2"; then
          realname="$2"
          shift
          shift

          # Install the shared library and build the symlinks.
          $show "$install_prog $dir/$realname $destdir/$realname"
          $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
          test "X$dlname" = "X$realname" && dlname=

          # Support stripping libraries.
          if test -n "$stripme"; then
            if test -n "$striplib"; then
              $show "$striplib $destdir/$realname"
              $run $striplib $destdir/$realname || exit $?
            else
              $echo "$modename: warning: no library stripping program" 1>&2
            fi
          fi

          if test $# -gt 0; then
            # Delete the old symlinks.
            rmcmd="$rm"
            for linkname
            do
              rmcmd="$rmcmd $destdir/$linkname"
            done
            $show "$rmcmd"
            $run $rmcmd

            # ... and create new ones.
            for linkname
            do
              test "X$dlname" = "X$linkname" && dlname=
              $show "(cd $destdir && $LN_S $realname $linkname)"
              $run eval "(cd $destdir && $LN_S $realname $linkname)"
            done
          fi

          if test -n "$dlname"; then
            # Install the dynamically-loadable library.
            $show "$install_prog $dir/$dlname $destdir/$dlname"
            $run eval "$install_prog $dir/$dlname $destdir/$dlname" || exit $?
          fi

          # Do each command in the postinstall commands.
          lib="$destdir/$realname"
          cmds=`eval \\$echo \"$postinstall_cmds\"`
          IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
          for cmd in $cmds; do
            IFS="$save_ifs"
            $show "$cmd"
            $run eval "$cmd" || exit $?
          done
          IFS="$save_ifs"
        fi

        # Install the pseudo-library for information purposes.
        name=`$echo "$file" | sed 's%^.*/%%'`
        $show "$install_prog $file $destdir/$name"
        $run eval "$install_prog $file $destdir/$name" || exit $?

        # Maybe install the static library, too.
        test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
        ;;

      *.lo)
        # Install (i.e. copy) a libtool object.

        # Figure out destination file name, if it wasn't already specified.
        if test -n "$destname"; then
          destfile="$destdir/$destname"
        else
          destfile=`$echo "$file" | sed 's%^.*/%%'`
          destfile="$destdir/$destfile"
        fi

        # Deduce the name of the destination old-style object file.
        case "$destfile" in
        *.lo)
          staticdest=`$echo "$destfile" | sed 's/\.lo$/\.o/'`
          ;;
        *.o)
          staticdest="$destfile"
          destfile=
          ;;
        *)
          $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
          $echo "$help" 1>&2
          exit 1
          ;;
        esac

        # Install the libtool object if requested.
        if test -n "$destfile"; then
          $show "$install_prog $file $destfile"
          $run eval "$install_prog $file $destfile" || exit $?
        fi

        # Install the old object if enabled.
        if test "$build_old_libs" = yes; then
          # Deduce the name of the old-style object file.
          staticobj=`$echo "$file" | sed 's/\.lo$/\.o/'`

          $show "$install_prog $staticobj $staticdest"
          $run eval "$install_prog \$staticobj \$staticdest" || exit $?
        fi
        exit 0
        ;;

      *)
        # Do a test to see if this is really a libtool program.
        if egrep '^# Generated by ltmain.sh' $file >/dev/null 2>&1; then
          link_against_libtool_libs=
          finalize_command=

          # If there is no directory component, then add one.
          case "$file" in
          */*) . $file ;;
          *) . ./$file ;;
          esac

          # Check the variables that should have been set.
          if test -z "$link_against_libtool_libs" || test -z "$finalize_command"; then
            $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
            exit 1
          fi

          finalize=yes
          for lib in $link_against_libtool_libs; do
            # Check to see that each library is installed.
            libdir=
            if test -f "$lib"; then
              # If there is no directory component, then add one.
              case "$lib" in
              */*) . $lib ;;
              *) . ./$lib ;;
              esac
            fi
            libfile="$libdir/`$echo "$lib" | sed 's%^.*/%%g'`"
            if test -z "$libdir"; then
              $echo "$modename: warning: \`$lib' contains no -rpath information" 1>&2
            elif test -f "$libfile"; then :
            else
              $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
              finalize=no
            fi
          done

          if test "$hardcode_action" = relink; then
            if test "$finalize" = yes; then
              $echo "$modename: warning: relinking \`$file' on behalf of your buggy system linker" 1>&2
              $show "$finalize_command"
              if $run eval "$finalize_command"; then :
              else
                $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
                continue
              fi
              file="$objdir/$file"T
            else
              $echo "$modename: warning: cannot relink \`$file' on behalf of your buggy system linker" 1>&2
            fi
          else
            # Install the binary that we compiled earlier.
	    file=`$echo "$file" | sed "s%\([^/]*\)$%$objdir/\1%"`
          fi
        fi

        $show "$install_prog$stripme $file $dest"
        $run eval "$install_prog\$stripme \$file \$dest" || exit $?
        ;;
      esac
    done

    for file in $staticlibs; do
      name=`$echo "$file" | sed 's%^.*/%%'`

      # Set up the ranlib parameters.
      oldlib="$destdir/$name"

      $show "$install_prog $file $oldlib"
      $run eval "$install_prog \$file \$oldlib" || exit $?

      # Support stripping libraries.
      if test -n "$stripme"; then
        if test -n "$old_striplib"; then
          $show "$old_striplib $oldlib"
          $run $old_striplib $oldlib || exit $?
        else
          $echo "$modename: warning: no static library stripping program" 1>&2
        fi
      fi

      # Do each command in the postinstall commands.
      cmds=`eval \\$echo \"$old_postinstall_cmds\"`
      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
      for cmd in $cmds; do
        IFS="$save_ifs"
        $show "$cmd"
        $run eval "$cmd" || exit $?
      done
      IFS="$save_ifs"
    done

    if test -n "$future_libdirs"; then
      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
    fi

    if test -n "$current_libdirs"; then
      # Maybe just do a dry run.
      test -n "$run" && current_libdirs=" -n$current_libdirs"
      exec $SHELL $0 --finish$current_libdirs
      exit 1
    fi

    exit 0
    ;;

  # libtool finish mode
  finish)
    modename="$modename: finish"
    libdirs="$nonopt"

    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
      for dir
      do
        libdirs="$libdirs $dir"
      done

      for libdir in $libdirs; do
	if test -n "$finish_cmds"; then
	  # Do each command in the finish commands.
	  cmds=`eval \\$echo \"$finish_cmds\"`
          IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
          for cmd in $cmds; do
            IFS="$save_ifs"
            $show "$cmd"
            $run eval "$cmd"
          done
          IFS="$save_ifs"
	fi
	if test -n "$finish_eval"; then
	  # Do the single finish_eval.
	  cmds=`eval \\$echo \"$finish_eval\"`
	  $run eval "$cmds"
	fi
      done
    fi

    echo "To link against installed libraries in LIBDIR, users may have to:"
    if test -n "$shlibpath_var"; then
      echo "   - add LIBDIR to their \`$shlibpath_var' environment variable"
    fi
    echo "   - use the \`-LLIBDIR' linker flag"
    exit 0
    ;;

  # libtool execute mode
  execute)
    modename="$modename: execute"

    # The first argument is the command name.
    cmd="$nonopt"
    if test -z "$cmd"; then
      $echo "$modename: you must specify a COMMAND" 1>&2
      $echo "$help"
      exit 1
    fi

    # Handle -dlopen flags immediately.
    for file in $execute_dlfiles; do
      if test -f "$file"; then :
      else
	$echo "$modename: \`$file' is not a file" 1>&2
	$echo "$help" 1>&2
	exit 1
      fi

      dir=
      case "$file" in
      *.la)
        # Check to see that this really is a libtool archive.
        if egrep '^# Generated by ltmain.sh' $file >/dev/null 2>&1; then :
        else
          $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
          $echo "$help" 1>&2
          exit 1
        fi

	# Read the libtool library.
	dlname=
	library_names=

        # If there is no directory component, then add one.
	case "$file" in
	*/*) . $file ;;
        *) . ./$file ;;
	esac

	# Skip this library if it cannot be dlopened.
	if test -z "$dlname"; then
	  # Warn if it was a shared library.
	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
	  continue
	fi

	dir=`$echo "$file" | sed 's%/[^/]*$%%'`
	test "X$dir" = "X$file" && dir=.

	if test -f "$dir/$objdir/$dlname"; then
	  dir="$dir/$objdir"
	else
	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
	  exit 1
	fi
	;;

      *.lo)
	# Just add the directory containing the .lo file.
	dir=`$echo "$file" | sed 's%/[^/]*$%%'`
	test "X$dir" = "X$file" && dir=.
	;;

      *)
	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
        continue
	;;
      esac

      # Get the absolute pathname.
      absdir=`cd "$dir" && pwd`
      test -n "$absdir" && dir="$absdir"

      # Now add the directory to shlibpath_var.
      if eval "test -z \"\$$shlibpath_var\""; then
	eval "$shlibpath_var=\"\$dir\""
      else
	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
      fi
    done

    # This variable tells wrapper scripts just to set shlibpath_var
    # rather than running their programs.
    libtool_execute_magic="$magic"

    # Check if any of the arguments is a wrapper script.
    args=
    for file
    do
      case "$file" in
      -*) ;;
      *)
	if egrep '^# Generated by ltmain.sh' $file >/dev/null 2>&1; then
	  # If there is no directory component, then add one.
	  case "$file" in
	  */*) . $file ;;
	  *) . ./$file ;;
	  esac

	  # Transform arg to wrapped name.
	  file="$progdir/$program"
	fi
        ;;
      esac
      # Quote arguments (to preserve shell metacharacters).
      file=`$echo "$file" | sed "$sed_quote_subst"`
      args="$args \"$file\""
    done

    if test -z "$run"; then
      # Export the shlibpath_var.
      eval "export $shlibpath_var"

      # Now actually exec the command.
      eval "exec \$cmd$args"

      $echo "$modename: cannot exec \$cmd$args"
      exit 1
    else
      # Display what would be done.
      eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
      $echo "export $shlibpath_var"
      $echo "$cmd$args"
      exit 0
    fi
    ;;

  # libtool uninstall mode
  uninstall)
    modename="$modename: uninstall"
    rm="$nonopt"
    files=

    for arg
    do
      case "$arg" in
      -*) rm="$rm $arg" ;;
      *) files="$files $arg" ;;
      esac
    done

    if test -z "$rm"; then
      $echo "$modename: you must specify an RM program" 1>&2
      $echo "$help" 1>&2
      exit 1
    fi

    for file in $files; do
      dir=`$echo "$file" | sed -e 's%/[^/]*$%%'`
      test "X$dir" = "X$file" && dir=.
      name=`$echo "$file" | sed -e 's%^.*/%%'`

      rmfiles="$file"

      case "$name" in
      *.la)
        # Possibly a libtool archive, so verify it.
        if egrep '^# Generated by ltmain.sh' $file >/dev/null 2>&1; then
          . $dir/$name

          # Delete the libtool libraries and symlinks.
          for n in $library_names; do
            rmfiles="$rmfiles $dir/$n"
            test "X$n" = "X$dlname" && dlname=
          done
          test -n "$dlname" && rmfiles="$rmfiles $dir/$dlname"
          test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"

	  $show "$rm $rmfiles"
	  $run $rm $rmfiles

	  if test -n "$library_names"; then
	    # Do each command in the postuninstall commands.
	    cmds=`eval \\$echo \"$postuninstall_cmds\"`
	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
	    for cmd in $cmds; do
	      IFS="$save_ifs"
	      $show "$cmd"
	      $run eval "$cmd"
	    done
	    IFS="$save_ifs"
	  fi

          if test -n "$old_library"; then
	    # Do each command in the old_postuninstall commands.
	    cmds=`eval \\$echo \"$old_postuninstall_cmds\"`
	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=';'
	    for cmd in $cmds; do
	      IFS="$save_ifs"
	      $show "$cmd"
	      $run eval "$cmd"
	    done
	    IFS="$save_ifs"
	  fi

          # FIXME: should reinstall the best remaining shared library.
        fi
        ;;

      *.lo)
        if test "$build_old_libs" = yes; then
          oldobj=`$echo "$name" | sed 's/\.lo$/\.o/'`
          rmfiles="$rmfiles $dir/$oldobj"
        fi
	$show "$rm $rmfiles"
	$run $rm $rmfiles
        ;;

      *)
      	$show "$rm $rmfiles"
	$run $rm $rmfiles
	;;
      esac
    done
    exit 0
    ;;

  "")
    $echo "$modename: you must specify a MODE" 1>&2
    $echo "$generic_help" 1>&2
    exit 1
    ;;
  esac

  $echo "$modename: invalid operation mode \`$mode'" 1>&2
  $echo "$generic_help" 1>&2
  exit 1
fi # test -z "$show_help"

# We need to display help for each of the modes.
case "$mode" in
"") cat <<EOF
Usage: $modename [OPTION]... [MODE-ARG]...

Provide generalized library-building support services.

-n, --dry-run         display commands without modifying any files
    --features        display configuration information and exit
    --finish          same as \`--mode=finish'
    --help            display this help message and exit
    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
    --quiet           same as \`--silent'
    --silent          don't print informational messages
    --version         print version information

MODE must be one of the following:

      compile         compile a source file into a libtool object
      execute         automatically set library path, then run a program
      finish          complete the installation of libtool libraries
      install         install libraries or executables
      link            create a library or an executable
      uninstall       remove libraries from an installed directory

MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
a more detailed description of MODE.
EOF
  ;;

compile)
  cat <<EOF
Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE

Compile a source file into a libtool library object.

COMPILE-COMMAND is a command to be used in creating a \`standard' object file
from the given SOURCEFILE.

The output file name is determined by removing the directory component from
SOURCEFILE, then substituting the C source code suffix \`.c' with the
library object suffix, \`.lo'.
EOF
  ;;

execute)
  cat <<EOF
Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...

Automatically set library path, then run a program.

This mode accepts the following additional options:

  -dlopen FILE      add the directory containing FILE to the library path

This mode sets the library path environment variable according to \`-dlopen'
flags.

If any of the ARGS are libtool executable wrappers, then they are translated
into their corresponding uninstalled binary, and any of their required library
directories are added to the library path.

Then, COMMAND is executed, with ARGS as arguments.
EOF
  ;;

finish)
  cat <<EOF
Usage: $modename [OPTION]... --mode=finish [LIBDIR]...

Complete the installation of libtool libraries.

Each LIBDIR is a directory that contains libtool libraries.

The commands that this mode executes may require superuser privileges.  Use
the \`--dry-run' option if you just want to see what would be executed.
EOF
  ;;

install)
  cat <<EOF
Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...

Install executables or libraries.

INSTALL-COMMAND is the installation command.  The first component should be
either the \`install' or \`cp' program.

The rest of the components are interpreted as arguments to that command (only
BSD-compatible install options are recognized).
EOF
  ;;

link)
  cat <<EOF
Usage: $modename [OPTION]... --mode=link LINK-COMMAND...

Link object files or libraries together to form another library, or to
create an executable program.

LINK-COMMAND is a command using the C compiler that you would use to create
a program from several object files.

The following components of LINK-COMMAND are treated specially:

  -all-static       do not do any dynamic linking at all
  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
  -dlpreopen FILE   link in FILE and add its symbols to dld_preloaded_symbols
  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
  -LLIBDIR          search LIBDIR for required installed libraries
  -lNAME            OUTPUT-FILE requires the installed library libNAME
  -no-undefined     declare that a library does not refer to external symbols
  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
  -static           do not do any dynamic linking of libtool libraries
  -version-info CURRENT[:REVISION[:AGE]]
                    specify library version info [each variable defaults to 0]

All other options (arguments beginning with \`-') are ignored.

Every other argument is treated as a filename.  Files ending in \`.la' are
treated as uninstalled libtool libraries, other files are standard or library
object files.

If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only
library objects (\`.lo' files) may be specified, and \`-rpath' is required.

If OUTPUT-FILE ends in \`.a', then a standard library is created using \`ar'
and \`ranlib'.

If OUTPUT-FILE ends in \`.lo' or \`.o', then a reloadable object file is
created, otherwise an executable program is created.
EOF
  ;;

uninstall)
  cat <<EOF
Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...

Remove libraries from an installation directory.

RM is the name of the program to use to delete files associated with each FILE
(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
to RM.

If FILE is a libtool library, all the files associated with it are deleted.
Otherwise, only FILE itself is deleted using RM.
EOF
  ;;

*)
  $echo "$modename: invalid operation mode \`$mode'" 1>&2
  $echo "$help" 1>&2
  exit 1
  ;;
esac

echo
$echo "Try \`$modename --help' for more information about other modes."

exit 0

# Local Variables:
# mode:shell-script
# sh-indentation:2
# End:
