ignore-value: handle pointer types, too
[gnulib.git] / gnulib-tool
index a86e4ee..ea451ec 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# Copyright (C) 2002-2008 Free Software Foundation, Inc.
+# Copyright (C) 2002-2009 Free Software Foundation, Inc.
 #
 # 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
@@ -63,26 +63,43 @@ if test -z "${AUTOPOINT}" || test -n "${GETTEXTPATH}"; then
   AUTOPOINT="${GETTEXTPATH}autopoint"
 fi
 
+# You can set MAKE.
+if test -z "${MAKE}"; then
+  MAKE=make
+fi
+
 # When using GNU sed, turn off as many GNU extensions as possible,
 # to minimize the risk of accidentally using non-portable features.
 # However, do this only for gnulib-tool itself, not for the code that
 # gnulib-tool generates, since we don't want "sed --posix" to leak
-# into makefiles.
-if (alias) > /dev/null 2>&1 && echo | sed --posix -e d >/dev/null 2>&1; then
+# into makefiles. And do it only for sed versions 4.2 or newer,
+# because "sed --posix" is buggy in GNU sed 4.1.5, see
+# <http://lists.gnu.org/archive/html/bug-gnulib/2009-02/msg00225.html>.
+if (alias) > /dev/null 2>&1 \
+   && echo | sed --posix -e d >/dev/null 2>&1 \
+   && case `sed --version | sed -e 's/^[^0-9]*//' -e 1q` in \
+        [1-3]* | 4.[01]*) false;; \
+        *) true;; \
+      esac \
+   ; then
   # Define sed as an alias.
   # It is not always possible to use aliases. Aliases are guaranteed to work
   # if the executing shell is bash and either it is invoked as /bin/sh or
   # is a version >= 2.0, supporting shopt. This is the common case.
   # Two other approaches (use of a variable $sed or of a function func_sed
   # instead of an alias) require massive, fragile code changes.
-  # An other approach (use of function sed) requires `which sed` - but 'which'
-  # is hard to emulate, due to missing "test -x" on some platforms.
+  # An other approach (use of function sed) requires `which sed` - but
+  # 'which' is hard to emulate, due to missing "test -x" on some platforms.
   if test -n "$BASH_VERSION"; then
     shopt -s expand_aliases >/dev/null 2>&1
   fi
   alias sed='sed --posix'
 fi
 
+# sed_noop is a sed expression that does nothing.
+# An empty expression does not work with the native 'sed' on AIX 6.1.
+sed_noop='s,x,x,'
+
 # func_usage
 # outputs to stdout the --help usage message.
 func_usage ()
@@ -96,6 +113,7 @@ Usage: gnulib-tool --list
        gnulib-tool --test --dir=directory module1 ... moduleN
        gnulib-tool --megatest --dir=directory [module1 ... moduleN]
        gnulib-tool --extract-description module
+       gnulib-tool --extract-status module
        gnulib-tool --extract-notice module
        gnulib-tool --extract-filelist module
        gnulib-tool --extract-dependencies module
@@ -106,6 +124,7 @@ Usage: gnulib-tool --list
        gnulib-tool --extract-license module
        gnulib-tool --extract-maintainer module
        gnulib-tool --extract-tests-module module
+       gnulib-tool --copy-file file [destination]
 
 Operation modes:
       --list                print the available module names
@@ -122,6 +141,7 @@ Operation modes:
       --megatest            test the given modules one by one and all together
                             (recommended to use CC=\"gcc -Wall\" here)
       --extract-description        extract the description
+      --extract-status             extract the status (obsolete or not)
       --extract-notice             extract the notice or banner
       --extract-filelist           extract the list of files
       --extract-dependencies       extract the dependencies
@@ -133,6 +153,7 @@ Operation modes:
                                    under lib/
       --extract-maintainer         report the maintainer(s) inside gnulib
       --extract-tests-module       report the unit test module, if it exists
+      --copy-file                  copy a file that is not part of any module
 
 General options:
       --dir=DIRECTORY       Specify the target directory.
@@ -161,6 +182,9 @@ Options for --import:
       --aux-dir=DIRECTORY   Directory relative to --dir where auxiliary build
                             tools are placed (default \"build-aux\").
       --with-tests          Include unit tests for the included modules.
+      --with-obsolete       Include obsolete modules when they occur among the
+                            dependencies. By default, dependencies to obsolete
+                            modules are ignored.
       --avoid=MODULE        Avoid including the given MODULE. Useful if you
                             have code that provides equivalent functionality.
                             This option can be repeated.
@@ -177,7 +201,10 @@ Options for --import:
                             'gl_INIT'. Default is 'gl'.
       --po-domain=NAME      Specify the prefix of the i18n domain. Usually use
                             the package name. A suffix '-gnulib' is appended.
-      --no-changelog        don't update or create ChangeLog files
+      --vc-files            Update version control related files.
+      --no-vc-files         Don't update version control related files
+                            (.gitignore and/or .cvsignore).
+      --no-changelog        Don't update or create ChangeLog files.
 
 Options for --import and --update:
       --dry-run             For --import, only print what would have been done.
@@ -209,7 +236,7 @@ q
     date=`echo "$date" | sed -e "$sed_year_before_time"`
     # Use GNU date to compute the time in GMT.
     date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
-    version=' '`"$gnulib_dir"/build-aux/git-version-gen /dev/null`
+    version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
   else
     if test -d "$gnulib_dir"/CVS \
        && (cvs --version) >/dev/null 2>/dev/null; then
@@ -255,7 +282,9 @@ func_emit_copyright_notice ()
 }
 
 # func_exit STATUS
-# exit with status
+# exits with a given status.
+# This function needs to be used, rather than 'exit', when a 'trap' handler is
+# in effect that refers to $?.
 func_exit ()
 {
   (exit $1); exit $1
@@ -263,14 +292,16 @@ func_exit ()
 
 # func_gnulib_dir
 # locates the directory where the gnulib repository lives
+# Input:
+# - progname                 name of this program
 # Sets variables
 # - self_abspathname         absolute pathname of gnulib-tool
 # - gnulib_dir               absolute pathname of gnulib repository
 func_gnulib_dir ()
 {
-  case "$0" in
-    /*) self_abspathname="$0" ;;
-    */*) self_abspathname=`pwd`/"$0" ;;
+  case "$progname" in
+    /*) self_abspathname="$progname" ;;
+    */*) self_abspathname=`pwd`/"$progname" ;;
     *)
       # Look in $PATH.
       # Iterate through the elements of $PATH.
@@ -317,8 +348,8 @@ func_gnulib_dir ()
       for d in $pathx; do
         IFS="$save_IFS"
         test -z "$d" && d=.
-        if test -x "$d/$0" && test ! -d "$d/$0"; then
-          self_abspathname="$d/$0"
+        if test -x "$d/$progname" && test ! -d "$d/$progname"; then
+          self_abspathname="$d/$progname"
           break
         fi
       done
@@ -342,6 +373,8 @@ func_gnulib_dir ()
 
 # func_tmpdir
 # creates a temporary directory.
+# Input:
+# - progname                 name of this program
 # Sets variable
 # - tmp             pathname of freshly created temporary directory
 func_tmpdir ()
@@ -366,7 +399,7 @@ func_tmpdir ()
     (umask 077 && mkdir "$tmp")
   } ||
   {
-    echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+    echo "$progname: cannot create a temporary directory in $TMPDIR" >&2
     func_exit 1
   }
 }
@@ -380,19 +413,79 @@ if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then
   {
     eval "$1+=\"\$2\""
   }
+  fast_func_append=true
 else
   func_append ()
   {
     eval "$1=\"\$$1\$2\""
   }
+  fast_func_append=false
+fi
+
+# func_remove_prefix var prefix
+# removes the given prefix from the value of the shell variable var.
+# var should be the name of a shell variable.
+# Its value should not contain a newline and not start or end with whitespace.
+# prefix should not contain the characters "$`\{}[]^|.
+if ( foo=bar; eval 'test "${foo#b}" = ar' ) >/dev/null 2>&1; then
+  func_remove_prefix ()
+  {
+    eval "$1=\${$1#\$2}"
+  }
+  fast_func_remove_prefix=true
+else
+  func_remove_prefix ()
+  {
+    eval "value=\"\$$1\""
+    prefix="$2"
+    case "$prefix" in
+      *.*)
+        sed_escape_dots='s/\([.]\)/\\\1/g'
+        prefix=`echo "$prefix" | sed -e "$sed_escape_dots"`
+        ;;
+    esac
+    value=`echo "$value" | sed -e "s|^${prefix}||"`
+    eval "$1=\"\$value\""
+  }
+  fast_func_remove_prefix=false
+fi
+
+# func_remove_suffix var suffix
+# removes the given suffix from the value of the shell variable var.
+# var should be the name of a shell variable.
+# Its value should not contain a newline and not start or end with whitespace.
+# suffix should not contain the characters "$`\{}[]^|.
+if ( foo=bar; eval 'test "${foo%r}" = ba' ) >/dev/null 2>&1; then
+  func_remove_suffix ()
+  {
+    eval "$1=\${$1%\$2}"
+  }
+  fast_func_remove_suffix=true
+else
+  func_remove_suffix ()
+  {
+    eval "value=\"\$$1\""
+    suffix="$2"
+    case "$suffix" in
+      *.*)
+        sed_escape_dots='s/\([.]\)/\\\1/g'
+        suffix=`echo "$suffix" | sed -e "$sed_escape_dots"`
+        ;;
+    esac
+    value=`echo "$value" | sed -e "s|${suffix}\$||"`
+    eval "$1=\"\$value\""
+  }
+  fast_func_remove_suffix=false
 fi
 
 # func_fatal_error message
 # outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname                 name of this program
 func_fatal_error ()
 {
-  echo "gnulib-tool: *** $1" 1>&2
-  echo "gnulib-tool: *** Stop." 1>&2
+  echo "$progname: *** $1" 1>&2
+  echo "$progname: *** Stop." 1>&2
   func_exit 1
 }
 
@@ -545,6 +638,34 @@ func_ln_if_changed ()
   fi
 }
 
