frexp: test for NetBSD failure on -0.0
[gnulib.git] / gnulib-tool
index 7dd2063..8c621c3 100755 (executable)
@@ -83,6 +83,10 @@ if (alias) > /dev/null 2>&1 && echo | sed --posix -e d >/dev/null 2>&1; then
   alias sed='sed --posix'
 fi
 
+# sed_noop is a sed expression that does nothing.
+# An empty expression does not work with the native 'sed' on AIX 6.1.
+sed_noop='s,x,x,'
+
 # func_usage
 # outputs to stdout the --help usage message.
 func_usage ()
@@ -548,6 +552,32 @@ func_ln_if_changed ()
   fi
 }
 
+# func_reset_sigpipe
+# Resets SIGPIPE to its default behaviour. SIGPIPE is signalled when a process
+# writes into a pipe with no readers, i.e. a pipe where all readers have
+# already closed their file descriptor that read from it or exited entirely.
+# The default behaviour is to terminate the current process without an error
+# message.
+# When "trap '' SIGPIPE" is in effect, the behaviour (at least with bash) is to
+# terminate the current process with an error message.
+# This function should be called at the beginning of a command that only
+# produces output to stdout (i.e. no side effects!), when the command that
+# 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.
+  # Note that Solaris sh does not understand "trap - SIGPIPE".
+  func_reset_sigpipe ()
+  {
+    trap - SIGPIPE
+  }
+else
+  func_reset_sigpipe ()
+  {
+    :
+  }
+fi
+
 # Ensure an 'echo' command that does not interpret backslashes.
 # Test cases:
 #   echo '\n' | wc -l                 prints 1 when OK, 2 when KO
@@ -1342,7 +1372,8 @@ func_get_automake_snippet ()
                  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 \
