maint.mk: import changes to syntax-check macros from coreutils
[gnulib.git] / gnulib-tool
index 29f5eec..74ea4fc 100755 (executable)
@@ -63,20 +63,33 @@ if test -z "${AUTOPOINT}" || test -n "${GETTEXTPATH}"; then
   AUTOPOINT="${GETTEXTPATH}autopoint"
 fi
 
+# You can set MAKE.
+if test -z "${MAKE}"; then
+  MAKE=make
+fi
+
 # When using GNU sed, turn off as many GNU extensions as possible,
 # to minimize the risk of accidentally using non-portable features.
 # However, do this only for gnulib-tool itself, not for the code that
 # gnulib-tool generates, since we don't want "sed --posix" to leak
-# into makefiles.
-if (alias) > /dev/null 2>&1 && echo | sed --posix -e d >/dev/null 2>&1; then
+# into makefiles. And do it only for sed versions 4.2 or newer,
+# because "sed --posix" is buggy in GNU sed 4.1.5, see
+# <http://lists.gnu.org/archive/html/bug-gnulib/2009-02/msg00225.html>.
+if (alias) > /dev/null 2>&1 \
+   && echo | sed --posix -e d >/dev/null 2>&1 \
+   && case `sed --version | sed -e 's/^[^0-9]*//' -e 1q` in \
+        [1-3]* | 4.[01]*) false;; \
+        *) true;; \
+      esac \
+   ; then
   # Define sed as an alias.
   # It is not always possible to use aliases. Aliases are guaranteed to work
   # if the executing shell is bash and either it is invoked as /bin/sh or
   # is a version >= 2.0, supporting shopt. This is the common case.
   # Two other approaches (use of a variable $sed or of a function func_sed
   # instead of an alias) require massive, fragile code changes.
-  # An other approach (use of function sed) requires `which sed` - but 'which'
-  # is hard to emulate, due to missing "test -x" on some platforms.
+  # An other approach (use of function sed) requires `which sed` - but
+  # 'which' is hard to emulate, due to missing "test -x" on some platforms.
   if test -n "$BASH_VERSION"; then
     shopt -s expand_aliases >/dev/null 2>&1
   fi
@@ -111,6 +124,7 @@ Usage: gnulib-tool --list
        gnulib-tool --extract-license module
        gnulib-tool --extract-maintainer module
        gnulib-tool --extract-tests-module module
+       gnulib-tool --copy-file file [destination]
 
 Operation modes:
       --list                print the available module names
@@ -139,6 +153,7 @@ Operation modes:
                                    under lib/
       --extract-maintainer         report the maintainer(s) inside gnulib
       --extract-tests-module       report the unit test module, if it exists
+      --copy-file                  copy a file that is not part of any module
 
 General options:
       --dir=DIRECTORY       Specify the target directory.
@@ -398,11 +413,69 @@ if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then
   {
     eval "$1+=\"\$2\""
   }
+  fast_func_append=true
 else
   func_append ()
   {
     eval "$1=\"\$$1\$2\""
   }
+  fast_func_append=false
+fi
+
+# func_remove_prefix var prefix
+# removes the given prefix from the value of the shell variable var.
+# var should be the name of a shell variable.
+# Its value should not contain a newline and not start or end with whitespace.
+# prefix should not contain the characters "$`\{}[]^|.
+if ( foo=bar; eval 'test "${foo#b}" = ar' ) >/dev/null 2>&1; then
+  func_remove_prefix ()
+  {
+    eval "$1=\${$1#\$2}"
+  }
+  fast_func_remove_prefix=true
+else
+  func_remove_prefix ()
+  {
+    eval "value=\"\$$1\""
+    prefix="$2"
+    case "$prefix" in
+      *.*)
+        sed_escape_dots='s/\([.]\)/\\\1/g'
+        prefix=`echo "$prefix" | sed -e "$sed_escape_dots"`
+        ;;
+    esac
+    value=`echo "$value" | sed -e "s|^${prefix}||"`
+    eval "$1=\"\$value\""
+  }
+  fast_func_remove_prefix=false
+fi
+
+# func_remove_suffix var suffix
+# removes the given suffix from the value of the shell variable var.
+# var should be the name of a shell variable.
+# Its value should not contain a newline and not start or end with whitespace.
+# suffix should not contain the characters "$`\{}[]^|.
+if ( foo=bar; eval 'test "${foo%r}" = ba' ) >/dev/null 2>&1; then
+  func_remove_suffix ()
+  {
+    eval "$1=\${$1%\$2}"
+  }
+  fast_func_remove_suffix=true
+else
+  func_remove_suffix ()
+  {
+    eval "value=\"\$$1\""
+    suffix="$2"
+    case "$suffix" in
+      *.*)
+        sed_escape_dots='s/\([.]\)/\\\1/g'
+        suffix=`echo "$suffix" | sed -e "$sed_escape_dots"`
+        ;;
+    esac
+    value=`echo "$value" | sed -e "s|${suffix}\$||"`
+    eval "$1=\"\$value\""
+  }
+  fast_func_remove_suffix=false
 fi
 
 # func_fatal_error message