+# func_reset_sigpipe
+# Resets SIGPIPE to its default behaviour. SIGPIPE is signalled when a process
+# writes into a pipe with no readers, i.e. a pipe where all readers have
+# already closed their file descriptor that read from it or exited entirely.
+# The default behaviour is to terminate the current process without an error
+# message.
+# When "trap '' SIGPIPE" is in effect, the behaviour (at least with bash) is to
+# terminate the current process with an error message.
+# This function should be called at the beginning of a command that only
+# produces output to stdout (i.e. no side effects!), when the command that
+# will read from this pipe might prematurely exit or close its standard input
+# descriptor.
+if test -n "$BASH_VERSION"; then
+  # The problem has only been reported with bash. Probably it occurs only with
+  # bash-3.2. For the reasons, see
+  # <http://lists.gnu.org/archive/html/bug-bash/2008-12/msg00050.html>.
+  # Note that Solaris sh does not understand "trap - SIGPIPE".
+  func_reset_sigpipe ()
+  {
+    trap - SIGPIPE
+  }
+else
+  func_reset_sigpipe ()
+  {
+    :
+  }
+fi
+
 # Ensure an 'echo' command that does not interpret backslashes.
 # Test cases:
 #   echo '\n' | wc -l                 prints 1 when OK, 2 when KO
@@ -705,6 +826,7 @@ fi
 # - testsbase       from --tests-base
 # - auxdir          from --aux-dir
 # - inctests        true if --with-tests was given, blank otherwise
+# - incobsolete     true if --with-obsolete was given, blank otherwise
 # - avoidlist       list of modules to avoid, from --avoid
 # - lgpl            yes or a number if --lgpl was given, blank otherwise
 # - makefile_name   from --makefile-name
@@ -712,6 +834,8 @@ fi
 #                   given, blank otherwise
 # - macro_prefix    from --macro-prefix
 # - po_domain       from --po-domain
+# - vc_files        true if --vc-files was given, false if --no-vc-files was
+#                   given, blank otherwise
 # - autoconf_minversion  minimum supported autoconf version
 # - do_changelog    false if --no-changelog was given, : otherwise
 # - doit            : if actions shall be executed, false if only to be printed
@@ -733,12 +857,14 @@ fi
   testsbase=
   auxdir=
   inctests=
+  incobsolete=
   avoidlist=
   lgpl=
   makefile_name=
   libtool=
   macro_prefix=
   po_domain=
+  vc_files=
   do_changelog=:
   doit=:
   symbolic=
@@ -773,6 +899,9 @@ fi
       --extract-* )
         mode=`echo "X$1" | sed -e 's/^X--//'`
         shift ;;
+      --copy-file | --copy-fil | --copy-fi | --copy-f | --copy- | --copy | --cop | --co )
+        mode=copy-file
+        shift ;;
       --dir )
         shift
         if test $# = 0; then
@@ -874,6 +1003,9 @@ fi
       --with-tests )
         inctests=true
         shift ;;
+      --with-obsolete )
+        incobsolete=true
+        shift ;;
       --avoid )
         shift
         if test $# = 0; then
@@ -932,6 +1064,12 @@ fi
       --po-domain=* )
         po_domain=`echo "X$1" | sed -e 's/^X--po-domain=//'`
         shift ;;
+      --vc-files )
+        vc_files=true
+        shift ;;
+      --no-vc-files )
+        vc_files=false
+        shift ;;
       --no-changelog | --no-changelo | --no-changel | --no-change | --no-chang | --no-chan | --no-cha | --no-ch | --no-c )
         do_changelog=false
         shift ;;
@@ -978,9 +1116,10 @@ fi
     if test -n "$local_gnulib_dir" || test -n "$supplied_libname" \
        || test -n "$sourcebase" || test -n "$m4base" || test -n "$pobase" \
        || test -n "$docbase" || test -n "$testsbase" || test -n "$auxdir" \
-       || test -n "$inctests" || test -n "$avoidlist" || test -n "$lgpl" \
-       || test -n "$makefile_name" || test -n "$macro_prefix" \
-       || test -n "$po_domain"; then
+       || test -n "$inctests" || test -n "$incobsolete" \
+       || test -n "$avoidlist" || test -n "$lgpl" || test -n "$makefile_name" \
+       || test -n "$macro_prefix" || test -n "$po_domain" \
+       || test -n "$vc_files"; then
       echo "gnulib-tool: invalid options for 'update' mode" 1>&2
       echo "Try 'gnulib-tool --help' for more information." 1>&2
       echo "If you really want to modify the gnulib configuration of your project," 1>&2
@@ -1206,6 +1345,7 @@ sed_extract_prog=':[       ]*$/ {
   :a
     n
     s/^Description:[    ]*$//
+    s/^Status:[         ]*$//
     s/^Notice:[         ]*$//
     s/^Files:[  ]*$//
     s/^Depends-on:[     ]*$//
@@ -1231,6 +1371,15 @@ func_get_description ()
   sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file"
 }
 
+# func_get_status module
+# Input:
+# - local_gnulib_dir  from --local-dir
+func_get_status ()
+{
+  func_lookup_file "modules/$1"
+  sed -n -e "/^Status$sed_extract_prog" < "$lookedup_file"
+}
+
 # func_get_notice module
 # Input:
 # - local_gnulib_dir  from --local-dir
@@ -1247,22 +1396,72 @@ func_get_filelist ()
 {
   func_lookup_file "modules/$1"
   sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file"
+  echo m4/00gnulib.m4
   echo m4/gnulib-common.m4
   case "$autoconf_minversion" in
     2.59)
-      #echo m4/onceonly.m4
-      echo m4/onceonly_2_57.m4
+      echo m4/onceonly.m4
       ;;
   esac
 }
 
+# func_filter_filelist outputvar separator filelist prefix suffix removed_prefix removed_suffix [added_prefix [added_suffix]]
+# stores in outputvar the filtered and processed filelist. Filtering: Only the
+# elements starting with prefix and ending with suffix are considered.
+# Processing: removed_prefix and removed_suffix are removed from each element,
+# added_prefix and added_suffix are added to each element.
+# removed_prefix, removed_suffix should not contain the characters "$`\{}[]^|.
+# added_prefix, added_suffix should not contain the characters \|&.
+func_filter_filelist ()
+{
+  if test "$2" != "$nl" \
+     || { $fast_func_append \
+          && { test -z "$6" || $fast_func_remove_prefix; } \
+          && { test -z "$7" || $fast_func_remove_suffix; }; \
+        }; then
+    ffflist=
+    for fff in $3; do
+      case "$fff" in
+        "$4"*"$5")
+          if test -n "$6"; then
+            func_remove_prefix fff "$6"
+          fi
+          if test -n "$7"; then
+            func_remove_suffix fff "$7"
+          fi
+          fff="$8${fff}$9"
+          if test -z "$ffflist"; then
+            ffflist="${fff}"
+          else
+            func_append ffflist "$2${fff}"
+          fi
+          ;;
+      esac
+    done
+  else
+    sed_fff_filter="s|^$6\(.*\)$7\$|$8\\1$9|"
+    ffflist=`for fff in $3; do
+               case "$fff" in
+                 "$4"*"$5") echo "$fff" ;;
+               esac
+             done | sed -e "$sed_fff_filter"`
+  fi
+  eval "$1=\"\$ffflist\""
+}
+
 # func_get_dependencies module
 # Input:
 # - local_gnulib_dir  from --local-dir
 func_get_dependencies ()
 {
   # ${module}-tests always implicitly depends on ${module}.
-  echo "$1" | sed -n -e 's/-tests$//p'
+  case "$1" in
+    *-tests)
+      fgd1="$1"
+      func_remove_suffix fgd1 '-tests'
+      echo "$fgd1"
+      ;;
+  esac
   # Then the explicit dependencies listed in the module description.
   func_lookup_file "modules/$1"
   sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file"
@@ -1298,11 +1497,7 @@ func_get_automake_snippet ()
       # *-tests module live in tests/, not lib/.
       # Synthesize an EXTRA_DIST augmentation.
       all_files=`func_get_filelist $1`
-      tests_files=`for f in $all_files; do \
-                     case $f in \
-                       tests/*) echo $f ;; \
-                     esac; \
-                   done | sed -e 's,^tests/,,'`
+      func_filter_filelist tests_files " " "$all_files" 'tests/' '' 'tests/' ''
       extra_files="$tests_files"
       if test -n "$extra_files"; then
         echo "EXTRA_DIST +=" $extra_files
@@ -1324,14 +1519,11 @@ func_get_automake_snippet ()
         | sed -e "$sed_combine_lines" \
         | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'`
       all_files=`func_get_filelist $1`
-      lib_files=`for f in $all_files; do \
-                   case $f in \
-                     lib/*) echo $f ;; \
-                   esac; \
-                 done | sed -e 's,^lib/,,'`
+      func_filter_filelist lib_files "$nl" "$all_files" 'lib/' '' 'lib/' ''
       # Remove $already_mentioned_files from $lib_files.
       echo "$lib_files" | LC_ALL=C sort -u > "$tmp"/lib-files
