Manual: improve out-of-memory documentation.
[gnulib.git] / gnulib-tool
index 2ec7799..cb643a7 100755 (executable)
@@ -109,10 +109,10 @@ fi
 sed_noop='s,x,x,'
 
 # sed_comments is true or false, depending whether 'sed' supports comments.
-# (The GNU autoconf doc says that sed comments are not portable, but does
-# not say which 'sed' versions are affected.)
+# AIX 5.3 sed barfs over indented comments.
 if echo fo | sed -e 's/f/g/
 # s/o/u/
+ # indented comment
 s/o/e/' 2>/dev/null | grep ge > /dev/null; then
   sed_comments=true
 else
@@ -123,10 +123,24 @@ fi
 # outputs to stdout the --help usage message.
 func_usage ()
 {
+  # This use of bold display can be removed on 2011-01-01.
+  if case "$TERM" in
+       xterm*) test -t 1;;
+       *) false;;
+     esac; then
+    # Assume xterm compatible escape sequences.
+    bold_on=`printf '\x1b[1m'`
+    bold_off=`printf '\x1b[0m'`
+  else
+    bold_on=
+    bold_off=
+  fi
   echo "\
 Usage: gnulib-tool --list
-       gnulib-tool --find filename
+       gnulib-tool --find filename${bold_on}
        gnulib-tool --import [module1 ... moduleN]
+       gnulib-tool --add-import [module1 ... moduleN]
+       gnulib-tool --remove-import [module1 ... moduleN]${bold_off}
        gnulib-tool --update
        gnulib-tool --create-testdir --dir=directory [module1 ... moduleN]
        gnulib-tool --create-megatestdir --dir=directory [module1 ... moduleN]
@@ -149,13 +163,18 @@ Usage: gnulib-tool --list
        gnulib-tool --copy-file file [destination]
 
 Operation modes:
+
       --list                print the available module names
-      --find                find the modules which contain the specified file
-      --import              import the given modules into the current package;
+      --find                find the modules which contain the specified file${bold_on}
+      --import              import the given modules into the current package
+      --add-import          augment the list of imports from gnulib into the
+                            current package, by adding the given modules;
                             if no modules are specified, update the current
                             package from the current gnulib
+      --remove-import       reduce the list of imports from gnulib into the
+                            current package, by removing the given modules${bold_off}
       --update              update the current package, restore files omitted
-                            from CVS
+                            from version control
       --create-testdir      create a scratch package with the given modules
       --create-megatestdir  create a mega scratch package with the given modules
                             one by one and all together
@@ -181,6 +200,7 @@ Operation modes:
       --copy-file                  copy a file that is not part of any module
 
 General options:
+
       --dir=DIRECTORY       Specify the target directory.
                             For --import, this specifies where your
                             configure.ac can be found.  Defaults to current
@@ -192,21 +212,34 @@ General options:
       --verbose             Increase verbosity. May be repeated.
       --quiet               Decrease verbosity. May be repeated.
 
-Options for --import, --update:
+Options for --import, --add/remove-import, --update:
+
       --dry-run             Only print what would have been done.
 
-Options for --import, --create-[mega]testdir, --[mega]test:
+Options for --import, --add/remove-import,
+            --create-[mega]testdir, --[mega]test:
+
       --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.
+      --with-c++-tests      Include even unit tests for C++ interoperability.
+      --with-longrunning-tests
+                            Include even unit tests that are long-runners.
+      --with-privileged-tests
+                            Include even unit tests that require root
+                            privileges.
+      --with-unportable-tests
+                            Include even unit tests that fail on some platforms.
+      --with-all-tests      Include all kinds of problematic unit tests.
       --avoid=MODULE        Avoid including the given MODULE. Useful if you
                             have code that provides equivalent functionality.
                             This option can be repeated.
       --libtool             Use libtool rules.
       --no-libtool          Don't use libtool rules.
 
-Options for --import:
+Options for --import, --add/remove-import:
+
       --lib=LIBRARY         Specify the library name.  Defaults to 'libgnu'.
       --source-base=DIRECTORY
                             Directory relative to --dir where source code is
