]> git.ipfire.org Git - thirdparty/libtool.git/commitdiff
* libtoolize.in: Completely rewritten.
authorGary V. Vaughan <gary@gnu.org>
Tue, 7 Oct 2003 11:12:16 +0000 (11:12 +0000)
committerGary V. Vaughan <gary@gnu.org>
Tue, 7 Oct 2003 11:12:16 +0000 (11:12 +0000)
* Makefile.am (AUTOMAKE_OPTIONS): Reduced to 1.7.  The 1.8
requirement just made the distribution much smaller due to
m4_includes.  1.7 will bootstrap libtool just fine.
* NEWS: Updated.

ChangeLog
Makefile.am
NEWS
libtoolize.in

index 1038a8feb918f87c24b3c49813a084272689c901..6212fb152f1f43a365102b5b99ab0cadda6aedfd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,19 @@
-2003-10-05  Peter O'Gorman <peter@pogma.com>, 
+2003-10-07  Gary V. Vaughan  <gary@gnu.org>
+
+       * libtoolize.in: Completely rewritten.
+       * Makefile.am (AUTOMAKE_OPTIONS): Reduced to 1.7.  The 1.8
+       requirement just made the distribution much smaller due to
+       m4_includes.  1.7 will bootstrap libtool just fine.
+       * NEWS: Updated.
+
+2003-10-05  Peter O'Gorman <peter@pogma.com>,
        Gary V. Vaughan  <gary@gnu.org>
 
        * ltmain.in: Remove inferrence of mode, add shorthand for mode
        choice.
 
        * ltmain.in: Specifying -allow-undefined is now an error.
-       
+
 2003-09-29  Scott James Remnant  <scott@netsplit.com>
 
        * m4/libtool.m4 (AC_DEPLIBS_CHECK_METHOD): Use pass_all for linux*
index 9b1c7db6642eb07cadfb2b690353b0ab7b5b24de..76c02803c71fb076b57bd851ee2b21ac76416353 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-AUTOMAKE_OPTIONS = 1.7a gnu
+AUTOMAKE_OPTIONS = 1.7 gnu
 ACLOCAL_AMFLAGS  = -I m4
 
 BUILD_SUBDIRS = . libltdl doc tests
diff --git a/NEWS b/NEWS
index bf2b1324a5c82a8249f92108468ee6e3c01978b7..f6e6be4e9d482b058bf1b6872415f1a2fe02f22f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,10 @@
 NEWS - list of user-visible changes between releases of GNU Libtool
 
 New in 1.5b: 2003-??-??; CVS version 1.5a, Libtool team:
-* Bug fixes.
+* libtoolize installs libtool.m4 (and ltdl.m4 if used) to AC_CONFIG_M4_DIR.
 * Mode inferrence removed, shorthand for choosing modes added.
 * Specifying -allow-undefined is now an error.
+* Bug fixes.
 \f
 New in 1.5.1: 2003-??-??; CVS version 1.5.0a, Libtool team:
 * lt_dlrealloc is an official part of the libltdl API.
index 0896b2ef8ce993ff80db17f21515cb3a018b9f6b..4ffa90babc0c258427f7c5d5ea702a37a4f2bb1a 100644 (file)
@@ -1,10 +1,11 @@
 #! /bin/sh
-# libtoolize - Prepare a package to use libtool.
-# @configure_input@
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003
-# Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
+# libtoolize (GNU @PACKAGE@) @VERSION@@TIMESTAMP@
+# Written by Gary V. Vaughan <gary@gnu.org>
+
+# Copyright (C) 2003 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.
+
 # 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
 # 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.