-      extra_files=`for f in $already_mentioned_files; do echo $f; done \
+      extra_files=`func_reset_sigpipe; \
+                   for f in $already_mentioned_files; do echo $f; done \
                    | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/lib-files`
       if test -n "$extra_files"; then
         echo "EXTRA_DIST +=" $extra_files
@@ -1351,8 +1543,7 @@ func_get_automake_snippet ()
       case "$1" in
         relocatable-prog-wrapper) ;;
         *)
-          sed_extract_c_files='/\.c$/p'
-          extra_files=`echo "$extra_files" | sed -n -e "$sed_extract_c_files"`
+          func_filter_filelist extra_files "$nl" "$extra_files" '' '.c' '' ''
           if test -n "$extra_files"; then
             echo "EXTRA_lib_SOURCES +=" $extra_files
             echo
@@ -1360,16 +1551,19 @@ func_get_automake_snippet ()
           ;;
       esac
       # Synthesize an EXTRA_DIST augmentation also for the files in build-aux/.
-      buildaux_files=`for f in $all_files; do \
-                        case $f in \
-                          build-aux/*) echo $f ;; \
-                        esac; \
-                      done | sed -e 's,^build-aux/,,'`
+      func_filter_filelist buildaux_files "$nl" "$all_files" 'build-aux/' '' 'build-aux/' ''
       if test -n "$buildaux_files"; then
         sed_prepend_auxdir='s,^,$(top_srcdir)/'"$auxdir"'/,'
         echo "EXTRA_DIST += "`echo "$buildaux_files" | sed -e "$sed_prepend_auxdir"`
         echo
       fi
+      # Synthesize an EXTRA_DIST augmentation also for the files from top/.
+      func_filter_filelist top_files "$nl" "$all_files" 'top/' '' 'top/' ''
+      if test -n "$top_files"; then
+        sed_prepend_topdir='s,^,$(top_srcdir)/,'
+        echo "EXTRA_DIST += "`echo "$top_files" | sed -e "$sed_prepend_topdir"`
+        echo
+      fi
       ;;
   esac
 }
@@ -1446,6 +1640,8 @@ func_acceptable ()
 # - local_gnulib_dir  from --local-dir
 # - modules         list of specified modules
 # - inctests        true if tests should be included, blank otherwise
+# - incobsolete     true if obsolete modules among dependencies should be
+#                   included, blank otherwise
 # - avoidlist       list of modules to avoid
 # - tmp             pathname of a temporary directory
 # Output:
@@ -1474,7 +1670,12 @@ func_modules_transitive_closure ()
           if test -n "$duplicated_deps"; then
             echo "warning: module $module has duplicated dependencies: "`echo $duplicated_deps` 1>&2
           fi
-          func_append inmodules " $deps"
+          for dep in $deps; do
+            if test -n "$incobsolete" \
+               || { status=`func_get_status $dep`; test "$status" != obsolete; }; then
+              func_append inmodules " $dep"
+            fi
+          done
           if test -n "$inctests"; then
             testsmodule=`func_get_tests_module $module`
             if test -n "$testsmodule"; then
@@ -1487,7 +1688,7 @@ func_modules_transitive_closure ()
     handledmodules=`for m in $handledmodules $inmodules_this_round; do echo $m; done | LC_ALL=C sort -u`
     # Remove $handledmodules from $inmodules.
     for m in $inmodules; do echo $m; done | LC_ALL=C sort -u > "$tmp"/queued-modules
-    inmodules=`echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
+    inmodules=`func_reset_sigpipe; echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
   done
   modules=`for m in $outmodules; do echo $m; done | LC_ALL=C sort -u`
   rm -f "$tmp"/queued-modules
@@ -1501,6 +1702,7 @@ func_modules_transitive_closure ()
 # - modules         list of modules, including 'dummy' if needed
 func_modules_add_dummy ()
 {
+  # Determine whether any module provides a lib_SOURCES augmentation.
   have_lib_SOURCES=
   sed_remove_backslash_newline=':a
 /\\$/{
@@ -1517,7 +1719,10 @@ ba
         # Ignore .h files since they are not compiled.
         case "$file" in
           *.h) ;;
-          *) have_lib_SOURCES=yes ;;
+          *)
+            have_lib_SOURCES=yes
+            break 2
+            ;;
         esac
       done
     fi
@@ -1580,7 +1785,7 @@ func_execute_command ()
     echo "executing $*"
     "$@"
   else
-    # Commands like automake produce output to stderr even when the succeed.
+    # Commands like automake produce output to stderr even when they succeed.
     # Turn this output off if the command succeeds.
     "$@" > "$tmp"/cmdout 2>&1
     cmdret=$?
@@ -1595,6 +1800,108 @@ func_execute_command ()
   fi
 }
 
+# func_dest_tmpfilename file
+# determines the name of a temporary file (file is relative to destdir).
+# Input:
+# - destdir         target directory
+# - doit            : if actions shall be executed, false if only to be printed
+# - tmp             pathname of a temporary directory
+# Sets variable:
+#   - tmpfile       absolute filename of the temporary file
+func_dest_tmpfilename ()
+{
+  if $doit; then
+    # Put the new contents of $file in a file in the same directory (needed
+    # to guarantee that an 'mv' to "$destdir/$file" works).
+    tmpfile="$destdir/$1.tmp"
+  else
+    # Put the new contents of $file in a file in a temporary directory
+    # (because the directory of "$file" might not exist).
+    tmpfile="$tmp"/`basename "$1"`.tmp
+  fi
+}
+
+# func_add_file
+# copies a file from gnulib into the destination directory. The destination
+# is known to not exist.
+# Input:
+# - destdir         target directory
+# - local_gnulib_dir  from --local-dir
+# - f               the original file name
+# - lookedup_file   name of the merged (combined) file
+# - lookedup_tmp    true if it is located in the tmp directory, blank otherwise
+# - g               the rewritten file name
+# - tmpfile         absolute filename of the temporary file
+# - doit            : if actions shall be executed, false if only to be printed
+# - symbolic        true if files should be symlinked, copied otherwise
+# - lsymbolic       true if files from local_gnulib_dir should be symlinked,
+#                   copied otherwise
+func_add_file ()
+{
+  if $doit; then
+    echo "Copying file $g"
+    if { test -n "$symbolic" \
+         || { test -n "$lsymbolic" \
+              && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
+       && test -z "$lookedup_tmp" \
+       && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+      func_ln_if_changed "$lookedup_file" "$destdir/$g"
+    else
+      mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+    fi
+  else
+    echo "Copy file $g"
+  fi
+}
+
+# func_update_file
+# copies a file from gnulib into the destination directory. The destination
+# is known to exist.
+# Input:
+# - destdir         target directory
+# - local_gnulib_dir  from --local-dir
+# - f               the original file name
+# - lookedup_file   name of the merged (combined) file
+# - lookedup_tmp    true if it is located in the tmp directory, blank otherwise
+# - g               the rewritten file name
+# - tmpfile         absolute filename of the temporary file
+# - doit            : if actions shall be executed, false if only to be printed
+# - symbolic        true if files should be symlinked, copied otherwise
+# - lsymbolic       true if files from local_gnulib_dir should be symlinked,
+#                   copied otherwise
+# - already_present  nonempty if the file should already exist, empty otherwise
+func_update_file ()
+{
+  if cmp "$destdir/$g" "$tmpfile" > /dev/null; then
+    : # The file has not changed.
+  else
+    # Replace the file.
+    if $doit; then
+      if test -n "$already_present"; then
+        echo "Updating file $g (backup in ${g}~)"
+      else
+        echo "Replacing file $g (non-gnulib code backed up in ${g}~) !!"
+      fi
+      mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
+      if { test -n "$symbolic" \
+           || { test -n "$lsymbolic" \
+                && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
+         && test -z "$lookedup_tmp" \
+         && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+        func_ln_if_changed "$lookedup_file" "$destdir/$g"
+      else
+        mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+      fi
+    else
+      if test -n "$already_present"; then
+        echo "Update file $g (backup in ${g}~)"
+      else
+        echo "Replace file $g (non-gnulib code backed up in ${g}~) !!"
+      fi
+    fi
+  fi
+}
+
 # func_emit_lib_Makefile_am
 # emits the contents of library makefile to standard output.
 # Input:
@@ -1609,6 +1916,10 @@ func_execute_command ()
 # - po_domain       prefix of i18n domain to use (without -gnulib suffix)
 # - actioncmd       (optional) command that will reproduce this invocation
 # - for_test        true if creating a package for testing, false otherwise
+# - destfile        filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+#                   list of edits to be done to Makefile.am variables
 # Output:
 # - uses_subdirs    nonempty if object files in subdirs exist
 func_emit_lib_Makefile_am ()
@@ -1623,7 +1934,7 @@ func_emit_lib_Makefile_am ()
   if test "$libtool" = true; then
     libext=la
     perhapsLT=LT
-    sed_eliminate_LDFLAGS=
+    sed_eliminate_LDFLAGS="$sed_noop"
   else
     libext=a
     perhapsLT=
@@ -1636,13 +1947,20 @@ func_emit_lib_Makefile_am ()
     # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
     sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
   else
-    sed_transform_check_PROGRAMS=
+    sed_transform_check_PROGRAMS="$sed_noop"
   fi
   echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
   echo "## Process this file with automake to produce Makefile.in."
   func_emit_copyright_notice
   if test -n "$actioncmd"; then
-    echo "# Reproduce by: $actioncmd"
+    # The maximum line length (excluding the terminating newline) of any file
+    # that is to be preprocessed by config.status is 3070.  config.status uses
+    # awk, and the HP-UX 11.00 awk fails if a line has length >= 3071;
+    # similarly, the IRIX 6.5 awk fails if a line has length >= 3072.
+    len=`echo "$actioncmd" | wc -c`
+    if test -n "$len" && test "$len" -le 3000; then
+      echo "# Reproduce by: $actioncmd"
+    fi
   fi
   echo
   uses_subdirs=
@@ -1664,7 +1982,7 @@ func_emit_lib_Makefile_am ()
             echo "${libname}_${libext}_DEPENDENCIES += @${perhapsLT}ALLOCA@"
           fi
         } > amsnippet.tmp
-        # Skip the contents if its entirely empty.
+        # Skip the contents if it's entirely empty.
         if grep '[^     ]' amsnippet.tmp > /dev/null ; then
           echo "## begin gnulib module $module"
           echo
@@ -1676,7 +1994,10 @@ func_emit_lib_Makefile_am ()
         # Test whether there are some source files in subdirectories.
         for f in `func_get_filelist "$module"`; do
           case $f in
-            lib/*/*.c) uses_subdirs=yes ;;
+            lib/*/*.c)
+              uses_subdirs=yes
+              break
+              ;;
           esac
         done
       fi
@@ -1693,6 +2014,7 @@ func_emit_lib_Makefile_am ()
   fi
   echo
   if test -z "$makefile_name"; then
+    echo "SUBDIRS ="
     echo "noinst_HEADERS ="
     echo "noinst_LIBRARIES ="
     echo "noinst_LTLIBRARIES ="
@@ -1711,13 +2033,35 @@ func_emit_lib_Makefile_am ()
     echo "CLEANFILES ="
     echo "DISTCLEANFILES ="
     echo "MAINTAINERCLEANFILES ="
+  fi
+  # Execute edits that apply to the Makefile.am being generated.
+  edit=0
+  while test $edit != $makefile_am_edits; do
+    edit=`expr $edit + 1`
+    eval dir=\"\$makefile_am_edit${edit}_dir\"
+    eval var=\"\$makefile_am_edit${edit}_var\"
+    eval val=\"\$makefile_am_edit${edit}_val\"
+    if test -n "$var"; then
+      if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+        echo "${var} += ${val}"
+        eval "makefile_am_edit${edit}_var="
+      fi
+    fi
+  done
+  if test -z "$makefile_name"; then
     echo
     echo "AM_CPPFLAGS ="
+    echo "AM_CFLAGS ="
   fi
   echo
-  if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *= *$libname\\.$libext\$" allsnippets.tmp > /dev/null; then
-    # One of the snippets already specifies an installation location for the
-    # library. Don't confuse automake by saying it should not be installed.
+  if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" allsnippets.tmp > /dev/null \
+     || { test -n "$makefile_name" \
+          && test -f "$sourcebase/Makefile.am" \
+          && LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" "$sourcebase/Makefile.am" > /dev/null; \
+        }; then
+    # One of the snippets or the user's Makefile.am already specifies an
+    # installation location for the library. Don't confuse automake by saying
+    # it should not be installed.
     :
   else
     # By default, the generated library should not be installed.
@@ -1726,7 +2070,7 @@ func_emit_lib_Makefile_am ()
   echo
   echo "${libname}_${libext}_SOURCES ="
   # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However,
-  # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@.
+  # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@.
   echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)"
   echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)"
   echo "EXTRA_${libname}_${libext}_SOURCES ="
@@ -1752,7 +2096,7 @@ func_emit_lib_Makefile_am ()
 }
 
 # func_emit_po_Makevars
-# emits the contents of po/ makefile parametrization to standard output.
+# emits the contents of po/ makefile parameterization to standard output.
 # Input:
 # - local_gnulib_dir  from --local-dir
 # - sourcebase      directory relative to destdir where to place source code
@@ -1842,13 +2186,17 @@ func_emit_po_POTFILES_in ()
 # - macro_prefix    prefix of gl_LIBOBJS macros to use
 # - for_test        true if creating a package for testing, false otherwise
 # - use_libtests    true if a libtests.a should be built, false otherwise
+# - destfile        filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+#                   list of edits to be done to Makefile.am variables
 # Output:
 # - uses_subdirs    nonempty if object files in subdirs exist
 func_emit_tests_Makefile_am ()
 {
   if test "$libtool" = true; then
     libext=la
-    sed_eliminate_LDFLAGS=
+    sed_eliminate_LDFLAGS="$sed_noop"
   else
     libext=a
     sed_eliminate_LDFLAGS='/^lib_LDFLAGS[       ]*+=/d'
@@ -1860,7 +2208,7 @@ func_emit_tests_Makefile_am ()
     # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
     sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
   else
-    sed_transform_check_PROGRAMS=
+    sed_transform_check_PROGRAMS="$sed_noop"
   fi
   testsbase_inverse=`echo "$testsbase" | sed -e 's,/$,,' | sed -e 's,[^/][^/]*,..,g'`
   echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
@@ -1890,7 +2238,7 @@ func_emit_tests_Makefile_am ()
             echo "libtests_a_DEPENDENCIES += @${perhapsLT}ALLOCA@"
           fi
         } > amsnippet.tmp
-        # Skip the contents if its entirely empty.
+        # Skip the contents if it's entirely empty.
         if grep '[^     ]' amsnippet.tmp > /dev/null ; then
           echo "## begin gnulib module $module"
           echo
@@ -1902,7 +2250,10 @@ func_emit_tests_Makefile_am ()
         # Test whether there are some source files in subdirectories.
         for f in `func_get_filelist "$module"`; do
           case $f in
-            lib/*/*.c | tests/*/*.c) uses_subdirs=yes ;;
+            lib/*/*.c | tests/*/*.c)
+              uses_subdirs=yes
+              break
+              ;;
           esac
         done
       fi
@@ -1953,6 +2304,20 @@ func_emit_tests_Makefile_am ()
   echo "CLEANFILES ="
   echo "DISTCLEANFILES ="
   echo "MAINTAINERCLEANFILES ="
+  # Execute edits that apply to the Makefile.am being generated.
+  edit=0
+  while test $edit != $makefile_am_edits; do
+    edit=`expr $edit + 1`
+    eval dir=\"\$makefile_am_edit${edit}_dir\"
+    eval var=\"\$makefile_am_edit${edit}_var\"
+    eval val=\"\$makefile_am_edit${edit}_val\"
+    if test -n "$var"; then
+      if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+        echo "${var} += ${val}"
+        eval "makefile_am_edit${edit}_var="
+      fi
+    fi
+  done
   echo
   echo "AM_CPPFLAGS = \\"
   echo "  -I. -I\$(srcdir) \\"
@@ -1978,7 +2343,7 @@ func_emit_tests_Makefile_am ()
   if $use_libtests; then
     echo "libtests_a_SOURCES ="
     # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However,
-    # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@.
+    # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@.
     echo "libtests_a_LIBADD = \$(${macro_prefix}tests_LIBOBJS)"
     echo "libtests_a_DEPENDENCIES = \$(${macro_prefix}tests_LIBOBJS)"
     echo "EXTRA_libtests_a_SOURCES ="
@@ -2024,6 +2389,15 @@ func_emit_initmacro_start ()
   # We let automake know about the files to be distributed through the
   # EXTRA_lib_SOURCES variable.
   echo "  m4_pushdef([AC_LIBSOURCES], m4_defn([${macro_prefix_arg}_LIBSOURCES]))"
+  # Create data variables for checking the presence of files that are mentioned
+  # as AC_LIBSOURCES arguments. These are m4 variables, not shell variables,
+  # because we want the check to happen when the configure file is created,
+  # not when it is run. ${macro_prefix_arg}_LIBSOURCES_LIST is the list of
+  # files to check for. ${macro_prefix_arg}_LIBSOURCES_DIR is the subdirectory
+  # in which to expect them.
+  echo "  m4_pushdef([${macro_prefix_arg}_LIBSOURCES_LIST], [])"
+  echo "  m4_pushdef([${macro_prefix_arg}_LIBSOURCES_DIR], [])"
+  echo "  gl_COMMON"
 }
 
 # func_emit_initmacro_end macro_prefix
@@ -2032,6 +2406,23 @@ func_emit_initmacro_start ()
 func_emit_initmacro_end ()
 {
   macro_prefix_arg="$1"
+  # Check the presence of files that are mentioned as AC_LIBSOURCES arguments.
+  # The check is performed only when autoconf is run from the directory where
+  # the configure.ac resides; if it is run from a different directory, the
+  # check is skipped.
+  echo "  m4_ifval(${macro_prefix_arg}_LIBSOURCES_LIST, ["
+  echo "    m4_syscmd([test ! -d ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[ ||"
+  echo "      for gl_file in ]${macro_prefix_arg}_LIBSOURCES_LIST[ ; do"
+  echo "        if test ! -r ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[/\$gl_file ; then"
+  echo "          echo \"missing file ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[/\$gl_file\" >&2"
+  echo "          exit 1"
+  echo "        fi"
+  echo "      done])dnl"
+  echo "      m4_if(m4_sysval, [0], [],"
+  echo "        [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])"
+  echo "  ])"
+  echo "  m4_popdef([${macro_prefix_arg}_LIBSOURCES_DIR])"
+  echo "  m4_popdef([${macro_prefix_arg}_LIBSOURCES_LIST])"
   echo "  m4_popdef([AC_LIBSOURCES])"
   echo "  m4_popdef([AC_REPLACE_FUNCS])"
   echo "  m4_popdef([AC_LIBOBJ])"
@@ -2067,13 +2458,6 @@ func_emit_initmacro_done ()
   echo "  ${macro_prefix_arg}_LIBOBJS=\"\$${macro_prefix_arg}_LIBOBJS \$1.\$ac_objext\""
   echo "])"
   echo
-  echo "# m4_foreach_w is provided by autoconf-2.59c and later."
-  echo "# This definition is to accommodate developers using versions"
-  echo "# of autoconf older than that."
-  echo "m4_ifndef([m4_foreach_w],"
-  echo "  [m4_define([m4_foreach_w],"
-  echo "    [m4_foreach([\$1], m4_split(m4_normalize([\$2]), [ ]), [\$3])])])"
-  echo
   echo "# Like AC_REPLACE_FUNCS, except that the module name goes"
   echo "# into ${macro_prefix_arg}_LIBOBJS instead of into LIBOBJS."
   echo "AC_DEFUN([${macro_prefix_arg}_REPLACE_FUNCS], ["
@@ -2082,15 +2466,14 @@ func_emit_initmacro_done ()
   echo "])"
   echo
   echo "# Like AC_LIBSOURCES, except the directory where the source file is"
-  echo "# expected is derived from the gnulib-tool parametrization,"
+  echo "# expected is derived from the gnulib-tool parameterization,"
   echo "# and alloca is special cased (for the alloca-opt module)."
   echo "# We could also entirely rely on EXTRA_lib..._SOURCES."
   echo "AC_DEFUN([${macro_prefix_arg}_LIBSOURCES], ["
   echo "  m4_foreach([_gl_NAME], [\$1], ["
   echo "    m4_if(_gl_NAME, [alloca.c], [], ["
-  echo "      m4_syscmd([test -r $sourcebase_arg/]_gl_NAME[ || test ! -d $sourcebase_arg])dnl"
-  echo "      m4_if(m4_sysval, [0], [],"
-  echo "        [AC_FATAL([missing $sourcebase_arg/]_gl_NAME)])"
+  echo "      m4_define([${macro_prefix_arg}_LIBSOURCES_DIR], [$sourcebase_arg])"
+  echo "      m4_append([${macro_prefix_arg}_LIBSOURCES_LIST], _gl_NAME, [ ])"
   echo "    ])"
   echo "  ])"
   echo "])"
@@ -2109,6 +2492,7 @@ func_emit_initmacro_done ()
 # - testsbase       directory relative to destdir where to place unit test code
 # - auxdir          directory relative to destdir where to place build aux files
 # - inctests        true if --with-tests was given, blank otherwise
+# - incobsolete     true if --with-obsolete was given, blank otherwise
 # - avoidlist       list of modules to avoid, from --avoid
 # - lgpl            yes or a number if library's license shall be LGPL,
 #                   blank otherwise
@@ -2118,6 +2502,8 @@ func_emit_initmacro_done ()
 # - guessed_libtool true if the configure.ac file uses libtool, false otherwise
 # - macro_prefix    prefix of gl_EARLY, gl_INIT macros to use
 # - po_domain       prefix of i18n domain to use (without -gnulib suffix)
+# - vc_files        true if --vc-files was given, false if --no-vc-files was
+#                   given, blank otherwise
 # - autoconf_minversion  minimum supported autoconf version
 # - doit            : if actions shall be executed, false if only to be printed
 # - symbolic        true if files should be symlinked, copied otherwise
@@ -2130,6 +2516,7 @@ func_import ()
   # Get the cached settings.
   cached_local_gnulib_dir=
   cached_specified_modules=
+  cached_incobsolete=
   cached_avoidlist=
   cached_sourcebase=
   cached_m4base=
@@ -2143,6 +2530,7 @@ func_import ()
   cached_libtool=
   cached_macro_prefix=
   cached_po_domain=
+  cached_vc_files=
   cached_files=
   if test -f "$destdir"/$m4base/gnulib-cache.m4; then
     cached_libtool=false
@@ -2151,52 +2539,65 @@ func_import ()
       s,^dnl .*$,,
       s, dnl .*$,,
       /gl_LOCAL_DIR(/ {
-        s,^.*gl_LOCAL_DIR([[ ]*\([^])]*\).*$,cached_local_gnulib_dir="\1",p
+        s,^.*gl_LOCAL_DIR([[ ]*\([^]"$`\\)]*\).*$,cached_local_gnulib_dir="\1",p
       }
       /gl_MODULES(/ {
-        s,^.*gl_MODULES([[ ]*\([^])]*\).*$,cached_specified_modules="\1",p
+        ta
+        :a
+          s/)/)/
+          tb
+          N
+          ba
+        :b
+        s,^.*gl_MODULES([[ ]*\([^]"$`\\)]*\).*$,cached_specified_modules="\1",p
+      }
+      /gl_WITH_OBSOLETE/ {
+        s,^.*$,cached_incobsolete=true,p
       }
       /gl_AVOID(/ {
-        s,^.*gl_AVOID([[ ]*\([^])]*\).*$,cached_avoidlist="\1",p
+        s,^.*gl_AVOID([[ ]*\([^]"$`\\)]*\).*$,cached_avoidlist="\1",p
       }
       /gl_SOURCE_BASE(/ {
-        s,^.*gl_SOURCE_BASE([[ ]*\([^])]*\).*$,cached_sourcebase="\1",p
+        s,^.*gl_SOURCE_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_sourcebase="\1",p
       }
       /gl_M4_BASE(/ {
-        s,^.*gl_M4_BASE([[ ]*\([^])]*\).*$,cached_m4base="\1",p
+        s,^.*gl_M4_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_m4base="\1",p
       }
       /gl_PO_BASE(/ {
-        s,^.*gl_PO_BASE([[ ]*\([^])]*\).*$,cached_pobase="\1",p
+        s,^.*gl_PO_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_pobase="\1",p
       }
       /gl_DOC_BASE(/ {
-        s,^.*gl_DOC_BASE([[ ]*\([^])]*\).*$,cached_docbase="\1",p
+        s,^.*gl_DOC_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_docbase="\1",p
       }
       /gl_TESTS_BASE(/ {
-        s,^.*gl_TESTS_BASE([[ ]*\([^])]*\).*$,cached_testsbase="\1",p
+        s,^.*gl_TESTS_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_testsbase="\1",p
       }
       /gl_WITH_TESTS/ {
         s,^.*$,cached_inctests=true,p
       }
       /gl_LIB(/ {
-        s,^.*gl_LIB([[ ]*\([^])]*\).*$,cached_libname="\1",p
+        s,^.*gl_LIB([[ ]*\([^]"$`\\)]*\).*$,cached_libname="\1",p
       }
       /gl_LGPL(/ {
-        s,^.*gl_LGPL([[ ]*\([^])]*\).*$,cached_lgpl="\1",p
+        s,^.*gl_LGPL([[ ]*\([^]"$`\\)]*\).*$,cached_lgpl="\1",p
       }
       /gl_LGPL/ {
         s,^.*$,cached_lgpl=yes,p
       }
       /gl_MAKEFILE_NAME(/ {
-        s,^.*gl_MAKEFILE_NAME([[ ]*\([^])]*\).*$,cached_makefile_name="\1",p
+        s,^.*gl_MAKEFILE_NAME([[ ]*\([^]"$`\\)]*\).*$,cached_makefile_name="\1",p
       }
       /gl_LIBTOOL/ {
         s,^.*$,cached_libtool=true,p
       }
       /gl_MACRO_PREFIX(/ {
-        s,^.*gl_MACRO_PREFIX([[ ]*\([^])]*\).*$,cached_macro_prefix="\1",p
+        s,^.*gl_MACRO_PREFIX([[ ]*\([^]"$`\\)]*\).*$,cached_macro_prefix="\1",p
       }
       /gl_PO_DOMAIN(/ {
-        s,^.*gl_PO_DOMAIN([[ ]*\([^])]*\).*$,cached_po_domain="\1",p
+        s,^.*gl_PO_DOMAIN([[ ]*\([^]"$`\\)]*\).*$,cached_po_domain="\1",p
+      }
+      /gl_VC_FILES(/ {
+        s,^.*gl_VC_FILES([[ ]*\([^]"$`\\)]*\).*$,cached_vc_files="\1",p
       }'
     eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-cache.m4`
     if test -f "$destdir"/$m4base/gnulib-comp.m4; then
@@ -2211,6 +2612,7 @@ func_import ()
           :a
           s,^\]).*$,",
           tb
+          s,["$`\\],,g
           p
           n
           ba
@@ -2247,6 +2649,10 @@ func_import ()
   # 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"
+  # Included obsolete modules among the dependencies if specified either way.
+  if test -z "$incobsolete"; then
+    incobsolete="$cached_incobsolete"
+  fi
   # Append the cached and the specified avoidlist. This is probably better
   # than dropping the cached one when --avoid is specified at least once.
   avoidlist=`for m in $cached_avoidlist $avoidlist; do echo $m; done | LC_ALL=C sort -u`
@@ -2315,6 +2721,10 @@ func_import ()
   if test -z "$po_domain"; then
     po_domain="$cached_po_domain"
   fi
+  # The vc_files defaults to the cached one.
+  if test -z "$vc_files"; then
+    vc_files="$cached_vc_files"
+  fi
 
   # Canonicalize the list of specified modules.
   specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u`
@@ -2349,7 +2759,7 @@ func_import ()
   fi
   # Determine tests-related module list.
   echo "$final_modules" | LC_ALL=C sort -u > "$tmp"/final-modules
-  testsrelated_modules=`echo "$main_modules" | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/final-modules`
+  testsrelated_modules=`func_reset_sigpipe; echo "$main_modules" | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/final-modules`
   if test $verbose -ge 1; then
     echo "Tests-related module list:"
     echo "$testsrelated_modules" | sed -e 's/^/  /'
@@ -2366,15 +2776,15 @@ func_import ()
     func_verify_nontests_module
     if test -n "$module"; then
       all_files=`func_get_filelist $module`
-      lib_files=`for f in $all_files; do \
-                   case $f in \
-                     lib/*) echo $f ;; \
-                   esac; \
-                 done | sed -e 's,^lib/,,'`
-      if test -n "$lib_files"; then
-        use_libtests=true
-        break
-      fi
+      # Test whether some file in $all_files lies in lib/.
+      for f in $all_files; do
+        case $f in
+          lib/*)
+            use_libtests=true
+            break 2
+            ;;
+        esac
+      done
     fi
   done
 
@@ -2387,6 +2797,7 @@ func_import ()
 
   # If --lgpl, verify that the licenses of modules are compatible.
   if test -n "$lgpl"; then
+    license_incompatibilities=
     for module in $main_modules; do
       license=`func_get_license $module`
       case $license in
@@ -2397,13 +2808,13 @@ func_import ()
             yes | 3)
               case $license in
                 LGPL | LGPLv2+) ;;
-                *) func_fatal_error "incompatible license on module $module: $license" ;;
+                *) func_append license_incompatibilities "$module $license$nl" ;;
               esac
               ;;
             2)
               case $license in
                 LGPLv2+) ;;
-                *) func_fatal_error "incompatible license on module $module: $license" ;;
+                *) func_append license_incompatibilities "$module $license$nl" ;;
               esac
               ;;
             *) func_fatal_error "invalid value lgpl=$lgpl" ;;
@@ -2411,6 +2822,13 @@ func_import ()
           ;;
       esac
     done
+    if test -n "$license_incompatibilities"; then
+      # Format the license incompatibilities as a table.
+      sed_expand_column1_width50_indent17='s,^\([^ ]*\) ,\1                                                   ,
+s,^\(.................................................[^ ]*\) *,                 \1 ,'
+      license_incompatibilities=`echo "$license_incompatibilities" | sed -e "$sed_expand_column1_width50_indent17"`
+      func_fatal_error "incompatible license on modules:$nl$license_incompatibilities"
+    fi
   fi
 
   # Show banner notice of every module.
@@ -2451,11 +2869,22 @@ func_import ()
       sed_transform_main_lib_file=$sed_transform_main_lib_file'
         s/GNU Lesser General/GNU General/g
         s/GNU Library General/GNU General/g
-        s/version \(2\|2\.1\)\([ ,]\)/version 3\2/g
+        s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g
       '
     fi
   fi
 
+  # Determine script to apply to auxiliary files that go into $auxdir/.
+  sed_transform_build_aux_file=
+  if test -n "$do_copyrights"; then
+    # Update license.
+    sed_transform_build_aux_file=$sed_transform_build_aux_file'
+      s/GNU Lesser General/GNU General/g
+      s/GNU Library General/GNU General/g
+      s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g
+    '
+  fi
+
   # Determine script to apply to library files that go into $testsbase/.
   sed_transform_testsrelated_lib_file="$sed_transform_lib_file"
   if test -n "$do_copyrights"; then
@@ -2463,7 +2892,7 @@ func_import ()
     sed_transform_testsrelated_lib_file=$sed_transform_testsrelated_lib_file'
       s/GNU Lesser General/GNU General/g
       s/GNU Library General/GNU General/g
-      s/version \(2\|2\.1\)\([ ,]\)/version 3\2/g
+      s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g
     '
   fi
 
@@ -2499,20 +2928,25 @@ func_import ()
     func_append old_files " m4/gnulib-tool.m4"
   fi
 
+  rewritten='%REWRITTEN%'
   sed_rewrite_old_files="\
-    s,^build-aux/,$auxdir/,
-    s,^doc/,$cached_docbase/,
-    s,^lib/,$cached_sourcebase/,
-    s,^m4/,$cached_m4base/,
-    s,^tests/,$cached_testsbase/,
-    s,^tests=lib/,$cached_testsbase/,"
+    s,^build-aux/,$rewritten$auxdir/,
+    s,^doc/,$rewritten$cached_docbase/,
+    s,^lib/,$rewritten$cached_sourcebase/,
+    s,^m4/,$rewritten$cached_m4base/,
+    s,^tests/,$rewritten$cached_testsbase/,
+    s,^tests=lib/,$rewritten$cached_testsbase/,
+    s,^top/,$rewritten,
+    s,^$rewritten,,"
   sed_rewrite_new_files="\
-    s,^build-aux/,$auxdir/,
-    s,^doc/,$docbase/,
-    s,^lib/,$sourcebase/,
-    s,^m4/,$m4base/,
-    s,^tests/,$testsbase/,
-    s,^tests=lib/,$testsbase/,"
+    s,^build-aux/,$rewritten$auxdir/,
+    s,^doc/,$rewritten$docbase/,
+    s,^lib/,$rewritten$sourcebase/,
+    s,^m4/,$rewritten$m4base/,
+    s,^tests/,$rewritten$testsbase/,
+    s,^tests=lib/,$rewritten$testsbase/,
+    s,^top/,$rewritten,
+    s,^$rewritten,,"
 
   # Create directories.
   { echo "$sourcebase"
@@ -2549,23 +2983,6 @@ func_import ()
     exec 0<&5 5<&-
   }
 
-  # func_dest_tmpfilename file
-  # determines the name of a temporary file (file is relative to destdir).
-  # Sets variable:
-  #   - tmpfile       absolute filename of the temporary file
-  func_dest_tmpfilename ()
-  {
-    if $doit; then
-      # Put the new contents of $file in a file in the same directory (needed
-      # to guarantee that an 'mv' to "$destdir/$file" works).
-      tmpfile="$destdir/$1.tmp"
-    else
-      # Put the new contents of $file in a file in a temporary directory
-      # (because the directory of "$file" might not exist).
-      tmpfile="$tmp"/`basename "$1"`.tmp
-    fi
-  }
-
   # Copy files or make symbolic links. Remove obsolete files.
   added_files=''
   removed_files=''
@@ -2600,7 +3017,8 @@ func_import ()
   # Uses parameters
   # - f             the original file name
   # - g             the rewritten file name
-  # - already_present  nonempty if the file already exists, empty otherwise
+  # - already_present  nonempty if the file should already exist, empty
+  #                    otherwise
   func_add_or_update ()
   {
     of="$f"
@@ -2618,6 +3036,14 @@ func_import ()
           ;;
       esac
     fi
+    if test -n "$sed_transform_build_aux_file"; then
+      case "$of" in
+        build-aux/*)
+          sed -e "$sed_transform_build_aux_file" \
+            < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed"
+          ;;
+      esac
+    fi
     if test -n "$sed_transform_testsrelated_lib_file"; then
       case "$of" in
         tests=lib/*)
@@ -2628,52 +3054,12 @@ func_import ()
     fi
     if test -f "$destdir/$g"; then
       # The file already exists.
-      if cmp "$destdir/$g" "$tmpfile" > /dev/null; then
-        : # The file has not changed.
-      else
-        # Replace the file.
-        if $doit; then
-          if test -n "$already_present"; then
-            echo "Updating file $g (backup in ${g}~)"
-          else
-            echo "Replacing file $g (non-gnulib code backuped in ${g}~) !!"
-          fi
-          mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
-          if { test -n "$symbolic" \
-               || { test -n "$lsymbolic" \
-                    && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
-             && test -z "$lookedup_tmp" \
-             && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
-            func_ln_if_changed "$lookedup_file" "$destdir/$g"
-          else
-            mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
-          fi
-        else
-          if test -n "$already_present"; then
-            echo "Update file $g (backup in ${g}~)"
-          else
-            echo "Replace file $g (non-gnulib code backuped in ${g}~) !!"
-          fi
-        fi
-      fi
+      func_update_file
     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.
-      if $doit; then
-        echo "Copying file $g"
-        if { test -n "$symbolic" \
-             || { test -n "$lsymbolic" \
-                  && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
-           && test -z "$lookedup_tmp" \
-           && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
-          func_ln_if_changed "$lookedup_file" "$destdir/$g"
-        else
-          mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
-        fi
-      else
-        echo "Copy file $g"
-      fi
+      func_add_file
       func_append added_files "$g$nl"
     fi
     rm -f "$tmpfile"
@@ -2719,10 +3105,14 @@ func_import ()
     func_append actioncmd " --po-base=$pobase"
   fi
   func_append actioncmd " --doc-base=$docbase"
+  func_append actioncmd " --tests-base=$testsbase"
   func_append actioncmd " --aux-dir=$auxdir"
   if test -n "$inctests"; then
     func_append actioncmd " --with-tests"
   fi
+  if test -n "$incobsolete"; then
+    func_append actioncmd " --with-obsolete"
+  fi
   for module in $avoidlist; do
     func_append actioncmd " --avoid=$module"
   done
@@ -2745,6 +3135,13 @@ func_import ()
   if test -n "$po_domain"; then
     func_append actioncmd " --po-domain=$po_domain"
   fi
+  if test -n "$vc_files"; then
+    if test "$vc_files" = true; then
+      func_append actioncmd " --vc-files"
+    else
+      func_append actioncmd " --no-vc-files"
+    fi
+  fi
   func_append actioncmd " `echo $specified_modules`"
 
   # Default the makefile name to Makefile.am.
@@ -2757,8 +3154,61 @@ func_import ()
   # Create normal Makefile.ams.
   for_test=false
 
+  # Setup list of Makefile.am edits that are to be performed afterwards.
+  # Some of these edits apply to files that we will generate; others are
+  # under the responsibility of the developer.
+  makefile_am_edits=0
+  # func_note_Makefile_am_edit dir var value
+  # remembers that ${dir}Makefile.am needs to be edited to that ${var} mentions
+  # ${value}.
+  func_note_Makefile_am_edit ()
+  {
+    makefile_am_edits=`expr $makefile_am_edits + 1`
+    eval makefile_am_edit${makefile_am_edits}_dir=\"\$1\"
+    eval makefile_am_edit${makefile_am_edits}_var=\"\$2\"
+    eval makefile_am_edit${makefile_am_edits}_val=\"\$3\"
+  }
+  if test "$makefile_am" = Makefile.am; then
+    sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
+    sourcebase_base=`basename "$sourcebase"`
+    func_note_Makefile_am_edit "$sourcebase_dir" SUBDIRS "$sourcebase_base"
+  fi
+  if test -n "$pobase"; then
+    pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
+    pobase_base=`basename "$pobase"`
+    func_note_Makefile_am_edit "$pobase_dir" SUBDIRS "$pobase_base"
+  fi
+  if test -n "$inctests"; then
+    if test "$makefile_am" = Makefile.am; then
+      testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
+      testsbase_base=`basename "$testsbase"`
+      func_note_Makefile_am_edit "$testsbase_dir" SUBDIRS "$testsbase_base"
+    fi
+  fi
+  func_note_Makefile_am_edit "" ACLOCAL_AMFLAGS "-I ${m4base}"
+  {
+    # Find the first parent directory of $m4base that contains or will contain
+    # a Makefile.am.
+    sed_last='s,^.*/\([^/][^/]*\)//*$,\1/,
+s,//*$,/,'
+    sed_butlast='s,[^/][^/]*//*$,,'
+    dir1="${m4base}/"; dir2=""
+    while test -n "$dir1" \
+          && ! { test -f "${destdir}/${dir1}Makefile.am" \
+                 || test "${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+                 || test "./${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+                 || { test -n "$inctests" \
+                      && { test "${dir1}Makefile.am" = "$testsbase/$makefile_am" \
+                           || test "./${dir1}Makefile.am" = "$testsbase/$makefile_am"; }; }; }; do
+      dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2"
+      dir1=`echo "$dir1" | sed -e "$sed_butlast"`
+    done
+    func_note_Makefile_am_edit "$dir1" EXTRA_DIST "${dir2}gnulib-cache.m4"
+  }
+
   # Create library makefile.
   func_dest_tmpfilename $sourcebase/$makefile_am
