m4_define([_m4_divert(SCRIPT)], 100)
m4_divert_push([SCRIPT])#! /bin/sh
# @configure_input@

# libtoolize (GNU @PACKAGE@@TIMESTAMP@) @VERSION@
# Written by Gary V. Vaughan <gary@gnu.org>, 2003

# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# Libtoolize 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.
#
# Libtoolize 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 libtoolize; see the file COPYING.  If not, a copy
# can be downloaded from http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

# Usage: $progname [OPTION]...
#
# Prepare a package to use libtool.
#
# -c, --copy            copy files rather than symlinking them
#     --debug           enable verbose shell tracing
# -n, --dry-run         print commands rather than running them
# -f, --force           replace existing files
# -i, --install         copy missing auxiliary files
#     --ltdl[=DIR]      install libltdl sources [default: libltdl]
#     --no-warn         don't display warning messages
#     --nonrecursive    prepare ltdl for non-recursive make
# -q, --quiet           work silently
#     --recursive       prepare ltdl for recursive make
#     --subproject      prepare ltdl to configure and build independently
# -v, --verbose         verbosely report processing
#     --version         print version information and exit
# -h, --help            print short or long help message
#
# The following space or comma delimited options can be passed to $progname
# via the environment variable LIBTOOLIZE_OPTIONS, unknown environment
# options are ignored:
#
#     --debug           enable verbose shell tracing
#     --no-warn         don't display warning messages
#     --quiet           work silently
#     --verbose         verbosely report processing
#
# You must `cd' to the top directory of your package before you run
# `$progname'.
#
# When reporting a bug, please describe a test case to reproduce it and
# include the following information:
#
#       host-triplet:	@host_triplet@
#       $progname:	(GNU @PACKAGE@@TIMESTAMP@) @VERSION@
#       automake:		$automake_version
#       autoconf:		$autoconf_version
#
# Report bugs to <bug-libtool@gnu.org>.

: ${TAR=tar}

PROGRAM=libtoolize

AS_SHELL_SANITIZE
$as_unset CDPATH

m4_include([getopt.m4sh])

M4SH_VERBATIM([[
# test EBCDIC or ASCII
case `echo X|tr X '\101'` in
 A) # ASCII based system
    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
  SP2NL='tr \040 \012'
  NL2SP='tr \015\012 \040\040'
  ;;
 *) # EBCDIC based system
  SP2NL='tr \100 \n'
  NL2SP='tr \r\n \100\100'
  ;;
esac


# Command line options:
opt_debug=:
opt_force=false
opt_install=false
opt_link=:
opt_ltdl=false

seen_autoconf=false
seen_libtool=false
seen_ltdl=false

# ltdl can be installed to be self-contained (subproject, the default);
# or to be configured by a parent project, either with a recursive or
# nonrecursive automake driven make:
ltdl_mode=

# Locations for important files:
prefix=@prefix@
datadir=@datadir@
pkgdatadir=@pkgdatadir@
pkgltdldir=@pkgdatadir@
aclocaldir=@aclocaldir@
auxdir=
macrodir=
ltdldir=
configure_ac=configure.in

# Lists of all files libtoolize has ever installed.  These are removed
# before installing the latest files when --force was passed to help
# ensure a clean upgrade.
# Do not remove config.guess nor config.sub, we don't install them
# without --install, and the project may not be using Automake.
all_pkgconfig_files="ltmain.sh"
all_pkgmacro_files="argz.m4 libtool.m4 ltdl.m4 ltoptions.m4 ltsugar.m4 ltversion.in ltversion.m4 lt~obsolete.m4"
all_pkgltdl_files="COPYING.LIB Makefile Makefile.in Makefile.inc Makefile.am README acinclude.m4 aclocal.m4 argz_.h argz.c config.h.in config-h.in configure configure.ac configure.in libltdl/lt__alloc.h libltdl/lt__dirent.h libltdl/lt__glibc.h libltdl/lt__private.h libltdl/lt__strl.h libltdl/lt_dlloader.h libltdl/lt_error.h libltdl/lt_system.h libltdl/slist.h loaders/dld_link.c loaders/dlopen.c loaders/dyld.c loaders/load_add_on.c loaders/loadlibrary.c loaders/preopen.c loaders/shl_load.c lt__alloc.c lt__dirent.c lt__strl.c lt_dlloader.c lt_error.c ltdl.c ltdl.h slist.c"

# Parse environment options
{
  my_sed_env_opt='1s/^\([^,:; ]*\).*$/\1/;q'
  my_sed_env_rest='1s/^[^,:; ]*[,:; ]*\(.*\)$/\1/;q'

  while test -n "$LIBTOOLIZE_OPTIONS"; do
    opt=`echo "$LIBTOOLIZE_OPTIONS" | sed "$my_sed_env_opt"`
    LIBTOOLIZE_OPTIONS=`echo "$LIBTOOLIZE_OPTIONS" | sed "$my_sed_env_rest"`

    case $opt in
      --debug)		opt_debug=:		;;
      --no-warn)	opt_warning=false	;;
      --quiet)		opt_quiet=:		;;
      --verbose)	opt_verbose=:		;;

      --*)	func_warning "unrecognized environment option \`$opt'"    ;;
      *)	func_fatal_help "garbled LIBTOOLIZE_OPTIONS near \`$opt'" ;;
    esac
  done
}


# Parse options once, thoroughly.  This comes as soon as possible in
# the script to make things like `libtoolize --version' happen quickly.
{
  # sed scripts:
  my_sed_single_opt='1s/^\(..\).*$/\1/;q'
  my_sed_single_rest='1s/^..\(.*\)$/\1/;q'
  my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
  my_sed_long_arg='1s/^--[^=]*=//'

  while test "$#" -gt 0; do
    opt="$1"
    shift
    case $opt in
      --copy|-c)	opt_link=false ;;

      --debug)		func_echo "enabling shell trace mode"
			opt_debug='set -x'
			$opt_debug
			;;

      --dry-run|-n)	if $opt_dry_run; then :; else
			  opt_dry_run=:
			  RM="$ECHO $RM"
			  test -n "$LN_S" && LN_S="$ECHO $LN_S"
			  CP="$ECHO $CP"
			  MKDIR="$ECHO $MKDIR"
			  TAR="$ECHO $TAR"
			fi
			;;

      --force|-f)	opt_force=: ;;

      --install|-i)	opt_install=: ;;

      --ltdl)		opt_ltdl=:
      			if test "$#" -gt 0; then
			  case $1 in
			    -*)	;;
			    *)	ltdldir=`$ECHO "X$1" | $Xsed -e 's,/*$,,'`
				shift
				;;
			  esac
			fi
			;;

      --no-warn)	opt_warning=false ;;

      --nonrecursive|--non-recursive)
      			ltdl_mode=nonrecursive
			;;

      --quiet|--automake|-q) # --automake is for 1.5 compatibility
			opt_quiet=:
			;;

      --recursive)	ltdl_mode=recursive ;;

      --subproject)	ltdl_mode=subproject ;;

      --verbose|-v)	opt_verbose=: ;;

      # Separate optargs to long options:
      --*=*)
      			arg=`$ECHO "X$opt" | $Xsed -e "$my_sed_long_arg"`
			opt=`$ECHO "X$opt" | $Xsed -e "$my_sed_long_opt"`
			set dummy "$opt" "$arg" ${1+"$@"}
			shift
			;;

      # Separate optargs to short options:
      #-X*)
      #			arg=`$ECHO "X$opt" | $Xsed -e "$my_sed_single_rest"`
      #			opt=`$ECHO "X$opt" | $Xsed -e "$my_sed_single_opt"`
      #			set dummy "$opt" "$arg" ${1+"$@"}
      #			shift
      #			;;

      # Separate non-argument short options:
      -c*|-f*|-i*|-n*|-q*|-v*)
			rest=`$ECHO "X$opt" | $Xsed -e "$my_sed_single_rest"`
			opt=`$ECHO "X$opt" | $Xsed -e "$my_sed_single_opt"`
			set dummy "$opt" "-$rest" ${1+"$@"}
			shift
			;;

      -\?|-h)		func_usage					;;
      --help)		func_help					;;
      --version)	func_version					;;
      --)		break						;;
      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
      *)		func_fatal_help "too many arguments"		;;
    esac
  done
}