@@ -826,6 +899,9 @@ fi
       --extract-* )
         mode=`echo "X$1" | sed -e 's/^X--//'`
         shift ;;
+      --copy-file | --copy-fil | --copy-fi | --copy-f | --copy- | --copy | --cop | --co )
+        mode=copy-file
+        shift ;;
       --dir )
         shift
         if test $# = 0; then
@@ -1320,6 +1396,7 @@ func_get_filelist ()
 {
   func_lookup_file "modules/$1"
   sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file"
+  echo m4/00gnulib.m4
   echo m4/gnulib-common.m4
   case "$autoconf_minversion" in
     2.59)
@@ -1328,13 +1405,63 @@ func_get_filelist ()
   esac
 }
 
+# func_filter_filelist outputvar separator filelist prefix suffix removed_prefix removed_suffix [added_prefix [added_suffix]]
+# stores in outputvar the filtered and processed filelist. Filtering: Only the
+# elements starting with prefix and ending with suffix are considered.
+# Processing: removed_prefix and removed_suffix are removed from each element,
+# added_prefix and added_suffix are added to each element.
+# removed_prefix, removed_suffix should not contain the characters "$`\{}[]^|.
+# added_prefix, added_suffix should not contain the characters \|&.
+func_filter_filelist ()
+{
+  if test "$2" != "$nl" \
+     || { $fast_func_append \
+          && { test -z "$6" || $fast_func_remove_prefix; } \
+          && { test -z "$7" || $fast_func_remove_suffix; }; \
+        }; then
+    ffflist=
+    for fff in $3; do
+      case "$fff" in
+        "$4"*"$5")
+          if test -n "$6"; then
+            func_remove_prefix fff "$6"
+          fi
+          if test -n "$7"; then
+            func_remove_suffix fff "$7"
+          fi
+          fff="$8${fff}$9"
+          if test -z "$ffflist"; then
+            ffflist="${fff}"
+          else
+            func_append ffflist "$2${fff}"
+          fi
+          ;;
+      esac
+    done
+  else
+    sed_fff_filter="s|^$6\(.*\)$7\$|$8\\1$9|"
+    ffflist=`for fff in $3; do
+               case "$fff" in
+                 "$4"*"$5") echo "$fff" ;;
+               esac
+             done | sed -e "$sed_fff_filter"`
+  fi
+  eval "$1=\"\$ffflist\""
+}
+
 # func_get_dependencies module
 # Input:
 # - local_gnulib_dir  from --local-dir
 func_get_dependencies ()
 {
   # ${module}-tests always implicitly depends on ${module}.
-  echo "$1" | sed -n -e 's/-tests$//p'
+  case "$1" in
+    *-tests)
+      fgd1="$1"
+      func_remove_suffix fgd1 '-tests'
+      echo "$fgd1"
+      ;;
+  esac
   # Then the explicit dependencies listed in the module description.
   func_lookup_file "modules/$1"
   sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file"
@@ -1370,11 +1497,7 @@ func_get_automake_snippet ()
       # *-tests module live in tests/, not lib/.
       # Synthesize an EXTRA_DIST augmentation.
       all_files=`func_get_filelist $1`
-      tests_files=`for f in $all_files; do \
-                     case $f in \
-                       tests/*) echo $f ;; \
-                     esac; \
-                   done | sed -e 's,^tests/,,'`
+      func_filter_filelist tests_files " " "$all_files" 'tests/' '' 'tests/' ''
       extra_files="$tests_files"
       if test -n "$extra_files"; then
         echo "EXTRA_DIST +=" $extra_files