+  destfile="$sourcebase/$makefile_am"
   modules="$main_modules"
   func_emit_lib_Makefile_am > "$tmpfile"
   if test -f "$destdir"/$sourcebase/$makefile_am; then
@@ -2816,7 +3266,7 @@ func_import ()
         func_append added_files "$pobase/$file$nl"
       fi
     done
-    # Create po makefile parametrization, part 1.
+    # Create po makefile parameterization, part 1.
     func_dest_tmpfilename $pobase/Makevars
     func_emit_po_Makevars > "$tmpfile"
     if test -f "$destdir"/$pobase/Makevars; then
@@ -2842,7 +3292,7 @@ func_import ()
       fi
       func_append added_files "$pobase/Makevars$nl"
     fi
-    # Create po makefile parametrization, part 2.
+    # Create po makefile parameterization, part 2.
     func_dest_tmpfilename $pobase/POTFILES.in
     func_emit_po_POTFILES_in > "$tmpfile"
     if test -f "$destdir"/$pobase/POTFILES.in; then
@@ -2945,7 +3395,10 @@ func_import ()
         esac ;;
     esac
     echo "gl_LOCAL_DIR([$relative_local_gnulib_dir])"
-    echo "gl_MODULES(["`echo $specified_modules`"])"
+    echo "gl_MODULES(["
+    echo "$specified_modules" | sed 's/^/  /g'
+    echo "])"
+    test -z "$incobsolete" || echo "gl_WITH_OBSOLETE"
     echo "gl_AVOID([$avoidlist])"
     echo "gl_SOURCE_BASE([$sourcebase])"
     echo "gl_M4_BASE([$m4base])"