# func_echo_once msg_var
# Calls func_echo with the value of MSG_VAR, and then sets MSG_VAR="" so
# that subsequent calls have no effect.
func_echo_once ()
{
    $opt_debug
    if test -n "$1"; then
      eval my_msg=\$$1

      if test -n "$my_msg"; then
        func_echo "$my_msg"
        eval $1=""
      fi
    fi
}


# func_copy srcfile destfile [msg_var]
# A wrapper for func_copy_cb that accepts arguments in the same order
# as the cp(1) shell command.
func_copy ()
{
    $opt_debug

    test -f "$1" || \
      { func_error "\`$1' not copied:  not a regular file"; return 1; }

    my_f1=`$ECHO "X$1" | $Xsed -e "$basename"`

    if test -d "$2"; then

      func_copy_cb "$my_f1" \
	`$ECHO "X$1" | $Xsed -e "$dirname"` "$2" "$3"

    else

      # Supporting this would mean changing the timestamp:
      test "X$my_f1" = X`$ECHO "X$2" | $Xsed -e "$basename"` \
        || func_fatal_error "func_copy() cannot change filename on copy"

      func_copy_cb "$my_f1" \
        `$ECHO "X$1" | $Xsed -e "$dirname"` \
        `$ECHO "X$2" | $Xsed -e "$dirname"` \
	"$3"

    fi

    return $copy_return_status # set in func_copy_cb
}


# func_copy_cb filename srcdir destdir [msg_var]
# If option `--copy' was specified, or soft-linking SRCFILE to DESTFILE fails,
# then try to copy SRCFILE to DESTFILE (without changing the timestamp if
# possible).
func_copy_cb ()
{
    $opt_debug
    my_file="$1"
    my_srcdir="$2"
    my_destdir="$3"
    my_msg_var="$4"
    copy_return_status=1

    # Libtool is probably misinstalled if this happens:
    test -f "$my_srcdir/$my_file" || 
        func_fatal_error "\`$my_file' not found in \`$my_srcdir'"

    case $opt_verbose in
      false) my_copy_msg="file \`$my_destdir/$my_file'"     ;;
      *)     my_copy_msg="file from \`$my_srcdir/$my_file'" ;;
    esac
    func_mkdir_p `$ECHO "X$my_destdir/$my_file" | $Xsed -e "$dirname"`

    $RM "$my_destdir/$my_file"
    if $opt_link; then
      if test "$my_file" = "aclocal.m4"; then
	if { ( cd "$my_srcdir" && $TAR chf - "$my_file" ) 2>/dev/null \
	     | ( umask 0 && cd "$my_destdir" && $TAR xf - ) >/dev/null 2>&1 ; }
	then
	  $opt_quiet || func_echo_once "$my_msg_var"
	  $opt_quiet || func_echo "copying $my_copy_msg"
	  copy_return_status=0
	fi
      else
	if $LN_S "$my_srcdir/$my_file" "$my_destdir/$my_file"; then
	  $opt_quiet || func_echo_once "$my_msg_var"
	  $opt_quiet || func_echo "linking $my_copy_msg"
	  copy_return_status=0
	fi
      fi
    else
      if { ( cd "$my_srcdir" && $TAR chf - "$my_file" ) 2>/dev/null \
           | ( umask 0 && cd "$my_destdir" && $TAR xf - ) >/dev/null 2>&1; } \
	 && touch "$my_destdir/$my_file"; then
	$opt_quiet || func_echo_once "$my_msg_var"
	$opt_quiet || func_echo "copying $my_copy_msg"
	copy_return_status=0
      fi
    fi
    if test "$copy_return_status" != 0; then
      $opt_quiet || func_echo_once "$my_msg_var"
      func_error "can not copy \`$my_srcdir/$my_file' to \`$my_destdir/'"
      exit_status=$EXIT_FAILURE
    fi
}


# func_copy_some_files srcfile_spec srcdir destdir [msg_var] [cb=func_copy_cb]
# Call COPY_CB for each regular file in SRCDIR named by the ':' delimited
# names in SRCFILE_SPEC.  The odd calling convention is needed to allow
# spaces in file and directory names.
func_copy_some_files ()
{
    $opt_debug
    my_srcfile_spec="$1"
    my_srcdir="$2"
    my_destdir="$3"
    my_msg_var="$4"
    my_copy_cb="${5-func_copy_cb}"

    my_save_IFS="$IFS"
    IFS=:
    for my_filename in $my_srcfile_spec; do
      IFS="$my_save_IFS"
      if test -f "$my_srcdir/$my_filename"; then
        if test "X$my_copy_cb" = Xfunc_copy_cb; then
	  $opt_force || if test -f "$my_destdir/$my_filename"; then
	    $opt_quiet || func_echo_once "$my_msg_var"
  	    $opt_quiet \
	      || func_error "\`$my_destdir/$my_filename' exists: use \`--force' to overwrite"
	    continue
	  fi
        fi
      else
	func_echo_once "$my_msg_var"
	func_fatal_error "\`$my_filename' not found in \`$my_srcdir'"
      fi

      $my_copy_cb "$my_filename" "$my_srcdir" "$my_destdir" "$my_msg_var"
    done
    IFS="$my_save_IFS"
}