@@ -221,7 +254,7 @@ Options for --import:
                             Directory relative to --dir where unit tests are
                             placed (default \"tests\").
       --aux-dir=DIRECTORY   Directory relative to --dir where auxiliary build
-                            tools are placed (default \"build-aux\").
+                            tools are placed (default comes from configure.ac).
       --lgpl[=2|=3]         Abort if modules aren't available under the LGPL.
                             Also modify license template from GPL to LGPL.
                             The version number of the LGPL can be specified;
@@ -233,26 +266,30 @@ 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.
-      --with-c++-tests      Include even unit tests for C++ interoperability.
-      --with-longrunning-tests
-                            Include even unit tests that are long-runners.
-      --with-privileged-tests
-                            Include even unit tests that require root
-                            privileges.
-      --with-unportable-tests
-                            Include even unit tests that fail on some platforms.
-      --with-all-tests      Include all kinds of problematic unit tests.
       --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, --update, --create-[mega]testdir, --[mega]test:
+Options for --create-[mega]testdir, --[mega]test:
+
+      --without-c++-tests   Exclude unit tests for C++ interoperability.
+      --without-longrunning-tests
+                            Exclude unit tests that are long-runners.
+      --without-privileged-tests
+                            Exclude unit tests that require root privileges.
+      --without-unportable-tests
+                            Exclude unit tests that fail on some platforms.
+
+Options for --import, --add/remove-import, --update,
+            --create-[mega]testdir, --[mega]test:
+
   -s, --symbolic, --symlink Make symbolic links instead of copying files.
       --local-symlink       Make symbolic links instead of copying files, only
                             for files from the local override directory.
 
-Options for --import, --update:
+Options for --import, --add/remove-import, --update:
+
   -S, --more-symlinks       Make symbolic links instead of copying files, and
                             don't replace copyright notices.
 
@@ -363,15 +400,14 @@ func_gnulib_dir ()
       # explicit canonicalization command when $PATH contains no empty fields.
       self_abspathname=
       if test "${PATH_SEPARATOR+set}" != set; then
-        func_tmpdir
-        { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
-        chmod +x "$tmp"/conf.sh
-        if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
-          PATH_SEPARATOR=';'
-        else
-          PATH_SEPARATOR=:
-        fi
-        rm -rf "$tmp"
+        # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+        # contains only /bin. Note that ksh looks also at the FPATH variable,
+        # so we have to set that as well for the test.
+        PATH_SEPARATOR=:
+        (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+          && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+                 || PATH_SEPARATOR=';'
+             }
       fi
       if test "$PATH_SEPARATOR" = ";"; then
         # On Windows, programs are searched in "." before $PATH.
@@ -810,20 +846,24 @@ fi
 # that the top-level statement containing the test starts after the 'alias'
 # command.
 if test -z "$have_echo"; then
-bsd_echo ()
+  bsd_echo ()
 {
 cat <<EOF
 $*
 EOF
 }
-alias echo=bsd_echo 2>/dev/null
+  if (alias echo=bsd_echo) 2>/dev/null; then
+    alias echo=bsd_echo 2>/dev/null
+  fi
 fi
 if test -z "$have_echo" \
    && echo '\t' | grep t > /dev/null; then
   have_echo=yes
 fi
 if test -z "$have_echo"; then
-  unalias echo 2>/dev/null
+  if (alias echo=bsd_echo) 2>/dev/null; then
+    unalias echo 2>/dev/null
+  fi
 fi
 # For Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh.
 if test -z "$have_echo" \
@@ -853,7 +893,8 @@ fi
 
 # Command-line option processing.
 # Removes the OPTIONS from the arguments. Sets the variables:
-# - mode            list or import or create-testdir or create-megatestdir
+# - mode            list or import or add-import or remove-import or update
+#                   or create-testdir or create-megatestdir
 # - destdir         from --dir
 # - local_gnulib_dir  from --local-dir
 # - modcache        true or false, from --cache-modules/--no-cache-modules
@@ -875,6 +916,13 @@ fi
 # - inc_unportable_tests  true if --with-unportable-tests was given, blank
 #                         otherwise
 # - inc_all_tests   true if --with-all-tests was given, blank otherwise
+# - excl_cxx_tests  true if --without-c++-tests was given, blank otherwise
+# - excl_longrunning_tests  true if --without-longrunning-tests was given,
+#                           blank otherwise
+# - excl_privileged_tests  true if --without-privileged-tests was given, blank
+#                          otherwise
+# - excl_unportable_tests  true if --without-unportable-tests 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
@@ -912,6 +960,10 @@ fi
   inc_privileged_tests=
   inc_unportable_tests=
   inc_all_tests=
+  excl_cxx_tests=
+  excl_longrunning_tests=
+  excl_privileged_tests=
+  excl_unportable_tests=
   avoidlist=
   lgpl=
   makefile_name=
@@ -938,6 +990,12 @@ fi
       --import | --impor | --impo | --imp | --im | --i )
         mode=import
         shift ;;
+      --add-import | --add-impor | --add-impo | --add-imp | --add-im | --add-i | --add- | --add | --ad )
+        mode=add-import
+        shift ;;
+      --remove-import | --remove-impor | --remove-impo | --remove-imp | --remove-im | --remove-i | --remove- | --remove | --remov | --remo | --rem | --re | --r )
+        mode=remove-import
+        shift ;;
       --update | --updat | --upda | --upd | --up | --u )
         mode=update
         shift ;;
@@ -1084,6 +1142,18 @@ fi
       --with-all-tests | --with-all-test | --with-all-tes | --with-all-te | --with-all-t | --with-all- | --with-all | --with-al | --with-a)
         inc_all_tests=true
         shift ;;
+      --without-c++-tests | --without-c++-test | --without-c++-tes | --without-c++-te | --without-c++-t | --without-c++- | --without-c++ | --without-c+ | --without-c)
+        excl_cxx_tests=true
+        shift ;;
+      --without-longrunning-tests | --without-longrunning-test | --without-longrunning-tes | --without-longrunning-te | --without-longrunning-t | --without-longrunning- | --without-longrunning | --without-longrunnin | --without-longrunni | --without-longrunn | --without-longrun | --without-longru | --without-longr | --without-long | --without-lon | --without-lo | --without-l)
+        excl_longrunning_tests=true
+        shift ;;
+      --without-privileged-tests | --without-privileged-test | --without-privileged-tes | --without-privileged-te | --without-privileged-t | --without-privileged- | --without-privileged | --without-privilege | --without-privileg | --without-privile | --without-privil | --without-privi | --without-priv | --without-pri | --without-pr | --without-p)
+        excl_privileged_tests=true
+        shift ;;
+      --without-unportable-tests | --without-unportable-test | --without-unportable-tes | --without-unportable-te | --without-unportable-t | --without-unportable- | --without-unportable | --without-unportabl | --without-unportab | --without-unporta | --without-unport | --without-unpor | --without-unpo | --without-unp | --without-un | --without-u)
+        excl_unportable_tests=true
+        shift ;;
       --avoid )
         shift
         if test $# = 0; then
@@ -1183,6 +1253,27 @@ fi
     esac
   done
 
+  if case "$mode" in import | add-import | remove-import) true;; *) false;; esac; then
+    if test -n "$excl_cxx_tests" || test -n "$excl_longrunning_tests" \
+       || test -n "$excl_privileged_tests" || test -n "$excl_unportable_tests"; then
+      echo "gnulib-tool: invalid options for '$mode' mode" 1>&2
+      echo "Try 'gnulib-tool --help' for more information." 1>&2
+      func_exit 1
+    fi
+  fi
+  # This code helps migrating from --import to --add-import or --update. It can
+  # be removed on 2012-01-01.
+  if test "$mode" = import && test $# = 0; then
+    echo "gnulib-tool: cowardly refusing to erase the module list." 1>&2
+    echo "The meaning of the option '--import' has changed." 1>&2
+    echo "See the documentation at" 1>&2
+    echo "<http://www.gnu.org/software/gnulib/manual/html_node/Modified-imports.html>." 1>&2
+    echo "For updating to a newer version of gnulib, use" 1>&2
+    echo "  gnulib-tool --add-import" 1>&2
+    echo "For restoring files that were omitted from version control, use" 1>&2
+    echo "  gnulib-tool --update" 1>&2
+    func_exit 1
+  fi
   if test "$mode" = update; then
     if test $# != 0; then
       echo "gnulib-tool: too many arguments in 'update' mode" 1>&2