@@ -2967,6 +3420,9 @@ func_import ()
     fi
     echo "gl_MACRO_PREFIX([$macro_prefix])"
     echo "gl_PO_DOMAIN([$po_domain])"
+    if test -n "$vc_files"; then
+      echo "gl_VC_FILES([$vc_files])"
+    fi
   ) > "$tmpfile"
   if test -f "$destdir"/$m4base/gnulib-cache.m4; then
     if cmp "$destdir"/$m4base/gnulib-cache.m4 "$tmpfile" > /dev/null; then
@@ -3022,9 +3478,6 @@ func_import ()
     if test -n "$uses_subdirs"; then
       echo "  AC_REQUIRE([AM_PROG_CC_C_O])"
     fi
-    if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 >/dev/null 2>/dev/null; then
-      echo "  AC_REQUIRE([AC_GNU_SOURCE])"
-    fi
     for module in $final_modules; do
       func_verify_module
       if test -n "$module"; then
@@ -3055,7 +3508,7 @@ func_import ()
           ba
         }'
     else
-      sed_replace_build_aux=
+      sed_replace_build_aux="$sed_noop"
     fi
     func_emit_initmacro_start $macro_prefix
     echo "  gl_source_base='$sourcebase'"
@@ -3147,6 +3600,7 @@ func_import ()
   if test -n "$inctests"; then
     # Create tests makefile.
     func_dest_tmpfilename $testsbase/$makefile_am