# func_fixup_Makefile srcfile srcdir destdir
func_fixup_Makefile ()
{
    $opt_debug
    my_filename="$1"
    my_srcdir="$2"
    my_destdir="$3"
    my_fixup_non_subpackage_script="\
      s,(LIBOBJS),(ltdl_LIBOBJS),g
      s,(LTLIBOBJS),(ltdl_LTLIBOBJS),g
      s,libltdl/configure.ac,,
      s,libltdl/configure,,
      s,libltdl/aclocal.m4,,
      s,libltdl/config-h.in,,
      s,libltdl/Makefile.am,,
      s,libltdl/Makefile.in,,
      /^[	 ]*\\\\\$/d"
    case $my_filename in
      Makefile.am)
	my_fixup_non_subpackage_script=`echo "$my_fixup_non_subpackage_script" | \
		sed 's,libltdl/,,'`
	my_fixup_inc_paths_script= ;;
      Makefile.inc)
	repl=$ltdldir
	repl_uscore=`$ECHO "X$repl" | $Xsed -e 's,[/.+-],_,g'`
	my_fixup_inc_paths_script="\
	  s,libltdl_,@repl_uscore@_,
	  s,libltdl/,@repl@/,
	  s,: libltdl/,: @repl@/,
	  s, -Ilibltdl , -I@repl@ ,
	  s,\\\$(libltdl_,\$(@repl_uscore@_,
	  s,)/libltdl ,)/@repl@ ,
	  s,@repl_uscore@,${repl_uscore},g
	  s,@repl@,${repl},g"
	;;
    esac

    $RM "$my_destdir/$my_filename" 2>/dev/null
    $opt_quiet || func_echo "creating file \`$my_destdir/$my_filename'"
    if $opt_dry_run; then :;
    else
      $SED "$my_fixup_non_subpackage_script
	    $my_fixup_inc_paths_script" \
	< "$my_srcdir/$my_filename" > "$my_destdir/$my_filename" ||
	func_fatal_error "cannot create $my_destdir/$my_filename"
    fi
}

# func_scan_files
# Scan configure.(ac|in) and aclocal.m4 (if present) for use of libltdl
# and libtool.  Possibly running some of these tools if necessary.
# Libtoolize affects the contents of aclocal.m4, and should be run before
# aclocal, so we can't use configure --trace which relies on a consistent
# configure.(ac|in) and aclocal.m4.
func_scan_files ()
{
    $opt_debug
    # Prefer configure.ac to configure.in
    test -f configure.ac && configure_ac=configure.ac
    test -f "$configure_ac" || configure_ac=

    # Set local variables to reflect contents of configure.ac
    my_sed_scan_configure_ac='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
	/AC_INIT/ {
	    s,^.*$,seen_autoconf=:,
	    p
	}
	d'
    test -z "$configure_ac" \
        || eval `$SED "$my_sed_scan_configure_ac" "$configure_ac"`

    $seen_autoconf || {
	my_configure_ac=
	test -n "$configure_ac" && my_configure_ac="$configure_ac: "
        func_verbose "${my_configure_ac}not using Autoconf"

	# Make sure ltdldir and ltdl_mode have sensible defaults
        # since we return early here:
	test -n "$ltdldir" || ltdldir=libltdl
	test -n "$ltdl_mode" || ltdl_mode=subproject

	return
    }

    # ---------------------------------------------------- #
    # Probe macro usage in configure.ac and/or aclocal.m4. #
    # ---------------------------------------------------- #

    my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,
        s,^.*AC_REQUIRE(.*$,,; s,^.*m4_require(.*$,,; s,^.*m4_define(.*$,,
	s,^.*A[CU]_DEFUN(.*$,,; s,^.*m4_defun(.*$,,
    	/AC_CONFIG_AUX_DIR(/ {
	    s,^.*AC_CONFIG_AUX_DIR([[ 	]*\([^])]*\).*$,ac_auxdir=\1,
	    p
        }
    	/AC_CONFIG_MACRO_DIR(/ {
	    s,^.*AC_CONFIG_MACRO_DIR([[ 	]*\([^])]*\).*$,ac_macrodir=\1,
	    p
        }
	/_LT_CONFIG_LTDL_DIR(/d
	/LT_CONFIG_LTDL_DIR(/ {
	    s,^.*LT_CONFIG_LTDL_DIR([[	 ]*\([^])]*\).*$,ac_ltdldir=\1,
	    p
	}
	/\@<:@A[CM]_PROG_LIBTOOL/d
	/A[CM]_PROG_LIBTOOL/ {
	    s,^.*$,seen_libtool=:,
	    p
	}
	/the.*option into.*LT_INIT.*parameter/d
	/\@<:@LT_INIT/d
	/LT_INIT/	     	 {
	    s,^.*$,seen_libtool=:,
	    p
	}
	/\@<:@LTDL_INIT/d
	/LTDL_INIT/          {
	    s,^.*LTDL_INIT([[ 	]*\([^])]*\).*$,ltdl_options="\1",
	    s,^.*LTDL_INIT[ 	]*$,seen_ltdl=:,
	    p
	}
	/LT_WITH_LTDL/       {
	    s,^.*$,seen_ltdl=:,
	    p
	}
	/AC_LIB_LTDL/        {
	    s,^.*$,seen_ltdl=:,
	    p
	}
	/AC_WITH_LTDL/       {
	    s,^.*$,seen_ltdl=:,
	    p
	}
	d'
    eval `cat aclocal.m4 "$configure_ac" 2>/dev/null | $SED "$my_sed_traces"`


    # ----------------- #
    # Validate ltdldir. #
    # ----------------- #

    ac_ltdldir=`$ECHO "X$ac_ltdldir" | $Xsed -e 's,/*$,,'`

    # If $configure_ac contains AC_CONFIG_LTDL_DIR, check that its
    # arguments were not given in terms of a shell variable!
    case "$ac_ltdldir" in
      *\$*)
        func_fatal_error "can not handle variables in LT_CONFIG_LTDL_DIR"
        ;;
    esac

    # If neither --ltdl nor LT_CONFIG_LTDL_DIR are specified, default to
    # `libltdl'.  If both are specified, they must be the same.  Otherwise,
    # take the one that is given! (If LT_CONFIG_LTDL_DIR is not specified
    # we suggest adding it later in this code.)
    case x$ac_ltdldir,x$ltdldir in
      x,x)	ltdldir=libltdl		;;
      x*,x)	ltdldir=$ac_ltdldir	;;
      x,x*)	ltdldir=$ltdldir	;;
      *)
        test x"$ac_ltdldir" = x"$ltdldir" || \
	    func_fatal_error "--ltdl='$ltdldir' does not match LT_CONFIG_LTDL_DIR($ac_ltdldir)"
	;;
    esac


    # ------------------- #
    # Validate ltdl_mode. #
    # ------------------- #

    test -n "$ltdl_options" && seen_ltdl=:

    # If $configure_ac contains LTDL_INIT, check that its
    # arguments were not given in terms of a shell variable!
    case "$ltdl_options" in
      *\$*)
        func_fatal_error "can not handle variables in LTDL_INIT"
        ;;
    esac

    # Extract mode name from ltdl_options
    # FIXME: Diagnose multiple conflicting modes in ltdl_options
    ac_ltdl_mode=
    case " $ltdl_options " in
      *" nonrecursive "*)  ac_ltdl_mode=nonrecursive	;;
      *" recursive "*)     ac_ltdl_mode=recursive	;;
      *" subproject "*)    ac_ltdl_mode=subproject	;;
    esac

    # If neither --ltdl nor an LTDL_INIT mode are specified, default to
    # `subproject'.  If both are specified, they must be the same.  Otherwise,
    # take the one that is given!
    case x$ac_ltdl_mode,x$ltdl_mode in
      x,x)	ltdl_mode=subproject	;;
      x*,x)	ltdl_mode=$ac_ltdl_mode	;;
      x,x*)	ltdl_mode=$ltdl_mode	;;
      *)
        test x"$ac_ltdl_mode" = x"$ltdl_mode" || \
	    func_fatal_error "--$ltdl_mode does not match LTDL_INIT($ac_ltdl_mode)"
	;;
    esac

    # ---------------- #
    # Validate auxdir. #
    # ---------------- #

    if test -n "$ac_auxdir"; then
      # If $configure_ac contains AC_CONFIG_AUX_DIR, check that it was
      # not given in terms of a shell variable!
      case "$ac_auxdir" in
      *\$*)
        func_fatal_error "can not handle variables in AC_CONFIG_AUX_DIR"
        ;;
      *)
	auxdir=$ac_auxdir
	;;
      esac
    else
      # Try to discover auxdir the same way it is discovered by configure.
      # Note that we default to the current directory.
      for dir in . .. ../..; do
        if test -f "$dir/install-sh"; then
          auxdir=$dir
          break
        elif test -f "$dir/install.sh"; then
          auxdir="$dir"
          break
        fi
      done
    fi

    # Just use the current directory if all else fails.
    test -n "$auxdir" || auxdir=.


    # ------------------------------ #
    # Find local m4 macro directory. #
    # ------------------------------ #

    # Hunt for ACLOCAL_AMFLAGS in `Makefile.am' for a `-I' argument.

    my_sed_aclocal_flags='
        /^[ 	]*ACLOCAL_[A-Z_]*FLAGS[ 	]*=/ {
	    s,^[^=]*=[ 	]*\(.*\), \1,
	    q
	}
	d'
    if test -f Makefile.am; then
      my_macrodir_is_next=false
      for arg in `$SED "$my_sed_aclocal_flags" Makefile.am`; do
        if $my_macrodir_is_next; then
          am_macrodir="$arg"
          break
        else
          if test "X$arg" = "X-I"; then
            my_macrodir_is_next=:
          else
            my_macrodir_is_next=false
          fi
        fi
      done
    fi

    macrodir="$ac_macrodir"
    test -z "$macrodir" && macrodir="$am_macrodir"

    if test -n "$am_macrodir" && test -n "$ac_macrodir"; then
      test "$am_macrodir" = "$ac_macrodir" \
        || func_fatal_error "AC_CONFIG_MACRO_DIR([$ac_macrodir]) conflicts with ACLOCAL_AMFLAGS=-I $am_macrodir."
    fi
}

