update from texinfo
[gnulib.git] / gnulib-tool
index 3dc9d46..68531a5 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
@@ -398,11 +411,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
@@ -578,7 +649,9 @@ func_ln_if_changed ()
 # will read from this pipe might prematurely exit or close its standard input
 # descriptor.
 if test -n "$BASH_VERSION"; then
-  # The problem has only been reported with bash.
+  # The problem has only been reported with bash. Probably it occurs only with
+  # bash-3.2. For the reasons, see
+  # <http://lists.gnu.org/archive/html/bug-bash/2008-12/msg00050.html>.
   # Note that Solaris sh does not understand "trap - SIGPIPE".
   func_reset_sigpipe ()
   {
@@ -1318,6 +1391,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)
@@ -1326,13 +1400,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"
@@ -1368,11 +1492,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
@@ -1394,11 +1514,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; \
@@ -1422,8 +1538,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
@@ -1431,22 +1546,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"`
@@ -1830,6 +1937,7 @@ 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
@@ -2312,7 +2420,7 @@ func_import ()
       s,^dnl .*$,,
       s, dnl .*$,,
       /gl_LOCAL_DIR(/ {
-        s,^.*gl_LOCAL_DIR([[ ]*\([^])]*\).*$,cached_local_gnulib_dir="\1",p
+        s,^.*gl_LOCAL_DIR([[ ]*\([^]"$`\\)]*\).*$,cached_local_gnulib_dir="\1",p
       }
       /gl_MODULES(/ {
         ta
@@ -2322,55 +2430,55 @@ func_import ()
           N
           ba
         :b
-        s,^.*gl_MODULES([[ ]*\([^])]*\).*$,cached_specified_modules="\1",p
+        s,^.*gl_MODULES([[ ]*\([^]"$`\\)]*\).*$,cached_specified_modules="\1",p
       }
       /gl_WITH_OBSOLETE/ {
         s,^.*$,cached_incobsolete=true,p
       }
       /gl_AVOID(/ {
-        s,^.*gl_AVOID([[ ]*\([^])]*\).*$,cached_avoidlist="\1",p
+        s,^.*gl_AVOID([[ ]*\([^]"$`\\)]*\).*$,cached_avoidlist="\1",p
       }
       /gl_SOURCE_BASE(/ {
-        s,^.*gl_SOURCE_BASE([[ ]*\([^])]*\).*$,cached_sourcebase="\1",p
+        s,^.*gl_SOURCE_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_sourcebase="\1",p
       }
       /gl_M4_BASE(/ {
-        s,^.*gl_M4_BASE([[ ]*\([^])]*\).*$,cached_m4base="\1",p
+        s,^.*gl_M4_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_m4base="\1",p
       }
       /gl_PO_BASE(/ {
-        s,^.*gl_PO_BASE([[ ]*\([^])]*\).*$,cached_pobase="\1",p
+        s,^.*gl_PO_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_pobase="\1",p
       }
       /gl_DOC_BASE(/ {
-        s,^.*gl_DOC_BASE([[ ]*\([^])]*\).*$,cached_docbase="\1",p
+        s,^.*gl_DOC_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_docbase="\1",p
       }
       /gl_TESTS_BASE(/ {
-        s,^.*gl_TESTS_BASE([[ ]*\([^])]*\).*$,cached_testsbase="\1",p
+        s,^.*gl_TESTS_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_testsbase="\1",p
       }
       /gl_WITH_TESTS/ {
         s,^.*$,cached_inctests=true,p
       }
       /gl_LIB(/ {
-        s,^.*gl_LIB([[ ]*\([^])]*\).*$,cached_libname="\1",p
+        s,^.*gl_LIB([[ ]*\([^]"$`\\)]*\).*$,cached_libname="\1",p
       }
       /gl_LGPL(/ {
-        s,^.*gl_LGPL([[ ]*\([^])]*\).*$,cached_lgpl="\1",p
+        s,^.*gl_LGPL([[ ]*\([^]"$`\\)]*\).*$,cached_lgpl="\1",p
       }
       /gl_LGPL/ {
         s,^.*$,cached_lgpl=yes,p
       }
       /gl_MAKEFILE_NAME(/ {
-        s,^.*gl_MAKEFILE_NAME([[ ]*\([^])]*\).*$,cached_makefile_name="\1",p
+        s,^.*gl_MAKEFILE_NAME([[ ]*\([^]"$`\\)]*\).*$,cached_makefile_name="\1",p
       }
       /gl_LIBTOOL/ {
         s,^.*$,cached_libtool=true,p
       }
       /gl_MACRO_PREFIX(/ {
-        s,^.*gl_MACRO_PREFIX([[ ]*\([^])]*\).*$,cached_macro_prefix="\1",p
+        s,^.*gl_MACRO_PREFIX([[ ]*\([^]"$`\\)]*\).*$,cached_macro_prefix="\1",p
       }
       /gl_PO_DOMAIN(/ {
-        s,^.*gl_PO_DOMAIN([[ ]*\([^])]*\).*$,cached_po_domain="\1",p
+        s,^.*gl_PO_DOMAIN([[ ]*\([^]"$`\\)]*\).*$,cached_po_domain="\1",p
       }
       /gl_VC_FILES(/ {
-        s,^.*gl_VC_FILES([[ ]*\([^])]*\).*$,cached_vc_files="\1",p
+        s,^.*gl_VC_FILES([[ ]*\([^]"$`\\)]*\).*$,cached_vc_files="\1",p
       }'
     eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-cache.m4`
     if test -f "$destdir"/$m4base/gnulib-comp.m4; then
@@ -2385,6 +2493,7 @@ func_import ()
           :a
           s,^\]).*$,",
           tb
+          s,["$`\\],,g
           p
           n
           ba
@@ -3284,9 +3393,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
@@ -3475,7 +3581,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
@@ -3825,10 +3931,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
@@ -3958,10 +4060,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
@@ -4100,9 +4198,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
 }
@@ -4155,6 +4253,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...\""
@@ -4166,7 +4265,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"
@@ -4245,7 +4344,7 @@ case $mode in
       s,^dnl .*$,,
       s, dnl .*$,,
       /AC_CONFIG_AUX_DIR/ {
-        s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^])]*\).*$,guessed_auxdir="\1",p
+        s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^]"$`\\)]*\).*$,guessed_auxdir="\1",p
       }
       /A[CM]_PROG_LIBTOOL/ {
         s,^.*$,guessed_libtool=true,p
@@ -4378,9 +4477,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
@@ -4401,9 +4500,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