+# along with this program; if not, a copy can be downloaded from
+# http://www.gnu.org/copyleft/gpl.html, or by writing 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%^.*/%%'`
+# 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
+#     --help            display this message and exit
+# -i, --install         copy missing auxiliary files
+#     --ltdl            install libltdl in a subdirectory
+#     --ltdl-tar        install the libltdl tarball
+# -q, --quiet           work silently
+# -v, --verbose         verbosely report processing
+#     --version         print version information and exit
+#
+# You must `cd' to the top directory of your package before you run
+# `$progname'.
+#
+# Report bugs to <bug-libtool@gnu.org>.
+
+: ${CP="cp -f"}
+: ${LN_S="@LN_S@"}
+: ${MKDIR="mkdir"}
+: ${RM="rm -f"}
 
-# Constants.
+# The name of this program:
+progname=`echo "$0" | sed 's%^.*/%%'`
 PROGRAM=libtoolize
-PACKAGE=@PACKAGE@
-VERSION=@VERSION@
 
-# Directory names.
+# Global variables.
+dry_run_opt=false
+force_opt=false
+install_opt=false
+link_opt=:
+ltdl_opt=false
+ltdl_tar_opt=false
+quiet_opt=false
+verbose_opt=false
+
+seen_gettext=false
+seen_libtool=false
+seen_ltdl=false
+
+exit_status=0
+
+# Locations for important files:
 prefix=@prefix@
 datadir=@datadir@
 pkgdatadir=@pkgdatadir@
 aclocaldir=@aclocaldir@
-
+auxdir=
+m4dir=
+configure_ac=configure.in
 libtool_m4="$aclocaldir/libtool.m4"
 ltdl_m4="$aclocaldir/ltdl.m4"
 