# func_included_files searchfile
# Output INCLUDEFILE if SEARCHFILE m4_includes it, else output SEARCHFILE.
func_included_files ()
{
    $opt_debug
    my_searchfile="$1"

    my_include_regex=
    my_sed_include='
        /^m4_include(\[.*\])$/ {
	    s,^m4_include(\[\(.*\)\])$,\1,
	    p
	}
        d'

    if test -f "$my_searchfile"; then
      $ECHO "X$my_searchfile" | $Xsed

      # Only recurse when we don't care if all the variables we use get
      # trashed, since they are in global scope.
      for my_filename in `$SED "$my_sed_include" "$my_searchfile"`; do
	func_included_files $my_filename
      done
    fi
}


# func_serial filename [macro_regex]
# Output the value of the serial number comment in FILENAME, where the
# comment line must also match MACRO_REGEX, if given.
func_serial ()
{
    $opt_debug
    my_filename="$1"
    my_macro_regex="$2"
    my_sed_serial='
	/^# serial [1-9][0-9.]*[ 	]*'"$my_macro_regex"'[ 	]*$/ {
	    s,^# serial \([1-9][0-9.]*\).*$,\1,
	    q
	}
	d'

    # Search FILENAME and all the files it m4_includes for a serial number
    # in the file that AC_DEFUNs MACRO_REGEX.
    my_serial=
    for my_file in `func_included_files "$my_filename"`; do
      if test -z "$my_macro_regex" ||
         test "$my_filename" = aclocal.m4 ||
         test "$my_macro_regex" = `echo "$my_filename" | $SED "$basename"` ||
         func_grep '^AC_DEFUN(\@<:@'"$my_macro_regex" "$my_file"
      then
        my_serial=`$SED -e "$my_sed_serial" "$my_file"`
	break
      fi
    done

    # If the file has no serial number, we assume it's ancient.
    test -n "$my_serial" || my_serial=0

    $ECHO $my_serial
}


# func_serial_max serial1 serial2
# Compare (possibly multi-part, '.' delimited) serial numbers, and
# return the largest in $func_serial_max_result.  If they are the
# same, func_serial_max_result will be empty.
func_serial_max ()
{
    $opt_debug
    my_serial1="$1"
    my_serial2="$2"

    my_sed_dot='s/\..*$//g'
    my_sed_rest='s/^[0-9][1-9]*\.*//'
    my_sed_digits='s/[^0-9.]//g'

    # Incase they turn out to be the same, we'll set it to empty
    func_serial_max_result=

    test "X$1$2" = X`$ECHO "X$1$2" | $Xsed -e "$my_sed_digits"` || {
      func_error "serial numbers \`$1' or \`$2' contain non-digit chars"
      return
    }

    while test -n "$my_serial1$my_serial2"; do
      my_serial1_part=`$ECHO "X$my_serial1" | $Xsed -e "$my_sed_dot"`
      my_serial2_part=`$ECHO "X$my_serial2" | $Xsed -e "$my_sed_dot"`

      test -z "$my_serial1_part$my_serial2_part" \
        && break

      test -z "$my_serial1_part" \
        && { func_serial_max_result="$2"; break; }

      test -z "$my_serial2_part" \
        && { func_serial_max_result="$1"; break; }

      test "$my_serial1_part" -gt "$my_serial2_part" \
        && { func_serial_max_result="$1"; break; }

      test "$my_serial2_part" -gt "$my_serial1_part" \
        && { func_serial_max_result="$2"; break; }

      my_serial1=`$ECHO "X$my_serial1" | $Xsed -e "$my_sed_rest"`
      my_serial2=`$ECHO "X$my_serial2" | $Xsed -e "$my_sed_rest"`
    done
}


# func_serial_update_check srcfile src_serial destfile dest_serial
# Unless SRC_SERIAL is newer than DEST_SERIAL set $func_serial_update_check
# to 'false'.
func_serial_update_check ()
{
    $opt_debug
    my_srcfile="$1"
    my_src_serial="$2"
    my_destfile="$3"
    my_dest_serial="$4"
    my_update_p=:

    if test -f "$my_destfile"; then
      test "X$my_src_serial" = "X0" && {
        func_warning "no serial number on \`$my_srcfile', not copying."
	return
      }

      # Determine whether the destination has an older serial.
      func_serial_max "$my_src_serial" "$my_dest_serial"
      test "X$my_src_serial" = "X$func_serial_max_result" || my_update_p=false

      test "X$my_src_serial" = "X$func_serial_max_result" \
        && func_verbose "\`$my_srcfile' is serial $my_src_serial, greater than $my_dest_serial in \`$my_destfile'"

      if test "X$my_dest_serial" = "X$func_serial_max_result"; then
        func_verbose "\`$my_srcfile' is serial $my_src_serial, less than $my_dest_serial in \`$my_destfile'"
	$opt_force || if test -n "$ac_macrodir$ac_ltdldir"; then
           func_error "\`$my_destfile' is newer: use \`--force' to overwrite"
        fi
      fi
    fi

    func_serial_update_check_result="$my_update_p"
}