@@ -1198,6 +1289,8 @@ fi
        || test -n "$inc_cxx_tests" || test -n "$inc_longrunning_tests" \
        || test -n "$inc_privileged_tests" || test -n "$inc_unportable_tests" \
        || test -n "$inc_all_tests" \
+       || test -n "$excl_cxx_tests" || test -n "$excl_longrunning_tests" \
+       || test -n "$excl_privileged_tests" || test -n "$excl_unportable_tests" \
        || test -n "$avoidlist" || test -n "$lgpl" || test -n "$makefile_name" \
        || test -n "$macro_prefix" || test -n "$po_domain" \
        || test -n "$vc_files"; then
@@ -1223,7 +1316,8 @@ fi
   DEFAULT_AUTOCONF_MINVERSION="2.59"
   autoconf_minversion=
   configure_ac=
-  if { test "$mode" = import || test "$mode" = update; } && test -n "$destdir"; then
+  if case "$mode" in import | add-import | remove-import | update) true;; *) false;; esac \
+     && test -n "$destdir"; then
     if test -f "$destdir"/configure.ac; then
       configure_ac="$destdir/configure.ac"
     else
@@ -1242,7 +1336,7 @@ fi
   fi
   if test -n "$configure_ac"; then
     # Use sed, not autoconf --trace, to look for the AC_PREREQ invocation,
-    # because when some m4 files are omitted from a CVS repository,
+    # because when some m4 files are omitted from a version control repository,
     # "autoconf --trace=AC_PREREQ" fails with an error message like this:
     #   m4: aclocal.m4:851: Cannot open m4/absolute-header.m4: No such file or directory
     #   autom4te: m4 failed with exit status: 1
@@ -1309,6 +1403,15 @@ for signal in 1 2 3 13 15; do
 done
 signal=0
 
+# Note: The 'eval' silences stderr output in dash.
+if (declare -A x && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }) 2>/dev/null; then
+  # Zsh 4 and Bash 4 have associative arrays.
+  have_associative=true
+else
+  # For other shells, use 'eval' with computed shell variable names.
+  have_associative=false
+fi
+
 # func_lookup_file file
 # looks up a file in $local_gnulib_dir or $gnulib_dir, or combines it through
 # 'patch'.
@@ -1492,15 +1595,6 @@ sed_extract_field_header='
 
 if $modcache; then
 
-  # Note: The 'eval' silences stderr output in dash.
-  if (declare -A x && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }) 2>/dev/null; then
-    # Zsh 4 and Bash 4 have associative arrays.
-    have_associative=true
-  else
-    # For other shells, use 'eval' with computed shell variable names.
-    have_associative=false
-  fi
-
   if $have_associative; then
 
     # Declare the associative arrays.
@@ -1523,11 +1617,11 @@ if $modcache; then
       #   ${param//pattern/replacement}
       # as a shorthand for
       #   `echo "$param" | sed -e "s/pattern/replacement/g"`.
-      # Note: The 'eval' above silences stderr output in dash.
-      func_cache_var ()
+      # Note: The 'eval' is necessary for dash and NetBSD /bin/sh.
+      eval 'func_cache_var ()
       {
         cachevar=c_${1//[!a-zA-Z0-9_]/_}
-      }
+      }'
     else
       func_cache_var ()
       {
@@ -1712,7 +1806,7 @@ if $modcache; then
   func_cache_lookup_module ()
   {
     if $have_associative; then
-      cached=${modcache_cached[$1]}
+      eval 'cached=${modcache_cached[$1]}'
     else
       func_cache_var "$1"
       eval "cached=\"\$${cachevar}_cached\""
@@ -1721,7 +1815,7 @@ if $modcache; then
       # Not found in cache. Look it up on the file system.
       func_lookup_file "modules/$1"
       if $have_associative; then
-        modcache_cached[$1]=yes
+        eval 'modcache_cached[$1]=yes'
       else
         eval "${cachevar}_cached=\"\$1\""
       fi
@@ -1756,8 +1850,8 @@ func_get_description ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_description[$1]+set}"; then
-        echo "${modcache_description[$1]}"
+      if eval 'test -n "${modcache_description[$1]+set}"'; then
+        eval 'echo "${modcache_description[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_description_set\""
@@ -1782,8 +1876,8 @@ func_get_comment ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_comment[$1]+set}"; then
-        echo "${modcache_comment[$1]}"
+      if eval 'test -n "${modcache_comment[$1]+set}"'; then
+        eval 'echo "${modcache_comment[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_comment_set\""
@@ -1808,8 +1902,8 @@ func_get_status ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_status[$1]+set}"; then
-        echo "${modcache_status[$1]}"
+      if eval 'test -n "${modcache_status[$1]+set}"'; then
+        eval 'echo "${modcache_status[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_status_set\""
@@ -1834,8 +1928,8 @@ func_get_notice ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_notice[$1]+set}"; then
-        echo "${modcache_notice[$1]}"
+      if eval 'test -n "${modcache_notice[$1]+set}"'; then
+        eval 'echo "${modcache_notice[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_notice_set\""
@@ -1861,7 +1955,7 @@ func_get_applicability ()
     func_cache_lookup_module "$1"
     # Get the field's value, without the final newline.
     if $have_associative; then
-      my_applicability="${modcache_applicability[$1]}"
+      eval 'my_applicability="${modcache_applicability[$1]}"'
     else
       eval "my_applicability=\"\$${cachevar}_applicability\""
     fi