-dry_run=no
-help="Try \`$progname --help' for more information."
-rm="rm -f"
-ln_s="@LN_S@"
-cp="cp -f"
-mkdir="mkdir"
-
-# Global variables.
-automake=
-copy=
-force=
-ltdl=
-ltdl_tar=
-configure_ac=
-status=0
-
-for arg
-do
-  case "$arg" in
-  --help)
-    cat <<EOF
-Usage: $progname [OPTION]...
-
-Prepare a package to use libtool.
-
-    --automake        work silently, and assume that Automake is in use
--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
-    --help            display this message and exit
-    --ltdl            install libltdl in a subdirectory
-    --ltdl-tar        install the libltdl tarball
-    --version         print version information and exit
-
-You must \`cd' to the top directory of your package before you run
-\`$progname'.
-
-Report bugs to <bug-libtool@gnu.org>.
-EOF
-    exit 0
-    ;;
-
-  --version)
-    echo "$PROGRAM (GNU $PACKAGE) $VERSION"
-    echo
-    echo "Copyright (C) 2003 Free Software Foundation, Inc."
-    echo "This is free software; see the source for copying conditions.  There is NO"
-    echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-    exit 0
-    ;;
-
-  --automake)
-    automake=yes
-    ;;
-
-  -c | --copy)
-    ln_s=
-    ;;
-
-  --debug)
-    echo "$progname: enabling shell trace mode"
-    set -x
-    ;;
-
-  -n | --dry-run)
-    if test "$dry_run" != yes; then
-      dry_run=yes
-      rm="echo $rm"
-      test -n "$ln_s" && ln_s="echo $ln_s"
-      cp="echo $cp"
-      mkdir="echo mkdir"
+sed_dirname='s,/[^/]*$,,'
+
+# func_echo arg...
+# Echo program name prefixed message.
+func_echo ()
+{
+    echo $progname: ${1+"$@"}
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $verbose_opt && func_echo ${1+"$@"}
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    echo $progname: ${1+"$@"} 1>&2
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit 1
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "Try \`$progname --help' for more information."
+}
+
+
+# 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_help='/^# Usage:/,/# Report bugs to/ {
+                s/^# //; s/^# *$//;
+               s/\$progname/'$progname'/;
+               p;
+            }; d'
+  my_sed_version='/^# '$PROGRAM' (GNU /,/# warranty; / {
+               s/^# //; s/^# *$//;
+               s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/;
+               p;
+            }; d'
+
+
+  while test $# -gt 0; do
+    case $1 in
+      --copy | -c)     shift; link_opt=false   ;;
+
+      --debug)         shift
+                       func_echo "enabling shell trace mode"
+                       set -x
+                       ;;
+
+      --dry-run | -n)  shift
+                       if $dry_run_opt; then :; else
+                         dry_run_opt=:
+                         RM="echo $RM"
+                         test -n "$LN_S" && LN_S="echo $LN_S"
+                         CP="echo $CP"
+                         MKDIR="echo $MKDIR"
+                       fi
+                       ;;
+
+      --force | -f)    shift; force_opt=:      ;;
+      --install | -i)  shift; install_opt=:    ;;
+      --ltdl)          shift; ltdl_opt=:       ;;
+      --ltdl-tar)      shift; ltdl_tar_opt=:   ;;
+      --quiet | --automake | -q) # --automake is for 1.5 compatibility
+                       shift; quiet_opt=:      ;;
+      --verbose | -v)  shift; verbose_opt=:    ;;
+
+      -c*|-i*|-f*|-n*|-q*|-v*)
+                       opt=`echo "$1" |sed "$my_sed_single_opt"`
+                       rest=`echo "$1" |sed "$my_sed_single_rest"`
+                       shift
+                       set -- "$opt" "-$rest" ${1+"$@"}
+                       ;;
+
+      --version)       sed "$my_sed_version" < $0;     exit 0  ;;
+      --help)          sed "$my_sed_help" < $0;        exit 0  ;;
+      --)              shift ;;
+      -*)              func_fatal_help "unrecognized option \`$1'"     ;;
+      *)               func_fatal_help "too many arguments"            ;;
+    esac
+  done
+}
+
+# func_mkdir_p dir
+# Make sure the entire path to DIR is available.
+func_mkdir_p ()
+{
+    my_dir=$1
+    my_dirs=
+
+    while test ! -d "$my_dir"; do
+      my_dirs="$my_dir $my_dirs"
+      my_dir=`echo "$my_dir" | sed "$sed_dirname"`
+    done
+   test ! -n "$my_dirs" || $MKDIR $my_dirs
+}
+
+# func_copy srcfile destfile
+# If --copy was specified, or soft-linking SRCFILE to DESTFILE fails,
+# then try to copy SRCFILE to DESTFILE.
+func_copy ()
+{
+    my_srcfile="$1"
+    my_destfile="$2"
+    my_return_status=1
+
+    func_mkdir_p `echo "$my_destfile" | sed "$sed_dirname"`
+
+    $RM "$my_destfile"
+    if $link_opt && $LN_S "$my_srcfile" "$my_destfile"; then
+      $quiet_opt || func_echo "copying file \`$my_destfile'"
+      my_return_status=0
+    elif $CP "$my_srcfile" "$my_destfile"; then
+      $quiet_opt || func_echo "copying file \`$my_destfile'"
+      my_return_status=0
+    else
+      func_error "can not copy \`$my_srcfile' to \`$my_destfile'"
+      exit_status=1
     fi
-    ;;
 
-  -f | --force)
-    force=yes
-    ;;
+    return $my_return_status
+}
 
-  --ltdl)
-    ltdl=yes
-    ;;
+# func_copy_all_files srcdir destdir [glob_exclude]
+# For each file in SRCDIR, if --copy was specified, or soft-linking the
+# file to DESTDIR fails, then try to copy the file to DESTDIR.  If
+# GLOB_EXCLUDE is given, exclude any matching filenames from the copy.
+func_copy_all_files ()
+{
+    my_srcdir="$1"
+    my_destdir="$2"
+    my_glob_exclude="$3"
 
-  --ltdl-tar)
-    ltdl_tar=yes
-    ;;
+    for my_filename in `cd "$my_srcdir" && ls`; do
 
-  -*)
-    echo "$progname: unrecognized option \`$arg'" 1>&2
-    echo "$help" 1>&2
-    exit 1
-    ;;
+      # ignore excluded filenames
+      if test -n "$my_glob_exclude"; then
+        eval 'case $my_filename in '$my_glob_exclude') continue ;; esac'
+      fi
 
-  *)
-    echo "$progname: too many arguments" 1>&2
-    echo "$help" 1>&2
-    exit 1
-    ;;
-  esac
-done
-
-if test -f configure.ac; then
-  configure_ac=configure.ac
-elif test -f configure.in; then
-  configure_ac=configure.in
-else
-  echo "$progname: \`configure.ac' does not exist" 1>&2
-  echo "$help" 1>&2
-  exit 1
-fi
-
-
-files=`cd $pkgdatadir && ls`
-if test -z "$files"; then
-  echo "$progname: cannot list files in \`$pkgdatadir'" 1>&2
-  exit 1
-fi
-files='config.guess config.sub ltmain.sh'
-
-auxdir=.
-auxdirline=`grep '^AC_CONFIG_AUX_DIR' $configure_ac 2>/dev/null`
-if test -n "$auxdirline"; then
-  # Handle explicit AC_CONFIG_AUX_DIR settings.
-  auxdir=`echo "$auxdirline" | sed 's/^AC_CONFIG_AUX_DIR(\([^)]*\)).*$/\1/'`
-
-  if test "$auxdir" = "$auxdirline"; then
-    echo "$progname: invalid AC_CONFIG_AUX_DIR syntax: $auxdirline" 1>&2
-    exit 1
-  else
-    # Strip any quote brackets.
-    auxdir=`echo "$auxdir" | sed 's/^\[\(.*\)\]$/\1/g'`
-    case "$auxdir" in
-    *\$*)
-      echo "$progname: cannot handle variables in AC_CONFIG_AUX_DIR" 1>&2
-      exit 1
-      ;;
-    *)
-    ;;
-    esac
-  fi
-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
+      if test -f "$my_srcdir/$my_filename"; then
+       $force_opt || if test -e "$my_destdir/$my_filename"; then
+          $quiet_opt \
+           || func_error "\`$my_destdir/$my_filename' exists: use \`--force' to overwrite"
+         continue
+        fi
+      else
+        # Not a regular file
+        continue
+      fi
+
+      func_copy "$my_srcdir/$my_filename" "$my_destdir/$my_filename"
+    done
+}
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    grep "$1" "$2" >/dev/null 2>&1
+}
+
+# func_scan_files
+# Trace configure.(ac|in) for use of autoconf, gettext, aclocal, automake,
+# libltdl and libtool.  Possibly running some of these tools if necessary.
+func_scan_files ()
+{
+    # Prefer configure.ac to configure.in
+    test -f configure.ac && configure_ac=configure.ac
+    test -f "$configure_ac" \
+        || func_fatal_help "\`$configure_ac' does not exist"
+
+    test -n "`cd $pkgdatadir && ls`" \
+        || func_fatal_error "can not list files in \`$pkgdatadir'"
+
+
+    # Set local variables to reflect contents of configure.ac
+    my_uses_autoconf=false
+    my_sed_scan_configure_ac='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
+       /AC_INIT/ { s,^.*$,my_uses_autoconf=:,; p; };
+       d'
+    eval `sed "$my_sed_scan_configure_ac" "$configure_ac"`
+
+    $my_uses_autoconf || {
+        func_verbose "$configure_ac: not using Autoconf"
+       return
+    }
+
+    # ---------------------------------------------------- #
+    # Probe macro usage in configure.ac and/or aclocal.m4. #
+    # ---------------------------------------------------- #
+
+    my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
+       /AC_CONFIG_AUX_DIR/  {
+           s,^.*AC_CONFIG_AUX_DIR([[   ]*\([^])]*\).*$,auxdir=\1,; p;
+        };
+       /AC_CONFIG_M4_DIR/   {
+            s,^.*AC_CONFIG_M4_DIR([[   ]*\([^])]*\).*$,m4dir=\1,; p;
+        };
+       /A[CM]_PROG_LIBTOOL/ { s,^.*$,seen_libtool=:,; p; };
+       /AC_LIB_LTDL/        { s,^.*$,seen_ltdl=:,; p; };
+       d;'
+    eval `cat aclocal.m4 "$configure_ac" | sed "$my_sed_traces"`
+
+
+    # ---------------- #
+    # Validate auxdir. #
+    # ---------------- #
+
+    if test -n "$auxdir"; then
+      # If $configure_ac contains AC_CONFIG_AUX_DIR, check that it was
+      # not given in terms of a shell variable!
+      case "$auxdir" in
+      *\$*)
+        func_fatal_error "can not handle variables in AC_CONFIG_AUX_DIR"
+        ;;
+      *);;
+      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
-  done
-fi
 
-if test -z "$automake"; then
-  if grep '^A[MC]_PROG_LIBTOOL' $configure_ac >/dev/null 2>&1; then :
-  else
-    echo "Remember to add \`AC_PROG_LIBTOOL' to \`$configure_ac'."
-  fi
 
-  if grep '^AC_PROG_RANLIB' $configure_ac >/dev/null 2>&1; then
-    echo "Using \`AC_PROG_RANLIB' is rendered obsolete by \`AC_PROG_LIBTOOL'"
-  fi
+    # ------------------------------ #
+    # Find local m4 macro directory. #
+    # ------------------------------ #
+
+    # If AC_CONFIG_M4_DIR turned nothing up, we 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 ! -n "$m4dir" && test -f Makefile.am; then
+      my_m4dir_is_next=false
+      for arg in `sed "$my_sed_aclocal_flags" Makefile.am`; do
+        if $my_m4dir_is_next; then
+          m4dir="$arg"
+          break
+        else
+          if test "X$arg" = "X-I"; then
+            my_m4dir_is_next=:
+          else
+            my_m4dir_is_next=false
+          fi
+        fi
+      done
+    fi
 
-  if grep 'generated automatically by aclocal' aclocal.m4 >/dev/null 2>&1; then
-    updatemsg="update your \`aclocal.m4' by running aclocal"
-  else
-    updatemsg="add the contents of \`$libtool_m4' to \`aclocal.m4'"
-  fi
+    # Just use the current directory if all else fails.
+    test -n "$m4dir" || m4dir=.
+}
 
-  if grep '^AC_DEFUN(\[A[MC]_PROG_LIBTOOL' aclocal.m4 >/dev/null 2>&1; then
-    # Check the version number on libtool.m4 and the one used in aclocal.m4.
-    instserial=`grep '^# serial ' $libtool_m4 | grep 'A[MC]_PROG_LIBTOOL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'`
+# func_included_files searchfile
+# Output INCLUDEFILE if SEARCHFILE m4_includes it, else output SEARCHFILE.
+func_included_files ()
+{
+    my_searchfile="$1"
 
-    if test -z "$instserial"; then
-      echo "$progname: warning: no serial number on \`$libtool_m4'" 1>&2
-    else
-      # If the local macro has no serial number, we assume it's ancient.
-      localserial=`grep '^# serial ' aclocal.m4 | grep 'A[MC]_PROG_LIBTOOL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'`
-
-      test -z "$localserial" && localserial=0
-
-      if test "$localserial" -lt "$instserial"; then
-       echo "You should $updatemsg."
-      elif test "$localserial" -gt "$instserial"; then
-       echo "$progname: \`$libtool_m4' is serial $instserial, less than $localserial in \`aclocal.m4'" 1>&2
-       if test -z "$force"; then
-         echo "Use \`--force' to replace newer libtool files with this version." 1>&2
-         exit 1
-       fi
-       echo "To remain compatible, you should $updatemsg."
+    my_include_regex=
+    my_sed_include='
+        /^m4_include(\[.*\])$/ { s,^m4_include(\[\(.*\)\])$,\1,; p; };
+        d'
+
+    test -f $my_searchfile && echo $my_searchfile
+
+    # 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
+}
+
+# func_serial macro_regex filename
+# Output the value of the serial number comment in FILENAME, where the
+# comment line must also match MACRO_REGEX.
+func_serial ()
+{
+    my_macro_regex="$1"
+    my_filename="$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 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_update macro_regex srcfile destfile
+# Copy SRCFILE to DESTFILE provided SRCFILE has a newer serial number, or
+# DESTFILE does not yet exist, or the user specified `--force'.
+func_serial_update ()
+{
+    my_macro_regex="$1"
+    my_srcfile="$2"
+    my_destfile="$3"
+
+    my_return_status=1
+    my_update_p=:
+
+    if test -f "$my_destfile"; then
+      my_src_serial=`func_serial "$my_macro_regex" "$my_srcfile"`
+      my_dest_serial=`func_serial "$my_macro_regex" "$my_destfile"`
+
+      test $my_src_serial = 0 && {
+        func_error "warning: no serial number on \`$my_srcfile', not copying."
+       return
+      }
+
+      # Only perform the file update if the destination has an older serial.
+      test $my_src_serial -gt $my_dest_serial || my_update_p=false
+
+      test $my_src_serial -gt $my_dest_serial \
+        && func_verbose "\`$my_srcfile' is serial $my_srcserial, greater than $my_destserial in \`$my_destfile'"
+
+      if test $my_src_serial -lt $my_dest_serial; then
+        func_error "\`$my_srcfile' is serial $my_srcserial, less than $my_destserial in \`$my_destfile'"
+       $force_opt \
+          || func_fatal_error "Use \`--force' to replace newer libtool files with this version."
       fi
     fi
-  else
-    echo "You should $updatemsg."
-  fi
 
-  if grep '^AC_LIB_LTDL' $configure_ac >/dev/null 2>&1; then
-    if grep 'generated automatically by aclocal' aclocal.m4 >/dev/null 2>&1; then
-      updatemsg="update your \`aclocal.m4' by running aclocal"
+    if $my_update_p || $force_opt; then
+      func_copy "$my_srcfile" "$my_destfile"
+      my_return_status=$?
     else
-      updatemsg="add the contents of \`$ltdl_m4' to \`aclocal.m4'"
+      $quiet_opt \
+        || func_echo "\`$my_destfile' is already up to date."
     fi
 
-    if grep '^AC_DEFUN(AC_LIB_LTDL' aclocal.m4 >/dev/null 2>&1; then
-      # Check the version number on ltdl.m4 and the one used in aclocal.m4.
-      instserial=`grep '^# serial ' $ltdl_m4 | grep 'AC_LIB_LTDL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'`
+    # Do this after the copy for hand maintained `aclocal.m4', incase
+    # it has `m4_include([DESTFILE])', so the copy effectively already
+    # updated `aclocal.m4'.
+    $use_aclocal || if test -f aclocal.m4; then
+      test $my_src_serial -gt `func_serial "$my_macro_regex" aclocal.m4` \
+         && func_echo "You should add the contents of \'$my_destfile' to \`aclocal.m4'."
+    fi
 
-      if test -z "$instserial"; then
-       echo "$progname: warning: no serial number on \`$ltdl_m4'" 1>&2
-      else
-       # If the local macro has no serial number, we assume it's ancient.
-       localserial=`grep '^# serial ' aclocal.m4 | grep 'AC_LIB_LTDL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'`
-
-       test -z "$localserial" && localserial=0
-
-       if test "$localserial" -lt "$instserial"; then
-         echo "You should $updatemsg."
-       elif test "$localserial" -gt "$instserial"; then
-         echo "$progname: \`$ltld_m4' is serial $instserial, less than $localserial in \`aclocal.m4'" 1>&2
-         if test -z "$force"; then
-           echo "Use \`--force' to replace newer libtool files with this version." 1>&2
-           exit 1
-         fi
-         echo "To remain compatible, you should $updatemsg."
-       fi
-      fi
+    return $my_return_status
+}
+
+# func_check_macros
+# Sanity check macros from aclocal.m4 against installed versions.
+func_check_macros ()
+{
+    # 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 \
+      && func_echo "\`AC_PROG_RANLIB' is rendered obsolete by \`AC_PROG_LIBTOOL'"
+
+    $seen_libtool \
+      || func_echo "Remember to add \`AC_PROG_LIBTOOL' to \`$configure_ac'."
+
+    # FIXME: Ensure ltmain.sh, libtool.m4 and ltdl.m4 are from the same release
+}
+
+# func_ltmain_update srcfile destfile
+# Copy SRCFILE to DESTFILE provided SRCFILE has a newer VERSION/TIMESTAMP,
+# or DESTFILE does not yet exist, or the user specified `--force'.
+func_ltmain_update ()
+{
+    my_srcfile="$1"
+    my_destfile="$2"
+    my_sed_ltmain='
+       s,^VERSION=[^0-9]*\(.*\)[       ]*$,\1,; t
+       s,^TIMESTAMP=[^0-9]*\([.0-9]*\) .*$,\1,; t
+       d'
+
+    if test -f "$my_srcfile"; then :
     else
-      echo "You should $updatemsg."
+      func_error "\`$my_srcfile' does not exist."
+      return
+    fi
+
+    # FIXME:  check versions, and only downgrade with --force
+    cmp -s  "$my_srcfile" "$my_destfile"
+    if test $? != 0 || $force_opt; then
+      func_copy "$my_srcfile" "$my_destfile"
+    else
+      $quiet_opt \
+        || func_echo "\`$my_destfile' is already up to date."
+    fi
+}
+
+# func_config_update srcfile destfile
+# Copy SRCFILE to DESTFILE provided SRCFILE has a newer TIMESTAMP,
+# or DESTFILE does not yet exist, or the user specified `--force'.
+func_config_update ()
+{
+    my_srcfile="$1"
+    my_destfile="$2"
+    my_sed_config='s,^timestamp=[^0-9]*\([.0-9-]*\)[^0-9].*$,\1,; t; d'
+
+    if test -f "$my_srcfile"; then :
+    else
+      func_error "\`$my_srcfile' does not exist."
+      return
     fi
-  fi
-fi
 
+    # FIXME:  check versions, and only downgrade with --force
+    cmp -s  "$my_srcfile" "$my_destfile"
+    if test $? != 0 || $force_opt; then
+      func_copy "$my_srcfile" "$my_destfile"
+    else
+      $quiet_opt \
+        || func_echo "\`$my_destfile' is already up to date."
+    fi
+}
 