# func_aclocal_update_check filename
# Unless serial number of FILENAME is newer than the matching serial number
# in aclocal.m4, set $func_aclocal_update_check to 'false'.
func_aclocal_update_check ()
{
    $opt_debug
    my_srcfile="$aclocaldir/$1"
    my_destfile="aclocal.m4"

    case $need in
      libtool.m4)
	my_src_serial=`func_serial "$my_srcfile" LT_INIT`
	my_dest_serial=`func_serial "$my_destfile" LT_INIT`

	# Strictly, this libtoolize ought not to have to deal with ancient
	# serial formats, but we accept them here to be complete:
	test "X$my_src_serial" = "X0" &&
	  my_src_serial=`func_serial "$my_srcfile" 'A[CM]_PROG_LIBTOOL'`
	test "X$my_dest_serial" = "X0" &&
	  my_dest_serial=`func_serial "$my_destfile" 'A[CM]_PROG_LIBTOOL'`
	;;
      ltdl.m4)
	my_src_serial=`func_serial "$my_srcfile" LTDL_INIT`
	my_dest_serial=`func_serial "$my_destfile" LTDL_INIT`
	;;
      *)
	my_src_serial=`func_serial "$my_srcfile" "$need"`
	my_dest_serial=`func_serial "$my_destfile" "$need"`
	;;
    esac

    func_serial_update_check \
      "$my_srcfile" "$my_src_serial" "$my_destfile" "$my_dest_serial"

    func_aclocal_update_check_result="$func_serial_update_check_result"
}


# func_serial_update filename srcdir destdir [msg_var] [macro_re] [old_macro_re]
# Copy the FILENAME from a SRCDIR to DESTDIR provided that either FILENAME
# has a newer serial number, or DESTFILE does not yet exist, or the user
# specified `--force' at the command line.  If given, MACRO_REGEX or
# OLD_MACRO_REGEX must match any text after "# serial N" in both files.
func_serial_update ()
{
    $opt_debug
    my_filename="$1"
    my_srcdir="$2"
    my_destdir="$3"
    my_msg_var="$4"
    my_macro_regex="$5"
    my_old_macro_regex="$6"

    my_serial_update_p=:
    my_return_status=1
    my_srcfile="$my_srcdir/$my_filename"
    my_destfile="$my_destdir/$my_filename"

    test -f "$my_srcfile" || func_fatal_error "\`$my_srcfile' does not exist."

    if test -f "$my_destfile"; then
      my_src_serial=`func_serial "$my_srcfile" "$my_macro_regex"`
      my_dest_serial=`func_serial "$my_destfile" "$my_macro_regex"`

      # Strictly, this libtoolize ought not to have to deal with ancient
      # serial formats, but we accept them here to be complete:
      test "X$my_src_serial" = "X0" &&
        my_src_serial=`func_serial "$my_srcfile" "$my_old_macro_regex"`

      test "X$my_dest_serial" = "X0" &&
        my_dest_serial=`func_serial "$my_destfile" "$my_old_macro_regex"`

      func_serial_update_check \
        "$my_srcfile" "$my_src_serial" "$my_destfile" "$my_dest_serial"
      my_serial_update_p="$func_serial_update_check_result"
    fi

    if $my_serial_update_p || $opt_force; then
      func_copy "$my_srcfile" "$my_destfile" "$my_msg_var"
      my_return_status=$?
    elif $opt_force && test "X$my_dest_serial" = "X$my_src_serial"; then
      $opt_quiet || func_echo_once "$my_msg_var"
      $opt_quiet \
        || func_echo "\`$my_destfile' is already up to date."
    fi

    # Do this after the copy for hand maintained `aclocal.m4', incase
    # it has `m4_include([DESTFILE])', so the copy effectively already
    # updated `aclocal.m4'.
    my_included_files=`func_included_files aclocal.m4`
    case `echo " $my_included_files " | $NL2SP` in

      # Skip included files:
      *" $my_destfile "*) ;;

      # Otherwise compare to aclocal.m4 serial number (func_serial
      # returns 0 for older macro serial numbers before we provided
      # serial tags, so the update message will be correctly given
      # if aclocal.m4 contains an untagged --i.e older-- macro file):
      *)
        if test -f aclocal.m4; then
          func_serial_max \
              "$my_src_serial" `func_serial aclocal.m4 "$my_macro_regex"`
          if test "X$my_src_serial" = "X$func_serial_max_result"; then
              func_echo_once "$my_msg_var"
	      func_echo "You should add the contents of \`$my_destfile' to \`aclocal.m4'."
          fi
        fi
        ;;
    esac
    return $my_return_status
}


# func_keyword_update filename srcdir destdir sed_script [msg_var]
# Copy the FILENAME from a SRCDIR to DESTDIR provided that either FILENAME
# has a newer revision according to the serial number extracted by
# SED_SCRIPT, or DESTFILE does not yet exist, or the user specified
# `--force' at the command line.
func_keyword_update ()
{
    $opt_debug
    my_filename="$1"
    my_srcdir="$2"
    my_destdir="$3"
    my_sed_script="$4"
    my_msg_var="$5"

    my_srcfile="$my_srcdir/$my_filename"
    my_destfile="$my_destdir/$my_filename"

    my_keyword_update_p=:

    test -f "$my_srcfile" || func_fatal_error "\`$my_srcfile' does not exist."

    if test -f "$my_destfile"; then
      my_src_serial=`$SED -e "$my_sed_script" "$my_srcfile"`
      test -z "$my_src_serial" && {
        func_warning "no serial number in \`$my_srcfile', not copying."
	return
      }

      my_dest_serial=`$SED -e "$my_sed_script" "$my_destfile"`
      test -n "$my_dest_serial" || my_dest_serial=0

      func_serial_update_check \
         "$my_srcfile" "$my_src_serial" "$my_destfile" "$my_dest_serial"
      my_keyword_update_p="$func_serial_update_check_result"
    fi

    if $my_keyword_update_p || $opt_force; then
      func_copy "$my_srcfile" "$my_destfile" "$my_msg_var"
    elif $opt_verbose || $opt_force && test "X$my_dest_serial" = "X$my_src_serial"; then
      func_echo_once "$my_msg_var"
      func_echo "\`$my_destfile' is already up to date."
    fi
}


# func_ltmain_update filename srcdir destdir [msg_var]
# Copy the FILENAME from a SRCDIR to DESTDIR provided that either FILENAME
# has a newer revision, or DESTFILE does not yet exist, or the user
# specified `--force' at the command line.
func_ltmain_update ()
{
    $opt_debug
    my_sed_ltmain='
	/^package_revision='\''*[0-9][1-9.]*'\''*/ {
	    s,^package_revision='\''*\([0-9.]*\)'\''*[ 	]*$,\1,
	    p
	}
	d'

    func_keyword_update "$1" "$2" "$3" "$my_sed_ltmain" "$4"

    return $my_return_status
}


