Remove u#-grapheme-len modules as too redundant with u#-grapheme-next.
[gnulib.git] / gnulib-tool
index b809dd1..9375f97 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# Copyright (C) 2002-2010 Free Software Foundation, Inc.
+# Copyright (C) 2002-2011 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
@@ -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,11 +163,16 @@ 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 version control
       --create-testdir      create a scratch package with the given modules
@@ -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,10 +212,13 @@ 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
@@ -215,7 +238,8 @@ Options for --import, --create-[mega]testdir, --[mega]test:
       --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
@@ -230,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;
@@ -248,6 +272,7 @@ Options for --import:
       --no-changelog        Don't update or create ChangeLog files.
 
 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.
@@ -256,12 +281,15 @@ Options for --create-[mega]testdir, --[mega]test:
       --without-unportable-tests
                             Exclude unit tests that fail on some platforms.
 
-Options for --import, --update, --create-[mega]testdir, --[mega]test:
+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.
 
@@ -818,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" \
@@ -861,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
@@ -957,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 ;;
@@ -1214,14 +1253,27 @@ fi
     esac
   done
 
-  if test "$mode" = import; then
+  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 'import' mode" 1>&2
+      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
@@ -1264,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
@@ -1350,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'.
@@ -1533,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.
@@ -1564,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 ()
       {
@@ -1753,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\""
@@ -1762,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
@@ -1797,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\""
@@ -1823,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\""
@@ -1849,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\""
@@ -1875,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\""
@@ -1902,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
@@ -1931,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\""
@@ -2022,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\""
@@ -2048,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\""
@@ -2074,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\""
@@ -2100,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\""
@@ -2138,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"'
@@ -2175,6 +2228,7 @@ func_get_automake_snippet ()
       # automake will generate a useless dependency; this is harmless.
       case "$1" in
         relocatable-prog-wrapper) ;;
+        pt_chown) ;;
         *)
           func_filter_filelist extra_files "$nl" "$extra_files" '' '.c' '' ''
           if test -n "$extra_files"; then
@@ -2215,8 +2269,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\""
@@ -2242,8 +2296,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\""
@@ -2269,8 +2323,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\""
@@ -2298,8 +2352,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\""
@@ -2877,6 +2931,18 @@ func_emit_lib_Makefile_am ()
   echo "EXTRA_${libname}_${libext}_SOURCES ="
   if test "$libtool" = true; then
     echo "${libname}_${libext}_LDFLAGS = \$(AM_LDFLAGS)"
+    echo "${libname}_${libext}_LDFLAGS += -no-undefined"
+    # Synthesize an ${libname}_${libext}_LDFLAGS augmentation by combining
+    # the link dependencies of all modules.
+    for module in $modules; do
+      func_verify_nontests_module
+      if test -n "$module"; then
+        func_get_link_directive "$module"
+      fi
+    done \
+      | LC_ALL=C sed -e '/^$/d' -e 's/ when linking with libtool.*//' \
+      | LC_ALL=C sort -u \
+      | LC_ALL=C sed -e 's/^/'"${libname}_${libext}"'_LDFLAGS += /'
   fi
   echo
   if test -n "$pobase"; then
@@ -3308,6 +3374,7 @@ 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
@@ -3351,6 +3418,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=
@@ -3480,130 +3549,174 @@ 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
-  # --without-*-tests options are not supported here.
-  excl_cxx_tests=
-  excl_longrunning_tests=
-  excl_privileged_tests=
-  excl_unportable_tests=
-  # 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`
@@ -4471,7 +4584,7 @@ s,//*$,/,'
     # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
     # created using libtool, because libtool already handles the dependencies.
     if test "$libtool" != true; then
-      libname_upper=`echo "$libname" | LC_ALL=C tr 'a-z-' 'A-Z_'`
+      libname_upper=`echo "$libname" | LC_ALL=C tr '[a-z]-' '[A-Z]_'`
       echo "  ${libname_upper}_LIBDEPS=\"\$gl_libdeps\""
       echo "  AC_SUBST([${libname_upper}_LIBDEPS])"
       echo "  ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
@@ -4851,6 +4964,11 @@ func_create_testdir ()
     echo "File list:"
     echo "$files" | sed -e 's/^/  /'
   fi
+  # Add files for which the copy in gnulib is newer than the one that
+  # "automake --add-missing --copy" would provide.
+  files="$files build-aux/config.guess"
+  files="$files build-aux/config.sub"
+  files=`for f in $files; do echo $f; done | LC_ALL=C sort -u`
 
   rewritten='%REWRITTEN%'
   sed_rewrite_files="\
@@ -5023,6 +5141,12 @@ func_create_testdir ()
            *)
              func_get_autoconf_snippet "$module" \
                | sed -e "$sed_replace_build_aux"
+             if test "$module" = 'alloca' && test "$libtool" = true; then
+               echo 'changequote(,)dnl'
+               echo 'LTALLOCA=`echo "$ALLOCA" | sed -e '"'"'s/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'"'"'`'
+               echo 'changequote([, ])dnl'
+               echo 'AC_SUBST([LTALLOCA])'
+             fi
              ;;
          esac
        fi
@@ -5039,7 +5163,7 @@ func_create_testdir ()
      # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
      # created using libtool, because libtool already handles the dependencies.
      if test "$libtool" != true; then
-       libname_upper=`echo "$libname" | LC_ALL=C tr 'a-z-' 'A-Z_'`
+       libname_upper=`echo "$libname" | LC_ALL=C tr '[a-z]-' '[A-Z]_'`
        echo "  ${libname_upper}_LIBDEPS=\"\$gl_libdeps\""
        echo "  AC_SUBST([${libname_upper}_LIBDEPS])"
        echo "  ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
@@ -5145,13 +5269,19 @@ func_create_testdir ()
      if test -n "$module"; then
        func_get_autoconf_snippet "$module" \
          | sed -e "$sed_replace_build_aux"
+       if test "$module" = 'alloca' && test "$libtool" = true; then
+         echo 'changequote(,)dnl'
+         echo 'LTALLOCA=`echo "$ALLOCA" | sed -e '"'"'s/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'"'"'`'
+         echo 'changequote([, ])dnl'
+         echo 'AC_SUBST([LTALLOCA])'
+       fi
      fi
    done
    func_emit_initmacro_end $macro_prefix
    # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
    # created using libtool, because libtool already handles the dependencies.
    if test "$libtool" != true; then
-     libname_upper=`echo "$libname" | LC_ALL=C tr 'a-z-' 'A-Z_'`
+     libname_upper=`echo "$libname" | LC_ALL=C tr '[a-z]-' '[A-Z]_'`
      echo "  ${libname_upper}_LIBDEPS=\"\$gl_libdeps\""
      echo "  AC_SUBST([${libname_upper}_LIBDEPS])"
      echo "  ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
@@ -5224,7 +5354,7 @@ func_create_testdir ()
     ) || func_exit 1
   fi
   # Need to run configure and make once, to create built files that are to be
-  # distributed (such as getdate.c).
+  # distributed (such as parse-datetime.c).
   sed_remove_make_variables='s,[$]([A-Za-z0-9_]*),,g'
   # Extract the value of "CLEANFILES += ..." and "MOSTLYCLEANFILES += ...".
   cleaned_files=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \
@@ -5429,7 +5559,7 @@ s/\([.*$]\)/[\1]/g'
     done
     ;;
 
-  import | update )
+  import | add-import | remove-import | update )
 
     # Where to import.
     if test -z "$destdir"; then
@@ -5469,96 +5599,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 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
+      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=`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
-      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