@@ -1890,8 +1984,8 @@ func_get_filelist ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_files[$1]+set}"; then
-        echo "${modcache_files[$1]}"
+      if eval 'test -n "${modcache_files[$1]+set}"'; then
+        eval 'echo "${modcache_files[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_files_set\""
@@ -1981,8 +2075,8 @@ func_get_dependencies ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_dependson[$1]+set}"; then
-        echo "${modcache_dependson[$1]}"
+      if eval 'test -n "${modcache_dependson[$1]+set}"'; then
+        eval 'echo "${modcache_dependson[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_dependson_set\""
@@ -2007,8 +2101,8 @@ func_get_autoconf_early_snippet ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_configureac_early[$1]+set}"; then
-        echo "${modcache_configureac_early[$1]}"
+      if eval 'test -n "${modcache_configureac_early[$1]+set}"'; then
+        eval 'echo "${modcache_configureac_early[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_configureac_early_set\""
@@ -2033,8 +2127,8 @@ func_get_autoconf_snippet ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_configureac[$1]+set}"; then
-        echo "${modcache_configureac[$1]}"
+      if eval 'test -n "${modcache_configureac[$1]+set}"'; then
+        eval 'echo "${modcache_configureac[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_configureac_set\""
@@ -2059,8 +2153,8 @@ func_get_automake_snippet ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_makefile[$1]+set}"; then
-        echo "${modcache_makefile[$1]}"
+      if eval 'test -n "${modcache_makefile[$1]+set}"'; then
+        eval 'echo "${modcache_makefile[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_makefile_set\""
@@ -2097,8 +2191,8 @@ func_get_automake_snippet ()
             sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file"
           else
             if $have_associative; then
-              if test -n "${modcache_makefile[$1]+set}"; then
-                echo "${modcache_makefile[$1]}"
+              if eval 'test -n "${modcache_makefile[$1]+set}"'; then
+                eval 'echo "${modcache_makefile[$1]}"'
               fi
             else
               eval 'field_set="$'"${cachevar}"'_makefile_set"'
@@ -2174,8 +2268,8 @@ func_get_include_directive ()
       func_cache_lookup_module "$1"
       # Output the field's value, including the final newline (if any).
       if $have_associative; then
-        if test -n "${modcache_include[$1]+set}"; then
-          echo "${modcache_include[$1]}"
+        if eval 'test -n "${modcache_include[$1]+set}"'; then
+          eval 'echo "${modcache_include[$1]}"'
         fi
       else
         eval "field_set=\"\$${cachevar}_include_set\""
@@ -2201,8 +2295,8 @@ func_get_link_directive ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_link[$1]+set}"; then
-        echo "${modcache_link[$1]}"
+      if eval 'test -n "${modcache_link[$1]+set}"'; then
+        eval 'echo "${modcache_link[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_link_set\""
@@ -2228,8 +2322,8 @@ func_get_license ()
       func_cache_lookup_module "$1"
       # Output the field's value, including the final newline (if any).
       if $have_associative; then
-        if test -n "${modcache_license[$1]+set}"; then
-          echo "${modcache_license[$1]}"
+        if eval 'test -n "${modcache_license[$1]+set}"'; then
+          eval 'echo "${modcache_license[$1]}"'
         fi
       else
         eval "field_set=\"\$${cachevar}_license_set\""
@@ -2257,8 +2351,8 @@ func_get_maintainer ()
     func_cache_lookup_module "$1"
     # Output the field's value, including the final newline (if any).
     if $have_associative; then
-      if test -n "${modcache_maintainer[$1]+set}"; then
-        echo "${modcache_maintainer[$1]}"
+      if eval 'test -n "${modcache_maintainer[$1]+set}"'; then
+        eval 'echo "${modcache_maintainer[$1]}"'
       fi
     else
       eval "field_set=\"\$${cachevar}_maintainer_set\""
@@ -2286,16 +2380,6 @@ func_get_tests_module ()
 # func_acceptable module
 # tests whether a module is acceptable.
 # Input:
-# - inc_cxx_tests   true if C++ interoperability tests should be included,
-#                   blank otherwise
-# - inc_longrunning_tests  true if long-runnings tests should be included,
-#                          blank otherwise
-# - inc_privileged_tests  true if tests that require root privileges should be
-#                         included, blank otherwise
-# - inc_unportable_tests  true if tests that fail on some platforms should be
-#                         included, blank otherwise
-# - inc_all_tests   true if all kinds of problematic unit tests should be
-#                   included, blank otherwise
 # - avoidlist       list of modules to avoid
 func_acceptable ()
 {
@@ -2304,38 +2388,6 @@ func_acceptable ()
       return 1
     fi
   done
-  case "$1" in
-    *-tests)
-      inc=true
-      for word in `func_get_status "$1"`; do
-        case "$word" in
-          c++-test)
-            test -n "$inc_all_tests" || test -n "$inc_cxx_tests" \
-              || inc=false
-            ;;
-          longrunning-test)
-            test -n "$inc_all_tests" || test -n "$inc_longrunning_tests" \
-              || inc=false
-            ;;
-          privileged-test)
-            test -n "$inc_all_tests" || test -n "$inc_privileged_tests" \
-              || inc=false
-            ;;
-          unportable-test)
-            test -n "$inc_all_tests" || test -n "$inc_unportable_tests" \
-              || inc=false
-            ;;
-          *-test)
-            test -n "$inc_all_tests" \
-              || inc=false
-            ;;
-        esac
-      done
-      if ! $inc; then
-        return 1
-      fi
-      ;;
-  esac
   return 0
 }
 
@@ -2355,8 +2407,20 @@ func_acceptable ()
 #                         included, blank otherwise
 # - inc_unportable_tests  true if tests that fail on some platforms should be
 #                         included, blank otherwise