# func_config_update filename srcdir destdir [msg_var]
# Copy the FILENAME from a SRCDIR to DESTDIR provided that either FILENAME
# has a newer timestamp, or DESTFILE does not yet exist, or the user
# specified `--force' at the command line.
func_config_update ()
{
    $opt_debug
    my_sed_config='
	/^timestamp='\''*[0-9][1-9-]*'\''*/ {
	    s,^timestamp='\''*\([0-9-]*\)'\''*,\1,
	    s/-/./g
	    p
	}
	d'

    func_keyword_update "$1" "$2" "$3" "$my_sed_config" "$4"

    return $my_return_status
}


# func_install_update filename srcdir destdir [msg_var]
# Copy the FILENAME from a SRCDIR to DESTDIR provided that either FILENAME
# has a newer timestamp, or DESTFILE does not yet exist, or the user
# specified `--force' at the command line.
func_install_update ()
{
    $opt_debug
    my_sed_install='
	/^scriptversion='\''*[0-9][1-9.-]*'\''*/ {
	    s,^scriptversion='\''*\([0-9.-]*\)'\''*,\1,
	    s/-/./g
	    p
	}
	d'

    func_keyword_update "$1" "$2" "$3" "$my_sed_install" "$4"

    return $my_return_status
}


# func_massage_aclocal_DATA [glob_exclude]
# @aclocal_DATA\@ is substituted as per its value in Makefile.am;
# this function massages it into a suitable format for func_copy_some_files.
func_massage_aclocal_DATA ()
{
    $opt_debug
    pkgmacro_files=     # GLOBAL VAR

    my_glob_exclude="$1"

    # Massage a value for pkgmacro_files from the value used in Makefile.am.
    for my_filename in @aclocal_DATA@; do
      my_filename=`$ECHO "X$my_filename" | $Xsed -e "$basename"`

      # ignore excluded filenames
      if test -n "$my_glob_exclude"; then
	my_cont=false
	eval 'case $my_filename in '$my_glob_exclude') my_cont=: ;; esac'
	$my_cont && continue
      fi

      pkgmacro_files="$pkgmacro_files:$my_filename"
    done

    # strip spurious leading `:'
    pkgmacro_files=`$ECHO "X$pkgmacro_files" | $Xsed -e 's,^:*,,'`
}


# func_install_pkgmacro_subproject
# Unless --quiet was passed, display a message. Then copy pkgmacro_files
# from libtool installation tree to subproject libltdl tree.
func_install_pkgmacro_subproject ()
{
    $opt_debug

    # Remove any lingering files that my have been installed by some
    # previous libtoolize release:
    $opt_force && for file in $all_pkgmacro_files; do
      test -f "$subproject_macrodir/$file" && func_verbose "rm -f '$subproject_macrodir/$file'"
      rm -f "$subproject_macrodir/$file"
    done

    # Copy all the files from installed libltdl to this project, if the
    # user specified a macrodir.
    $opt_quiet || if test "x$macrodir" != "x$subproject_macrodir"; then
      pkgmacro_header="putting macros in \`$subproject_macrodir'."
    elif test -n "$subproject_macrodir"; then
      pkgmacro_header="putting macros in AC_CONFIG_MACRO_DIR, \`$subproject_macrodir'."
    fi

    func_copy_some_files "argz.m4:libtool.m4:ltdl.m4:$pkgmacro_files" \
      "$aclocaldir" "$subproject_macrodir" pkgmacro_header
}


# func_install_pkgmacro_parent
# Unless --quiet was passed, or AC_CONFIG_MACRO_DIR was not seen, display
# a message.  Then update appropriate macros if newer ones are available
# from the libtool installation tree.
func_install_pkgmacro_parent ()
{
    $opt_debug

    # Remove any lingering files that my have been installed by some
    # previous libtoolize release:
    $opt_force && for file in $all_pkgmacro_files; do
      test -f "$macrodir/$file" && func_verbose "rm -f '$macrodir/$file'"
      rm -f "$macrodir/$file"
    done

    # Copy all the files from installed libltdl to this project, if the
    # user specified a macrodir.
    $opt_quiet || if test -n "$ac_macrodir"; then
      my_pkgmacro_header="putting macros in AC_CONFIG_MACRO_DIR, \`$ac_macrodir'."
    elif test -n "$macrodir"; then
      my_pkgmacro_header="putting macros in \`$macrodir'."
    fi

    if $opt_ltdl; then
      func_serial_update argz.m4 "$aclocaldir" "$macrodir" \
        my_pkgmacro_header argz.m4
    else
      func_verbose "Not copying \`$macrodir/argz.m4', libltdl not used."
    fi

    func_serial_update  libtool.m4 "$aclocaldir" "$macrodir" \
      my_pkgmacro_header LT_INIT 'A[CM]_PROG_LIBTOOL'

    if $opt_ltdl; then
      func_serial_update ltdl.m4 "$aclocaldir" "$macrodir" \
        my_pkgmacro_header 'LTDL_INIT'
    else
      func_verbose "Not copying \`$macrodir/ltdl.m4', libltdl not used."
    fi

    my_save_IFS="$IFS"
    IFS=:
    for file in $pkgmacro_files; do
      IFS="$my_save_IFS"
      func_serial_update "$file" "$aclocaldir" "$macrodir" \
        my_pkgmacro_header "$file"
    done
    IFS="$my_save_IFS"
}


# func_install_pkgmacro_files
# Install copies of the libtool and libltdl m4 macros into this package.
func_install_pkgmacro_files ()
{
    $opt_debug

    # argz.m4, libtool.m4 and ltdl.m4 are handled specially:
    func_massage_aclocal_DATA 'argz.m4|libtool.m4|ltdl.m4'

  # 1. Parent has separate macrodir to subproject ltdl:
    if $opt_ltdl && test "x$ltdl_mode" = "xsubproject" &&
       test -n "$macrodir" && test "x$macrodir" != "x$subproject_macrodir"
    then
      func_install_pkgmacro_parent
      func_install_pkgmacro_subproject

  # 2. Parent shares macrodir with subproject ltdl:
    elif $opt_ltdl && test "x$ltdl_mode" = "xsubproject"
       # && test "x$macrodir" = "x$subproject_macrodir"
    then
      func_install_pkgmacro_subproject

  # 3. Not a subproject, but macrodir was specified in parent:
    elif test -n "$macrodir"; then
      func_install_pkgmacro_parent

  # 4. AC_CONFIG_MACRO_DIR was not specified:
    else
      func_verbose "AC_CONFIG_MACRO_DIR not defined, not copying libtool macros."
    fi
}


