libtool-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

10-gary-rewrite-libtoolize.patch


From: Gary V. Vaughan
Subject: 10-gary-rewrite-libtoolize.patch
Date: Thu, 02 Oct 2003 15:55:55 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20030925 Thunderbird/0.3

Mostly, I just wanted libtoolize to install libtool.m4 and ltdl.m4 like autopoint installs its macros, so that aclocal-1.8 will be able to m4_include them.

Then I noticed how noisy libtoolize is when autoreconf runs it, and wanted to sort that out.

Once I'd started, I realised that we will need to support macros outside configure.ac, and that we would need to scan m4_included files, and use autoconf --trace.

It was easier to rewrite the whole of libtoolize.in.

Okay to commit?
--
  ())_.  Gary V. Vaughan    gary@(lilith.warpmail.net|gnu.org)
  ( '/   Research Scientist http://www.oranda.demon.co.uk       ,_())____
  / )=   GNU Hacker         http://www.gnu.org/software/libtool  \'      `&
`(_~)_   Tech' Author       http://sources.redhat.com/autobook   =`---d__/
Index: ChangeLog
from  Gary V. Vaughan  <address@hidden>

        * libtoolize.in: Completely rewritten.
        * NEWS: Updated.

Index: NEWS
===================================================================
RCS file: /cvsroot/libtool/libtool/NEWS,v
retrieving revision 1.111
diff -u -p -u -r1.111 NEWS
--- NEWS 5 Aug 2003 16:05:00 -0000 1.111
+++ NEWS 2 Oct 2003 14:41:48 -0000
@@ -1,6 +1,10 @@
 NEWS - list of user-visible changes between releases of GNU Libtool
 
 New in 1.5b: 2003-??-??; CVS version 1.5a, Libtool team:
+* Requires Automake 1.8.
+* libtoolize will run autopoint, aclocal and autoconf for the user
+  if necessary.
+* libtoolize installs libtool.m4 (and ltdl.m4 if used) to AC_CONFIG_M4_DIR.
 * Bug fixes.
 
 New in 1.5.1: 2003-??-??; CVS version 1.5.0a, Libtool team:
Index: libtoolize.in
===================================================================
RCS file: /cvsroot/libtool/libtool/libtoolize.in,v
retrieving revision 1.21
diff -u -p -u -r1.21 libtoolize.in
--- libtoolize.in 23 Feb 2003 16:15:49 -0000 1.21
+++ libtoolize.in 2 Oct 2003 14:41:49 -0000
@@ -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 <address@hidden>, 1996
-#
+# libtoolize (GNU @PACKAGE@) @VERSION@@TIMESTAMP@
+# Written by Gary V. Vaughan <address@hidden>
+
+# 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
@@ -16,339 +17,592 @@
 # 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 <address@hidden>.
+
+: ${ACLOCAL="aclocal"}
+: ${AUTOCONF="autoconf"}
+: ${AUTOPOINT="autopoint"}
+: ${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
address@hidden@
address@hidden@
 
-# 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
+uses_aclocal=:
+
+exit_status=0
+
+# Locations for important files:
 address@hidden@
 address@hidden@
 address@hidden@
 address@hidden@
-
+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 <address@hidden>.
-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"
-    fi
-    ;;
-
-  -f | --force)
-    force=yes
-    ;;
-
-  --ltdl)
-    ltdl=yes
-    ;;
-
-  --ltdl-tar)
-    ltdl_tar=yes
-    ;;
-
-  -*)
-    echo "$progname: unrecognized option \`$arg'" 1>&2
-    echo "$help" 1>&2
+# 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
-    ;;
+}
 
-  *)
-    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
-      ;;
-    *)
-    ;;
+# 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"
+                         AUTOPOINT=": $AUTOPOINT"
+                         ACLOCAL=": $ACLOCAL"
+                         AUTOCONF=": $AUTOCONF"
+                       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
-  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
-    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
+  $force_opt && AUTOPOINT="$AUTOPOINT --force"
+}
 
-  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
+# 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
+
+    $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
 
-  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'`
+    return $my_return_status
+}
 
-    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'`
+# func_copy_all_files srcdir destdir
+# 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.
+func_copy_all_files ()
+{
+    my_srcdir="$1"
+    my_destdir="$2"
+
+    test -d "$my_destdir" || $MKDIR "$my_destdir"
+
+    for my_filename in `cd "$my_srcdir" && ls`; do
+      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
 
-      test -z "$localserial" && localserial=0
+      func_copy "$my_srcdir/$my_filename" "$my_destdir/$my_filename"
+    done
+}
 
-      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."
+# 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 -z "`cd $pkgdatadir && ls`" \
+        && func_fatal_error "can not list files in \`$pkgdatadir'"
+
+
+    # Set local variables to reflect contents of configure.ac
+    # We can't trace for these macros, because aclocal may not have
+    # run yet.
+    my_uses_autoconf=false
+    my_uses_gettext=false
+    my_sed_scan_configure_ac='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
+       /AC_INIT/ { s,^.*$,my_uses_autoconf=:,; p; };
+       /AM_GNU_GETTEXT_VERSION/ { s,^.*$,my_uses_gettext=:,; p; };
+       d'
+    eval `sed "$my_sed_scan_configure_ac" "$configure_ac"`
+
+    $my_uses_autoconf || {
+        func_verbose "$configure_ac: not using Autoconf"
+       return
+    }
+
+    # ------------------ #
+    # Running autopoint. #
+    # ------------------ #
+
+    # Autoreconf should do this anyway, but if we run libtoolize from
+    # a fresh CVS checkout, running `aclocal' may fail if the Gettext
+    # macros are missing.  Worse, we can't trace configure.ac until we
+    # have run `aclocal' successfully, so we provide the option to run
+    # `autopoint' if `--install' was given to give `aclocal' the best
+    # chance of success.
+
+    if $my_uses_gettext; then
+      if $install_opt; then
+        func_verbose "running: $AUTOPOINT"
+        eval $AUTOPOINT || exit 1
+      else
+        func_verbose "not running autopoint: --install not given"
       fi