-# - inc_all_tests   true if all kinds of problematic unit tests should be
-#                   included, blank otherwise
+# - inc_all_direct_tests   true if all kinds of problematic unit tests among
+#                          the unit tests of the specified modules should be
+#                          included, blank otherwise
+# - inc_all_indirect_tests   true if all kinds of problematic unit tests among
+#                            the unit tests of the dependencies should be
+#                            included, blank otherwise
+# - excl_cxx_tests   true if C++ interoperability tests should be excluded,
+#                    blank otherwise
+# - excl_longrunning_tests  true if long-runnings tests should be excluded,
+#                           blank otherwise
+# - excl_privileged_tests  true if tests that require root privileges should be
+#                          excluded, blank otherwise
+# - excl_unportable_tests  true if tests that fail on some platforms should be
+#                          excluded, blank otherwise
 # - avoidlist       list of modules to avoid
 # - tmp             pathname of a temporary directory
 # Output:
@@ -2371,6 +2435,7 @@ func_modules_transitive_closure ()
   handledmodules=
   inmodules="$modules"
   outmodules=
+  fmtc_inc_all_tests="$inc_all_direct_tests"
   while test -n "$inmodules"; do
     inmodules_this_round="$inmodules"
     inmodules=                    # Accumulator, queue for next round
@@ -2385,27 +2450,55 @@ func_modules_transitive_closure ()
           if test -n "$duplicated_deps"; then
             func_warning "module $module has duplicated dependencies: "`echo $duplicated_deps`
           fi
-          for dep in $deps; do
-            if test -n "$incobsolete" \
-               || { inc=true
-                    for word in `func_get_status $dep`; do
-                      case "$word" in
-                        obsolete)
-                          inc=false
-                          ;;
-                      esac
-                    done
-                    $inc
-                  }; then
-              func_append inmodules " $dep"
-            fi
-          done
           if test -n "$inctests"; then
             testsmodule=`func_get_tests_module $module`
             if test -n "$testsmodule"; then
-              func_append inmodules " $testsmodule"
+              deps="$deps $testsmodule"
             fi
           fi
+          for dep in $deps; do
+            # Determine whether to include the dependency or tests module.
+            inc=true
+            for word in `func_get_status $dep`; do
+              case "$word" in
+                obsolete)
+                  test -n "$incobsolete" \
+                    || inc=false
+                  ;;
+                c++-test)
+                  test -z "$excl_cxx_tests" \
+                    || inc=false
+                  test -n "$fmtc_inc_all_tests" || test -n "$inc_cxx_tests" \
+                    || inc=false
+                  ;;
+                longrunning-test)
+                  test -z "$excl_longrunning_tests" \
+                    || inc=false
+                  test -n "$fmtc_inc_all_tests" || test -n "$inc_longrunning_tests" \
+                    || inc=false
+                  ;;
+                privileged-test)
+                  test -z "$excl_privileged_tests" \
+                    || inc=false
+                  test -n "$fmtc_inc_all_tests" || test -n "$inc_privileged_tests" \
+                    || inc=false
+                  ;;
+                unportable-test)
+                  test -z "$excl_unportable_tests" \
+                    || inc=false
+                  test -n "$fmtc_inc_all_tests" || test -n "$inc_unportable_tests" \
+                    || inc=false
+                  ;;
+                *-test)
+                  test -n "$fmtc_inc_all_tests" \
+                    || inc=false
+                  ;;
+              esac
+            done
+            if $inc; then
+              func_append inmodules " $dep"
+            fi
+          done
         fi
       fi
     done
@@ -2413,11 +2506,37 @@ func_modules_transitive_closure ()
     # 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`
+    fmtc_inc_all_tests="$inc_all_indirect_tests"
   done
   modules=`for m in $outmodules; do echo $m; done | LC_ALL=C sort -u`
   rm -f "$tmp"/queued-modules
 }
 
+# func_show_module_list
+# Input:
+# - specified_modules  list of specified modules (one per line, sorted)
+# - modules         complete list of modules (one per line, sorted)
+# - tmp             pathname of a temporary directory
+func_show_module_list ()
+{
+  if case "$TERM" in
+       xterm*) test -t 1;;
+       *) false;;
+     esac; then
+    # Assume xterm compatible escape sequences.
+    bold_on=`printf '\x1b[1m'`
+    bold_off=`printf '\x1b[0m'`
+  else
+    bold_on=
+    bold_off=
+  fi
+  echo "Module list with included dependencies (indented):"
+  echo "$specified_modules" | sed -e '/^$/d' -e 's/$/| /' > "$tmp"/specified-modules
+  echo "$modules" | sed -e '/^$/d' \
+    | LC_ALL=C join -t '|' -a 2 "$tmp"/specified-modules - \
+    | sed -e 's/^\(.*\)|.*/|\1/' -e 's/^/    /' -e 's/^    |\(.*\)$/  '"${bold_on}"'\1'"${bold_off}"'/'
+}
+
 # func_modules_add_dummy
 # Input:
 # - local_gnulib_dir  from --local-dir
@@ -3242,11 +3361,13 @@ func_emit_initmacro_done ()
 
 # func_import modules
 # Uses also the variables
+# - mode            import or add-import or remove-import or update
 # - destdir         target directory
 # - local_gnulib_dir  from --local-dir
 # - modcache        true or false, from --cache-modules/--no-cache-modules
 # - verbose         integer, default 0, inc/decremented by --verbose/--quiet
 # - libname         library name
+# - supplied_libname  true if --lib was given, blank otherwise
 # - sourcebase      directory relative to destdir where to place source code
 # - m4base          directory relative to destdir where to place *.m4 macros
 # - pobase          directory relative to destdir where to place *.po files