# func_massage_pkgltdl_files [glob_exclude]
# @pkgltdl_files\@ is substituted as per its value in Makefile.am; this
# function massages it into a suitable format for func_copy_some_files.
func_massage_pkgltdl_files ()
{
    $opt_debug
    pkgltdl_files=	# GLOBAL VAR

    my_glob_exclude="$1"

    # Massage a value for pkgltdl_files from the value used in Makefile.am
    for my_filename in @pkgltdl_files@; do

      # Strip surplus leading 'libltdl/':
      my_filename=`expr "X$my_filename" : 'Xlibltdl/\(.*\)'`

      # ignore excluded filenames
      if test -n "$my_glob_exclude"; then
	my_cont=false
	eval 'case $my_filename in '$my_glob_exclude') my_cont=: ;; esac'
	$my_cont && continue
      fi

      # ignore duplicates
      case :$pkgltdl_files: in
        *:$my_filename:*) ;;
	*) pkgltdl_files="$pkgltdl_files:$my_filename" ;;
      esac
    done

    # strip spurious leading `:'
    pkgltdl_files=`$ECHO "X$pkgltdl_files" | $Xsed -e 's,^:*,,'`
}


# func_install_pkgltdl_files
# Install copies of the libltdl files into this package.  Any auxiliary
# or m4 macro files needed in the libltdl tree will also be copied by
# func_install_pkgconfig_files and func_install_pkgmacro_files resp.
func_install_pkgltdl_files ()
{
    $opt_debug
    $opt_ltdl || return

    # Remove any lingering files that my have been installed by some
    # previous libtoolize release:
    $opt_force && for file in $all_pkgltdl_files; do
      test -f "$ltdldir/$file" && func_verbose "rm -f '$ltdldir/$file'"
      rm -f "$ltdldir/$file"
    done

    # Copy all the files from installed libltdl to this project, if the
    # user specified `--ltdl'.
    $opt_quiet || if test -n "$ac_ltdldir"; then
      pkgltdl_header="putting libltdl files in LT_CONFIG_LTDL_DIR, \`$ac_ltdldir'."
    elif test -n "$ltdldir"; then
      pkgltdl_header="putting libltdl files in \`$ltdldir'."
    fi

    # These files are handled specially, depending on ltdl_mode:
    if test "x$ltdl_mode" = "xsubproject"; then
      func_massage_pkgltdl_files 'Makefile.inc'
    else
      func_massage_pkgltdl_files 'Makefile.am|Makefile.in*|aclocal.m4|config*'
    fi

    func_copy_some_files "$pkgltdl_files" \
      "$pkgltdldir/libltdl" "$ltdldir" pkgltdl_header

    # For recursive ltdl modes, copy a suitable Makefile.{am,inc}:
    case $ltdl_mode in
      recursive)
        func_fixup_Makefile "Makefile.am" "$pkgltdldir/libltdl" "$ltdldir"
        ;;
      nonrecursive)
        func_fixup_Makefile "Makefile.inc" "$pkgltdldir/libltdl" "$ltdldir"
        ;;
    esac
}


# func_massage_pkgconfig_files [glob_exclude]
# @pkgconfig_files\@ is substituted as per its value in Makefile.am; this
# function massages it into a suitable format for func_copy_some_files.
func_massage_pkgconfig_files ()
{
    $opt_debug
    pkgconfig_files=	# GLOBAL VAR

    my_glob_exclude="$1"

    # Massage a value for pkgconfig_files from the value used in Makefile.am
    for my_filename in @pkgconfig_files@; do

      # ignore excluded filenames
      if test -n "$my_glob_exclude"; then
	my_cont=false
	eval 'case $my_filename in '$my_glob_exclude') my_cont=: ;; esac'
	$my_cont && continue
      fi

      # ignore duplicates
      case :$pkgconfig_files: in
        *:$my_filename:*) ;;
	*) pkgconfig_files="$pkgconfig_files:$my_filename" ;;
      esac
    done

    # strip spurious leading `:'
    pkgconfig_files=`$ECHO "X$pkgconfig_files" | $Xsed -e 's,^:*,,'`
}


# func_install_pkgconfig_subproject
# Unless --quiet was passed, display a message. Then copy pkgconfig_files
# from libtool installation tree to subproject libltdl tree.
func_install_pkgconfig_subproject ()
{
    $opt_debug

    # Remove any lingering files that my have been installed by some
    # previous libtoolize release:
    $opt_force && for file in $all_pkgconfig_files; do
      test -f "$subproject_auxdir/$file" && func_verbose "rm -f '$subproject_auxdir/$file'"
      rm -f "$subproject_auxdir/$file"
    done

    # Copy all the files from installed libltdl to this project, if the
    # user specified an auxdir.
    $opt_quiet || if test "x$ac_auxdir" = "x$subproject_auxdir"; then
      pkgconfig_header="putting auxiliary files in AC_CONFIG_AUX_DIR, \`$subproject_auxdir'."
    elif test -n "$auxdir"; then
      pkgconfig_header="putting auxiliary files in \`$auxdir'."
    fi

    func_copy_some_files "$pkgconfig_files" \
      "$pkgdatadir" "$ltdldir" pkgconfig_header
}


# func_install_pkgconfig_parent
# Unless --quiet was passed, or AC_CONFIG_AUX_DIR was not seen, display a
# message.  Then update appropriate auxiliary files if newer ones are
# available from the libtool installation tree.
func_install_pkgconfig_parent ()
{
    $opt_debug

    # Remove any lingering files that my have been installed by some
    # previous libtoolize release:
    $opt_force && for file in $all_pkgconfig_files; do
      test -f "$auxdir/$file" && func_verbose "rm -f '$auxdir/$file'"
      rm -f "$auxdir/$file"
    done

    if test -n "$ac_auxdir"; then
      pkgconfig_header="putting auxiliary files in AC_CONFIG_AUX_DIR, \`$ac_auxdir'."
    elif test -n "$auxdir" || test "x$ltdldir" = "x."; then
      pkgconfig_header="putting auxiliary files in \`$auxdir'."
    fi

    if $opt_install; then
      func_config_update config.guess \
        "$pkgdatadir/config" "$auxdir" pkgconfig_header
      func_config_update config.sub \
        "$pkgdatadir/config" "$auxdir" pkgconfig_header
      func_install_update install-sh \
        "$pkgdatadir/config" "$auxdir" pkgconfig_header
    fi
    func_ltmain_update ltmain.sh \
      "$pkgdatadir/config" "$auxdir" pkgconfig_header
}


# func_install_pkgconfig_files
# Install copies of the auxiliary files into this package according to
# the whether libltdl is included as a subproject, and whether the parent
# shares the AC_CONFIG_AUX_DIR setting.
func_install_pkgconfig_files ()
{
    $opt_debug
    func_massage_pkgconfig_files

  # 1. Parent shares auxdir with subproject ltdl:
    if $opt_ltdl && test "x$ltdl_mode" = "xsubproject" &&
       test "x$ac_auxdir" = "x$subproject_auxdir"
    then
      func_install_pkgconfig_subproject

  # 2. Parent has separate auxdir to subproject ltdl:
    elif $opt_ltdl && test "x$ltdl_mode" = "xsubproject"
       # && test "x$auxdir" != "x$subproject_auxdir" is implied
    then
      if $seen_autoconf; then
	func_install_pkgconfig_parent
      fi
      func_install_pkgconfig_subproject

  # 3. Not subproject, but AC_CONFIG_AUX_DIR was used in parent:
    elif test -n "$ac_auxdir" || test "x$auxdir" = "x."; then
      func_install_pkgconfig_parent

  # 4. AC_CONFIG_AUX_DIR was not specified:
    else
      func_verbose "AC_CONFIG_AUX_DIR not defined, not copying libtool auxiliary files."
    fi
}