@@ -1396,11 +1519,7 @@ func_get_automake_snippet ()
         | sed -e "$sed_combine_lines" \
         | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'`
       all_files=`func_get_filelist $1`
-      lib_files=`for f in $all_files; do \
-                   case $f in \
-                     lib/*) echo $f ;; \
-                   esac; \
-                 done | sed -e 's,^lib/,,'`
+      func_filter_filelist lib_files "$nl" "$all_files" 'lib/' '' 'lib/' ''
       # Remove $already_mentioned_files from $lib_files.
       echo "$lib_files" | LC_ALL=C sort -u > "$tmp"/lib-files
       extra_files=`func_reset_sigpipe; \
@@ -1424,8 +1543,7 @@ func_get_automake_snippet ()
       case "$1" in
         relocatable-prog-wrapper) ;;
         *)
-          sed_extract_c_files='/\.c$/p'
-          extra_files=`echo "$extra_files" | sed -n -e "$sed_extract_c_files"`
+          func_filter_filelist extra_files "$nl" "$extra_files" '' '.c' '' ''
           if test -n "$extra_files"; then
             echo "EXTRA_lib_SOURCES +=" $extra_files
             echo
@@ -1433,22 +1551,14 @@ func_get_automake_snippet ()
           ;;
       esac
       # Synthesize an EXTRA_DIST augmentation also for the files in build-aux/.
-      buildaux_files=`for f in $all_files; do \
-                        case $f in \
-                          build-aux/*) echo $f ;; \
-                        esac; \
-                      done | sed -e 's,^build-aux/,,'`
+      func_filter_filelist buildaux_files "$nl" "$all_files" 'build-aux/' '' 'build-aux/' ''
       if test -n "$buildaux_files"; then
         sed_prepend_auxdir='s,^,$(top_srcdir)/'"$auxdir"'/,'
         echo "EXTRA_DIST += "`echo "$buildaux_files" | sed -e "$sed_prepend_auxdir"`
         echo
       fi
       # Synthesize an EXTRA_DIST augmentation also for the files from top/.
-      top_files=`for f in $all_files; do \
-                   case $f in \
-                     top/*) echo $f ;; \
-                   esac; \
-                 done | sed -e 's,^top/,,'`
+      func_filter_filelist top_files "$nl" "$all_files" 'top/' '' 'top/' ''
       if test -n "$top_files"; then
         sed_prepend_topdir='s,^,$(top_srcdir)/,'
         echo "EXTRA_DIST += "`echo "$top_files" | sed -e "$sed_prepend_topdir"`
@@ -1690,6 +1800,108 @@ func_execute_command ()
   fi
 }
 
+# func_dest_tmpfilename file
+# determines the name of a temporary file (file is relative to destdir).
+# Input:
+# - destdir         target directory
+# - doit            : if actions shall be executed, false if only to be printed
+# - tmp             pathname of a temporary directory
+# Sets variable:
+#   - tmpfile       absolute filename of the temporary file
+func_dest_tmpfilename ()
+{
+  if $doit; then
+    # Put the new contents of $file in a file in the same directory (needed
+    # to guarantee that an 'mv' to "$destdir/$file" works).
+    tmpfile="$destdir/$1.tmp"
+  else
+    # Put the new contents of $file in a file in a temporary directory
+    # (because the directory of "$file" might not exist).
+    tmpfile="$tmp"/`basename "$1"`.tmp
+  fi
+}
+
+# func_add_file
+# copies a file from gnulib into the destination directory. The destination
+# is known to not exist.
+# Input:
+# - destdir         target directory
+# - local_gnulib_dir  from --local-dir
+# - f               the original file name
+# - lookedup_file   name of the merged (combined) file
+# - lookedup_tmp    true if it is located in the tmp directory, blank otherwise
+# - g               the rewritten file name
+# - tmpfile         absolute filename of the temporary file
+# - doit            : if actions shall be executed, false if only to be printed
+# - symbolic        true if files should be symlinked, copied otherwise
+# - lsymbolic       true if files from local_gnulib_dir should be symlinked,
+#                   copied otherwise
+func_add_file ()
+{
+  if $doit; then
+    echo "Copying file $g"
+    if { test -n "$symbolic" \
+         || { test -n "$lsymbolic" \
+              && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
+       && test -z "$lookedup_tmp" \
+       && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+      func_ln_if_changed "$lookedup_file" "$destdir/$g"
+    else
+      mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+    fi
+  else
+    echo "Copy file $g"
+  fi
+}
+
+# func_update_file
+# copies a file from gnulib into the destination directory. The destination
+# is known to exist.
+# Input:
+# - destdir         target directory
+# - local_gnulib_dir  from --local-dir
+# - f               the original file name
+# - lookedup_file   name of the merged (combined) file
+# - lookedup_tmp    true if it is located in the tmp directory, blank otherwise
+# - g               the rewritten file name
+# - tmpfile         absolute filename of the temporary file
+# - doit            : if actions shall be executed, false if only to be printed
+# - symbolic        true if files should be symlinked, copied otherwise
+# - lsymbolic       true if files from local_gnulib_dir should be symlinked,
+#                   copied otherwise
+# - already_present  nonempty if the file should already exist, empty otherwise
+func_update_file ()
+{
+  if cmp "$destdir/$g" "$tmpfile" > /dev/null; then
+    : # The file has not changed.
+  else
+    # Replace the file.
+    if $doit; then
+      if test -n "$already_present"; then
+        echo "Updating file $g (backup in ${g}~)"
+      else
+        echo "Replacing file $g (non-gnulib code backed up in ${g}~) !!"
+      fi
+      mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
+      if { test -n "$symbolic" \
+           || { test -n "$lsymbolic" \
+                && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
+         && test -z "$lookedup_tmp" \
+         && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+        func_ln_if_changed "$lookedup_file" "$destdir/$g"
+      else
+        mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+      fi
+    else
+      if test -n "$already_present"; then
+        echo "Update file $g (backup in ${g}~)"
+      else
+        echo "Replace file $g (non-gnulib code backed up in ${g}~) !!"
+      fi
+    fi
+  fi
+}
+
 # func_emit_lib_Makefile_am
 # emits the contents of library makefile to standard output.
 # Input:
@@ -1741,7 +1953,14 @@ func_emit_lib_Makefile_am ()
   echo "## Process this file with automake to produce Makefile.in."
   func_emit_copyright_notice
   if test -n "$actioncmd"; then
-    echo "# Reproduce by: $actioncmd"
+    # The maximum line length (excluding the terminating newline) of any file
+    # that is to be preprocessed by config.status is 3070.  config.status uses
+    # awk, and the HP-UX 11.00 awk fails if a line has length >= 3071;
+    # similarly, the IRIX 6.5 awk fails if a line has length >= 3072.
+    len=`echo "$actioncmd" | wc -c`
+    if test -n "$len" && test "$len" -le 3000; then
+      echo "# Reproduce by: $actioncmd"
+    fi
   fi
   echo
   uses_subdirs=
@@ -1832,11 +2051,17 @@ func_emit_lib_Makefile_am ()
   if test -z "$makefile_name"; then
     echo
     echo "AM_CPPFLAGS ="
+    echo "AM_CFLAGS ="
   fi
   echo
-  if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" allsnippets.tmp > /dev/null; then
-    # One of the snippets already specifies an installation location for the
-    # library. Don't confuse automake by saying it should not be installed.
+  if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" allsnippets.tmp > /dev/null \
+     || { test -n "$makefile_name" \
+          && test -f "$sourcebase/Makefile.am" \
+          && LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" "$sourcebase/Makefile.am" > /dev/null; \
+        }; then
+    # One of the snippets or the user's Makefile.am already specifies an
+    # installation location for the library. Don't confuse automake by saying
+    # it should not be installed.
     :
   else
     # By default, the generated library should not be installed.
@@ -2744,23 +2969,6 @@ s,^\(.................................................[^ ]*\) *,
     exec 0<&5 5<&-
   }
 
-  # func_dest_tmpfilename file
-  # determines the name of a temporary file (file is relative to destdir).
-  # Sets variable:
-  #   - tmpfile       absolute filename of the temporary file
-  func_dest_tmpfilename ()
-  {
-    if $doit; then
-      # Put the new contents of $file in a file in the same directory (needed
-      # to guarantee that an 'mv' to "$destdir/$file" works).
-      tmpfile="$destdir/$1.tmp"
-    else
-      # Put the new contents of $file in a file in a temporary directory
-      # (because the directory of "$file" might not exist).
-      tmpfile="$tmp"/`basename "$1"`.tmp
-    fi
-  }
-
   # Copy files or make symbolic links. Remove obsolete files.
   added_files=''
   removed_files=''
@@ -2795,7 +3003,8 @@ s,^\(.................................................[^ ]*\) *,
   # Uses parameters
   # - f             the original file name
   # - g             the rewritten file name
-  # - already_present  nonempty if the file already exists, empty otherwise
+  # - already_present  nonempty if the file should already exist, empty
+  #                    otherwise
   func_add_or_update ()
   {
     of="$f"
@@ -2823,52 +3032,12 @@ s,^\(.................................................[^ ]*\) *,
     fi
     if test -f "$destdir/$g"; then
       # The file already exists.
-      if cmp "$destdir/$g" "$tmpfile" > /dev/null; then
-        : # The file has not changed.
-      else
-        # Replace the file.
-        if $doit; then
-          if test -n "$already_present"; then
-            echo "Updating file $g (backup in ${g}~)"
-          else
-            echo "Replacing file $g (non-gnulib code backed up in ${g}~) !!"
-          fi
-          mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
-          if { test -n "$symbolic" \
-               || { test -n "$lsymbolic" \
-                    && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
-             && test -z "$lookedup_tmp" \
-             && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
-            func_ln_if_changed "$lookedup_file" "$destdir/$g"
-          else
-            mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
-          fi
-        else
-          if test -n "$already_present"; then
-            echo "Update file $g (backup in ${g}~)"
-          else
-            echo "Replace file $g (non-gnulib code backed up in ${g}~) !!"
-          fi
-        fi
-      fi
+      func_update_file
     else
       # Install the file.
       # Don't protest if the file should be there but isn't: it happens
       # frequently that developers don't put autogenerated files into CVS.
-      if $doit; then
-        echo "Copying file $g"
-        if { test -n "$symbolic" \
-             || { test -n "$lsymbolic" \
-                  && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
-           && test -z "$lookedup_tmp" \
-           && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
-          func_ln_if_changed "$lookedup_file" "$destdir/$g"
-        else
-          mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
-        fi
-      else
-        echo "Copy file $g"
-      fi
+      func_add_file
       func_append added_files "$g$nl"
     fi
     rm -f "$tmpfile"
@@ -3287,9 +3456,6 @@ s,//*$,/,'
     if test -n "$uses_subdirs"; then
       echo "  AC_REQUIRE([AM_PROG_CC_C_O])"
     fi
-    if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 >/dev/null 2>/dev/null; then
-      echo "  AC_REQUIRE([AC_GNU_SOURCE])"
-    fi
     for module in $final_modules; do
       func_verify_module
       if test -n "$module"; then
@@ -3478,7 +3644,7 @@ s,//*$,/,'
                 echo "Updating $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
                 mv -f "$destdir/$dir$ignore" "$destdir/$dir$ignore"~
                 { sed -e 's,/,\\/,g' -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed
-                  if test -n "$anchor"; then sed -e 's,/,\\/,g' -e "s,^,/^${doubly_escaped_anchor}," -e 's,$,\$/d,' < "$tmp"/ignore-removed; fi
+                  if test -n "$anchor"; then sed -e 's,/,\\/,g' -e "s,^,/^${doubly_escaped_anchor}," -e 's,$,$/d,' < "$tmp"/ignore-removed; fi
                 } > "$tmp"/sed-ignore-removed
                 { cat "$destdir/$dir$ignore"~
                   sed -e "s|^|$anchor|" < "$tmp"/ignore-added
@@ -3828,10 +3994,6 @@ func_create_testdir ()
      echo "AC_PROG_MAKE_SET"
      echo "AC_PROG_RANLIB"
      echo
-     if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then
-       echo "AC_GNU_SOURCE"
-       echo
-     fi
      for module in $modules; do
        func_verify_module
        if test -n "$module"; then
@@ -3961,10 +4123,6 @@ func_create_testdir ()
      echo "AM_PROG_CC_C_O"
      echo
    fi
-   if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then
-     echo "AC_GNU_SOURCE"
-     echo
-   fi
    for module in $modules; do
      func_verify_nontests_module
      if test -n "$module"; then
@@ -4103,9 +4261,9 @@ func_create_testdir ()
      ./configure || func_exit 1
        cd "$sourcebase"
        echo 'built_sources: $(BUILT_SOURCES)' >> Makefile
-       make built_sources || func_exit 1
+       $MAKE built_sources || func_exit 1
        cd ..
-     make distclean || func_exit 1
+     $MAKE distclean || func_exit 1
     ) || func_exit 1
   fi
 }
@@ -4158,6 +4316,7 @@ func_create_megatestdir ()
                    -e 's,^\([0-9]*\) \([0-9]*\) \([0-9]*\),\3\2\1,'`
   (echo '#!/bin/sh'
    echo "CVSDATE=$cvsdate"
+   echo ": \${MAKE=make}"
    echo "test -d logs || mkdir logs"
    echo "for module in $megasubdirs; do"
    echo "  echo \"Working on module \$module...\""
@@ -4169,7 +4328,7 @@ func_create_megatestdir ()
    echo "   : autobuild revision... cvs-\$CVSDATE-000000"
    echo "   : autobuild timestamp... \`date \"+%Y%m%d-%H%M%S\"\`"
    echo "   : autobuild hostname... \`hostname\`"
-   echo "   cd \$module && ./configure \$CONFIGURE_OPTIONS && make && make check && make distclean"
+   echo "   cd \$module && ./configure \$CONFIGURE_OPTIONS && \$MAKE && \$MAKE check && \$MAKE distclean"
    echo "   echo rc=\$?"
    echo "  ) 2>&1 | { if test -n \"\$AUTOBUILD_SUBST\"; then sed -e \"\$AUTOBUILD_SUBST\"; else cat; fi; } > logs/\$safemodule"
    echo "done"
@@ -4381,9 +4540,9 @@ case $mode in
       mkdir build
       cd build
         ../configure || func_exit 1
-        make || func_exit 1
-        make check || func_exit 1
-        make distclean || func_exit 1
+        $MAKE || func_exit 1
+        $MAKE check || func_exit 1
+        $MAKE distclean || func_exit 1
         remaining=`find . -type f -print`
         if test -n "$remaining"; then
           echo "Remaining files:" $remaining 1>&2
@@ -4404,9 +4563,9 @@ case $mode in
       mkdir build
       cd build
         ../configure
-        make
-        make check
-        make distclean
+        $MAKE
+        $MAKE check
+        $MAKE distclean
         remaining=`find . -type f -print`
         if test -n "$remaining"; then
           echo "Remaining files:" $remaining 1>&2
@@ -4538,6 +4697,64 @@ case $mode in
     done
     ;;
 
+  copy-file )
+    # Verify the number of arguments.
+    if test $# -lt 1 || test $# -gt 2; then
+      func_fatal_error "invalid number of arguments for --$mode"
+    fi
+
+    # The first argument is the file to be copied.
+    f="$1"
+    # Verify the file exists.
+    func_lookup_file "$f"
+
+    # The second argument is the destination; either a directory ot a file.
+    # It defaults to the current directory.
+    dest="$2"
+    test -n "$dest" || dest='.'
+    test -n "$sourcebase" || sourcebase="lib"
+    test -n "$m4base" || m4base="m4"
+    test -n "$docbase" || docbase="doc"
+    test -n "$testsbase" || testsbase="tests"
+    test -n "$auxdir" || auxdir="build-aux"
+    sed_rewrite_files="\
+      s,^build-aux/,$auxdir/,
+      s,^doc/,$docbase/,
+      s,^lib/,$sourcebase/,
+      s,^m4/,$m4base/,
+      s,^tests/,$testsbase/,
+      s,^top/,,"
+    if test -d "$dest"; then
+      destdir="$dest"
+      g=`echo "$f" | sed -e "$sed_rewrite_files"`
+    else
+      destdir=`dirname "$dest"`
+      g=`basename "$dest"`
+    fi
+
+    # Create the directory for destfile.
+    d=`dirname "$destdir/$g"`
+    if $doit; then
+      if test -n "$d" && test ! -d "$d"; then
+        mkdir -p "$d" || func_fatal_error "failed"
+      fi
+    fi
+    # Copy the file.
+    func_dest_tmpfilename "$g"
+    cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed"
+    already_present=true
+    if test -f "$destdir/$g"; then
+      # The file already exists.
+      func_update_file
+    else
+      # Install the file.
+      # Don't protest if the file should be there but isn't: it happens
+      # frequently that developers don't put autogenerated files into CVS.
+      func_add_file
+    fi
+    rm -f "$tmpfile"
+    ;;
+
   * )
     func_fatal_error "unknown operation mode --$mode" ;;
 esac