X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=8c621c3f1ff964e083aeb7ff38c4bea3e6b8c6ab;hb=314fcbb7de94709b92edf1b68f62ca6aed8d4dbc;hp=a3b9df5b07dfe38c5b254ab4690c09e856f623f4;hpb=6d03958a046c6783210c538dd9f656553434a804;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index a3b9df5b0..8c621c3f1 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -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." @@ -1737,7 +1768,7 @@ func_emit_lib_Makefile_am () echo "AM_CPPFLAGS =" fi echo - if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *= *$libname\\.$libext\$" allsnippets.tmp > /dev/null; then + 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. : @@ -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!" @@ -2068,10 +2099,10 @@ func_emit_initmacro_end () # the configure.ac resides; if it is run from a different directory, the # check is skipped. echo " m4_ifval(${macro_prefix_arg}_LIBSOURCES_LIST, [" - echo " m4_syscmd([test ! -d ]${macro_prefix_arg}_LIBSOURCES_DIR[ ||" + echo " m4_syscmd([test ! -d ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[ ||" echo " for gl_file in ]${macro_prefix_arg}_LIBSOURCES_LIST[ ; do" - echo " if test ! -r ]${macro_prefix_arg}_LIBSOURCES_DIR[/\$gl_file ; then" - echo " echo \"missing file ]${macro_prefix_arg}_LIBSOURCES_DIR[/\$gl_file\" >&2" + echo " if test ! -r ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[/\$gl_file ; then" + echo " echo \"missing file ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[/\$gl_file\" >&2" echo " exit 1" echo " fi" echo " done])dnl" @@ -2197,6 +2228,13 @@ func_import () s,^.*gl_LOCAL_DIR([[ ]*\([^])]*\).*$,cached_local_gnulib_dir="\1",p } /gl_MODULES(/ { + ta + :a + s/)/)/ + tb + N + ba + :b s,^.*gl_MODULES([[ ]*\([^])]*\).*$,cached_specified_modules="\1",p } /gl_AVOID(/ { @@ -2399,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/^/ /' @@ -3004,7 +3042,9 @@ func_import () esac ;; esac echo "gl_LOCAL_DIR([$relative_local_gnulib_dir])" - echo "gl_MODULES(["`echo $specified_modules`"])" + echo "gl_MODULES([" + echo "$specified_modules" | sed 's/^/ /g' + echo "])" echo "gl_AVOID([$avoidlist])" echo "gl_SOURCE_BASE([$sourcebase])" echo "gl_M4_BASE([$m4base])" @@ -3117,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'" @@ -3240,6 +3280,8 @@ func_import () # Update the .cvsignore and .gitignore files. { echo "$added_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|A|\1,' echo "$removed_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|R|\1,' + # Treat gnulib-comp.m4 like an added file, even if it already existed. + echo "$m4base/|A|gnulib-comp.m4" } | LC_ALL=C sort -t'|' -k1,1 > "$tmp"/fileset-changes { # Rearrange file descriptors. Needed because "while ... done < ..." # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh. @@ -3247,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}~)" @@ -3277,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" @@ -3401,6 +3459,18 @@ func_import () fi fi echo " - mention \"-I ${m4base}\" in ACLOCAL_AMFLAGS in Makefile.am," + { + # Find the first parent directory of $m4base that contains a Makefile.am. + sed_last='s,^.*/\([^/][^/]*\)//*$,\1/, +s,//*$,/,' + sed_butlast='s,[^/][^/]*//*$,,' + dir1="${m4base}/"; dir2="" + while test -n "$dir1" && test ! -f "${destdir}/${dir1}Makefile.am"; do + dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2" + dir1=`echo "$dir1" | sed -e "$sed_butlast"` + done + echo " - mention ${dir2}gnulib-cache.m4 in EXTRA_DIST in ${dir1}Makefile.am." + } echo " - invoke ${macro_prefix}_EARLY in $configure_ac, right after AC_PROG_CC," echo " - invoke ${macro_prefix}_INIT in $configure_ac." } @@ -3764,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'"