# func_nonemptydir_p dirvar
# DIRVAR is the name of a variable to evaluate.  Unless DIRVAR names
# a directory that exists and is non-empty abort with a diagnostic.
func_nonemptydir_p ()
{
    $opt_debug
    my_dirvar="$1"
    my_dir=`eval echo "\\\$$my_dirvar"`

    # Is it a directory at all?
    test -d "$my_dir" \
      || func_fatal_error "\$$my_dirvar not a directory: \`$my_dir'"

    # check that the directories contents can be ls'ed
    test -n "`{ cd $my_dir && ls; } 2>/dev/null`" \
        || func_fatal_error "can not list files: \`$my_dir'"
}


# func_check_macros
# Sanity check macros from aclocal.m4 against installed versions.
func_check_macros ()
{
    $opt_debug
    $opt_quiet && return
    $seen_autoconf || return

    ac_config_macro_dir_advised=false

    if test -n "$ac_macrodir$ltdldir" && test -z "$macrodir"; then
      my_ac_config_macro_srcdir="$aclocaldir"
      if $opt_ltdl && test "$macrodir" != "$subproject_macrodir"; then
	my_ac_config_macro_srcdir="$subproject_macrodir"
      fi

      my_needed="libtool.m4 ltoptions.m4 ltversion.m4 ltsugar.m4 lt~obsolete.m4"
      $opt_ltdl && my_needed="$my_needed argz.m4 ltdl.m4"

      if test -f "aclocal.m4"; then
	for need in $my_needed; do
	  func_aclocal_update_check $need
	  $func_aclocal_update_check_result && my_missing="$my_missing $need"
	done
      else
        my_missing="$my_needed"
      fi

      if test -n "$my_missing"; then
        func_echo "You should add the contents of the following files to \`aclocal.m4':"
        for need in $my_missing; do
	  func_echo "  \`$my_ac_config_macro_srcdir/$need'"
        done

        if test "$my_ac_config_macro_srcdir" != "$aclocaldir"; then
          func_echo "or else add \`AC_CONFIG_MACRO_DIR([$subproject_macrodir])' to $configure_ac."
	  ac_config_macro_dir_advised=:
        fi
      fi
    fi

    ## ---------------------------------------------------------- ##
    ## Since we return early here when --no-warn was given:       ##
    ## DO NOT PUT ANYTHING BUT UPGRADE ADVICE MESSAGES BELOW HERE ##
    ## ---------------------------------------------------------- ##

    $opt_warning || return

    $seen_libtool ||
      func_echo "Remember to add \`LT_INIT' to $configure_ac."

    # Suggest using LTDL_INIT if appropriate:
    $opt_ltdl && if test x$seen_ltdl != x:; then
      case $ltdl_mode in
	subproject) ltdl_init_args=""               ;;
	*)          ltdl_init_args="([$ltdl_mode])" ;;
      esac
      func_echo "Remember to add \`LTDL_INIT$ltdl_init_args' to $configure_ac."
    fi

    if $opt_ltdl; then
      # Remind the user to call LT_CONFIG_LTDL_DIR:
      test -n "$ac_ltdldir" ||
        func_echo "Remember to add \`LT_CONFIG_LTDL_DIR([$ltdldir])' to \`$configure_ac'."

      # For subproject mode, offer some suggestions for avoiding duplicate
      # files in a project that uses libltdl:
      if test "x$ltdl_mode" = "xsubproject"; then
        test "$subproject_auxdir" = "$auxdir" ||
          func_echo "Consider using \`AC_CONFIG_AUX_DIR([$subproject_auxdir])' in $configure_ac."
        $ac_config_macro_dir_advised || test "$subproject_macrodir" = "$macrodir" ||
          func_echo "Consider using \`AC_CONFIG_MACRO_DIR([$subproject_macrodir])' in $configure_ac."
	ac_config_macro_dir_advised=:
      fi
    fi

    # Suggest modern idioms for storing autoconf macros:
    $ac_config_macro_dir_advised || if test -z "$ac_macrodir" || test x"$macrodir" = x.; then
      func_echo "Consider adding \`AC_CONFIG_MACRO_DIR([m4])' to $configure_ac and"
      func_echo "rerunning $progname, to keep the correct libtool macros in-tree."
      ac_config_macro_dir_advised=:

    elif test -z "$ac_macrodir$ltdldir"; then
      func_echo "Consider adding \`AC_CONFIG_MACRO_DIR([$macrodir])' to $configure_ac,"
      func_echo "and rerunning $progname and aclocal."
      ac_config_macro_dir_advised=:
    fi

    if test -z "$am_macrodir$macrodir"; then
      func_echo "Consider adding \`-I m4' to ACLOCAL_AMFLAGS in Makefile.am."

    elif test -z "$am_macrodir"; then
      if $opt_ltdl && test "x$ltdl_mode" = "xsubproject" && test "$subproject_macrodir" != "$macrodir"; then
	func_echo "Consider adding \`-I $subproject_macrodir' to ACLOCAL_AMFLAGS in Makefile.am."
      else
        func_echo "Consider adding \`-I $macrodir' to ACLOCAL_AMFLAGS in Makefile.am."
      fi
    fi 

    # Don't trace for this, we're just checking the user didn't invoke it
    # directly from configure.ac.
    $SED 's,dnl .*$,,; s,# .*$,,' "$configure_ac" | grep AC_PROG_RANLIB >/dev/null &&
      func_echo "\`AC_PROG_RANLIB' is rendered obsolete by \`LT_INIT'"

    # FIXME: Ensure ltmain.sh, libtool.m4 and ltdl.m4 are from the same release
}


## ----------- ##
##    Main.    ##
## ----------- ##

{
  # Allow the user to override the master libtoolize repository:
  if test -n "$_lt_pkgdatadir"; then
    pkgltdldir="$_lt_pkgdatadir"
    pkgdatadir="$_lt_pkgdatadir/libltdl"
    aclocaldir="$_lt_pkgdatadir/libltdl/m4"
  fi
  func_nonemptydir_p pkgltdldir
  func_nonemptydir_p pkgdatadir
  func_nonemptydir_p aclocaldir

  func_scan_files

  case $ltdldir in
  .) ltdlprefix= ;;
  *) ltdlprefix=$ltdldir/ ;;
  esac
  subproject_auxdir=${ltdlprefix}config
  subproject_macrodir=${ltdlprefix}m4

  # :::BE CAREFUL HERE:::
  # func_check_macros needs to check whether --ltdl was specified when
  # LTDL_INIT was not seen, so we can't just use one variable for both
  # conditions, or that check will be impossible.   No need to clutter the
  # rest of the code with '$opt_ltdl || $seen_ltdl' though, because we CAN
  # safely set opt_ltdl to true if LTDL_INIT was seen:
  $seen_ltdl && opt_ltdl=:

  func_install_pkgconfig_files
  func_install_pkgmacro_files
  func_install_pkgltdl_files

  func_check_macros
}

exit $exit_status

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