+    else
+      func_verbose "$configure_ac: not using Gettext"
     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"
+    # ---------------- #
+    # Running aclocal. #
+    # ---------------- #
+
+    # Provided `aclocal.m4' is missing, or was generated by `aclocal',
+    # we need to rerun it so that we can trace `configure.ac' to discover
+    # whether the Libtool macros need installing.
+
+    if test -f aclocal.m4; then
+      func_grep 'generated .*by aclocal' aclocal.m4 \
+        || uses_aclocal=false
+    fi
+
+    # Use aclocal flags from `Makefile.am' if available
+    my_sed_aclocal_flags='/^[  ]*ACLOCAL_[A-Z_]*FLAGS[         ]*=/ {
+       s,^[^=]*=[      ]*\(.*\), \1,; q; }; d'
+    test -f Makefile.am \
+      && ACLOCAL="$ACLOCAL"`sed "$my_sed_aclocal_flags" Makefile.am`
+
+    if $uses_aclocal; then
+      func_verbose "running: $ACLOCAL"
+      eval $ACLOCAL || exit 1
     else
-      updatemsg="add the contents of \`$ltdl_m4' to \`aclocal.m4'"
+      func_verbose "$configure_ac: not using aclocal"
     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'`
 
-      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'`
+    # ---------------------------------- #
+    # Trace macro usage in configure.ac. #
+    # ---------------------------------- #
+
+    my_trace_macros='
+       AC_CONFIG_AUX_DIR
+       AC_CONFIG_M4_DIR
+       AC_LIB_LTDL
+       AC_PROG_LIBTOOL
+       AM_PROG_LIBTOOL'
+    my_sed_traces='
+       /:AC_CONFIG_AUX_DIR/  { s,^.*:\([^:][^:]*\)$,auxdir=\1,; p; };
+       /:AC_CONFIG_M4_DIR/   { s,^.*:\([^:][^:]*\)$,m4dir=\1,; p; };
+       /:A[CM]_PROG_LIBTOOL/ { s,^.*$,seen_libtool=:,; p; };
+       /:AC_LIB_LTDL/        { s,^.*$,seen_ltdl=:,; p; };
+       d;'
+    for my_macro_name in $my_trace_macros; do
+      AUTOCONF="$AUTOCONF --trace=$my_macro_name"
+    done
+    func_verbose "running: $AUTOCONF"
+    eval `$AUTOCONF | sed "$my_sed_traces"`
 
-       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
+    # ---------------- #
+    # 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
-      echo "You should $updatemsg."
+      # 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
-  fi
-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
+    # ------------------------------ #
+    # Find local m4 macro directory. #
+    # ------------------------------ #
+
+    # If autoconf --trace=AC_CONFIG_M4_DIR turned nothing up, we hunt
+    # for ACLOCAL_AMFLAGS in `Makefile.am' for a `-I' argument.
+
+    if test -z "$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
 
-  $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
+    # Just use the current directory if all else fails.
+    test -n "$m4dir" || m4dir=.
+}
+
+# func_included_files searchfile
+# Output INCLUDEFILE if SEARCHFILE m4_includes it, else output SEARCHFILE.
+func_included_files ()
+{
+    my_searchfile="$1"
+
+    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
+}
 
-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
+# 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
-    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
+
+    # If the file has no serial number, we assume it's ancient.
+    test -z "$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
-    done
-    tar -cf - libltdl | gzip --best > libltdl.tar.gz
-    ${rm}r libltdl
-  fi
-fi
+    fi
+
+    if $my_update_p || $force_opt; then
+      func_copy "$my_srcfile" "$my_destfile"
+      my_return_status=$?
+    else
+      $quiet_opt \
+        || 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'.
+    $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
 
-# 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
+    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'
+    # FIXME
+}
+
+# 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'
+    # FIXME
+}
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+{
+  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
+  }
+
+  # Copy all the installed utility files to the auxiliary directory.
+  $quiet_opt || if test "$auxdir" != .; then
+    func_echo "putting files in AC_CONFIG_AUX_DIR, \`$auxdir'."
   fi
+  func_copy_all_files "$pkgdatadir" "$auxdir"
+
+  # Copy libtool's m4 macros to the macro directory, if they are newer.
+  func_serial_update 'A[CM]_PROG_LIBTOOL' "$aclocaldir/libtool.m4" 
"$m4dir/libtool.m4" \
+    && rerun_aclocal=:
 
-  $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" \
+      && rerun_aclocal=:
   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
+
+  # If we updated any macro files, rerun aclocal.
+  if $rerun_aclocal; then
+    func_verbose "running: $ACLOCAL"
+    eval $ACLOCAL || exit 1
   fi
-done
+}
 
-exit $status
+exit $exit_status
 
 # Local Variables:
 # mode:shell-script

reply via email to

[Prev in Thread] Current Thread [Next in Thread]