X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=46f5f8790de460a3aec15121253bc33793b0bb95;hb=95be85947415fc9c52cd4ee535fcb3c5eb34bd91;hp=b50b08beebb9359e6f258b5ffeb16c777efc05b0;hpb=4237d0b164f7d7ba9d94a6bd9c9647c30b3c07f0;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index b50b08bee..46f5f8790 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -124,6 +124,7 @@ Usage: gnulib-tool --list gnulib-tool --extract-license module gnulib-tool --extract-maintainer module gnulib-tool --extract-tests-module module + gnulib-tool --copy-file file [destination] Operation modes: --list print the available module names @@ -152,6 +153,7 @@ Operation modes: under lib/ --extract-maintainer report the maintainer(s) inside gnulib --extract-tests-module report the unit test module, if it exists + --copy-file copy a file that is not part of any module General options: --dir=DIRECTORY Specify the target directory. @@ -701,7 +703,7 @@ 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 + && $CONFIG_SHELL -c "echo '\\t' | grep t > /dev/null"; then exec $CONFIG_SHELL "$0" --no-reexec "$@" exit 127 fi @@ -897,6 +899,9 @@ fi --extract-* ) mode=`echo "X$1" | sed -e 's/^X--//'` shift ;; + --copy-file | --copy-fil | --copy-fi | --copy-f | --copy- | --copy | --cop | --co ) + mode=copy-file + shift ;; --dir ) shift if test $# = 0; then @@ -1406,7 +1411,7 @@ func_get_filelist () # 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 \|. +# added_prefix, added_suffix should not contain the characters \|&. func_filter_filelist () { if test "$2" != "$nl" \ @@ -1795,6 +1800,108 @@ func_execute_command () fi } +# func_dest_tmpfilename file +# determines the name of a temporary file (file is relative to destdir). +# Input: +# - destdir target directory +# - doit : if actions shall be executed, false if only to be printed +# - tmp pathname of a temporary directory +# Sets variable: +# - tmpfile absolute filename of the temporary file +func_dest_tmpfilename () +{ + if $doit; then + # Put the new contents of $file in a file in the same directory (needed + # to guarantee that an 'mv' to "$destdir/$file" works). + tmpfile="$destdir/$1.tmp" + else + # Put the new contents of $file in a file in a temporary directory + # (because the directory of "$file" might not exist). + tmpfile="$tmp"/`basename "$1"`.tmp + fi +} + +# func_add_file +# copies a file from gnulib into the destination directory. The destination +# is known to not exist. +# Input: +# - destdir target directory +# - local_gnulib_dir from --local-dir +# - f the original file name +# - lookedup_file name of the merged (combined) file +# - lookedup_tmp true if it is located in the tmp directory, blank otherwise +# - g the rewritten file name +# - tmpfile absolute filename of the temporary file +# - doit : if actions shall be executed, false if only to be printed +# - symbolic true if files should be symlinked, copied otherwise +# - lsymbolic true if files from local_gnulib_dir should be symlinked, +# copied otherwise +func_add_file () +{ + if $doit; then + echo "Copying file $g" + if { test -n "$symbolic" \ + || { test -n "$lsymbolic" \ + && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \ + && test -z "$lookedup_tmp" \ + && cmp "$lookedup_file" "$tmpfile" > /dev/null; then + func_ln_if_changed "$lookedup_file" "$destdir/$g" + else + mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed" + fi + else + echo "Copy file $g" + fi +} + +# func_update_file +# copies a file from gnulib into the destination directory. The destination +# is known to exist. +# Input: +# - destdir target directory +# - local_gnulib_dir from --local-dir +# - f the original file name +# - lookedup_file name of the merged (combined) file +# - lookedup_tmp true if it is located in the tmp directory, blank otherwise +# - g the rewritten file name +# - tmpfile absolute filename of the temporary file +# - doit : if actions shall be executed, false if only to be printed +# - symbolic true if files should be symlinked, copied otherwise +# - lsymbolic true if files from local_gnulib_dir should be symlinked, +# copied otherwise +# - already_present nonempty if the file should already exist, empty otherwise +func_update_file () +{ + if cmp "$destdir/$g" "$tmpfile" > /dev/null; then + : # The file has not changed. + else + # Replace the file. + if $doit; then + if test -n "$already_present"; then + echo "Updating file $g (backup in ${g}~)" + else + echo "Replacing file $g (non-gnulib code backed up in ${g}~) !!" + fi + mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed" + if { test -n "$symbolic" \ + || { test -n "$lsymbolic" \ + && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \ + && test -z "$lookedup_tmp" \ + && cmp "$lookedup_file" "$tmpfile" > /dev/null; then + func_ln_if_changed "$lookedup_file" "$destdir/$g" + else + mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed" + fi + else + if test -n "$already_present"; then + echo "Update file $g (backup in ${g}~)" + else + echo "Replace file $g (non-gnulib code backed up in ${g}~) !!" + fi + fi + fi +} + # func_emit_lib_Makefile_am # emits the contents of library makefile to standard output. # Input: @@ -1846,7 +1953,14 @@ func_emit_lib_Makefile_am () echo "## Process this file with automake to produce Makefile.in." func_emit_copyright_notice if test -n "$actioncmd"; then - echo "# Reproduce by: $actioncmd" + # The maximum line length (excluding the terminating newline) of any file + # that is to be preprocessed by config.status is 3070. config.status uses + # awk, and the HP-UX 11.00 awk fails if a line has length >= 3071; + # similarly, the IRIX 6.5 awk fails if a line has length >= 3072. + len=`echo "$actioncmd" | wc -c` + if test -n "$len" && test "$len" -le 3000; then + echo "# Reproduce by: $actioncmd" + fi fi echo uses_subdirs= @@ -1940,9 +2054,14 @@ func_emit_lib_Makefile_am () 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 - # One of the snippets already specifies an installation location for the - # library. Don't confuse automake by saying it should not be installed. + if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" allsnippets.tmp > /dev/null \ + || { test -n "$makefile_name" \ + && test -f "$sourcebase/Makefile.am" \ + && LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" "$sourcebase/Makefile.am" > /dev/null; \ + }; then + # One of the snippets or the user's Makefile.am already specifies an + # installation location for the library. Don't confuse automake by saying + # it should not be installed. : else # By default, the generated library should not be installed. @@ -2750,11 +2869,22 @@ s,^\(.................................................[^ ]*\) *, sed_transform_main_lib_file=$sed_transform_main_lib_file' s/GNU Lesser General/GNU General/g s/GNU Library General/GNU General/g - s/version \(2\|2\.1\)\([ ,]\)/version 3\2/g + s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g ' fi fi + # Determine script to apply to auxiliary files that go into $auxdir/. + sed_transform_build_aux_file= + if test -n "$do_copyrights"; then + # Update license. + sed_transform_build_aux_file=$sed_transform_build_aux_file' + s/GNU Lesser General/GNU General/g + s/GNU Library General/GNU General/g + s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g + ' + fi + # Determine script to apply to library files that go into $testsbase/. sed_transform_testsrelated_lib_file="$sed_transform_lib_file" if test -n "$do_copyrights"; then @@ -2762,7 +2892,7 @@ s,^\(.................................................[^ ]*\) *, sed_transform_testsrelated_lib_file=$sed_transform_testsrelated_lib_file' s/GNU Lesser General/GNU General/g s/GNU Library General/GNU General/g - s/version \(2\|2\.1\)\([ ,]\)/version 3\2/g + s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g ' fi @@ -2798,22 +2928,25 @@ s,^\(.................................................[^ ]*\) *, func_append old_files " m4/gnulib-tool.m4" fi + rewritten='%REWRITTEN%' sed_rewrite_old_files="\ - s,^build-aux/,$auxdir/, - s,^doc/,$cached_docbase/, - s,^lib/,$cached_sourcebase/, - s,^m4/,$cached_m4base/, - s,^tests/,$cached_testsbase/, - s,^tests=lib/,$cached_testsbase/, - s,^top/,," + s,^build-aux/,$rewritten$auxdir/, + s,^doc/,$rewritten$cached_docbase/, + s,^lib/,$rewritten$cached_sourcebase/, + s,^m4/,$rewritten$cached_m4base/, + s,^tests/,$rewritten$cached_testsbase/, + s,^tests=lib/,$rewritten$cached_testsbase/, + s,^top/,$rewritten, + s,^$rewritten,," sed_rewrite_new_files="\ - s,^build-aux/,$auxdir/, - s,^doc/,$docbase/, - s,^lib/,$sourcebase/, - s,^m4/,$m4base/, - s,^tests/,$testsbase/, - s,^tests=lib/,$testsbase/, - s,^top/,," + s,^build-aux/,$rewritten$auxdir/, + s,^doc/,$rewritten$docbase/, + s,^lib/,$rewritten$sourcebase/, + s,^m4/,$rewritten$m4base/, + s,^tests/,$rewritten$testsbase/, + s,^tests=lib/,$rewritten$testsbase/, + s,^top/,$rewritten, + s,^$rewritten,," # Create directories. { echo "$sourcebase" @@ -2850,23 +2983,6 @@ s,^\(.................................................[^ ]*\) *, exec 0<&5 5<&- } - # func_dest_tmpfilename file - # determines the name of a temporary file (file is relative to destdir). - # Sets variable: - # - tmpfile absolute filename of the temporary file - func_dest_tmpfilename () - { - if $doit; then - # Put the new contents of $file in a file in the same directory (needed - # to guarantee that an 'mv' to "$destdir/$file" works). - tmpfile="$destdir/$1.tmp" - else - # Put the new contents of $file in a file in a temporary directory - # (because the directory of "$file" might not exist). - tmpfile="$tmp"/`basename "$1"`.tmp - fi - } - # Copy files or make symbolic links. Remove obsolete files. added_files='' removed_files='' @@ -2901,7 +3017,8 @@ s,^\(.................................................[^ ]*\) *, # Uses parameters # - f the original file name # - g the rewritten file name - # - already_present nonempty if the file already exists, empty otherwise + # - already_present nonempty if the file should already exist, empty + # otherwise func_add_or_update () { of="$f" @@ -2919,6 +3036,14 @@ s,^\(.................................................[^ ]*\) *, ;; esac fi + if test -n "$sed_transform_build_aux_file"; then + case "$of" in + build-aux/*) + sed -e "$sed_transform_build_aux_file" \ + < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed" + ;; + esac + fi if test -n "$sed_transform_testsrelated_lib_file"; then case "$of" in tests=lib/*) @@ -2929,52 +3054,12 @@ s,^\(.................................................[^ ]*\) *, fi if test -f "$destdir/$g"; then # The file already exists. - if cmp "$destdir/$g" "$tmpfile" > /dev/null; then - : # The file has not changed. - else - # Replace the file. - if $doit; then - if test -n "$already_present"; then - echo "Updating file $g (backup in ${g}~)" - else - echo "Replacing file $g (non-gnulib code backed up in ${g}~) !!" - fi - mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed" - if { test -n "$symbolic" \ - || { test -n "$lsymbolic" \ - && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \ - && test -z "$lookedup_tmp" \ - && cmp "$lookedup_file" "$tmpfile" > /dev/null; then - func_ln_if_changed "$lookedup_file" "$destdir/$g" - else - mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed" - fi - else - if test -n "$already_present"; then - echo "Update file $g (backup in ${g}~)" - else - echo "Replace file $g (non-gnulib code backed up in ${g}~) !!" - fi - fi - fi + func_update_file else # Install the file. # Don't protest if the file should be there but isn't: it happens # frequently that developers don't put autogenerated files into CVS. - if $doit; then - echo "Copying file $g" - if { test -n "$symbolic" \ - || { test -n "$lsymbolic" \ - && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \ - && test -z "$lookedup_tmp" \ - && cmp "$lookedup_file" "$tmpfile" > /dev/null; then - func_ln_if_changed "$lookedup_file" "$destdir/$g" - else - mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed" - fi - else - echo "Copy file $g" - fi + func_add_file func_append added_files "$g$nl" fi rm -f "$tmpfile" @@ -3733,10 +3818,9 @@ func_create_testdir () if test -z "$modules"; then # All modules together. # Except config-h, which breaks all modules which use HAVE_CONFIG_H. - # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME. # Except ftruncate, mountlist, which abort the configuration on mingw. FIXME. modules=`func_all_modules` - modules=`for m in $modules; do case $m in config-h | fnmatch-posix | ftruncate | mountlist) ;; *) echo $m;; esac; done` + modules=`for m in $modules; do case $m in config-h | ftruncate | mountlist) ;; *) echo $m;; esac; done` fi modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u` @@ -3821,13 +3905,15 @@ func_create_testdir () echo "$files" | sed -e 's/^/ /' fi + rewritten='%REWRITTEN%' sed_rewrite_files="\ - s,^build-aux/,$auxdir/, - s,^doc/,$docbase/, - s,^lib/,$sourcebase/, - s,^m4/,$m4base/, - s,^tests/,$testsbase/, - s,^top/,," + s,^build-aux/,$rewritten$auxdir/, + s,^doc/,$rewritten$docbase/, + s,^lib/,$rewritten$sourcebase/, + s,^m4/,$rewritten$m4base/, + s,^tests/,$rewritten$testsbase/, + s,^top/,$rewritten, + s,^$rewritten,," # Create directories. for f in $files; do echo $f; done \ @@ -3924,7 +4010,7 @@ func_create_testdir () echo "AC_CONFIG_AUX_DIR([$auxdir])" echo "AM_INIT_AUTOMAKE" echo - echo "AM_CONFIG_HEADER([config.h])" + echo "AC_CONFIG_HEADERS([config.h])" echo echo "AC_PROG_CC" echo "AC_PROG_INSTALL" @@ -4014,7 +4100,8 @@ func_create_testdir () # by "merging" config.h into $testsbase/config.h; look out for gcc warnings. echo "AH_TOP([#include \"../config.h\"])" echo - echo "AC_OUTPUT([Makefile])" + echo "AC_CONFIG_FILES([Makefile])" + echo "AC_OUTPUT" ) > "$testdir/$testsbase/configure.ac" auxdir="$saved_auxdir" func_append subdirs " $testsbase" @@ -4039,7 +4126,7 @@ func_create_testdir () fi echo "AM_INIT_AUTOMAKE" echo - echo "AM_CONFIG_HEADER([config.h])" + echo "AC_CONFIG_HEADERS([config.h])" echo echo "AC_PROG_CC" echo "AC_PROG_INSTALL" @@ -4130,7 +4217,8 @@ func_create_testdir () *) func_append makefiles " $d/Makefile" ;; esac done - echo "AC_OUTPUT([$makefiles])" + echo "AC_CONFIG_FILES([$makefiles])" + echo "AC_OUTPUT" ) > "$testdir/configure.ac" # Create autogenerated files. @@ -4225,8 +4313,7 @@ func_create_megatestdir () done # Then, all modules all together. # Except config-h, which breaks all modules which use HAVE_CONFIG_H. - # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME. - allmodules=`for m in $allmodules; do if test $m != config-h && test $m != fnmatch-posix; then echo $m; fi; done` + allmodules=`for m in $allmodules; do if test $m != config-h; then echo $m; fi; done` func_create_testdir "$megatestdir/ALL" "$allmodules" func_append megasubdirs "ALL" @@ -4293,7 +4380,8 @@ func_create_megatestdir () echo "AC_PROG_MAKE_SET" echo echo "AC_CONFIG_SUBDIRS([$megasubdirs])" - echo "AC_OUTPUT([Makefile])" + echo "AC_CONFIG_FILES([Makefile])" + echo "AC_OUTPUT" ) > "$megatestdir/configure.ac" # Create autogenerated files. @@ -4634,6 +4722,66 @@ case $mode in done ;; + copy-file ) + # Verify the number of arguments. + if test $# -lt 1 || test $# -gt 2; then + func_fatal_error "invalid number of arguments for --$mode" + fi + + # The first argument is the file to be copied. + f="$1" + # Verify the file exists. + func_lookup_file "$f" + + # The second argument is the destination; either a directory ot a file. + # It defaults to the current directory. + dest="$2" + test -n "$dest" || dest='.' + test -n "$sourcebase" || sourcebase="lib" + test -n "$m4base" || m4base="m4" + test -n "$docbase" || docbase="doc" + test -n "$testsbase" || testsbase="tests" + test -n "$auxdir" || auxdir="build-aux" + rewritten='%REWRITTEN%' + sed_rewrite_files="\ + s,^build-aux/,$rewritten$auxdir/, + s,^doc/,$rewritten$docbase/, + s,^lib/,$rewritten$sourcebase/, + s,^m4/,$rewritten$m4base/, + s,^tests/,$rewritten$testsbase/, + s,^top/,$rewritten, + s,^$rewritten,," + if test -d "$dest"; then + destdir="$dest" + g=`echo "$f" | sed -e "$sed_rewrite_files"` + else + destdir=`dirname "$dest"` + g=`basename "$dest"` + fi + + # Create the directory for destfile. + d=`dirname "$destdir/$g"` + if $doit; then + if test -n "$d" && test ! -d "$d"; then + mkdir -p "$d" || func_fatal_error "failed" + fi + fi + # Copy the file. + func_dest_tmpfilename "$g" + cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed" + already_present=true + if test -f "$destdir/$g"; then + # The file already exists. + func_update_file + else + # Install the file. + # Don't protest if the file should be there but isn't: it happens + # frequently that developers don't put autogenerated files into CVS. + func_add_file + fi + rm -f "$tmpfile" + ;; + * ) func_fatal_error "unknown operation mode --$mode" ;; esac