+    destfile="$testsbase/$makefile_am"
     modules="$testsrelated_modules"
     func_emit_tests_Makefile_am > "$tmpfile"
     if test -f "$destdir"/$testsbase/$makefile_am; then
@@ -3174,88 +3628,108 @@ func_import ()
     fi
   fi
 
-  # Update the .cvsignore and .gitignore files.
-  { echo "$added_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|A|\1,'
-    echo "$removed_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|R|\1,'
-  } | LC_ALL=C sort -t'|' -k1,1 > "$tmp"/fileset-changes
-  { # Rearrange file descriptors. Needed because "while ... done < ..."
-    # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
-    exec 5<&0 < "$tmp"/fileset-changes
-    func_update_ignorelist ()
-    {
-      ignore="$1"
-      if test -f "$destdir/$dir$ignore"; then
-        if test -n "$dir_added" || test -n "$dir_removed"; then
-          LC_ALL=C sort "$destdir/$dir$ignore" > "$tmp"/ignore
-          echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u \
-            | LC_ALL=C join -v 2 "$tmp"/ignore - > "$tmp"/ignore-added
-          echo "$dir_removed" | sed -e '/^$/d' | LC_ALL=C sort -u \
-            | LC_ALL=C join -v 2 "$tmp"/ignore - > "$tmp"/ignore-removed
-          if test -s "$tmp"/ignore-added || test -s "$tmp"/ignore-removed; then
+  if test "$vc_files" != false; then
+    # Update the .cvsignore and .gitignore files.
+    { echo "$added_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|A|\1,'
+      echo "$removed_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|R|\1,'
+      # Treat gnulib-comp.m4 like an added file, even if it already existed.
+      echo "$m4base/|A|gnulib-comp.m4"
+    } | LC_ALL=C sort -t'|' -k1,1 > "$tmp"/fileset-changes
+    { # Rearrange file descriptors. Needed because "while ... done < ..."
+      # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+      exec 5<&0 < "$tmp"/fileset-changes
+      func_update_ignorelist ()
+      {
+        ignore="$1"
+        if test "$ignore" = .gitignore; then
+          # In a .gitignore file, "foo" applies to the current directory and all
+          # subdirectories, whereas "/foo" applies to the current directory only.
+          anchor='/'
+          escaped_anchor='\/'
+          doubly_escaped_anchor='\\/'
+        else
+          anchor=''
+          escaped_anchor=''
+          doubly_escaped_anchor=''
+        fi
+        if test -f "$destdir/$dir$ignore"; then
+          if test -n "$dir_added" || test -n "$dir_removed"; then
+            sed -e "s|^$anchor||" < "$destdir/$dir$ignore" | LC_ALL=C sort > "$tmp"/ignore
+            (func_reset_sigpipe
+             echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u \
+               | LC_ALL=C join -v 1 - "$tmp"/ignore > "$tmp"/ignore-added
+             echo "$dir_removed" | sed -e '/^$/d' | LC_ALL=C sort -u \
+               | LC_ALL=C join -v 1 - "$tmp"/ignore > "$tmp"/ignore-removed
+            )
+            if test -s "$tmp"/ignore-added || test -s "$tmp"/ignore-removed; then
+              if $doit; then
+                echo "Updating $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
+                mv -f "$destdir/$dir$ignore" "$destdir/$dir$ignore"~
+                { sed -e 's,/,\\/,g' -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed
+                  if test -n "$anchor"; then sed -e 's,/,\\/,g' -e "s,^,/^${doubly_escaped_anchor}," -e 's,$,$/d,' < "$tmp"/ignore-removed; fi
+                } > "$tmp"/sed-ignore-removed
+                { cat "$destdir/$dir$ignore"~
+                  sed -e "s|^|$anchor|" < "$tmp"/ignore-added
+                } | sed -f "$tmp"/sed-ignore-removed \
+                  > "$destdir/$dir$ignore"
+              else
+                echo "Update $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
+              fi
+            fi
+          fi
+        else
+          if test -n "$dir_added"; then
             if $doit; then
-              echo "Updating $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
-              mv -f "$destdir/$dir$ignore" "$destdir/$dir$ignore"~
-              sed -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed > "$tmp"/sed-ignore-removed
-              cat "$destdir/$dir$ignore"~ "$tmp"/ignore-added \
-                | sed -f "$tmp"/sed-ignore-removed \
-                > "$destdir/$dir$ignore"
+              echo "Creating $destdir/$dir$ignore"
+              {
+                if test "$ignore" = .cvsignore; then
+                  echo ".deps"
+                  # Automake generates Makefile rules that create .dirstamp files.
+                  echo ".dirstamp"
+                fi
+                echo "$dir_added" | sed -e '/^$/d' -e "s|^|$anchor|" | LC_ALL=C sort -u
+              } > "$destdir/$dir$ignore"
             else
-              echo "Update $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
+              echo "Create $destdir/$dir$ignore"
             fi
           fi
         fi
-      else
-        if test -n "$dir_added"; then
-          if $doit; then
-            echo "Creating $destdir/$dir$ignore"
-            {
-              if test "$ignore" = .cvsignore; then
-                echo ".deps"
-                # Automake generates Makefile rules that create .dirstamp files.
-                echo ".dirstamp"
-              fi
-              echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u
-            } > "$destdir/$dir$ignore"
-          else
-            echo "Create $destdir/$dir$ignore"
-          fi
+      }
+      func_done_dir ()
+      {
+        dir="$1"
+        dir_added="$2"
+        dir_removed="$3"
+        if test -d "$destdir/CVS" || test -d "$destdir/${dir}CVS" || test -f "$destdir/${dir}.cvsignore"; then
+          func_update_ignorelist .cvsignore
         fi
-      fi
-    }
-    func_done_dir ()
-    {
-      dir="$1"
-      dir_added="$2"
-      dir_removed="$3"
-      if test -d "$destdir/CVS" || test -d "$destdir/${dir}CVS" || test -f "$destdir/${dir}.cvsignore"; then
-        func_update_ignorelist .cvsignore
-      fi
-      if test -d "$destdir/.git" || test -f "$destdir/${dir}.gitignore"; then
-        func_update_ignorelist .gitignore
-      fi
+        if test -d "$destdir/.git" || test -f "$destdir/${dir}.gitignore"; then
+          func_update_ignorelist .gitignore
+        fi
+      }
+      last_dir=
+      last_dir_added=
+      last_dir_removed=
+      while read line; do
+        # Why not ''read next_dir op file'' ? Because the dir column can be empty.
+        next_dir=`echo "$line" | sed -e 's,|.*,,'`
+        op=`echo "$line" | sed -e 's,^[^|]*|\([^|]*\)|.*$,\1,'`
+        file=`echo "$line" | sed -e 's,^[^|]*|[^|]*|,,'`
+        if test "$next_dir" != "$last_dir"; then
+          func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed"
+          last_dir="$next_dir"
+          last_dir_added=
+          last_dir_removed=
+        fi
+        case $op in
+          A) func_append last_dir_added "$file$nl";;
+          R) func_append last_dir_removed "$file$nl";;
+        esac
+      done
+      func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed"
+      exec 0<&5 5<&-
     }