+      extra_files=`func_reset_sigpipe; \
+                   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
@@ -1509,7 +1540,7 @@ func_modules_transitive_closure ()
     handledmodules=`for m in $handledmodules $inmodules_this_round; do echo $m; done | LC_ALL=C sort -u`
     # Remove $handledmodules from $inmodules.
     for m in $inmodules; do echo $m; done | LC_ALL=C sort -u > "$tmp"/queued-modules
-    inmodules=`echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
+    inmodules=`func_reset_sigpipe; echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
   done
   modules=`for m in $outmodules; do echo $m; done | LC_ALL=C sort -u`
   rm -f "$tmp"/queued-modules
@@ -1645,7 +1676,7 @@ func_emit_lib_Makefile_am ()
   if test "$libtool" = true; then
     libext=la
     perhapsLT=LT
-    sed_eliminate_LDFLAGS=
+    sed_eliminate_LDFLAGS="$sed_noop"
   else
     libext=a
     perhapsLT=
@@ -1658,7 +1689,7 @@ func_emit_lib_Makefile_am ()
     # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
     sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
   else
-    sed_transform_check_PROGRAMS=
+    sed_transform_check_PROGRAMS="$sed_noop"
   fi
   echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
   echo "## Process this file with automake to produce Makefile.in."
@@ -1870,7 +1901,7 @@ func_emit_tests_Makefile_am ()
 {
   if test "$libtool" = true; then
     libext=la
-    sed_eliminate_LDFLAGS=
+    sed_eliminate_LDFLAGS="$sed_noop"
   else
     libext=a
     sed_eliminate_LDFLAGS='/^lib_LDFLAGS[       ]*+=/d'
@@ -1882,7 +1913,7 @@ func_emit_tests_Makefile_am ()
     # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
     sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
   else
-    sed_transform_check_PROGRAMS=
+    sed_transform_check_PROGRAMS="$sed_noop"
   fi
   testsbase_inverse=`echo "$testsbase" | sed -e 's,/$,,' | sed -e 's,[^/][^/]*,..,g'`
   echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
@@ -2197,6 +2228,7 @@ func_import ()
         s,^.*gl_LOCAL_DIR([[ ]*\([^])]*\).*$,cached_local_gnulib_dir="\1",p
       }
       /gl_MODULES(/ {
+        ta
         :a
           s/)/)/
           tb
@@ -2405,7 +2437,7 @@ func_import ()
   fi
   # Determine tests-related module list.
   echo "$final_modules" | LC_ALL=C sort -u > "$tmp"/final-modules
-  testsrelated_modules=`echo "$main_modules" | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/final-modules`
+  testsrelated_modules=`func_reset_sigpipe; echo "$main_modules" | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/final-modules`
   if test $verbose -ge 1; then
     echo "Tests-related module list:"
     echo "$testsrelated_modules" | sed -e 's/^/  /'
@@ -3125,7 +3157,7 @@ func_import ()
           ba
         }'
     else
-      sed_replace_build_aux=
+      sed_replace_build_aux="$sed_noop"
     fi
     func_emit_initmacro_start $macro_prefix
     echo "  gl_source_base='$sourcebase'"
@@ -3257,20 +3289,36 @@ func_import ()
       func_update_ignorelist ()
       {
         ignore="$1"
+        if test "$ignore" = .gitignore; then
+          # In a .gitignore file, "foo" applies to the current directory and all
+          # subdirectories, whereas "/foo" applies to the current directory only.
+          anchor='/'
+          escaped_anchor='\/'
+          doubly_escaped_anchor='\\/'
+        else
+          anchor=''
+          escaped_anchor=''
+          doubly_escaped_anchor=''
+        fi
         if test -f "$destdir/$dir$ignore"; then
           if test -n "$dir_added" || test -n "$dir_removed"; then
-            LC_ALL=C sort "$destdir/$dir$ignore" > "$tmp"/ignore
-            echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u \
-              | LC_ALL=C join -v 2 "$tmp"/ignore - > "$tmp"/ignore-added
-            echo "$dir_removed" | sed -e '/^$/d' | LC_ALL=C sort -u \
-              | LC_ALL=C join -v 2 "$tmp"/ignore - > "$tmp"/ignore-removed
+            sed -e "s|^$anchor||" < "$destdir/$dir$ignore" | LC_ALL=C sort > "$tmp"/ignore
+            (func_reset_sigpipe
+             echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u \
+               | LC_ALL=C join -v 2 "$tmp"/ignore - > "$tmp"/ignore-added
+             echo "$dir_removed" | sed -e '/^$/d' | LC_ALL=C sort -u \
+               | LC_ALL=C join -v 2 "$tmp"/ignore - > "$tmp"/ignore-removed
+            )
             if test -s "$tmp"/ignore-added || test -s "$tmp"/ignore-removed; then
               if $doit; then
                 echo "Updating $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
                 mv -f "$destdir/$dir$ignore" "$destdir/$dir$ignore"~
-                sed -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed > "$tmp"/sed-ignore-removed
-                cat "$destdir/$dir$ignore"~ "$tmp"/ignore-added \
-                  | sed -f "$tmp"/sed-ignore-removed \
+                { sed -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed
+                  if test -n "$anchor"; then sed -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
+                } | sed -f "$tmp"/sed-ignore-removed \
                   > "$destdir/$dir$ignore"
               else
                 echo "Update $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
@@ -3287,7 +3335,7 @@ func_import ()
                   # Automake generates Makefile rules that create .dirstamp files.
                   echo ".dirstamp"
                 fi
-                echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u
+                echo "$dir_added" | sed -e '/^$/d' -e "s|^|$anchor|" | LC_ALL=C sort -u
               } > "$destdir/$dir$ignore"
             else
               echo "Create $destdir/$dir$ignore"
@@ -3786,7 +3834,7 @@ func_create_testdir ()
          ba
        }'
    else
-     sed_replace_build_aux=
+     sed_replace_build_aux="$sed_noop"
    fi
    func_emit_initmacro_start $macro_prefix
    echo "gl_source_base='$sourcebase'"