@@ -3284,6 +3405,8 @@ func_emit_initmacro_done ()
 func_import ()
 {
   # Get the cached settings.
+  # In 'import' mode, we read them only for the purpose of knowing the old
+  # installed file list, and don't use them as defaults.
   cached_local_gnulib_dir=
   cached_specified_modules=
   cached_incobsolete=
@@ -3413,135 +3536,187 @@ func_import ()
     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
-  # The local_gnulib_dir defaults to the cached one. Recall that the cached one
-  # is relative to $destdir, whereas the one we use is relative to . or absolute.
-  if test -z "$local_gnulib_dir"; then
-    if test -n "$cached_local_gnulib_dir"; then
-      case "$destdir" in
-        /*)
-          local_gnulib_dir="$destdir/$cached_local_gnulib_dir" ;;
-        *)
-          case "$cached_local_gnulib_dir" in
-            /*)
-              local_gnulib_dir="$destdir/$cached_local_gnulib_dir" ;;
-            *)
-              func_relconcat "$destdir" "$cached_local_gnulib_dir"
-              local_gnulib_dir="$relconcat" ;;
-          esac ;;
-      esac
+  if test "$mode" = import; then
+    # In 'import' mode, the new set of specified modules overrides the cached
+    # set of modules. Ignore the cached settings.
+    specified_modules="$1"
+  else
+    # 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
-  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"
-  # Included obsolete modules among the dependencies if specified either way.
-  if test -z "$incobsolete"; then
-    incobsolete="$cached_incobsolete"
-  fi
-  # Included special kinds of tests modules among the dependencies if specified
-  # either way.
-  if test -z "$inc_cxx_tests"; then
-    inc_cxx_tests="$cached_inc_cxx_tests"
-  fi
-  if test -z "$inc_longrunning_tests"; then
-    inc_longrunning_tests="$cached_inc_longrunning_tests"
-  fi
-  if test -z "$inc_privileged_tests"; then
-    inc_privileged_tests="$cached_inc_privileged_tests"
-  fi
-  if test -z "$inc_unportable_tests"; then
-    inc_unportable_tests="$cached_inc_unportable_tests"
-  fi
-  if test -z "$inc_all_tests"; then
-    inc_all_tests="$cached_inc_all_tests"
-  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`
-  avoidlist=`echo $avoidlist`
-
-  # The sourcebase defaults to the cached one.
-  if test -z "$sourcebase"; then
-    sourcebase="$cached_sourcebase"
+    # The local_gnulib_dir defaults to the cached one. Recall that the cached one
+    # is relative to $destdir, whereas the one we use is relative to . or absolute.
+    if test -z "$local_gnulib_dir"; then
+      if test -n "$cached_local_gnulib_dir"; then
+        case "$destdir" in
+          /*)
+            local_gnulib_dir="$destdir/$cached_local_gnulib_dir" ;;
+          *)
+            case "$cached_local_gnulib_dir" in
+              /*)
+                local_gnulib_dir="$destdir/$cached_local_gnulib_dir" ;;
+              *)
+                func_relconcat "$destdir" "$cached_local_gnulib_dir"
+                local_gnulib_dir="$relconcat" ;;
+            esac ;;
+        esac
+      fi
+    fi
+    case $mode in
+      add-import)
+        # Append the cached and the specified module names. So that
+        # "gnulib-tool --add-import foo" means to add the module foo.
+        specified_modules="$cached_specified_modules $1"
+        ;;
+      remove-import)
+        # Take the cached module names, minus the specified module names.
+        specified_modules=
+        if $have_associative; then
+          # Use an associative array, for O(N) worst-case run time.
+          declare -A to_remove
+          for m in $1; do
+            eval 'to_remove[$m]=yes'
+          done
+          for module in $cached_specified_modules; do
+            if eval 'test -z "${to_remove[$module]}"'; then
+              func_append specified_modules "$module "
+            fi
+          done
+        else
+          # This loop has O(N²) worst-case run time.
+          for module in $cached_specified_modules; do
+            to_remove=
+            for m in $1; do
+              if test "$m" = "$module"; then
+                to_remove=yes
+                break
+              fi
+            done
+            if test -z "$to_remove"; then
+              func_append specified_modules "$module "
+            fi
+          done
+        fi
+        ;;
+      update)
+        # Take the cached module names. There are no specified module names.
+        specified_modules="$cached_specified_modules"
+        ;;
+    esac
+    # Included obsolete modules among the dependencies if specified either way.
+    if test -z "$incobsolete"; then
+      incobsolete="$cached_incobsolete"
+    fi
+    # Included special kinds of tests modules among the dependencies if specified
+    # either way.
+    if test -z "$inc_cxx_tests"; then
+      inc_cxx_tests="$cached_inc_cxx_tests"
+    fi
+    if test -z "$inc_longrunning_tests"; then
+      inc_longrunning_tests="$cached_inc_longrunning_tests"
+    fi
+    if test -z "$inc_privileged_tests"; then
+      inc_privileged_tests="$cached_inc_privileged_tests"
+    fi
+    if test -z "$inc_unportable_tests"; then
+      inc_unportable_tests="$cached_inc_unportable_tests"
+    fi
+    if test -z "$inc_all_tests"; then
+      inc_all_tests="$cached_inc_all_tests"
+    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`
+    avoidlist=`echo $avoidlist`
+
+    # The sourcebase defaults to the cached one.
     if test -z "$sourcebase"; then
-      func_fatal_error "missing --source-base option"
+      sourcebase="$cached_sourcebase"
+      if test -z "$sourcebase"; then
+        func_fatal_error "missing --source-base option"
+      fi
     fi
-  fi
-  # The pobase defaults to the cached one.
-  if test -z "$pobase"; then
-    pobase="$cached_pobase"
-  fi
-  # The docbase defaults to the cached one.
-  if test -z "$docbase"; then
-    docbase="$cached_docbase"
+    # The pobase defaults to the cached one.
+    if test -z "$pobase"; then
+      pobase="$cached_pobase"
+    fi
+    # The docbase defaults to the cached one.
     if test -z "$docbase"; then
-      func_fatal_error "missing --doc-base option. --doc-base has been introduced on 2006-07-11; if your last invocation of 'gnulib-tool --import' is before that date, you need to run 'gnulib-tool --import' once, with a --doc-base option."
+      docbase="$cached_docbase"
+      if test -z "$docbase"; then
+        func_fatal_error "missing --doc-base option. --doc-base has been introduced on 2006-07-11; if your last invocation of 'gnulib-tool --import' is before that date, you need to run 'gnulib-tool --import' once, with a --doc-base option."
+      fi
     fi
-  fi
-  # The testsbase defaults to the cached one.
-  if test -z "$testsbase"; then
-    testsbase="$cached_testsbase"
+    # The testsbase defaults to the cached one.
     if test -z "$testsbase"; then
-      func_fatal_error "missing --tests-base option"
+      testsbase="$cached_testsbase"
+      if test -z "$testsbase"; then
+        func_fatal_error "missing --tests-base option"
+      fi
     fi
-  fi
-  # Require the tests if specified either way.
-  if test -z "$inctests"; then
-    inctests="$cached_inctests"
-  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"
+    # Require the tests if specified either way.
+    if test -z "$inctests"; then
+      inctests="$cached_inctests"
     fi
-  fi
-  # Require LGPL if specified either way.
-  if test -z "$lgpl"; then
-    lgpl="$cached_lgpl"
-  fi
-  # The makefile_name defaults to the cached one.
-  if test -z "$makefile_name"; then
-    makefile_name="$cached_makefile_name"
-  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"
+    # 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
-  fi
-  # The macro_prefix defaults to the cached one.
-  if test -z "$macro_prefix"; then
-    macro_prefix="$cached_macro_prefix"
+    # Require LGPL if specified either way.
+    if test -z "$lgpl"; then
+      lgpl="$cached_lgpl"
+    fi
+    # The makefile_name defaults to the cached one.
+    if test -z "$makefile_name"; then
+      makefile_name="$cached_makefile_name"
+    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
-      func_fatal_error "missing --macro-prefix option"
+      macro_prefix="$cached_macro_prefix"
+      if test -z "$macro_prefix"; then
+        func_fatal_error "missing --macro-prefix option"
+      fi
+    fi
+    # The po_domain defaults to the cached one.
+    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
   fi
-  # The po_domain defaults to the cached one.
-  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
+  # --without-*-tests options are not supported here.
+  excl_cxx_tests=
+  excl_longrunning_tests=
+  excl_privileged_tests=
+  excl_unportable_tests=
 
   # Canonicalize the list of specified modules.
   specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u`
 
+  # Include all kinds of tests modules if --with-all-tests was specified.
+  inc_all_direct_tests="$inc_all_tests"
+  inc_all_indirect_tests="$inc_all_tests"
+
   # Determine final module list.
   modules="$specified_modules"
   func_modules_transitive_closure
   if test $verbose -ge 0; then
-    echo "Module list with included dependencies:"
-    echo "$modules" | sed -e 's/^/  /'
+    func_show_module_list
   fi
   final_modules="$modules"
 
@@ -3871,7 +4046,7 @@ s,^\(.................................................[^ ]*\) *,
     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.
+      # frequently that developers don't put autogenerated files under version control.
       func_add_file
       func_append added_files "$g$nl"
     fi
@@ -4201,8 +4376,8 @@ s,//*$,/,'
     echo "#"
     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 "# In projects that use version control, this file is meant to be put under"
+    echo "# version control, like the configure.ac and various Makefile.am files."
     echo
     echo
     echo "# Specification in the form of a command-line invocation:"
@@ -4295,7 +4470,8 @@ s,//*$,/,'
     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 "# In projects that use version control, this file can be treated like"
+    echo "# other built files."
     echo
     echo
     echo "# This macro should be invoked from $configure_ac, in the section"
@@ -4661,6 +4837,14 @@ s,//*$,/,'
 # - inctests        true if tests should be included, blank otherwise
 # - incobsolete     true if obsolete modules among dependencies should be
 #                   included, blank otherwise
+# - excl_cxx_tests   true if C++ interoperability tests should be excluded,
+#                    blank otherwise
+# - excl_longrunning_tests  true if long-runnings tests should be excluded,
+#                           blank otherwise
+# - excl_privileged_tests  true if tests that require root privileges should be
+#                          excluded, blank otherwise
+# - excl_unportable_tests  true if tests that fail on some platforms should be
+#                          excluded, blank otherwise
 # - avoidlist       list of modules to avoid
 # - libtool         true if --libtool was given, false if --no-libtool was
 #                   given, blank otherwise
@@ -4679,20 +4863,24 @@ func_create_testdir ()
     modules=`func_all_modules`
     modules=`for m in $modules; do case $m in config-h | ftruncate | mountlist | lib-ignore) ;; *) echo $m;; esac; done`
   fi
-  modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u`
+  specified_modules="$modules"
+
+  # Canonicalize the list of specified modules.
+  specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u`
 
-  # Unlike in func_import, here we want to include all kinds of tests.
-  inc_all_tests=true
+  # Unlike in func_import, here we want to include all kinds of tests for the
+  # directly specified modules, but not for dependencies.
+  inc_all_direct_tests=true
+  inc_all_indirect_tests="$inc_all_tests"
 
   # Check that the license of every module is consistent with the license of
   # its dependencies.
-  saved_modules="$modules"
   saved_inctests="$inctests"
   # When computing transitive closures, don't consider $module to depend on
   # $module-tests. Need this becauses tests are implicitly GPL and may depend
   # on GPL modules - therefore we don't want a warning in this case.
   inctests=""
-  for requested_module in $saved_modules; do
+  for requested_module in $specified_modules; do
     requested_license=`func_get_license "$requested_module"`
     if test "$requested_license" != GPL; then
       # Here we use func_modules_transitive_closure, not just
@@ -4732,7 +4920,6 @@ func_create_testdir ()
       done
     fi
   done
-  modules="$saved_modules"
   inctests="$saved_inctests"
 
   # Subdirectory names.
@@ -4746,10 +4933,10 @@ func_create_testdir ()
   vc_files=
 
   # Determine final module list.
+  modules="$specified_modules"
   func_modules_transitive_closure
   if test $verbose -ge 0; then
-    echo "Module list with included dependencies:"
-    echo "$modules" | sed -e 's/^/  /'
+    func_show_module_list
   fi
 
   # Add the dummy module if needed.
@@ -5342,7 +5529,7 @@ s/\([.*$]\)/[\1]/g'
     done
     ;;
 
-  import | update )
+  import | add-import | remove-import | update )
 
     # Where to import.
     if test -z "$destdir"; then
@@ -5382,94 +5569,109 @@ s/\([.*$]\)/[\1]/g'
     fi
 
     # Determine where to apply func_import.
-    if test -n "$m4base"; then
+    if test "$mode" = import; 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 "$docbase" || docbase="doc"
-        test -n "$testsbase" || testsbase="tests"
-        test -n "$macro_prefix" || macro_prefix="gl"
-      fi
+      # The command line contains the complete specification; don't look at
+      # the contents of gnulib-cache.m4.
+      test -n "$supplied_libname" || supplied_libname=true
+      test -n "$sourcebase" || sourcebase="lib"
+      test -n "$m4base" || m4base="m4"
+      test -n "$docbase" || docbase="doc"
+      test -n "$testsbase" || testsbase="tests"
+      test -n "$macro_prefix" || macro_prefix="gl"
       func_import "$*"
     else
-      # 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.)
-      m4dirs=
-      m4dirs_count=0
-      if test -f "$destdir"/Makefile.am; then
-        aclocal_amflags=`sed -n -e 's/^ACLOCAL_AMFLAGS[         ]*=\(.*\)$/\1/p' "$destdir"/Makefile.am`
-        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
-                  func_append m4dirs " $arg"
-                  m4dirs_count=`expr $m4dirs_count + 1`
-                fi
-                ;;
-            esac
-            m4dir_is_next=
-          else
-            if test "X$arg" = "X-I"; then
-              m4dir_is_next=yes
-            else
+      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 "$docbase" || docbase="doc"
+          test -n "$testsbase" || testsbase="tests"
+          test -n "$macro_prefix" || macro_prefix="gl"
+        fi
+        func_import "$*"
+      else
+        # 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 version control. Also,
+        # don't run "find $destdir -name gnulib-cache.m4", as it might be
+        # too expensive.)
+        m4dirs=
+        m4dirs_count=0
+        if test -f "$destdir"/Makefile.am; then
+          aclocal_amflags=`sed -n -e 's/^ACLOCAL_AMFLAGS[       ]*=\(.*\)$/\1/p' "$destdir"/Makefile.am`
+          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
+                    func_append m4dirs " $arg"
+                    m4dirs_count=`expr $m4dirs_count + 1`
+                  fi
+                  ;;
+              esac
               m4dir_is_next=
+            else
+              if test "X$arg" = "X-I"; then
+                m4dir_is_next=yes
+              else
+                m4dir_is_next=
+              fi
             fi
+          done
+        else
+          # No Makefile.am! Oh well. Look at the last generated aclocal.m4.
+          if test -f "$destdir"/aclocal.m4; then
+            sedexpr1='s,^m4_include(\[\(.*\)])$,\1,p'
+            sedexpr2='s,^[^/]*$,.,'
+            sedexpr3='s,/[^/]*$,,'
+            m4dirs=`sed -n -e "$sedexpr1" aclocal.m4 | sed -e "$sedexpr2" -e "$sedexpr3" | LC_ALL=C sort -u`
+            m4dirs=`for arg in $m4dirs; do if test -f "$destdir/$arg"/gnulib-cache.m4; then echo $arg; fi; done`
+            m4dirs_count=`for arg in $m4dirs; do echo "$arg"; done | wc -l`
           fi
-        done
-      else
-        # No Makefile.am! Oh well. Look at the last generated aclocal.m4.
-        if test -f "$destdir"/aclocal.m4; then
-          sedexpr1='s,^m4_include(\[\(.*\)])$,\1,p'
-          sedexpr2='s,^[^/]*$,.,'
-          sedexpr3='s,/[^/]*$,,'
-          m4dirs=`sed -n -e "$sedexpr1" aclocal.m4 | sed -e "$sedexpr2" -e "$sedexpr3" | LC_ALL=C sort -u`
-          m4dirs_count=`printf %s "$m4dirs" | wc -l`
         fi
-      fi
-      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 "$docbase" || docbase="doc"
-        test -n "$testsbase" || testsbase="tests"
-        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.
+        if test $m4dirs_count = 0; then
+          # First use of gnulib in a package.
           # Any number of additional modules can be given.
-          for m4base in $m4dirs; do
-            func_import "$*"
-          done
+          test -n "$supplied_libname" || supplied_libname=true
+          test -n "$sourcebase" || sourcebase="lib"
+          m4base="m4"
+          test -n "$docbase" || docbase="doc"
+          test -n "$testsbase" || testsbase="tests"
+          test -n "$macro_prefix" || macro_prefix="gl"
+          func_import "$*"
         else
-          # Ambiguous - guess what the user meant.
-          if test $# = 0; then
-            # No further arguments. Guess the user wants to update all of them.
+          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
-              # Perform func_import in a subshell, so that variable values
-              # such as
-              #   local_gnulib_dir, incobsolete, inc_cxx_tests,
-              #   inc_longrunning_tests, inc_privileged_tests,
-              #   inc_unportable_tests, inc_all_tests, 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
+              func_import "$*"
             done
           else
-            # Really ambiguous.
-            func_fatal_error "Ambiguity: to which directory should the modules be added? Please specify at least --m4-base=..."
+            # 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
+                # Perform func_import in a subshell, so that variable values
+                # such as
+                #   local_gnulib_dir, incobsolete, inc_cxx_tests,
+                #   inc_longrunning_tests, inc_privileged_tests,
+                #   inc_unportable_tests, inc_all_tests, 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
+            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
@@ -5736,7 +5938,8 @@ s/\([.*$]\)/[\1]/g'
     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.
+      # frequently that developers don't put autogenerated files under version
+      # control.
       func_add_file
     fi
     rm -f "$tmpfile"