-    last_dir=
-    last_dir_added=
-    last_dir_removed=
-    while read line; do
-      # Why not ''read next_dir op file'' ? Because the dir column can be empty.
-      next_dir=`echo "$line" | sed -e 's,|.*,,'`
-      op=`echo "$line" | sed -e 's,^[^|]*|\([^|]*\)|.*$,\1,'`
-      file=`echo "$line" | sed -e 's,^[^|]*|[^|]*|,,'`
-      if test "$next_dir" != "$last_dir"; then
-        func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed"
-        last_dir="$next_dir"
-        last_dir_added=
-        last_dir_removed=
-      fi
-      case $op in
-        A) func_append last_dir_added "$file$nl";;
-        R) func_append last_dir_removed "$file$nl";;
-      esac
-    done
-    func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed"
-    exec 0<&5 5<&-
-  }
+  fi
 
   echo "Finished."
   echo
@@ -3319,24 +3793,16 @@ func_import ()
       echo "  - \"include $makefile_name\" from within \"$testsbase/Makefile.am\","
     fi
   fi
-  if test "$makefile_am" = Makefile.am; then
-    sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
-    sourcebase_base=`basename "$sourcebase"`
-    echo "  - mention \"${sourcebase_base}\" in SUBDIRS in ${sourcebase_dir}Makefile.am,"
-  fi
-  if test -n "$pobase"; then
-    pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
-    pobase_base=`basename "$pobase"`
-    echo "  - mention \"${pobase_base}\" in SUBDIRS in ${pobase_dir}Makefile.am,"
-  fi
-  if test -n "$inctests"; then
-    if test "$makefile_am" = Makefile.am; then
-      testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
-      testsbase_base=`basename "$testsbase"`
-      echo "  - mention \"${testsbase_base}\" in SUBDIRS in ${testsbase_dir}Makefile.am,"
+  edit=0
+  while test $edit != $makefile_am_edits; do
+    edit=`expr $edit + 1`
+    eval dir=\"\$makefile_am_edit${edit}_dir\"
+    eval var=\"\$makefile_am_edit${edit}_var\"
+    eval val=\"\$makefile_am_edit${edit}_val\"
+    if test -n "$var"; then
+      echo "  - mention \"${val}\" in ${var} in ${dir}Makefile.am,"
     fi
-  fi
-  echo "  - mention \"-I ${m4base}\" in ACLOCAL_AMFLAGS in Makefile.am,"
+  done
   echo "  - invoke ${macro_prefix}_EARLY in $configure_ac, right after AC_PROG_CC,"
   echo "  - invoke ${macro_prefix}_INIT in $configure_ac."
 }
@@ -3352,10 +3818,9 @@ func_create_testdir ()
   if test -z "$modules"; then
     # All modules together.
     # Except config-h, which breaks all modules which use HAVE_CONFIG_H.
-    # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME.
     # Except ftruncate, mountlist, which abort the configuration on mingw. FIXME.
     modules=`func_all_modules`
