X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=15b93d58c43eba718984152b4ae5cf2d8a2cebce;hb=242aad9a41b0204eda139e2424c1430954f04301;hp=36b4aad783ee4181c2591febe6970dcb787e4af0;hpb=b0d9d3aa695aebab5ebc0fb02ebeac9e59f57242;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index 36b4aad78..15b93d58c 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -22,11 +22,12 @@ progname=$0 package=gnulib -cvsdatestamp='$Date: 2007-03-11 22:11:22 $' +cvsdatestamp='$Date: 2007-06-23 12:37:29 $' last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'` version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'` nl=' ' +IFS=" "" $nl" # You can set AUTOCONFPATH to empty if autoconf 2.57 is already in your PATH. AUTOCONFPATH= @@ -410,6 +411,152 @@ func_ln_if_changed () fi } +# Ensure an 'echo' command that does not interpret backslashes. +# Test cases: +# echo '\n' | wc -l prints 1 when OK, 2 when KO +# echo '\t' | grep t > /dev/null has return code 0 when OK, 1 when KO +# This problem is a weird heritage from SVR4. BSD got it right (except that +# BSD echo interprets '-n' as an option, which is also not desirable). +# Nowadays the problem occurs in 4 situations: +# - in bash, when the shell option xpg_echo is set (bash >= 2.04) +# or when it was built with --enable-usg-echo-default (bash >= 2.0) +# or when it was built with DEFAULT_ECHO_TO_USG (bash < 2.0), +# - in zsh, when sh-emulation is not set, +# - in ksh (e.g. AIX /bin/sh and Solaris /usr/xpg4/bin/sh are ksh instances, +# and HP-UX /bin/sh and IRIX /bin/sh behave similarly), +# - in Solaris /bin/sh and OSF/1 /bin/sh. +# We try the following workarounds: +# - for all: respawn using $CONFIG_SHELL if that is set and works. +# - for bash >= 2.04: unset the shell option xpg_echo. +# - for bash >= 2.0: define echo to a function that uses the printf built-in. +# - for bash < 2.0: define echo to a function that uses cat of a here document. +# - for zsh: turn sh-emulation on. +# - for ksh: alias echo to 'print -r'. +# - for ksh: alias echo to a function that uses cat of a here document. +# - for Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh and rely on +# the ksh workaround. +# - otherwise: respawn using /bin/sh and rely on the workarounds. +# When respawning, we pass --no-reexec as first argument, so as to avoid +# turning this script into a fork bomb in unlucky situations. +have_echo= +if echo '\t' | grep t > /dev/null; then + have_echo=yes # Lucky! +fi +# Try the workarounds. +# Respawn using $CONFIG_SHELL if that is set and works. +if test -z "$have_echo" \ + && test "X$1" != "X--no-reexec" \ + && test -n "$CONFIG_SHELL" \ + && test -f "$CONFIG_SHELL" \ + && $CONFIG_SHELL -c 'echo '\t' | grep t > /dev/null'; then + exec $CONFIG_SHELL "$0" --no-reexec "$@" + exit 127 +fi +# For bash >= 2.04: unset the shell option xpg_echo. +if test -z "$have_echo" \ + && test -n "$BASH_VERSION" \ + && (shopt -o xpg_echo; echo '\t' | grep t > /dev/null) 2>/dev/null; then + shopt -o xpg_echo + have_echo=yes +fi +# For bash >= 2.0: define echo to a function that uses the printf built-in. +# For bash < 2.0: define echo to a function that uses cat of a here document. +# (There is no win in using 'printf' over 'cat' if it is not a shell built-in.) +if test -z "$have_echo" \ + && test -n "$BASH_VERSION"; then \ + if type printf 2>/dev/null | grep / > /dev/null; then + # 'printf' is not a shell built-in. +echo () +{ +cat < /dev/null; then + have_echo=yes + fi +fi +# For zsh: turn sh-emulation on. +if test -z "$have_echo" \ + && test -n "$ZSH_VERSION" \ + && (emulate sh) >/dev/null 2>&1; then + emulate sh +fi +# For ksh: alias echo to 'print -r'. +if test -z "$have_echo" \ + && (type print) >/dev/null 2>&1; then + # A 'print' command exists. + if type print 2>/dev/null | grep / > /dev/null; then + : + else + # 'print' is a shell built-in. + if (print -r '\told' | grep told > /dev/null) 2>/dev/null; then + # 'print' is the ksh shell built-in. + alias echo='print -r' + fi + fi +fi +if test -z "$have_echo" \ + && echo '\t' | grep t > /dev/null; then + have_echo=yes +fi +# For ksh: alias echo to a function that uses cat of a here document. +# The ksh manual page says: +# "Aliasing is performed when scripts are read, not while they are executed. +# Therefore, for an alias to take effect, the alias definition command has +# to be executed before the command which references the alias is read." +# Because of this, we have to play strange tricks with have_echo, to ensure +# that the top-level statement containing the test starts after the 'alias' +# command. +if test -z "$have_echo"; then +bsd_echo () +{ +cat </dev/null +fi +if test -z "$have_echo" \ + && echo '\t' | grep t > /dev/null; then + have_echo=yes +fi +if test -z "$have_echo"; then + unalias echo 2>/dev/null +fi +# For Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh. +if test -z "$have_echo" \ + && test "X$1" != "X--no-reexec" \ + && test -f /bin/ksh; then + exec /bin/ksh "$0" --no-reexec "$@" + exit 127 +fi +# Otherwise: respawn using /bin/sh. +if test -z "$have_echo" \ + && test "X$1" != "X--no-reexec" \ + && test -f /bin/sh; then + exec /bin/sh "$0" --no-reexec "$@" + exit 127 +fi +if test -z "$have_echo"; then + func_fatal_error "Shell does not support 'echo' correctly. Please install GNU bash and set the environment variable CONFIG_SHELL to point to it." +fi +if echo '\t' | grep t > /dev/null; then + : # Works fine now. +else + func_fatal_error "Shell does not support 'echo' correctly. Workaround does not work. Please report this as a bug to bug-gnulib@gnu.org." +fi +if test "X$1" = "X--no-reexec"; then + shift +fi + # Command-line option processing. # Removes the OPTIONS from the arguments. Sets the variables: # - mode list or import or create-testdir or create-megatestdir @@ -739,16 +886,24 @@ func_ln_if_changed () case "$0" in /*) self_abspathname="$0" ;; */*) self_abspathname=`pwd`/"$0" ;; - *) for d in `echo ":$PATH:" | sed -e 's/:::*/:.:/g' | sed -e 's/:/ /g'`; do - if test -x "$d/$0" && test ! -d "$d/$0"; then - self_abspathname="$d/$0" - break - fi - done - if test -z "$self_abspathname"; then - func_fatal_error "could not locate the gnulib-tool program - how did you invoke it?" - fi - ;; + *) + + self_abspathname= + save_IFS=$IFS + IFS=: + for d in $PATH; do + IFS=$save_IFS + test -z "$d" && d=. + if test -x "$d/$0" && test ! -d "$d/$0"; then + self_abspathname=$d/$0 + break + fi + done + IFS=$save_IFS + if test -z "$self_abspathname"; then + func_fatal_error "could not locate the gnulib-tool program - how did you invoke it?" + fi + ;; esac while test -h "$self_abspathname"; do # Resolve symbolic link. @@ -826,6 +981,7 @@ func_all_modules () -e '/^COPYING$/d' -e '/\/COPYING$/d' \ -e '/^README$/d' -e '/\/README$/d' \ -e '/^TEMPLATE$/d' \ + -e '/^TEMPLATE-EXTENDED$/d' \ -e '/^TEMPLATE-TESTS$/d' \ -e '/^\..*/d' \ -e '/~$/d' \ @@ -848,6 +1004,7 @@ func_verify_module () && test "COPYING" != "$module" \ && test "README" != "$module" \ && test "TEMPLATE" != "$module" \ + && test "TEMPLATE-EXTENDED" != "$module" \ && test "TEMPLATE-TESTS" != "$module"; then # OK, $module is a correct module name. # Verify that building the module description with 'patch' succeeds. @@ -1173,7 +1330,9 @@ ba done # Add the dummy module, to make sure the library will be non-empty. if test -z "$have_lib_SOURCES"; then - func_append modules " dummy" + if func_acceptable "dummy"; then + func_append modules " dummy" + fi fi } @@ -1252,12 +1411,12 @@ func_emit_lib_Makefile_am () { func_get_automake_snippet "$module" | sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \ - -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' | - sed -e "$sed_eliminate_LDFLAGS" | - sed -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' | - sed -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \ - -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' | - sed -e "$sed_transform_check_PROGRAMS" + -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \ + -e "$sed_eliminate_LDFLAGS" \ + -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' \ + -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \ + -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' \ + -e "$sed_transform_check_PROGRAMS" if test "$module" = 'alloca'; then echo "${libname}_${libext}_LIBADD += @${perhapsLT}ALLOCA@" echo "${libname}_${libext}_DEPENDENCIES += @${perhapsLT}ALLOCA@" @@ -1397,12 +1556,12 @@ func_emit_tests_Makefile_am () { func_get_automake_snippet "$module" | sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \ - -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' | - sed -e "$sed_eliminate_LDFLAGS" | - sed -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' | - sed -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \ - -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' | - sed -e "$sed_transform_check_PROGRAMS" + -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \ + -e "$sed_eliminate_LDFLAGS" \ + -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' \ + -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \ + -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' \ + -e "$sed_transform_check_PROGRAMS" } > amsnippet.tmp # Skip the contents if its entirely empty. if grep '[^ ]' amsnippet.tmp > /dev/null ; then @@ -1562,6 +1721,7 @@ func_import () cached_m4base= cached_docbase= cached_testsbase= + cached_inctests= cached_libname= cached_lgpl= cached_makefile_name= @@ -1595,6 +1755,9 @@ func_import () /gl_TESTS_BASE(/ { 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 } @@ -1683,6 +1846,10 @@ func_import () func_fatal_error "missing --tests-base option" fi fi + # Require the tests if specified either way. + if test -z "$inctests"; then + inctests="$cached_inctests" + fi # The libname defaults to the cached one. if test -z "$supplied_libname"; then libname="$cached_libname" @@ -1835,6 +2002,8 @@ func_import () } # Copy files or make symbolic links. Remove obsolete files. + added_files='' + removed_files='' delimiter=' ' # Construct a table with 2 columns: rewritten-file-name original-file-name, # representing the files according to the last gnulib-tool invocation. @@ -1859,6 +2028,7 @@ func_import () else echo "Remove file $g (backup in ${g}~)" fi + func_append removed_files "$g$nl" fi done # func_add_or_update handles a file that ought to be present afterwards. @@ -1927,6 +2097,7 @@ func_import () else echo "Copy file $g" fi + func_append added_files "$g$nl" fi rm -f "$tmpfile" } @@ -1969,6 +2140,9 @@ func_import () func_append actioncmd " --m4-base=$m4base" func_append actioncmd " --doc-base=$docbase" func_append actioncmd " --aux-dir=$auxdir" + if test -n "$inctests"; then + func_append actioncmd " --with-tests" + fi for module in $avoidlist; do func_append actioncmd " --avoid=$module" done @@ -2020,6 +2194,7 @@ func_import () echo "Create $sourcebase/$makefile_am" rm -f "$tmpfile" fi + func_append added_files "$sourcebase/$makefile_am$nl" fi # Create m4/gnulib-cache.m4. @@ -2057,6 +2232,7 @@ func_import () echo "gl_M4_BASE([$m4base])" echo "gl_DOC_BASE([$docbase])" echo "gl_TESTS_BASE([$testsbase])" + test -z "$inctests" || echo "gl_WITH_TESTS" echo "gl_LIB([$libname])" test -z "$lgpl" || echo "gl_LGPL" echo "gl_MAKEFILE_NAME([$makefile_name])" @@ -2153,7 +2329,6 @@ func_import () s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:'"$auxdir"'/\2)| ba }' - sed_replace_build_aux=`echo "$sed_replace_build_aux" | sed -e 1d -e 's/^ *//'` else sed_replace_build_aux= fi @@ -2245,9 +2420,86 @@ func_import () echo "Create $testsbase/$makefile_am" rm -f "$tmpfile" fi + func_append added_files "$testsbase/$makefile_am$nl" fi fi + # 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,' + } | 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. + exec 5<&0 < "$tmp"/fileset-changes + func_update_ignorelist () + { + ignore="$1" + 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 + 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 \ + > "$destdir/$dir$ignore" + else + echo "Update $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)" + fi + fi + fi + else + if test -n "$dir_added"; then + if $doit; then + echo "Creating $destdir/$dir$ignore" + echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u > "$destdir/$dir$ignore" + else + echo "Create $destdir/$dir$ignore" + fi + fi + fi + } + func_done_dir () + { + dir="$1" + dir_added="$2" + dir_removed="$3" + if test -d "$destdir/${dir}CVS" || test -f "$destdir/${dir}.cvsignore"; then + func_update_ignorelist .cvsignore + fi + if test -d "$destdir/.git" || test -f "$destdir/${dir}.gitignore"; then + func_update_ignorelist .gitignore + fi + } + last_dir= + last_dir_added= + last_dir_removed= + while read line; do + # Why not ''read next_dir op file'' ? Because the dir column can be empty. + next_dir=`echo "$line" | sed -e 's,|.*,,'` + op=`echo "$line" | sed -e 's,^[^|]*|\([^|]*\)|.*$,\1,'` + file=`echo "$line" | sed -e 's,^[^|]*|[^|]*|,,'` + if test "$next_dir" != "$last_dir"; then + func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed" + last_dir="$next_dir" + last_dir_added= + last_dir_removed= + fi + case $op in + A) func_append last_dir_added "$file$nl";; + R) func_append last_dir_removed "$file$nl";; + esac + done + func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed" + exec 0<&5 5<&- + } + echo "Finished." echo echo "You may need to add #include directives for the following .h files." @@ -2522,10 +2774,9 @@ func_create_testdir () sed_replace_build_aux=' :a /AC_CONFIG_FILES(.*:build-aux\/.*)/{ - s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:../'"$auxdir"'/\2)| - ba + s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:../'"$auxdir"'/\2)| + ba }' - sed_replace_build_aux=`echo "$sed_replace_build_aux" | sed -e 1d -e 's/^ *//'` # We don't have explicit ordering constraints between the various # autoconf snippets. It's cleanest to put those of the library before # those of the tests. @@ -2646,7 +2897,6 @@ func_create_testdir () s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:'"$auxdir"'/\2)| ba }' - sed_replace_build_aux=`echo "$sed_replace_build_aux" | sed -e 1d -e 's/^ *//'` else sed_replace_build_aux= fi @@ -2720,7 +2970,7 @@ func_create_testdir () echo "executing ${AUTOPOINT} --force" ${AUTOPOINT} --force || func_exit 1 for f in ../$m4base/*.m4~; do - mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1 + mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1 done fi echo "executing ${ACLOCAL} -I ../$m4base" @@ -2741,13 +2991,13 @@ func_create_testdir () # distributed (such as getdate.c). # Extract the value of "CLEANFILES += ..." and "MOSTLYCLEANFILES += ...". cleaned_files=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \ - | sed -n -e 's,^CLEANFILES[ ]*+=\([^#]*\).*$,\1,p' -e 's,^MOSTLYCLEANFILES[ ]*+=\([^#]*\).*$,\1,p'` + | sed -n -e 's,^CLEANFILES[ ]*+=\([^#]*\).*$,\1,p' -e 's,^MOSTLYCLEANFILES[ ]*+=\([^#]*\).*$,\1,p'` cleaned_files=`for file in $cleaned_files; do echo " $file "; done` # Extract the value of "BUILT_SOURCES += ...". Remove variable references # such $(FOO_H) because they don't refer to distributed files. sed_remove_make_variables='s,[$]([A-Za-z0-9_]*),,g' built_sources=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \ - | sed -n -e 's,^BUILT_SOURCES[ ]*+=\([^#]*\).*$,\1,p' \ + | sed -n -e 's,^BUILT_SOURCES[ ]*+=\([^#]*\).*$,\1,p' \ | sed -e "$sed_remove_make_variables"` distributed_built_sources=`for file in $built_sources; do case "$cleaned_files" in @@ -2806,8 +3056,8 @@ func_create_megatestdir () -e 's,October,10,' -e 's,Oct,10,' \ -e 's,November,11,' -e 's,Nov,11,' \ -e 's,December,12,' -e 's,Dec,12,' \ - | sed -e 's,^,00,' | sed -e 's,^[0-9]*\([0-9][0-9] \),\1,' \ - | sed -e 's,^\([0-9]*\) \([0-9]*\) \([0-9]*\),\3\2\1,'` + -e 's,^,00,' -e 's,^[0-9]*\([0-9][0-9] \),\1,' \ + -e 's,^\([0-9]*\) \([0-9]*\) \([0-9]*\),\3\2\1,'` (echo '#!/bin/sh' echo "CVSDATE=$cvsdate" echo "test -d logs || mkdir logs" @@ -2821,12 +3071,12 @@ 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 && make && make check" + echo " cd \$module && ./configure \$CONFIGURE_OPTIONS && make && make check && make distclean" echo " echo rc=\$?" - echo " ) 2>&1 | sed -e \"\$AUTOBUILD_SUBST\" > logs/\$safemodule" + echo " ) 2>&1 | { if test -n \"\$AUTOBUILD_SUBST\"; then sed -e \"\$AUTOBUILD_SUBST\"; else cat; fi; } > logs/\$safemodule" echo "done" - ) > "$megatestdir/autobuild" - chmod a+x "$megatestdir/autobuild" + ) > "$megatestdir/do-autobuild" + chmod a+x "$megatestdir/do-autobuild" # Create Makefile.am. (echo "## Process this file with automake to produce Makefile.in." @@ -2835,7 +3085,7 @@ func_create_megatestdir () echo echo "SUBDIRS = $megasubdirs" echo - echo "EXTRA_DIST = autobuild" + echo "EXTRA_DIST = do-autobuild" ) > "$megatestdir/Makefile.am" # Create configure.ac. @@ -2994,7 +3244,8 @@ case $mode in # Perform func_import in a subshell, so that variable values # such as # local_gnulib_dir, avoidlist, sourcebase, m4base, docbase, - # testsbase, libname, lgpl, makefile_name, libtool, macro_prefix + # testsbase, inctests, libname, lgpl, makefile_name, libtool, + # macro_prefix # don't propagate from one directory to another. (func_import) || func_exit 1 done