* lib/canonicalize.c (ELOOP): Define if not already defined.
[gnulib.git] / gnulib-tool
index 121d23c..a705f23 100755 (executable)
@@ -22,7 +22,7 @@
 
 progname=$0
 package=gnulib
-cvsdatestamp='$Date: 2006-09-18 13:07:37 $'
+cvsdatestamp='$Date: 2006-10-20 13:42:39 $'
 last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'`
 version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'`
 nl='
@@ -40,11 +40,17 @@ AUTOCONFPATH=
 # You can set AUTOMAKEPATH to empty if automake 1.9.x is already in your PATH.
 AUTOMAKEPATH=
 
+# You can set GETTEXTPATH to empty if autopoint 0.15 is already in your PATH.
+GETTEXTPATH=
+
 # If you didn't set AUTOCONFPATH and AUTOMAKEPATH, you can also set the
-# variables AUTOCONF, ACLOCAL, AUTOMAKE, AUTORECONF individually.
+# variables AUTOCONF, AUTOHEADER, ACLOCAL, AUTOMAKE, AUTORECONF individually.
 if test -z "${AUTOCONF}" || test -n "${AUTOCONFPATH}"; then
   AUTOCONF="${AUTOCONFPATH}autoconf"
 fi
+if test -z "${AUTOHEADER}" || test -n "${AUTOCONFPATH}"; then
+  AUTOHEADER="${AUTOCONFPATH}autoheader"
+fi
 if test -z "${ACLOCAL}" || test -n "${AUTOMAKEPATH}"; then
   ACLOCAL="${AUTOMAKEPATH}aclocal"
 fi
@@ -55,6 +61,11 @@ if test -z "${AUTORECONF}" || test -n "${AUTOCONFPATH}"; then
   AUTORECONF="${AUTOCONFPATH}autoreconf"
 fi
 
+# If you didn't set GETTEXTPATH, you can also set the variable AUTOPOINT.
+if test -z "${AUTOPOINT}" || test -n "${GETTEXTPATH}"; then
+  AUTOPOINT="${GETTEXTPATH}autopoint"
+fi
+
 # GNU sort is needed. Set SORT to its location (not needed if it's called
 # 'sort' and already in the PATH).
 if test -z "$SORT"; then
@@ -69,7 +80,7 @@ func_usage ()
 Usage: gnulib-tool --list
        gnulib-tool --import [module1 ... moduleN]
        gnulib-tool --update
-       gnulib-tool --create-testdir --dir=directory module1 ... moduleN
+       gnulib-tool --create-testdir --dir=directory [module1 ... moduleN]
        gnulib-tool --create-megatestdir --dir=directory [module1 ... moduleN]
        gnulib-tool --test --dir=directory module1 ... moduleN
        gnulib-tool --megatest --dir=directory [module1 ... moduleN]
@@ -157,11 +168,12 @@ Report bugs to <bug-gnulib@gnu.org>."
 func_version ()
 {
   year=`echo "$last_checkin_date" | sed -e 's,/.*$,,'`
-  echo "$progname (GNU $package) $version"
-  echo "Copyright (C) $year Free Software Foundation, Inc.
+  echo "\
+$progname (GNU $package) $version
+Copyright (C) $year Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-  echo "Written by" "Bruno Haible" "and" "Simon Josefsson"
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+Written by" "Bruno Haible" "and" "Simon Josefsson"
 }
 
 # func_emit_copyright_notice
@@ -179,6 +191,13 @@ func_emit_copyright_notice ()
   echo "# Generated by gnulib-tool."
 }
 
+# func_exit STATUS
+# exit with status
+func_exit ()
+{
+  (exit $1); exit $1
+}
+
 # func_tmpdir
 # creates a temporary directory.
 # Sets variable
@@ -206,7 +225,7 @@ func_tmpdir ()
   } ||
   {
     echo "$0: cannot create a temporary directory in $TMPDIR" >&2
-    { (exit 1); exit 1; }
+    func_exit 1
   }
 }
 