-    modules=`for m in $modules; do case $m in config-h | fnmatch-posix | ftruncate | mountlist) ;; *) echo $m;; esac; done`
+    modules=`for m in $modules; do case $m in config-h | ftruncate | mountlist) ;; *) echo $m;; esac; done`
   fi
   modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u`
 
@@ -3418,6 +3883,7 @@ func_create_testdir ()
   testsbase=gltests
   macro_prefix=gl
   po_domain=
+  vc_files=
 
   # Determine final module list.
   func_modules_transitive_closure
@@ -3439,12 +3905,15 @@ func_create_testdir ()
     echo "$files" | sed -e 's/^/  /'
   fi
 
+  rewritten='%REWRITTEN%'
   sed_rewrite_files="\
-    s,^build-aux/,$auxdir/,
-    s,^doc/,$docbase/,
-    s,^lib/,$sourcebase/,
-    s,^m4/,$m4base/,
-    s,^tests/,$testsbase/,"
+    s,^build-aux/,$rewritten$auxdir/,
+    s,^doc/,$rewritten$docbase/,
+    s,^lib/,$rewritten$sourcebase/,
+    s,^m4/,$rewritten$m4base/,
+    s,^tests/,$rewritten$testsbase/,
+    s,^top/,$rewritten,
+    s,^$rewritten,,"
 
   # Create directories.
   for f in $files; do echo $f; done \
@@ -3491,8 +3960,12 @@ func_create_testdir ()
   # Create Makefile.ams that are for testing.
   for_test=true
 
+  # No special edits are needed.
+  makefile_am_edits=0
+
   # Create $sourcebase/Makefile.am.
   mkdir -p "$testdir/$sourcebase"
+  destfile="$sourcebase/Makefile.am"
   func_emit_lib_Makefile_am > "$testdir/$sourcebase/Makefile.am"
   any_uses_subdirs="$uses_subdirs"
 
@@ -3528,6 +4001,7 @@ func_create_testdir ()
     auxdir=`echo "$testsbase/"|sed 's%[^/][^/]*//*%../%g'`"$auxdir"
     # Create $testsbase/Makefile.am.
     use_libtests=false
+    destfile="$testsbase/Makefile.am"
     func_emit_tests_Makefile_am > "$testdir/$testsbase/Makefile.am"
     any_uses_subdirs="$any_uses_subdirs$uses_subdirs"
     # Create $testsbase/configure.ac.
@@ -3543,14 +4017,17 @@ func_create_testdir ()
      echo "AC_PROG_MAKE_SET"
      echo "AC_PROG_RANLIB"
      echo
-     if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then
-       echo "AC_GNU_SOURCE"
-       echo
-     fi
      for module in $modules; do
        func_verify_module
        if test -n "$module"; then
-         func_get_autoconf_early_snippet "$module"
+         case $module in
+           gnumakefile | maintainer-makefile)
+             # These modules are meant to be used only in the top-level directory.
+             ;;
+           *)
+             func_get_autoconf_early_snippet "$module"
+             ;;
+         esac
        fi
      done \
        | sed -e '/^$/d;' -e 's/AC_REQUIRE(\[\([^()]*\)\])/\1/'
@@ -3585,8 +4062,15 @@ func_create_testdir ()
      for module in $modules; do
        func_verify_nontests_module
        if test -n "$module"; then
-         func_get_autoconf_snippet "$module" \
-           | sed -e "$sed_replace_build_aux"
+         case $module in
+           gnumakefile | maintainer-makefile)
+             # These modules are meant to be used only in the top-level directory.
+             ;;
+           *)
+             func_get_autoconf_snippet "$module" \
+               | sed -e "$sed_replace_build_aux"
+             ;;
+         esac
        fi
      done
      echo "gl_source_base='.'"
@@ -3662,10 +4146,6 @@ func_create_testdir ()
      echo "AM_PROG_CC_C_O"
      echo
    fi
-   if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then
-     echo "AC_GNU_SOURCE"
-     echo
-   fi
    for module in $modules; do
      func_verify_nontests_module
      if test -n "$module"; then
@@ -3698,7 +4178,7 @@ func_create_testdir ()
          ba
        }'
    else
-     sed_replace_build_aux=
+     sed_replace_build_aux="$sed_noop"
    fi
    func_emit_initmacro_start $macro_prefix
    echo "gl_source_base='$sourcebase'"
@@ -3746,7 +4226,9 @@ func_create_testdir ()
    if test -f $m4base/gettext.m4; then
      func_execute_command ${AUTOPOINT} --force || func_exit 1
      for f in $m4base/*.m4~; do
-       mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1
+       if test -f $f; then
+         mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1
+       fi
      done
    fi
    func_execute_command ${ACLOCAL} -I $m4base || func_exit 1
@@ -3765,7 +4247,9 @@ func_create_testdir ()
      if test -f ../$m4base/gettext.m4; then
        func_execute_command ${AUTOPOINT} --force || func_exit 1
        for f in ../$m4base/*.m4~; do
-         mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1
+         if test -f $f; then
+           mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1
+         fi
        done
      fi
      func_execute_command ${ACLOCAL} -I ../$m4base || func_exit 1
@@ -3800,9 +4284,9 @@ func_create_testdir ()
      ./configure || func_exit 1
        cd "$sourcebase"
        echo 'built_sources: $(BUILT_SOURCES)' >> Makefile
-       make built_sources || func_exit 1
+       $MAKE built_sources || func_exit 1
        cd ..
-     make distclean || func_exit 1
+     $MAKE distclean || func_exit 1
     ) || func_exit 1
   fi
 }
@@ -3827,8 +4311,7 @@ func_create_megatestdir ()
   done
   # Then, all modules all together.
   # Except config-h, which breaks all modules which use HAVE_CONFIG_H.
-  # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME.
-  allmodules=`for m in $allmodules; do if test $m != config-h && test $m != fnmatch-posix; then echo $m; fi; done`
+  allmodules=`for m in $allmodules; do if test $m != config-h; then echo $m; fi; done`
   func_create_testdir "$megatestdir/ALL" "$allmodules"
   func_append megasubdirs "ALL"
 
@@ -3855,6 +4338,7 @@ func_create_megatestdir ()
                    -e 's,^\([0-9]*\) \([0-9]*\) \([0-9]*\),\3\2\1,'`
   (echo '#!/bin/sh'
    echo "CVSDATE=$cvsdate"
+   echo ": \${MAKE=make}"
    echo "test -d logs || mkdir logs"
    echo "for module in $megasubdirs; do"
    echo "  echo \"Working on module \$module...\""
@@ -3866,7 +4350,7 @@ func_create_megatestdir ()
    echo "   : autobuild revision... cvs-\$CVSDATE-000000"
    echo "   : autobuild timestamp... \`date \"+%Y%m%d-%H%M%S\"\`"
    echo "   : autobuild hostname... \`hostname\`"
-   echo "   cd \$module && ./configure \$CONFIGURE_OPTIONS && make && make check && make distclean"
+   echo "   cd \$module && ./configure \$CONFIGURE_OPTIONS && \$MAKE && \$MAKE check && \$MAKE distclean"
    echo "   echo rc=\$?"
    echo "  ) 2>&1 | { if test -n \"\$AUTOBUILD_SUBST\"; then sed -e \"\$AUTOBUILD_SUBST\"; else cat; fi; } > logs/\$safemodule"
    echo "done"
@@ -3945,7 +4429,7 @@ case $mode in
       s,^dnl .*$,,
       s, dnl .*$,,
       /AC_CONFIG_AUX_DIR/ {
-        s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^])]*\).*$,guessed_auxdir="\1",p
+        s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^]"$`\\)]*\).*$,guessed_auxdir="\1",p
       }
       /A[CM]_PROG_LIBTOOL/ {
         s,^.*$,guessed_libtool=true,p
@@ -4034,9 +4518,9 @@ case $mode in
             for m4base in $m4dirs; do
               # Perform func_import in a subshell, so that variable values
               # such as
-              #   local_gnulib_dir, avoidlist, sourcebase, m4base, pobase,
-              #   docbase, testsbase, inctests, libname, lgpl, makefile_name,
-              #   libtool, macro_prefix, po_domain
+              #   local_gnulib_dir, incobsolete, avoidlist, sourcebase, m4base,
+              #   pobase, docbase, testsbase, inctests, libname, lgpl,
+              #   makefile_name, libtool, macro_prefix, po_domain, vc_files
               # don't propagate from one directory to another.
               (func_import) || func_exit 1
             done
@@ -4078,9 +4562,9 @@ case $mode in
       mkdir build
       cd build
         ../configure || func_exit 1
-        make || func_exit 1
-        make check || func_exit 1
-        make distclean || func_exit 1
+        $MAKE || func_exit 1
+        $MAKE check || func_exit 1
+        $MAKE distclean || func_exit 1
         remaining=`find . -type f -print`
         if test -n "$remaining"; then
           echo "Remaining files:" $remaining 1>&2
@@ -4101,9 +4585,9 @@ case $mode in
       mkdir build
       cd build
         ../configure
-        make
-        make check
-        make distclean
+        $MAKE
+        $MAKE check
+        $MAKE distclean
         remaining=`find . -type f -print`
         if test -n "$remaining"; then
           echo "Remaining files:" $remaining 1>&2
@@ -4125,6 +4609,16 @@ case $mode in
     done
     ;;
 
+  extract-status )
+    for module
+    do
+      func_verify_module
+      if test -n "$module"; then
+        func_get_status "$module"
+      fi
+    done
+    ;;
+
   extract-notice )
     for module
     do
@@ -4225,6 +4719,66 @@ case $mode in
     done
     ;;
 
+  copy-file )
+    # Verify the number of arguments.
+    if test $# -lt 1 || test $# -gt 2; then
+      func_fatal_error "invalid number of arguments for --$mode"
+    fi
+
+    # The first argument is the file to be copied.
+    f="$1"
+    # Verify the file exists.
+    func_lookup_file "$f"
+
+    # The second argument is the destination; either a directory ot a file.
+    # It defaults to the current directory.
+    dest="$2"
+    test -n "$dest" || dest='.'
+    test -n "$sourcebase" || sourcebase="lib"
+    test -n "$m4base" || m4base="m4"
+    test -n "$docbase" || docbase="doc"
+    test -n "$testsbase" || testsbase="tests"
+    test -n "$auxdir" || auxdir="build-aux"
+    rewritten='%REWRITTEN%'
+    sed_rewrite_files="\
+      s,^build-aux/,$rewritten$auxdir/,
+      s,^doc/,$rewritten$docbase/,
+      s,^lib/,$rewritten$sourcebase/,
+      s,^m4/,$rewritten$m4base/,
+      s,^tests/,$rewritten$testsbase/,
+      s,^top/,$rewritten,
+      s,^$rewritten,,"
+    if test -d "$dest"; then
+      destdir="$dest"
+      g=`echo "$f" | sed -e "$sed_rewrite_files"`
+    else
+      destdir=`dirname "$dest"`
+      g=`basename "$dest"`
+    fi
+
+    # Create the directory for destfile.
+    d=`dirname "$destdir/$g"`
+    if $doit; then
+      if test -n "$d" && test ! -d "$d"; then
+        mkdir -p "$d" || func_fatal_error "failed"
+      fi
+    fi
+    # Copy the file.
+    func_dest_tmpfilename "$g"
+    cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed"
+    already_present=true
+    if test -f "$destdir/$g"; then
+      # The file already exists.
+      func_update_file
+    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.
+      func_add_file
+    fi
+    rm -f "$tmpfile"
+    ;;
+
   * )
     func_fatal_error "unknown operation mode --$mode" ;;
 esac