* getpass.c (getpass): Fix typo, test for HAVE_TCSETATTR and not
[gnulib.git] / gnulib-tool
index 68fe24b..757ad7c 100755 (executable)
@@ -22,7 +22,7 @@
 
 progname=$0
 package=gnulib
-cvsdatestamp='$Date: 2005-08-31 20:51:09 $'
+cvsdatestamp='$Date: 2005-09-05 11:40:42 $'
 last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'`
 version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'`
 
@@ -603,7 +603,6 @@ func_modules_to_filelist ()
 # - modules         list of modules, including dependencies
 # - libname         library name
 # - libtool         true if libtool will be used, blank otherwise
-# - cmd             (optional) command that led to this invocation
 # - actioncmd       (optional) command that will reproduce this invocation
 func_emit_lib_Makefile_am ()
 {
@@ -624,9 +623,6 @@ func_emit_lib_Makefile_am ()
   echo "# the same distribution terms as the rest of that program."
   echo "#"
   echo "# Generated by gnulib-tool."
-  if test -n "$cmd"; then
-    echo "# Invoked as: $cmd"
-  fi
   if test -n "$actioncmd"; then
     echo "# Reproduce by: $actioncmd"
   fi
@@ -750,16 +746,124 @@ func_emit_tests_Makefile_am ()
 # - avoidlist       list of modules to avoid, from --avoid
 # - lgpl            true if library's license shall be LGPL, blank otherwise
 # - libtool         true if libtool will be used, blank otherwise
+# - guessed_libtool true if the configure.ac file uses libtool, blank otherwise
 # - macro_prefix    prefix of gl_EARLY, gl_INIT macros to use
 # - dry_run         true if actions shall only be printed, blank otherwise
 # - symbolic        true if files should be symlinked, copied otherwise
-# - supplied_opts   all options passed to gnulib-tool
 func_import ()
 {
-  modules="$1"
-  modules=`for m in $modules; do echo $m; done | sort | uniq`
+  # Get the cached settings.
+  cached_specified_modules=
+  cached_avoidlist=
+  cached_sourcebase=
+  cached_m4base=
+  cached_libname=
+  cached_lgpl=
+  cached_libtool=
+  cached_macro_prefix=
+  cached_files=
+  if test -f "$destdir"/$m4base/gnulib-cache.m4; then
+    my_sed_traces='
+      s,#.*$,,
+      s,^dnl .*$,,
+      s, dnl .*$,,
+      /gl_MODULES(/ {
+        s,^.*gl_MODULES([[ ]*\([^])]*\).*$,cached_specified_modules="\1",p
+      }
+      /gl_AVOID(/ {
+        s,^.*gl_AVOID([[ ]*\([^])]*\).*$,cached_avoidlist="\1",p
+      }
+      /gl_SOURCE_BASE(/ {
+        s,^.*gl_SOURCE_BASE([[ ]*\([^])]*\).*$,cached_sourcebase="\1",p
+      }
+      /gl_M4_BASE(/ {
+        s,^.*gl_M4_BASE([[ ]*\([^])]*\).*$,cached_m4base="\1",p
+      }
+      /gl_LIB(/ {
+        s,^.*gl_LIB([[ ]*\([^])]*\).*$,cached_libname="\1",p
+      }
+      /gl_LGPL/ {
+        s,^.*$,cached_lgpl=true,p
+      }
+      /gl_LIBTOOL/ {
+        s,^.*$,cached_libtool=true,p
+      }
+      /gl_MACRO_PREFIX(/ {
+        s,^.*gl_MACRO_PREFIX([[ ]*\([^])]*\).*$,cached_macro_prefix="\1",p
+      }'
+    eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-cache.m4`
+    if test -f "$destdir"/$m4base/gnulib-comp.m4; then
+      my_sed_traces='
+        s,#.*$,,
+        s,^dnl .*$,,
+        s, dnl .*$,,
+        /AC_DEFUN(\['"${cached_macro_prefix}"'_FILE_LIST\], \[/ {
+          s,^.*$,cached_files=",p
+          n
+          ta
+          :a
+          s,^\]).*$,",
+          tb
+          p
+          n
+          ba
+          :b
+          p
+        }'
+      eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-comp.m4`
+    fi
+  fi
+
+  # Merge the cached settings with the specified ones.
+  # The m4base must be the same as expected from the pathname.
+  if test -n "$cached_m4base" && test "$cached_m4base" != "$m4base"; then
+    func_fatal_error "$m4base/gnulib-cache.m4 is expected to contain gl_M4_BASE([$m4base])"
+  fi
+  # Append the cached and the specified module names. So that
+  # "gnulib-tool --import foo" means to add the module foo.
+  specified_modules="$cached_specified_modules $1"
+  # Append the cached and the specified avoidlist. This is probably better
+  # than dropping the cached one when --avoid is specified at least once.
+  avoidlist=`echo $cached_avoidlist $avoidlist`
+  # The sourcebase defaults to the cached one.
+  if test -z "$sourcebase"; then
+    sourcebase="$cached_sourcebase"
+    if test -z "$sourcebase"; then
+      func_fatal_error "missing --source-base option"
+    fi
+  fi
+  # The libname defaults to the cached one.
+  if test -z "$supplied_libname"; then
+    libname="$cached_libname"
+    if test -z "$libname"; then
+      func_fatal_error "missing --lib option"
+    fi
+  fi
+  # Require LGPL if specified either way.
+  if test -z "$lgpl"; then
+    lgpl="$cached_lgpl"
+  fi
+  # Use libtool if specified either way, or if guessed.
+  if test -z "$libtool"; then
+    if test -n "$cached_m4base"; then
+      libtool="$cached_libtool"
+    else
+      libtool="$guessed_libtool"
+    fi
+  fi
+  # The macro_prefix defaults to the cached one.
+  if test -z "$macro_prefix"; then
+    macro_prefix="$cached_macro_prefix"
+    if test -z "$macro_prefix"; then
+      func_fatal_error "missing --macro-prefix option"
+    fi
+  fi
+
+  # Canonicalize the list of specified modules.
+  specified_modules=`for m in $specified_modules; do echo $m; done | sort | uniq`
 
   # Determine final module list.
+  modules="$specified_modules"
   func_modules_transitive_closure
   echo "Module list with included dependencies:"
   echo "$modules" | sed -e 's/^/  /'
@@ -769,10 +873,8 @@ func_import ()
     for module in $modules; do
       license=`func_get_license $module`
       case $license in
-       LGPL | 'public domain' | 'unlimited') ;;
-       *)
-         func_fatal_error \
-           "incompatible license on module \`$module\`: $license" ;;
+        LGPL | 'public domain' | 'unlimited') ;;
+        *) func_fatal_error "incompatible license on module $module: $license" ;;
       esac
     done
   fi
@@ -785,57 +887,162 @@ func_import ()
   test -n "$files" \
     || func_fatal_error "refusing to do nothing"
 
-  # Copy files or make symbolic links.
-  for f in $files m4/gnulib-tool.m4; do
-    source=
-    case "$f" in
-      build-aux/*) g=`echo "$f" | sed -e "s,^build-aux/,$auxdir/,"` ;;
-      lib/*) g=`echo "$f" | sed -e "s,^lib/,$sourcebase/,"`; source=true ;;
-      m4/*) g=`echo "$f" | sed -e "s,^m4/,$m4base/,"` ;;
-      *) g="$f" ;;
+  # Add m4/gnulib-tool.m4 to the file list. It is not part of any module.
+  new_files="$files m4/gnulib-tool.m4"
+  old_files="$cached_files"
+  if test -f "$destdir"/$m4base/gnulib-tool.m4; then
+    old_files="$old_files m4/gnulib-tool.m4"
+  fi
+
+  # Create directories.
+  test -d "$destdir/$sourcebase" \
+    || { test -n "$dry_run" || mkdir "$destdir/$sourcebase" || func_fatal_error "failed"; }
+  test -d "$destdir/$m4base" \
+    || { test -n "$dry_run" || mkdir "$destdir/$m4base" || func_fatal_error "failed"; }
+  test -d "$destdir/$auxdir" \
+    || { test -n "$dry_run" || mkdir "$destdir/$auxdir" || func_fatal_error "failed"; }
+
+  # Copy files or make symbolic links. Remove obsolete files.
+  for f1 in $old_files; do
+    case "$f1" in
+      build-aux/*) g1=`echo "$f1" | sed -e "s,^build-aux/,$auxdir/,"` ;;
+      lib/*) g1=`echo "$f1" | sed -e "s,^lib/,$cached_sourcebase/,"` ;;
+      m4/*) g1=`echo "$f1" | sed -e "s,^m4/,$cached_m4base/,"` ;;
+      *) g1="$f1" ;;
     esac
-    if test -z "$symbolic"; then
-      func_cp_if_changed "$gnulib_dir/$f" "$destdir/$g"
-    else
-      func_ln_if_changed "$gnulib_dir/$f" "$destdir/$g"
+    still_present=
+    for f2 in $new_files; do
+      case "$f2" in
+        build-aux/*) g2=`echo "$f2" | sed -e "s,^build-aux/,$auxdir/,"` ;;
+        lib/*) g2=`echo "$f2" | sed -e "s,^lib/,$sourcebase/,"` ;;
+        m4/*) g2=`echo "$f2" | sed -e "s,^m4/,$m4base/,"` ;;
+        *) g2="$f2" ;;
+      esac
+      if test "$g2" = "$g1"; then
+        still_present=true
+        break
+      fi
+    done
+    if test -z "$still_present"; then
+      # Remove the file. Do nothing if the user already removed it.
+      if test -f "$destdir/$g1"; then
+        echo "Removing file $g1 (backup in ${g1}~)"
+        test -n "$dry_run" && dry=echo
+        $dry mv -f "$destdir/$g1" "$destdir/${g1}~" || func_fatal_error "failed"
+      fi
     fi
-    # Update license.
-    if test -z "$dry_run" && test -n "$lgpl" && test -n "$source"; then
-      perl -pi -e 's/GNU General/GNU Lesser General/g;' \
-               -e 's/version 2([ ,])/version 2.1\1/g' \
-               "$destdir/$g"
+  done
+  for f2 in $new_files; do
+    case "$f2" in
+      build-aux/*) g2=`echo "$f2" | sed -e "s,^build-aux/,$auxdir/,"` ;;
+      lib/*) g2=`echo "$f2" | sed -e "s,^lib/,$sourcebase/,"` ;;
+      m4/*) g2=`echo "$f2" | sed -e "s,^m4/,$m4base/,"` ;;
+      *) g2="$f2" ;;
+    esac
+    already_present=
+    for f1 in $old_files; do
+      case "$f1" in
+        build-aux/*) g1=`echo "$f1" | sed -e "s,^build-aux/,$auxdir/,"` ;;
+        lib/*) g1=`echo "$f1" | sed -e "s,^lib/,$cached_sourcebase/,"` ;;
+        m4/*) g1=`echo "$f1" | sed -e "s,^m4/,$cached_m4base/,"` ;;
+        *) g1="$f1" ;;
+      esac
+      if test "$g1" = "$g2"; then
+        already_present=true
+        break
+      fi
+    done
+    cp "$gnulib_dir/$f2" "$destdir/$g2.tmp" || func_fatal_error "failed"
+    if test -n "$lgpl"; then
+      # Update license.
+      case "$f2" in
+        lib/*)
+          sed -e 's/GNU General/GNU Lesser General/g' \
+              -e 's/version 2\([ ,]\)/version 2.1\1/g' \
+            < "$gnulib_dir/$f2" > "$destdir/$g2.tmp" || func_fatal_error "failed"
+          ;;
+      esac
     fi
+    if test -f "$destdir/$g2"; then
+      # The file already exists.
+      if cmp "$destdir/$g2" "$destdir/$g2.tmp" > /dev/null; then
+        : # The file has not changed.
+      else
+        # Replace the file.
+        if test -n "$already_present"; then
+          echo "Updating file $g2 (backup in ${g2}~)"
+        else
+          echo "Replacing file $g2 (non-gnulib code backuped in ${g2}~) !!"
+        fi
+        test -n "$dry_run" && dry=echo
+        $dry mv -f "$destdir/$g2" "$destdir/${g2}~" || func_fatal_error "failed"
+        if test -n "$symbolic" && cmp "$gnulib_dir/$f2" "$destdir/$g2.tmp" > /dev/null; then
+          func_ln_if_changed "$gnulib_dir/$f2" "$destdir/$g2"
+        else
+          $dry mv -f "$destdir/$g2.tmp" "$destdir/${g2}" || func_fatal_error "failed"
+        fi
+      fi
+    else
+      # Install the file.
+      # Don't protest if the file should be there but isn't: it happens
+      # frequently that developers don't put autogenerated files into CVS.
+      echo "Copying file $g2"
+      test -n "$dry_run" && dry=echo
+      if test -n "$symbolic" && cmp "$gnulib_dir/$f2" "$destdir/$g2.tmp" > /dev/null; then
+        func_ln_if_changed "$gnulib_dir/$f2" "$destdir/$g2"
+      else
+        $dry mv -f "$destdir/$g2.tmp" "$destdir/${g2}" || func_fatal_error "failed"
+      fi
+    fi
+    rm -f "$destdir/$g2.tmp"
   done
 
-  # Commands printed in a comment in generated files.
-  cmd="gnulib-tool $supplied_opts"
-  opt_libtool=
-  if test -n "$libtool"; then
-    opt_libtool="--libtool"
-  fi
-  opt_lgpl=
+  # Command-line invocation printed in a comment in generated gnulib-cache.m4.
+  actioncmd="gnulib-tool --import"
+  actioncmd="$actioncmd --dir=$destdir"
+  actioncmd="$actioncmd --lib=$libname"
+  actioncmd="$actioncmd --source-base=$sourcebase"
+  actioncmd="$actioncmd --m4-base=$m4base"
+  actioncmd="$actioncmd --aux-dir=$auxdir"
+  for module in $avoidlist; do
+    actioncmd="$actioncmd --avoid=$module"
+  done
   if test -n "$lgpl"; then
-    opt_lgpl="--lgpl"
+    actioncmd="$actioncmd --lgpl"
+  fi
+  if test -n "$libtool"; then
+    actioncmd="$actioncmd --libtool"
   fi
-  actioncmd="gnulib-tool --import --dir=$destdir --lib=$libname --source-base=$sourcebase --m4-base=$m4base --aux-dir=$auxdir $opt_libtool $opt_lgpl `echo $modules`"
+  actioncmd="$actioncmd --macro-prefix=$macro_prefix"
+  actioncmd="$actioncmd `echo $specified_modules`"
 
   # Create lib/Makefile.am.
-  echo "Creating $destdir/$sourcebase/Makefile.am..."
   if test -z "$dry_run"; then
-    func_emit_lib_Makefile_am > "$destdir"/$sourcebase/Makefile.am.new
+    func_emit_lib_Makefile_am > "$destdir"/$sourcebase/Makefile.am.tmp
+    if test -f "$destdir"/$sourcebase/Makefile.am; then
+      if cmp "$destdir"/$sourcebase/Makefile.am "$destdir"/$sourcebase/Makefile.am.tmp > /dev/null; then
+        rm -f "$destdir"/$sourcebase/Makefile.am.tmp
+      else
+        echo "Updating $sourcebase/Makefile.am (backup in $sourcebase/Makefile.am~)"
+        mv -f "$destdir"/$sourcebase/Makefile.am "$destdir"/$sourcebase/Makefile.am~
+        mv -f "$destdir"/$sourcebase/Makefile.am.tmp "$destdir"/$sourcebase/Makefile.am
+      fi
+    else
+      echo "Creating $sourcebase/Makefile.am"
+      mv -f "$destdir"/$sourcebase/Makefile.am.tmp "$destdir"/$sourcebase/Makefile.am
+    fi
   else
+    echo "Creating $sourcebase/Makefile.am..."
     func_emit_lib_Makefile_am
   fi
-  func_mv_if_changed "$destdir"/$sourcebase/Makefile.am.new \
-                     "$destdir"/$sourcebase/Makefile.am
 
-  # Create gnulib.m4.
-  echo "Creating $destdir/$m4base/gnulib.m4..."
+  # Create m4/gnulib-cache.m4.
   (
     if test -z "$dry_run"; then
-      exec > "$destdir"/$m4base/gnulib.m4.new
+      exec > "$destdir"/$m4base/gnulib-cache.m4.tmp
     else
-      echo "# $destdir/$m4base/gnulib.m4"
+      echo "Creating $m4base/gnulib-cache.m4..."
+      echo "# $destdir/$m4base/gnulib-cache.m4"
     fi
     echo "# Copyright (C) 2004 Free Software Foundation, Inc."
     echo "# This file is free software, distributed under the terms of the GNU"
@@ -846,8 +1053,64 @@ func_import ()
     echo "#"
     echo "# Generated by gnulib-tool."
     echo "#"
-    echo "# Invoked as: $cmd"
-    echo "# Reproduce by: $actioncmd"
+    echo "# This file represents the specification of how gnulib-tool is used."
+    echo "# It acts as a cache: It is written and read by gnulib-tool."
+    echo "# In projects using CVS, this file is meant to be stored in CVS,"
+    echo "# like the configure.ac and various Makefile.am files."
+    echo
+    echo
+    echo "# Specification in the form of a command-line invocation:"
+    echo "#   $actioncmd"
+    echo
+    echo "# Specification in the form of a few gnulib-tool.m4 macro invocations:"
+    echo "gl_MODULES(["`echo $specified_modules`"])"
+    echo "gl_AVOID([$avoidlist])"
+    echo "gl_SOURCE_BASE([$sourcebase])"
+    echo "gl_M4_BASE([$m4base])"
+    echo "gl_LIB([$libname])"
+    test -z "$lgpl" || echo "gl_LGPL"
+    test -z "$libtool" || echo "gl_LIBTOOL"
+    echo "gl_MACRO_PREFIX([$macro_prefix])"
+    echo
+    echo "# gnulib-cache.m4 ends here"
+  )
+  if test -z "$dry_run"; then
+    if test -f "$destdir"/$m4base/gnulib-cache.m4; then
+      if cmp "$destdir"/$m4base/gnulib-cache.m4 "$destdir"/$m4base/gnulib-cache.m4.tmp > /dev/null; then
+        rm -f "$destdir"/$m4base/gnulib-cache.m4.tmp
+      else
+        echo "Updating $m4base/gnulib-cache.m4 (backup in $m4base/gnulib-cache.m4~)"
+        mv -f "$destdir"/$m4base/gnulib-cache.m4 "$destdir"/$m4base/gnulib-cache.m4~
+        mv -f "$destdir"/$m4base/gnulib-cache.m4.tmp "$destdir"/$m4base/gnulib-cache.m4
+      fi
+    else
+      echo "Creating $m4base/gnulib-cache.m4"
+      mv -f "$destdir"/$m4base/gnulib-cache.m4.tmp "$destdir"/$m4base/gnulib-cache.m4
+    fi
+  fi
+
+  # Create m4/gnulib-comp.m4.
+  (
+    if test -z "$dry_run"; then
+      exec > "$destdir"/$m4base/gnulib-comp.m4.tmp
+    else
+      echo "Creating $m4base/gnulib-comp.m4..."
+      echo "# $destdir/$m4base/gnulib-comp.m4"
+    fi
+    echo "# Copyright (C) 2004 Free Software Foundation, Inc."
+    echo "# This file is free software, distributed under the terms of the GNU"
+    echo "# General Public License.  As a special exception to the GNU General"
+    echo "# Public License, this file may be distributed as part of a program"
+    echo "# that contains a configuration script generated by Autoconf, under"
+    echo "# the same distribution terms as the rest of that program."
+    echo "#"
+    echo "# Generated by gnulib-tool."
+    echo "#"
+    echo "# This file represents the compiled summary of the specification in"
+    echo "# gnulib-cache.m4. It lists the computed macro invocations that need"
+    echo "# to be invoked from configure.ac."
+    echo "# In projects using CVS, this file can be treated like other built files."
+    echo
     echo
     echo "# This macro should be invoked from $configure_ac, in the section"
     echo "# \"Checks for programs\", right after AC_PROG_CC, and certainly before"
@@ -855,10 +1118,10 @@ func_import ()
     echo "AC_DEFUN([${macro_prefix}_EARLY],"
     echo "["
     if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 > /dev/null; then
-      echo "  AC_GNU_SOURCE"
+      echo "  AC_REQUIRE([AC_GNU_SOURCE])"
     fi
     if grep gl_USE_SYSTEM_EXTENSIONS "$destdir"/$m4base/*.m4 > /dev/null; then
-      echo "  gl_USE_SYSTEM_EXTENSIONS"
+      echo "  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])"
     fi
     echo "])"
     echo
@@ -880,9 +1143,29 @@ func_import ()
     done
     echo "])"
     echo
-    echo "# gnulib.m4 ends here"
+    echo "# This macro records the list of files which have been installed by"
+    echo "# gnulib-tool and may be removed by future gnulib-tool invocations."
+    echo "AC_DEFUN([${macro_prefix}_FILE_LIST], ["
+    echo "$files" | sed -e 's,^,  ,'
+    echo "])"
+    echo
+    echo "# gnulib-comp.m4 ends here"
   )
-  func_mv_if_changed "$destdir"/$m4base/gnulib.m4.new "$destdir"/$m4base/gnulib.m4
+  if test -z "$dry_run"; then
+    if test -f "$destdir"/$m4base/gnulib-comp.m4; then
+      if cmp "$destdir"/$m4base/gnulib-comp.m4 "$destdir"/$m4base/gnulib-comp.m4.tmp > /dev/null; then
+        rm -f "$destdir"/$m4base/gnulib-comp.m4.tmp
+      else
+        echo "Updating $m4base/gnulib-comp.m4 (backup in $m4base/gnulib-comp.m4~)"
+        mv -f "$destdir"/$m4base/gnulib-comp.m4 "$destdir"/$m4base/gnulib-comp.m4~
+        mv -f "$destdir"/$m4base/gnulib-comp.m4.tmp "$destdir"/$m4base/gnulib-comp.m4
+      fi
+    else
+      echo "Creating $m4base/gnulib-comp.m4"
+      mv -f "$destdir"/$m4base/gnulib-comp.m4.tmp "$destdir"/$m4base/gnulib-comp.m4
+    fi
+  fi
+
   echo "Finished."
   echo
   echo "You may need to add #include directives for the following .h files."
@@ -1165,88 +1448,108 @@ case $mode in
     test -d "$destdir" \
       || func_fatal_error "destination directory does not exist: $destdir"
 
-    # Prefer configure.ac to configure.in
-    test -f "$destdir"/configure.in && configure_ac="$destdir/configure.in"
-    test -f "$destdir"/configure.ac && configure_ac="$destdir/configure.ac"
-    test -f "$configure_ac" \
-      || func_fatal_error "cannot find $destdir/configure.ac"
-
-    # Get settings.
-    my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
-      /gl_MODULES[^_]/  {
-        s,^.*gl_MODULES([[   ]*\([^])]*\).*$,ac_modules="\1",; p;
-      };
-      /gl_AVOID[^_]/  {
-        s,^.*gl_AVOID([[   ]*\([^])]*\).*$,ac_avoidlist="\1",; p;
-      };
-      /gl_SOURCE_BASE/   {
-        s,^.*gl_SOURCE_BASE([[         ]*\([^])]*\).*$,ac_sourcebase="\1",; p;
-      };
-      /gl_M4_BASE/   {
-        s,^.*gl_M4_BASE([[         ]*\([^])]*\).*$,ac_m4base="\1",; p;
-      };
-      /gl_LIB/   {
-        s,^.*gl_LIB([[         ]*\([^])]*\).*$,ac_libname="\1",; p;
-      };
-      /AC_CONFIG_AUX_DIR/  {
-        s,^.*AC_CONFIG_AUX_DIR([[         ]*\([^])]*\).*$,ac_auxdir="\1",; p;
-      }
-      /A[CM]_PROG_LIBTOOL/ { s,^.*$,seen_libtool=:,; p; };
-      /LT_INIT/            { s,^.*$,seen_libtool=:,; p; };
-      /gl_LGPL/            { s,^.*$,lgpl=true,; p; };
-      /gl_LIBTOOL/         { s,^.*$,seen_libtool=:,; p; };
-      /gl_MACRO_PREFIX/   {
-        s,^.*gl_MACRO_PREFIX([[         ]*\([^])]*\).*$,ac_macro_prefix="\1",; p;
-      };
-      d;'
-    eval `cat $configure_ac | sed "$my_sed_traces"`
-
-    # Override libname?
-    if test -z "$supplied_libname" && test -n "$ac_libname"; then
-      libname="$ac_libname"
+    # Prefer configure.ac to configure.in.
+    if test -f "$destdir"/configure.ac; then
+      configure_ac="$destdir/configure.ac"
+    else
+      if test -f "$destdir"/configure.in; then
+        configure_ac="$destdir/configure.in"
+      else
+        func_fatal_error "cannot find $destdir/configure.ac"
+      fi
     fi
 
-    # Set up source base.
-    test -z "$sourcebase" && sourcebase="$ac_sourcebase"
-    test -z "$sourcebase" && sourcebase="lib"
-    test -d "$destdir/$sourcebase" \
-      || { test -z "$dry_run" && mkdir "$destdir/$sourcebase"; } \
-      || func_fatal_error "source base $destdir/$sourcebase doesn't exist"
-
-    # Set up m4 base.
-    test -z "$m4base" && m4base="$ac_m4base"
-    test -z "$m4base" && m4base="m4"
-    test -d "$destdir/$m4base" \
-      || { test -z "$dry_run" && mkdir "$destdir/$m4base"; } \
-      || func_fatal_error "m4 base $destdir/$m4base doesn't exist"
-
-    # Set up auxiliary directory.
-    test -z "$auxdir" && auxdir="$ac_auxdir"
-    test -z "$auxdir" && auxdir="build-aux"
-    test -d "$destdir/$auxdir" \
-      || { test -z "$dry_run" && mkdir "$destdir/$auxdir"; } \
-      || func_fatal_error "aux directory $destdir/$auxdir doesn't exist"
-
-    # Using libtool?
-    if test -n "$seen_libtool"; then
-      libtool=true
-    fi
+    test -f "$destdir"/Makefile.am \
+      || func_fatal_error "cannot find $destdir/Makefile.am"
+
+    # Analyze configure.ac.
+    guessed_auxdir="."
+    guessed_libtool=
+    my_sed_traces='
+      s,#.*$,,
+      s,^dnl .*$,,
+      s, dnl .*$,,
+      /AC_CONFIG_AUX_DIR/ {
+        s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^])]*\).*$,guessed_auxdir="\1",p
+      }
+      /A[CM]_PROG_LIBTOOL/ {
+        s,^.*$,guessed_libtool=true,p
+      }'
+    eval `sed -n -e "$my_sed_traces" < "$configure_ac"`
 
-    # Macro prefix
-    test -z "$macro_prefix" && macro_prefix="$ac_macro_prefix"
-    test -z "$macro_prefix" && macro_prefix="gl"
+    if test -z "$auxdir"; then
+      auxdir="$guessed_auxdir"
+    fi
 
-    # What modules to extract.
-    if test $# = 0; then
-      modules="$ac_modules"
+    # Determine where to apply func_import.
+    if test -n "$m4base"; then
+      # Apply func_import to a particular gnulib directory.
+      # Any number of additional modules can be given.
+      if test ! -f "$destdir/$m4base"/gnulib-cache.m4; then
+        # First use of gnulib in the given m4base.
+        test -n "$supplied_libname" || supplied_libname=true
+        test -n "$sourcebase" || sourcebase="lib"
+        test -n "$macro_prefix" || macro_prefix="gl"
+      fi
+      func_import "$*"
     else
-      modules="$*"
+      # Apply func_import to all gnulib directories.
+      # To get this list of directories, look at Makefile.am. (Not at
+      # configure, because it may be omitted from CVS. Also, don't run
+      # "find $destdir -name gnulib-cache.m4", as it might be too expensive.)
+      aclocal_amflags=`grep '^ACLOCAL_AMFLAGS[         ]*=' "$destdir"/Makefile.am | sed -e 's/^ACLOCAL_AMFLAGS[       ]*=\(.*\)$/\1/'`
+      m4dirs=
+      m4dirs_count=0
+      m4dir_is_next=
+      for arg in $aclocal_amflags; do
+        if test -n "$m4dir_is_next"; then
+          # Ignore absolute directory pathnames, like /usr/local/share/aclocal.
+          case "$arg" in
+            /*) ;;
+            *)
+              if test -f "$destdir/$arg"/gnulib-cache.m4; then
+                m4dirs="$m4dirs $arg"
+                m4dirs_count=`expr $m4dirs_count + 1`
+              fi
+              ;;
+          esac
+        else
+          if test "X$arg" = "X-I"; then
+            m4dir_is_next=yes
+          else
+            m4dir_is_next=
+          fi
+        fi
+      done
+      if test $m4dirs_count = 0; then
+        # First use of gnulib in a package.
+        # Any number of additional modules can be given.
+        test -n "$supplied_libname" || supplied_libname=true
+        test -n "$sourcebase" || sourcebase="lib"
+        m4base="m4"
+        test -n "$macro_prefix" || macro_prefix="gl"
+        func_import "$*"
+      else
+        if test $m4dirs_count = 1; then
+          # There's only one use of gnulib here. Assume the user means it.
+          # Any number of additional modules can be given.
+          for m4base in $m4dirs; do
+            func_import "$*"
+          done
+        else
+          # Ambiguous - guess what the user meant.
+          if test $# = 0; then
+            # No further arguments. Guess the user wants to update all of them.
+            for m4base in $m4dirs; do
+              func_import
+            done
+          else
+            # Really ambiguous.
+            func_fatal_error "Ambiguity: to which directory should the modules be added? Please specify at least --m4-base=..."
+          fi
+        fi
+      fi
     fi
-
-    # Which modules to avoid?
-    avoidlist=`echo $avoidlist $ac_avoidlist`
-
-    func_import "$modules"
     ;;
 
   create-testdir )