@@ -232,7 +251,7 @@ func_fatal_error ()
 {
   echo "gnulib-tool: *** $1" 1>&2
   echo "gnulib-tool: *** Stop." 1>&2
-  exit 1
+  func_exit 1
 }
 
 # func_readlink SYMLINK
@@ -525,7 +544,7 @@ func_relconcat ()
         shift ;;
       --avoid=* )
         arg=`echo "X$1" | sed -e 's/^X--avoid=//'`
-        func_append " $arg"
+        func_append avoidlist " $arg"
         shift ;;
       --lgpl )
         lgpl=true
@@ -567,10 +586,10 @@ func_relconcat ()
         shift ;;
       --help | --hel | --he | --h )
         func_usage
-        exit 0 ;;
+        func_exit $? ;;
       --version | --versio | --versi | --vers | --ver | --ve | --v )
         func_version
-        exit 0 ;;
+        func_exit $? ;;
       -- )
         # Stop option processing
         shift
@@ -578,7 +597,7 @@ func_relconcat ()
       -* )
         echo "gnulib-tool: unknown option $1" 1>&2
         echo "Try 'gnulib-tool --help' for more information." 1>&2
-        exit 1 ;;
+        func_exit 1 ;;
       * )
         break ;;
     esac
@@ -590,7 +609,7 @@ func_relconcat ()
       echo "Try 'gnulib-tool --help' for more information." 1>&2
       echo "If you really want to modify the gnulib configuration of your project," 1>&2
       echo "you need to use 'gnulib --import' - at your own risk!" 1>&2
-      exit 1
+      func_exit 1
     fi
     if test -n "$local_gnulib_dir" || test -n "$supplied_libname" \
        || test -n "$sourcebase" || test -n "$m4base" \
@@ -601,7 +620,7 @@ func_relconcat ()
       echo "Try 'gnulib-tool --help' for more information." 1>&2
       echo "If you really want to modify the gnulib configuration of your project," 1>&2
       echo "you need to use 'gnulib --import' - at your own risk!" 1>&2
-      exit 1
+      func_exit 1
     fi
     do_changelog=false
   fi
@@ -659,7 +678,7 @@ func_relconcat ()
   # m4base (to avoid an error in func_import) and optional for the others.
   sed_trimtrailingslashes='s,\([^/]\)//*$,\1,'
   case "$local_gnulib_dir" in
-    */ ) sourcebase=`echo "$local_gnulib_dir" | sed -e "$sed_trimtrailingslashes"` ;;
+    */ ) local_gnulib_dir=`echo "$local_gnulib_dir" | sed -e "$sed_trimtrailingslashes"` ;;
   esac
   case "$sourcebase" in
     */ ) sourcebase=`echo "$sourcebase" | sed -e "$sed_trimtrailingslashes"` ;;
@@ -704,7 +723,16 @@ done
 gnulib_dir=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`
 
 func_tmpdir
-trap 'rm -rf "$tmp"' 0 1 2 3 15
+trap 'exit_status=$?
+      if test "$signal" != 0; then
+        echo "caught signal $signal" >&2
+      fi
+      rm -rf "$tmp"
+      exit $exit_status' 0
+for signal in 1 2 3 13 15; do
+  trap '{ signal='$signal'; func_exit 1; }' $signal
+done
+signal=0
 
 # func_lookup_file file
 # looks up a file in $local_gnulib_dir or $gnulib_dir, or combines it through
@@ -879,6 +907,41 @@ func_get_automake_snippet ()
 {
   func_lookup_file "modules/$1"
   sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file"
+  case "$1" in
+    *-tests)
+      # *-tests module live in tests/, not lib/.
+      ;;
+    *)
+      # Synthesize an EXTRA_DIST augmentation.
+      sed_combine_lines='/\\$/{
+        :a
+        N
+        s/\\\
+//
+        s/\\$/\\/
+        ta
+      }'
+      sed_extract_mentioned_files='s/^lib_SOURCES[     ]*+=[   ]*//p'
+      already_mentioned_files=` \
+        sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file" \
+        | 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/,,'`
+      # Remove $already_mentioned_files from $lib_files.
+      echo "$lib_files" | LC_ALL=C sort -u > "$tmp"/lib-files
+      extra_files=`for f in $already_mentioned_files; do echo $f; done \
+                   | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/lib-files`
+      if test -n "$extra_files"; then
+        echo "EXTRA_DIST +=" $extra_files
+        echo
+      fi
+      ;;
+  esac
 }
 
 # func_get_include_directive module