-if test "x$ltdl" = xyes; then
-  test -d libltdl || $mkdir libltdl
-  ltdlfiles=`cd $pkgdatadir && ls libltdl/*`
-else
-  ltdlfiles=
-fi
 
-for file in $ltdlfiles; do
-  if test -f "$file" && test -z "$force"; then
-    test -z "$automake" && echo "$progname: \`$file' exists: use \`--force' to overwrite" 1>&2
-    continue
-  fi
 
-  $rm $file
-  if test -n "$ln_s" && $ln_s $pkgdatadir/$file $file; then :
-  elif $cp $pkgdatadir/$file $file; then :
-  else
-    echo "$progname: cannot copy \`$pkgdatadir/$file' to \`$file'" 1>&2
-    status=1
-  fi
-done
+## ----------- ##
+##    Main.    ##
+## ----------- ##
 
-if test "x$ltdl_tar" = x"yes"; then
-  if test "x$dry_run" = x"yes"; then
-    echo "tar -cf - libltdl | gzip --best > libltdl.tar.gz"
-  elif test -f libltdl.tar.gz && test -z "$force"; then
-    test -z "$automake" && echo "$progname: \`libltdl.tar.gz' exists: use \`--force' to overwrite" 1>&2
-  else
-    test -d libltdl && ${rm}r libltdl
-    $mkdir libltdl
-    ltdlfiles=`cd $pkgdatadir && ls libltdl/*`
-    for file in $ltdlfiles; do
-      if $cp $pkgdatadir/$file $file; then :
-      else
-       echo "$progname: cannot copy \`$pkgdatadir/$file' to \`$file'" 1>&2
-       status=1
-       break
-      fi
-    done
-    for file in $files; do
-      if $cp $pkgdatadir/$file libltdl/$file; then :
-      else
-       echo "$progname: cannot copy \`$pkgdatadir/$file' to \`libltdl/$file'" 1>&2
-       status=1
-       break
+{
+  rerun_aclocal=false
+
+  func_scan_files
+  $quiet_opt || func_check_macros
+
+  # Copy all the files from installed libltdl to this project, if the
+  # user specified `--with-ltdl'.
+  $ltdl_opt && eval func_copy_all_files "$pkgdatadir/libltdl" libltdl
+
+  # Copy all the files from installed libltdl to a tarball in this project,
+  # if the user specified `--with-ltdl-tar'.
+  $ltdl_tar_opt && {
+      if test -f libltdl.tar.gz; then
+        if $force_opt; then
+          test -d libltdl && ${RM}r libltdl
+          func_copy_all_files "$pkgdatadir/libltdl" libltdl
+          tar -chof - libltdl | gzip --best > libltdl.tar.gz
+          ${RM}r libltdl
+        else
+          func_error "\`libltdl.tar.gz' exists: use \`--force' to overwrite"
+        fi
       fi
-    done
-    tar -cf - libltdl | gzip --best > libltdl.tar.gz
-    ${rm}r libltdl
+  }
+
+  # Copy all the installed utility files to the auxiliary directory if
+  # `--install' was passed, or else copy just ltmain.sh.
+  $quiet_opt || if test "$auxdir" != .; then
+    func_echo "putting files in AC_CONFIG_AUX_DIR, \`$auxdir'."
   fi
-fi
-
-# Change to the auxiliary directory.
-if test "$auxdir" != .; then
-  test -z "$automake" && echo "Putting files in AC_CONFIG_AUX_DIR, \`$auxdir'."
-  cd $auxdir || exit 1
-fi
-
-for file in $files; do
-  if test -f "$file" && test -z "$force"; then
-    test -z "$automake" && echo "$progname: \`$file' exists: use \`--force' to overwrite" 1>&2
-    continue
+  if $install_opt || $force_opt; then
+    func_copy_all_files "$pkgdatadir" "$auxdir" 'config.guess|config.sub|ltmain.sh'
+    func_config_update "$pkgdatadir/config.guess" "$auxdir/config.guess"
+    test -f "$pkgdatadir/config.sub" \
+      && func_config_update "$pkgdatadir/config.guess" "$auxdir/config.sub"
+  fi
+  func_ltmain_update "$pkgdatadir/ltmain.sh" "$auxdir/ltmain.sh"
+
+  # Copy libtool's m4 macros to the macro directory, if they are newer.
+  $quiet_opt || if test "$m4dir" != .; then
+    func_echo "putting macros in AC_CONFIG_M4_DIR, \`$m4dir'."
   fi
+  func_serial_update 'A[CM]_PROG_LIBTOOL' "$aclocaldir/libtool.m4" "$m4dir/libtool.m4"
 
-  $rm $file
-  if test -n "$ln_s" && $ln_s $pkgdatadir/$file $file; then :
-  elif $cp $pkgdatadir/$file $file; then :
+  if $seen_ltdl; then
+    func_serial_update 'AC_LIB_LTDL' "$aclocaldir/ltdl.m4" "$m4dir/ltdl.m4"
   else
-    echo "$progname: cannot copy \`$pkgdatadir/$file' to \`$file'" 1>&2
-    status=1
+    func_verbose "Not copying \`$aclocaldir/ltdl.m4', AC_LIB_LTDL not used."
   fi
-done
+}
 
-exit $status
+exit $exit_status
 
 # Local Variables:
 # mode:shell-script