X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=c091a3ea4e380d706700afe7e2215363ae23d32b;hb=681a475b43655abc79b81c4bf01e79a227ed6755;hp=1108ce0949f7474c51952ae76fc6f272fae6e6e8;hpb=eba129a7c621bda4516a9ad1a18e2e795b7932b3;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index 1108ce094..c091a3ea4 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -2,10 +2,10 @@ # # Copyright (C) 2002-2007 Free Software Foundation, Inc. # -# This program is free software; you can redistribute it and/or modify +# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,8 +13,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . # # This program is meant for authors or maintainers which want to import @@ -22,9 +21,11 @@ progname=$0 package=gnulib -cvsdatestamp='$Date: 2007-08-26 10:31:22 $' +cvsdatestamp='$Date: 2007-09-17 10:26:33 $' last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'` +# Sometimes last_checkin_date is "YYYY/MM/DD ...", sometimes "YYYY-MM-DD ...". version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'` +# version is in YYYY-MM-DD format. nl=' ' IFS=" "" $nl" @@ -73,6 +74,17 @@ fi # 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 + # 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. + if test -n "$BASH_VERSION"; then + shopt -s expand_aliases >/dev/null 2>&1 + fi alias sed='sed --posix' fi @@ -89,6 +101,7 @@ Usage: gnulib-tool --list gnulib-tool --test --dir=directory module1 ... moduleN gnulib-tool --megatest --dir=directory [module1 ... moduleN] gnulib-tool --extract-description module + gnulib-tool --extract-notice module gnulib-tool --extract-filelist module gnulib-tool --extract-dependencies module gnulib-tool --extract-autoconf-snippet module @@ -114,6 +127,7 @@ Operation modes: --megatest test the given modules one by one and all together (recommended to use CC=\"gcc -Wall\" here) --extract-description extract the description + --extract-notice extract the notice or banner --extract-filelist extract the list of files --extract-dependencies extract the dependencies --extract-autoconf-snippet extract the snippet for configure.ac @@ -132,6 +146,8 @@ General options: directory. --local-dir=DIRECTORY Specify a local override directory where to look up files before looking in gnulib's directory. + --verbose Increase verbosity. May be repeated. + --quiet Decrease verbosity. May be repeated. Options for --import: --lib=LIBRARY Specify the library name. Defaults to 'libgnu'. @@ -181,7 +197,7 @@ Report bugs to ." # outputs to stdout the --version message. func_version () { - year=`echo "$last_checkin_date" | sed -e 's,/.*$,,'` + year=`echo "$version" | sed -e 's,-.*$,,'` echo "\ $progname (GNU $package) $version Copyright (C) $year Free Software Foundation, Inc. @@ -568,6 +584,7 @@ fi # - mode list or import or create-testdir or create-megatestdir # - destdir from --dir # - local_gnulib_dir from --local-dir +# - verbose integer, default 0, inc/decremented by --verbose/--quiet # - libname, supplied_libname from --lib # - sourcebase from --source-base # - m4base from --m4-base @@ -594,6 +611,7 @@ fi mode= destdir= local_gnulib_dir= + verbose=0 libname=libgnu supplied_libname= sourcebase= @@ -663,6 +681,12 @@ fi --local-dir=* ) local_gnulib_dir=`echo "X$1" | sed -e 's/^X--local-dir=//'` shift ;; + --verbose | --verbos | --verbo | --verb ) + verbose=`expr $verbose + 1` + shift ;; + --quiet | --quie | --qui | --qu | --q ) + verbose=`expr $verbose - 1` + shift ;; --lib ) shift if test $# = 0; then @@ -807,7 +831,7 @@ fi --help | --hel | --he | --h ) func_usage func_exit $? ;; - --version | --versio | --versi | --vers | --ver | --ve | --v ) + --version | --versio | --versi | --vers ) func_version func_exit $? ;; -- ) @@ -1132,6 +1156,7 @@ sed_extract_prog=':[ ]*$/ { :a n s/^Description:[ ]*$// + s/^Notice:[ ]*$// s/^Files:[ ]*$// s/^Depends-on:[ ]*$// s/^configure\.ac-early:[ ]*$// @@ -1156,6 +1181,15 @@ func_get_description () sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file" } +# func_get_notice module +# Input: +# - local_gnulib_dir from --local-dir +func_get_notice () +{ + func_lookup_file "modules/$1" + sed -n -e "/^Notice$sed_extract_prog" < "$lookedup_file" +} + # func_get_filelist module # Input: # - local_gnulib_dir from --local-dir @@ -1178,7 +1212,7 @@ func_get_filelist () func_get_dependencies () { # ${module}-tests always implicitly depends on ${module}. - echo "$1" | sed -n -e 's/-tests//p' + echo "$1" | sed -n -e 's/-tests$//p' # Then the explicit dependencies listed in the module description. func_lookup_file "modules/$1" sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file" @@ -1212,6 +1246,18 @@ func_get_automake_snippet () case "$1" in *-tests) # *-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/,,'` + extra_files="$tests_files" + if test -n "$extra_files"; then + echo "EXTRA_DIST +=" $extra_files + echo + fi ;; *) # Synthesize an EXTRA_DIST augmentation. @@ -1434,6 +1480,27 @@ ba fi } +# func_modules_notice +# Input: +# - local_gnulib_dir from --local-dir +# - verbose integer, default 0, inc/decremented by --verbose/--quiet +# - modules list of modules, including dependencies +func_modules_notice () +{ + if test $verbose -ge -1; then + for module in $modules; do + func_verify_module + if test -n "$module"; then + msg=`func_get_notice $module` + if test -n "$msg"; then + echo "Notice from module $module:" + echo "$msg" | sed -e 's/^/ /' + fi + fi + done + fi +} + # func_modules_to_filelist # Input: # - local_gnulib_dir from --local-dir @@ -1453,6 +1520,31 @@ func_modules_to_filelist () files=`for f in $files; do echo $f; done | LC_ALL=C sort -u` } +# func_execute_command command [args...] +# Executes a command. +# Uses also the variables +# - verbose integer, default 0, inc/decremented by --verbose/--quiet +func_execute_command () +{ + if test $verbose -ge 0; then + echo "executing $*" + "$@" + else + # Commands like automake produce output to stderr even when the succeed. + # Turn this output off if the command succeeds. + "$@" > "$tmp"/cmdout 2>&1 + cmdret=$? + if test $cmdret = 0; then + rm -f "$tmp"/cmdout + else + echo "executing $*" + cat "$tmp"/cmdout 1>&2 + rm -f "$tmp"/cmdout + (exit $cmdret) + fi + fi +} + # func_emit_lib_Makefile_am # emits the contents of library makefile to standard output. # Input: @@ -1851,29 +1943,44 @@ func_emit_initmacro_end () # 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 +# - sourcebase directory relative to destdir where to place source code 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 "AC_DEFUN([${macro_prefix}_LIBOBJ], [" + echo " AS_LITERAL_IF([\$1], [${macro_prefix}_LIBSOURCES([\$1.c])])dnl" + echo " ${macro_prefix}_LIBOBJS=\"\$${macro_prefix}_LIBOBJS \$1.\$ac_objext\"" + echo "])" 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)])])" + echo "AC_DEFUN([${macro_prefix}_REPLACE_FUNCS], [" + echo " m4_foreach_w([gl_NAME], [\$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl" + echo " AC_CHECK_FUNCS([\$1], , [${macro_prefix}_LIBOBJ(\$ac_func)])" + echo "])" echo - echo "# Like AC_LIBSOURCES, except that it does nothing." - echo "# We rely on EXTRA_lib..._SOURCES instead." - echo "AC_DEFUN([${macro_prefix}_LIBSOURCES]," - echo " [])" + echo "# Like AC_LIBSOURCES, except the directory where the source file is" + echo "# expected is derived from the gnulib-tool parametrization," + echo "# and alloca is special cased (for the alloca-opt module)." + echo "# We could also entirely rely on EXTRA_lib..._SOURCES." + echo "AC_DEFUN([${macro_prefix}_LIBSOURCES], [" + echo " m4_foreach([_gl_NAME], [\$1], [" + echo " m4_if(_gl_NAME, [alloca.c], [], [" + echo " m4_syscmd([test -r $sourcebase/]_gl_NAME[ || test ! -d $sourcebase])dnl" + echo " m4_if(m4_sysval, [0], []," + echo " [AC_FATAL([missing $sourcebase/]_gl_NAME)])" + echo " ])" + echo " ])" + echo "])" } # func_import modules # Uses also the variables # - destdir target directory # - local_gnulib_dir from --local-dir +# - verbose integer, default 0, inc/decremented by --verbose/--quiet # - libname library name # - sourcebase directory relative to destdir where to place source code # - m4base directory relative to destdir where to place *.m4 macros @@ -2091,8 +2198,10 @@ func_import () # Determine final module list. modules="$specified_modules" func_modules_transitive_closure - echo "Module list with included dependencies:" - echo "$modules" | sed -e 's/^/ /' + if test $verbose -ge 0; then + echo "Module list with included dependencies:" + echo "$modules" | sed -e 's/^/ /' + fi # Add the dummy module if needed. func_modules_add_dummy @@ -2109,6 +2218,9 @@ func_import () done fi + # Show banner notice of every module. + func_modules_notice + # Determine script to apply to imported library files. sed_transform_lib_file= for module in $modules; do @@ -2132,8 +2244,10 @@ func_import () # Determine final file list. func_modules_to_filelist - echo "File list:" - echo "$files" | sed -e 's/^/ /' + if test $verbose -ge 0; then + echo "File list:" + echo "$files" | sed -e 's/^/ /' + fi test -n "$files" \ || func_fatal_error "refusing to do nothing" @@ -2230,7 +2344,7 @@ func_import () sed_take_first_column='s,'"$delimiter"'.*,,' for g in `LC_ALL=C join -t"$delimiter" -v1 "$tmp"/old-files "$tmp"/new-files | sed -e "$sed_take_first_column"`; do # Remove the file. Do nothing if the user already removed it. - if test -f "$destdir/$g"; then + if test -f "$destdir/$g" || test -h "$destdir/$g"; then if $doit; then echo "Removing file $g (backup in ${g}~)" mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed" @@ -2497,10 +2611,18 @@ func_import () fi # Fetch PO files. TP_URL="http://translationproject.org/latest/" + TP_RSYNC_URI="translationproject.org::tp/latest/" if $doit; then echo "Fetching gnulib PO files from $TP_URL" (cd "$destdir"/$pobase \ - && wget --quiet -r -l1 -nd -np -A.po "${TP_URL}gnulib" + && { # Prefer rsync over wget if it is available, since it consumes + # less network bandwidth, due to compression. + if type rsync 2>/dev/null | grep / > /dev/null; then + rsync -Lrtz "${TP_RSYNC_URI}gnulib/" . + else + wget --quiet -r -l1 -nd -np -A.po "${TP_URL}gnulib" + fi + } ) else echo "Fetch gnulib PO files from $TP_URL" @@ -3011,16 +3133,23 @@ func_create_testdir () # Determine final module list. func_modules_transitive_closure - echo "Module list with included dependencies:" - echo "$modules" | sed -e 's/^/ /' + if test $verbose -ge 0; then + echo "Module list with included dependencies:" + echo "$modules" | sed -e 's/^/ /' + fi # Add the dummy module if needed. func_modules_add_dummy + # Show banner notice of every module. + func_modules_notice + # Determine final file list. func_modules_to_filelist - echo "File list:" - echo "$files" | sed -e 's/^/ /' + if test $verbose -ge 0; then + echo "File list:" + echo "$files" | sed -e 's/^/ /' + fi sed_rewrite_files="\ s,^build-aux/,$auxdir/, @@ -3320,24 +3449,18 @@ func_create_testdir () # 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 || func_exit 1 + func_execute_command ${AUTOPOINT} --force || func_exit 1 for f in $m4base/*.m4~; do mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1 done fi - echo "executing ${ACLOCAL} -I $m4base" - ${ACLOCAL} -I $m4base || func_exit 1 + func_execute_command ${ACLOCAL} -I $m4base || func_exit 1 if ! test -d build-aux; then - echo "executing mkdir build-aux" - mkdir build-aux || func_exit 1 + func_execute_command mkdir build-aux || func_exit 1 fi - echo "executing ${AUTOCONF}" - ${AUTOCONF} || func_exit 1 - echo "executing ${AUTOHEADER}" - ${AUTOHEADER} || func_exit 1 - echo "executing ${AUTOMAKE} --add-missing --copy" - ${AUTOMAKE} --add-missing --copy || func_exit 1 + func_execute_command ${AUTOCONF} || func_exit 1 + func_execute_command ${AUTOHEADER} || func_exit 1 + func_execute_command ${AUTOMAKE} --add-missing --copy || func_exit 1 ) || func_exit 1 if test -n "$inctests"; then # Create autogenerated files. @@ -3345,24 +3468,18 @@ func_create_testdir () # 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 || func_exit 1 + func_execute_command ${AUTOPOINT} --force || func_exit 1 for f in ../$m4base/*.m4~; do mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1 done fi - echo "executing ${ACLOCAL} -I ../$m4base" - ${ACLOCAL} -I ../$m4base || func_exit 1 + func_execute_command ${ACLOCAL} -I ../$m4base || func_exit 1 if ! test -d ../build-aux; then - echo "executing mkdir ../build-aux" - mkdir ../build-aux + func_execute_command mkdir ../build-aux fi - echo "executing ${AUTOCONF}" - ${AUTOCONF} || func_exit 1 - echo "executing ${AUTOHEADER}" - ${AUTOHEADER} || func_exit 1 - echo "executing ${AUTOMAKE} --add-missing --copy" - ${AUTOMAKE} --add-missing --copy || func_exit 1 + func_execute_command ${AUTOCONF} || func_exit 1 + func_execute_command ${AUTOHEADER} || func_exit 1 + func_execute_command ${AUTOMAKE} --add-missing --copy || func_exit 1 ) || func_exit 1 fi # Need to run configure and make once, to create built files that are to be @@ -3421,7 +3538,12 @@ func_create_megatestdir () func_append megasubdirs "ALL" # Create autobuild. - cvsdate=`sh "$gnulib_dir/build-aux/mdate-sh" "$gnulib_dir/CVS/Entries" \ + cvsdate=`if test -f "$gnulib_dir/CVS/Entries"; then \ + vc_witness="$gnulib_dir/CVS/Entries"; \ + else \ + vc_witness="$gnulib_dir/.git/refs/heads/master"; \ + fi; \ + sh "$gnulib_dir/build-aux/mdate-sh" "$vc_witness" \ | sed -e 's,January,01,' -e 's,Jan,01,' \ -e 's,February,02,' -e 's,Feb,02,' \ -e 's,March,03,' -e 's,Mar,03,' \ @@ -3485,14 +3607,10 @@ func_create_megatestdir () # Do not use "${AUTORECONF} --install", because autoreconf operates # recursively, but the subdirectories are already finished, therefore # calling autoreconf here would only waste lots of CPU time. - echo "executing ${ACLOCAL}" - ${ACLOCAL} || func_exit 1 - echo "executing mkdir build-aux" - mkdir build-aux - echo "executing ${AUTOCONF}" - ${AUTOCONF} || func_exit 1 - echo "executing ${AUTOMAKE} --add-missing --copy" - ${AUTOMAKE} --add-missing --copy || func_exit 1 + func_execute_command ${ACLOCAL} || func_exit 1 + func_execute_command mkdir build-aux + func_execute_command ${AUTOCONF} || func_exit 1 + func_execute_command ${AUTOMAKE} --add-missing --copy || func_exit 1 ) || func_exit 1 } @@ -3712,6 +3830,16 @@ case $mode in done ;; + extract-notice ) + for module + do + func_verify_module + if test -n "$module"; then + func_get_notice "$module" + fi + done + ;; + extract-filelist ) for module do