@@ -1050,6 +1113,7 @@ func_modules_to_filelist ()
 # - libname         library name
 # - makefile_name   from --makefile-name
 # - libtool         true if libtool will be used, false or blank otherwise
+# - macro_prefix    prefix of gl_LIBOBJS macros to use
 # - actioncmd       (optional) command that will reproduce this invocation
 func_emit_lib_Makefile_am ()
 {
@@ -1067,8 +1131,9 @@ func_emit_lib_Makefile_am ()
   else
     libext=a
     perhapsLT=
-    sed_eliminate_LDFLAGS='/^lib_LDFLAGS[      ]*+=/d'
+    sed_eliminate_LDFLAGS='/^lib_LDFLAGS[       ]*+=/d'
   fi
+  echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
   echo "## Process this file with automake to produce Makefile.in."
   func_emit_copyright_notice
   if test -n "$actioncmd"; then
@@ -1076,8 +1141,7 @@ func_emit_lib_Makefile_am ()
   fi
   echo
   if test -z "$makefile_name"; then
-    # No need to generate dependencies since the sources are in gnulib, not here.
-    echo "AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies"
+    echo "AUTOMAKE_OPTIONS = 1.5 gnits"
   fi
   echo
   (
@@ -1094,6 +1158,7 @@ func_emit_lib_Makefile_am ()
                 -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g'
           if test "$module" = 'alloca'; then
             echo "${libname}_${libext}_LIBADD += @${perhapsLT}ALLOCA@"
+            echo "${libname}_${libext}_DEPENDENCIES += @${perhapsLT}ALLOCA@"
           fi
         } > amsnippet.tmp
         # Skip the contents if its entirely empty.
@@ -1120,7 +1185,8 @@ func_emit_lib_Makefile_am ()
   echo "${libname}_${libext}_SOURCES ="
   # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However,
   # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@.
-  echo "${libname}_${libext}_LIBADD = \$(${perhapsLT}LIBOBJS)"
+  echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)"
+  echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)"
   if test "$libtool" = true; then
     echo "${libname}_${libext}_LDFLAGS = \$(AM_LDFLAGS)"
   fi
@@ -1180,9 +1246,10 @@ func_emit_tests_Makefile_am ()
     sed_eliminate_LDFLAGS=
   else
     libext=a
-    sed_eliminate_LDFLAGS='/^lib_LDFLAGS[      ]*+=/d'
+    sed_eliminate_LDFLAGS='/^lib_LDFLAGS[       ]*+=/d'
   fi
   testsbase_inverse=`echo "$testsbase" | sed -e 's,/$,,' | sed -e 's,[^/][^/]*,..,g'`
+  echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
   echo "## Process this file with automake to produce Makefile.in."
   func_emit_copyright_notice
   echo
@@ -1259,6 +1326,55 @@ func_emit_tests_Makefile_am ()
   rm -f allsnippets.tmp
 }
 
+# func_emit_initmacro_start
+# emits the first few statements of the gl_INIT macro to standard output.
+# - macro_prefix    prefix of gl_EARLY, gl_INIT macros to use
+func_emit_initmacro_start ()
+{
+  echo "  m4_pushdef([AC_LIBOBJ], m4_defn([${macro_prefix}_LIBOBJ]))"
+  echo "  m4_pushdef([AC_REPLACE_FUNCS], m4_defn([${macro_prefix}_REPLACE_FUNCS]))"
+}
+
+# func_emit_initmacro_end
+# emits the last few statements of the gl_INIT macro to standard output.
+# - macro_prefix    prefix of gl_EARLY, gl_INIT macros to use
+func_emit_initmacro_end ()
+{
+  echo "  m4_popdef([AC_REPLACE_FUNCS])"
+  echo "  m4_popdef([AC_LIBOBJ])"
+  echo "  AC_CONFIG_COMMANDS_PRE(["
+  echo "    ${macro_prefix}_libobjs="
+  echo "    ${macro_prefix}_ltlibobjs="
+  echo "    if test -n \"\$${macro_prefix}_LIBOBJS\"; then"
+  echo "      # Remove the extension."
+  echo "      sed_drop_objext='s/\\.o\$//;s/\\.obj\$//'"
+  echo "      for i in \`for i in \$${macro_prefix}_LIBOBJS; do echo \"\$i\"; done | sed \"\$sed_drop_objext\" | sort | uniq\`; do"
+  echo "        ${macro_prefix}_libobjs=\"\$${macro_prefix}_libobjs \$i.\$ac_objext\""
+  echo "        ${macro_prefix}_ltlibobjs=\"\$${macro_prefix}_ltlibobjs \$i.lo\""
+  echo "      done"
+  echo "    fi"
+  echo "    AC_SUBST([${macro_prefix}_LIBOBJS], [\$${macro_prefix}_libobjs])"
+  echo "    AC_SUBST([${macro_prefix}_LTLIBOBJS], [\$${macro_prefix}_ltlibobjs])"
+  echo "  ])"
+}
+
+# func_emit_initmacro_done
+# emits a few statements after the gl_INIT macro to standard output.
+# - macro_prefix    prefix of gl_EARLY, gl_INIT macros to use
+func_emit_initmacro_done ()
+{
+  echo
+  echo "# Like AC_LIBOBJ, except that the module name goes"
+  echo "# into ${macro_prefix}_LIBOBJS instead of into LIBOBJS."
+  echo "AC_DEFUN([${macro_prefix}_LIBOBJ],"
+  echo "  [${macro_prefix}_LIBOBJS=\"\$${macro_prefix}_LIBOBJS \$1.\$ac_objext\"])"
+  echo
+  echo "# Like AC_REPLACE_FUNCS, except that the module name goes"
+  echo "# into ${macro_prefix}_LIBOBJS instead of into LIBOBJS."
+  echo "AC_DEFUN([${macro_prefix}_REPLACE_FUNCS],"
+  echo "  [AC_CHECK_FUNCS([\$1], , [${macro_prefix}_LIBOBJ(\$ac_func)])])"
+}
+
 # func_import modules
 # Uses also the variables
 # - destdir         target directory
@@ -1672,17 +1788,27 @@ func_import ()
   LC_ALL=C join -t"$delimiter" -v2 "$tmp"/old-files "$tmp"/new-files \
     | sed -e "$sed_take_last_column" \
     | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" > "$tmp"/added-files
-  while read g f; do
-    func_add_or_update
-  done < "$tmp"/added-files
+  { # Rearrange file descriptors. Needed because "while ... done < ..."
+    # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+    exec 5<&0 < "$tmp"/added-files
+    while read g f; do
+      func_add_or_update
+    done
+    exec 0<&5 5<&-
+  }
   # Then the files that are in new-files and in old-files:
   already_present=true
   LC_ALL=C join -t"$delimiter" "$tmp"/old-files "$tmp"/new-files \
     | sed -e "$sed_take_last_column" \
     | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" > "$tmp"/kept-files
-  while read g f; do
-    func_add_or_update
-  done < "$tmp"/kept-files
+  { # Rearrange file descriptors. Needed because "while ... done < ..."
+    # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+    exec 5<&0 < "$tmp"/kept-files
+    while read g f; do
+      func_add_or_update
+    done
+    exec 0<&5 5<&-
+  }
 
   # Command-line invocation printed in a comment in generated gnulib-cache.m4.
   actioncmd="gnulib-tool --import"
@@ -1820,6 +1946,7 @@ func_import ()
   # Create m4/gnulib-comp.m4.
   func_dest_tmpfilename $m4base/gnulib-comp.m4
   (
+    echo "# DO NOT EDIT! GENERATED AUTOMATICALLY!"
     func_emit_copyright_notice
     echo "#"
     echo "# This file represents the compiled summary of the specification in"
@@ -1834,7 +1961,9 @@ func_import ()
     echo "AC_DEFUN([${macro_prefix}_EARLY],"
     echo "["
     echo "  m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace"
-    echo "  m4_pattern_allow([^gl_ES$])dnl a valid locale name"
+    echo "  m4_pattern_allow([^gl_ES\$])dnl a valid locale name"
+    echo "  m4_pattern_allow([^gl_LIBOBJS\$])dnl a variable"
+    echo "  m4_pattern_allow([^gl_LTLIBOBJS\$])dnl a variable"
     echo "  AC_REQUIRE([AC_PROG_RANLIB])"
     if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 >/dev/null 2>/dev/null; then
       echo "  AC_REQUIRE([AC_GNU_SOURCE])"
@@ -1851,6 +1980,7 @@ func_import ()
     echo "# \"Check for header files, types and library functions\"."
     echo "AC_DEFUN([${macro_prefix}_INIT],"
     echo "["
+    func_emit_initmacro_start
     if test "$libtool" = true; then
       echo "  AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
       echo "  gl_cond_libtool=true"
@@ -1860,6 +1990,7 @@ func_import ()
       echo "  gl_libdeps="
       echo "  gl_ltlibdeps="
     fi
+    echo "  gl_source_base='$sourcebase'"
     if test "$auxdir" != "build-aux"; then
       sed_replace_build_aux='
         :a
@@ -1895,7 +2026,9 @@ func_import ()
       echo "  ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
       echo "  AC_SUBST([${libname_upper}_LTLIBDEPS])"
     fi
+    func_emit_initmacro_end
     echo "])"
+    func_emit_initmacro_done
     echo
     echo "# This macro records the list of files which have been installed by"
     echo "# gnulib-tool and may be removed by future gnulib-tool invocations."
@@ -2024,6 +2157,14 @@ func_create_testdir ()
 {
   testdir="$1"
   modules="$2"
+  if test -z "$modules"; then
+    # All modules together.
+    # Except config-h, which breaks all modules which use HAVE_CONFIG_H.
+    # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME.
+    # Except ftruncate, mountlist, which abort the configuration on mingw. FIXME.
+    modules=`func_all_modules`
+    modules=`for m in $modules; do case $m in config-h | fnmatch-posix | ftruncate | mountlist) ;; *) echo $m;; esac; done`
+  fi
   modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u`
 
   # Subdirectory names.
@@ -2031,6 +2172,7 @@ func_create_testdir ()
   m4base=glm4
   docbase=gldoc
   testsbase=gltests
+  macro_prefix=gl
 
   # Determine final module list.
   func_modules_transitive_closure
@@ -2069,19 +2211,24 @@ func_create_testdir ()
     | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_files" \
     | LC_ALL=C sort \
     > "$tmp"/files
-  while read g f; do
-    func_lookup_file "$f"
-    if test -n "$lookedup_tmp"; then
-      cp -p "$lookedup_file" "$testdir/$g"
-    else
-      ln "$lookedup_file" "$testdir/$g" 2>/dev/null ||
-      if test -z "$symbolic"; then
+  { # Rearrange file descriptors. Needed because "while ... done < ..."
+    # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+    exec 5<&0 < "$tmp"/files
+    while read g f; do
+      func_lookup_file "$f"
+      if test -n "$lookedup_tmp"; then
         cp -p "$lookedup_file" "$testdir/$g"
       else
-        ln -s "$lookedup_file" "$testdir/$g"
+        ln "$lookedup_file" "$testdir/$g" 2>/dev/null ||
+        if test -z "$symbolic"; then
+          cp -p "$lookedup_file" "$testdir/$g"
+        else
+          ln -s "$lookedup_file" "$testdir/$g"
+        fi
       fi
-    fi
-  done < "$tmp"/files
+    done
+    exec 0<&5 5<&-
+  }
 
   # Create $sourcebase/Makefile.am.
   mkdir -p "$testdir/$sourcebase"
@@ -2103,7 +2250,7 @@ func_create_testdir ()
   subdirs="$sourcebase $m4base"
   subdirs_with_configure_ac=""
 
-  if test -f "$testdir"/$m4base/gettext.m4; then
+  if false && test -f "$testdir"/$m4base/gettext.m4; then
     # Avoid stupid error message from automake:
     # "AM_GNU_GETTEXT used but `po' not in SUBDIRS"
     mkdir -p "$testdir/po"
@@ -2150,6 +2297,7 @@ func_create_testdir ()
        echo "gl_libdeps="
        echo "gl_ltlibdeps="
      fi
+     echo "gl_source_base='$testsbase'"
      # Wrap the set of autoconf snippets into an autoconf macro that is then
      # invoked. This is needed because autoconf does not support AC_REQUIRE
      # at the top level:
@@ -2158,6 +2306,7 @@ func_create_testdir ()
      # expansion of the required macro before the current point, and only one
      # expansion total).
      echo "AC_DEFUN([gl_INIT], ["
+     func_emit_initmacro_start
      if test "$auxdir" != "build-aux"; then
        sed_replace_build_aux='
          :a
@@ -2195,7 +2344,10 @@ func_create_testdir ()
        echo "  ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
        echo "  AC_SUBST([${libname_upper}_LTLIBDEPS])"
      fi
+     func_emit_initmacro_end
      echo "])"
+     func_emit_initmacro_done
+     echo
      echo "gl_INIT"
      echo
      # Usually $testsbase/config.h will be a superset of config.h. Verify this
@@ -2233,7 +2385,9 @@ func_create_testdir ()
    echo "AC_PROG_MAKE_SET"
    echo
    echo "m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace"
-   echo "m4_pattern_allow([^gl_ES$])dnl a valid locale name"
+   echo "m4_pattern_allow([^gl_ES\$])dnl a valid locale name"
+   echo "m4_pattern_allow([^gl_LIBOBJS\$])dnl a variable"
+   echo "m4_pattern_allow([^gl_LTLIBOBJS\$])dnl a variable"
    echo
    echo "AC_PROG_RANLIB"
    echo
@@ -2258,6 +2412,7 @@ func_create_testdir ()
      echo "gl_libdeps="
      echo "gl_ltlibdeps="
    fi
+   echo "gl_source_base='$sourcebase'"
    # Wrap the set of autoconf snippets into an autoconf macro that is then
    # invoked. This is needed because autoconf does not support AC_REQUIRE
    # at the top level:
@@ -2266,6 +2421,7 @@ func_create_testdir ()
    # expansion of the required macro before the current point, and only one
    # expansion total).
    echo "AC_DEFUN([gl_INIT], ["
+   func_emit_initmacro_start
    if test "$auxdir" != "build-aux"; then
      sed_replace_build_aux='
        :a
@@ -2293,7 +2449,10 @@ func_create_testdir ()
      echo "  ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
      echo "  AC_SUBST([${libname_upper}_LTLIBDEPS])"
    fi
+   func_emit_initmacro_end
    echo "])"
+   func_emit_initmacro_done
+   echo
    echo "gl_INIT"
    echo
    if test -n "$subdirs_with_configure_ac"; then
@@ -2313,8 +2472,27 @@ func_create_testdir ()
 
   # Create autogenerated files.
   (cd "$testdir"
-   echo "executing ${AUTORECONF} --force --install"
-   ${AUTORECONF} --force --install
+   # Do not use "${AUTORECONF} --force --install", because it may invoke
+   # autopoint, which brings in older versions of some of our .m4 files.
+   if test -f $m4base/gettext.m4; then
+     echo "executing ${AUTOPOINT} --force"
+     ${AUTOPOINT} --force
+     for f in $m4base/*.m4~; do
+       mv $f `echo $f | sed -e 's,~$,,'`
+     done
+   fi
+   echo "executing ${ACLOCAL} --force -I $m4base"
+   ${ACLOCAL} --force -I $m4base
+   if ! test -d build-aux; then
+     echo "executing mkdir build-aux"
+     mkdir build-aux
+   fi
+   echo "executing ${AUTOCONF} --force"
+   ${AUTOCONF} --force
+   echo "executing ${AUTOHEADER} --force"
+   ${AUTOHEADER} --force
+   echo "executing ${AUTOMAKE} --add-missing --copy --force-missing"
+   ${AUTOMAKE} --add-missing --copy --force-missing
   )
   if grep '^BUILT_SOURCES *+=' "$testdir/$sourcebase/Makefile.am" > /dev/null; then
     (cd "$testdir"
@@ -2347,8 +2525,9 @@ func_create_megatestdir ()
     func_append megasubdirs "$onemodule "
   done
   # Then, all modules all together.
+  # Except config-h, which breaks all modules which use HAVE_CONFIG_H.
   # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME.
-  allmodules=`for m in $allmodules; do if test $m != fnmatch-posix; then echo $m; fi; done`
+  allmodules=`for m in $allmodules; do if test $m != config-h && test $m != fnmatch-posix; then echo $m; fi; done`
   func_create_testdir "$megatestdir/ALL" "$allmodules"
   func_append megasubdirs "ALL"
 
@@ -2517,7 +2696,7 @@ case $mode in
               #   local_gnulib_dir, avoidlist, sourcebase, m4base, docbase,
               #   testsbase, libname, lgpl, makefile_name, libtool, macro_prefix
               # don't propagate from one directory to another.
-              (func_import) || exit 1
+              (func_import) || func_exit 1
             done
           else
             # Really ambiguous.
@@ -2564,7 +2743,7 @@ case $mode in
         if test -n "$remaining"; then
           echo "Remaining files:" $remaining 1>&2
           echo "gnulib-tool: *** Stop." 1>&2
-          exit 1
+          func_exit 1
         fi
       cd ..
     cd ..
@@ -2587,7 +2766,7 @@ case $mode in
         if test -n "$remaining"; then
           echo "Remaining files:" $remaining 1>&2
           echo "gnulib-tool: *** Stop." 1>&2
-          exit 1
+          func_exit 1
         fi
       cd ..
     cd ..
@@ -2690,12 +2869,12 @@ esac
 
 rm -rf "$tmp"
 # Undo the effect of the previous 'trap' command. Some shellology:
-# We cannot use "trap - 0 1 2 3 15", because Solaris sh would attempt to
+# We cannot use "trap - 0 1 2 3 13 15", because Solaris sh would attempt to
 # execute the command "-". "trap '' ..." is fine only for signal 0 (= normal
 # exit); for the others we need to call 'exit' explicitly. The value of $? is
 # 128 + signal number and is set before the trap-registered command is run.
 trap '' 0
-trap 'exit $?' 1 2 3 15
+trap 'func_exit $?' 1 2 3 13 15
 
 exit 0