X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=dc59e481018e20817e7e67be8c441a4ccba5ffe6;hb=2bc9cabc544597791089f579a5a6d025792f47dc;hp=391b6b6d2253c43d17010c181f922b048989e25b;hpb=7ade1ecd14b6669fbbe325a7b3605225bf53c1b8;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index 391b6b6d2..dc59e4810 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright (C) 2002-2008 Free Software Foundation, Inc. +# Copyright (C) 2002-2009 Free Software Foundation, Inc. # # 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 @@ -63,20 +63,33 @@ if test -z "${AUTOPOINT}" || test -n "${GETTEXTPATH}"; then AUTOPOINT="${GETTEXTPATH}autopoint" fi +# You can set MAKE. +if test -z "${MAKE}"; then + MAKE=make +fi + # When using GNU sed, turn off as many GNU extensions as possible, # to minimize the risk of accidentally using non-portable features. # However, do this only for gnulib-tool itself, not for the code that # 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 +# into makefiles. And do it only for sed versions 4.2 or newer, +# because "sed --posix" is buggy in GNU sed 4.1.5, see +# . +if (alias) > /dev/null 2>&1 \ + && echo | sed --posix -e d >/dev/null 2>&1 \ + && case `sed --version | sed -e 's/^[^0-9]*//' -e 1q` in \ + [1-3]* | 4.[01]*) false;; \ + *) true;; \ + esac \ + ; 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. + # 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 @@ -111,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 @@ -139,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. @@ -398,11 +413,69 @@ if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then { eval "$1+=\"\$2\"" } + fast_func_append=true else func_append () { eval "$1=\"\$$1\$2\"" } + fast_func_append=false +fi + +# func_remove_prefix var prefix +# removes the given prefix from the value of the shell variable var. +# var should be the name of a shell variable. +# Its value should not contain a newline and not start or end with whitespace. +# prefix should not contain the characters "$`\{}[]^|. +if ( foo=bar; eval 'test "${foo#b}" = ar' ) >/dev/null 2>&1; then + func_remove_prefix () + { + eval "$1=\${$1#\$2}" + } + fast_func_remove_prefix=true +else + func_remove_prefix () + { + eval "value=\"\$$1\"" + prefix="$2" + case "$prefix" in + *.*) + sed_escape_dots='s/\([.]\)/\\\1/g' + prefix=`echo "$prefix" | sed -e "$sed_escape_dots"` + ;; + esac + value=`echo "$value" | sed -e "s|^${prefix}||"` + eval "$1=\"\$value\"" + } + fast_func_remove_prefix=false +fi + +# func_remove_suffix var suffix +# removes the given suffix from the value of the shell variable var. +# var should be the name of a shell variable. +# Its value should not contain a newline and not start or end with whitespace. +# suffix should not contain the characters "$`\{}[]^|. +if ( foo=bar; eval 'test "${foo%r}" = ba' ) >/dev/null 2>&1; then + func_remove_suffix () + { + eval "$1=\${$1%\$2}" + } + fast_func_remove_suffix=true +else + func_remove_suffix () + { + eval "value=\"\$$1\"" + suffix="$2" + case "$suffix" in + *.*) + sed_escape_dots='s/\([.]\)/\\\1/g' + suffix=`echo "$suffix" | sed -e "$sed_escape_dots"` + ;; + esac + value=`echo "$value" | sed -e "s|${suffix}\$||"` + eval "$1=\"\$value\"" + } + fast_func_remove_suffix=false fi # func_fatal_error message @@ -578,7 +651,9 @@ func_ln_if_changed () # 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. + # The problem has only been reported with bash. Probably it occurs only with + # bash-3.2. For the reasons, see + # . # Note that Solaris sh does not understand "trap - SIGPIPE". func_reset_sigpipe () { @@ -628,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 @@ -824,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 @@ -1318,6 +1396,7 @@ func_get_filelist () { func_lookup_file "modules/$1" sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file" + echo m4/00gnulib.m4 echo m4/gnulib-common.m4 case "$autoconf_minversion" in 2.59) @@ -1326,13 +1405,63 @@ func_get_filelist () esac } +# func_filter_filelist outputvar separator filelist prefix suffix removed_prefix removed_suffix [added_prefix [added_suffix]] +# stores in outputvar the filtered and processed filelist. Filtering: Only the +# elements starting with prefix and ending with suffix are considered. +# 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 \|&. +func_filter_filelist () +{ + if test "$2" != "$nl" \ + || { $fast_func_append \ + && { test -z "$6" || $fast_func_remove_prefix; } \ + && { test -z "$7" || $fast_func_remove_suffix; }; \ + }; then + ffflist= + for fff in $3; do + case "$fff" in + "$4"*"$5") + if test -n "$6"; then + func_remove_prefix fff "$6" + fi + if test -n "$7"; then + func_remove_suffix fff "$7" + fi + fff="$8${fff}$9" + if test -z "$ffflist"; then + ffflist="${fff}" + else + func_append ffflist "$2${fff}" + fi + ;; + esac + done + else + sed_fff_filter="s|^$6\(.*\)$7\$|$8\\1$9|" + ffflist=`for fff in $3; do + case "$fff" in + "$4"*"$5") echo "$fff" ;; + esac + done | sed -e "$sed_fff_filter"` + fi + eval "$1=\"\$ffflist\"" +} + # func_get_dependencies module # Input: # - local_gnulib_dir from --local-dir func_get_dependencies () { # ${module}-tests always implicitly depends on ${module}. - echo "$1" | sed -n -e 's/-tests$//p' + case "$1" in + *-tests) + fgd1="$1" + func_remove_suffix fgd1 '-tests' + echo "$fgd1" + ;; + esac # Then the explicit dependencies listed in the module description. func_lookup_file "modules/$1" sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file" @@ -1368,11 +1497,7 @@ func_get_automake_snippet () # *-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/,,'` + func_filter_filelist tests_files " " "$all_files" 'tests/' '' 'tests/' '' extra_files="$tests_files" if test -n "$extra_files"; then echo "EXTRA_DIST +=" $extra_files @@ -1394,11 +1519,7 @@ func_get_automake_snippet () | sed -e "$sed_combine_lines" \ | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'` all_files=`func_get_filelist $1` - lib_files=`for f in $all_files; do \ - case $f in \ - lib/*) echo $f ;; \ - esac; \ - done | sed -e 's,^lib/,,'` + func_filter_filelist lib_files "$nl" "$all_files" 'lib/' '' 'lib/' '' # Remove $already_mentioned_files from $lib_files. echo "$lib_files" | LC_ALL=C sort -u > "$tmp"/lib-files extra_files=`func_reset_sigpipe; \ @@ -1422,8 +1543,7 @@ func_get_automake_snippet () case "$1" in relocatable-prog-wrapper) ;; *) - sed_extract_c_files='/\.c$/p' - extra_files=`echo "$extra_files" | sed -n -e "$sed_extract_c_files"` + func_filter_filelist extra_files "$nl" "$extra_files" '' '.c' '' '' if test -n "$extra_files"; then echo "EXTRA_lib_SOURCES +=" $extra_files echo @@ -1431,22 +1551,14 @@ func_get_automake_snippet () ;; esac # Synthesize an EXTRA_DIST augmentation also for the files in build-aux/. - buildaux_files=`for f in $all_files; do \ - case $f in \ - build-aux/*) echo $f ;; \ - esac; \ - done | sed -e 's,^build-aux/,,'` + func_filter_filelist buildaux_files "$nl" "$all_files" 'build-aux/' '' 'build-aux/' '' if test -n "$buildaux_files"; then sed_prepend_auxdir='s,^,$(top_srcdir)/'"$auxdir"'/,' echo "EXTRA_DIST += "`echo "$buildaux_files" | sed -e "$sed_prepend_auxdir"` echo fi # Synthesize an EXTRA_DIST augmentation also for the files from top/. - top_files=`for f in $all_files; do \ - case $f in \ - top/*) echo $f ;; \ - esac; \ - done | sed -e 's,^top/,,'` + func_filter_filelist top_files "$nl" "$all_files" 'top/' '' 'top/' '' if test -n "$top_files"; then sed_prepend_topdir='s,^,$(top_srcdir)/,' echo "EXTRA_DIST += "`echo "$top_files" | sed -e "$sed_prepend_topdir"` @@ -1590,6 +1702,7 @@ func_modules_transitive_closure () # - modules list of modules, including 'dummy' if needed func_modules_add_dummy () { + # Determine whether any module provides a lib_SOURCES augmentation. have_lib_SOURCES= sed_remove_backslash_newline=':a /\\$/{ @@ -1606,7 +1719,10 @@ ba # Ignore .h files since they are not compiled. case "$file" in *.h) ;; - *) have_lib_SOURCES=yes ;; + *) + have_lib_SOURCES=yes + break 2 + ;; esac done fi @@ -1684,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: @@ -1735,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= @@ -1769,7 +1994,10 @@ func_emit_lib_Makefile_am () # Test whether there are some source files in subdirectories. for f in `func_get_filelist "$module"`; do case $f in - lib/*/*.c) uses_subdirs=yes ;; + lib/*/*.c) + uses_subdirs=yes + break + ;; esac done fi @@ -1823,11 +2051,17 @@ func_emit_lib_Makefile_am () if test -z "$makefile_name"; then echo echo "AM_CPPFLAGS =" + 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. @@ -1982,7 +2216,7 @@ func_emit_tests_Makefile_am () func_emit_copyright_notice echo uses_subdirs= - ( + { for module in $modules; do if $for_test; then func_verify_tests_module @@ -2016,12 +2250,15 @@ func_emit_tests_Makefile_am () # Test whether there are some source files in subdirectories. for f in `func_get_filelist "$module"`; do case $f in - lib/*/*.c | tests/*/*.c) uses_subdirs=yes ;; + lib/*/*.c | tests/*/*.c) + uses_subdirs=yes + break + ;; esac done fi done - ) > allsnippets.tmp + } > allsnippets.tmp # Generate dependencies here, since it eases the debugging of test failures. # If there are source files in subdirectories, prevent collision of the # object files (example: hash.c and libxml/hash.c). @@ -2040,6 +2277,7 @@ func_emit_tests_Makefile_am () # "AM_GNU_GETTEXT used but SUBDIRS not defined" echo "SUBDIRS =" echo "TESTS =" + echo "XFAIL_TESTS =" echo "TESTS_ENVIRONMENT =" echo "noinst_PROGRAMS =" if ! $for_test; then @@ -2302,7 +2540,7 @@ func_import () s,^dnl .*$,, s, dnl .*$,, /gl_LOCAL_DIR(/ { - s,^.*gl_LOCAL_DIR([[ ]*\([^])]*\).*$,cached_local_gnulib_dir="\1",p + s,^.*gl_LOCAL_DIR([[ ]*\([^]"$`\\)]*\).*$,cached_local_gnulib_dir="\1",p } /gl_MODULES(/ { ta @@ -2312,55 +2550,55 @@ func_import () N ba :b - s,^.*gl_MODULES([[ ]*\([^])]*\).*$,cached_specified_modules="\1",p + s,^.*gl_MODULES([[ ]*\([^]"$`\\)]*\).*$,cached_specified_modules="\1",p } /gl_WITH_OBSOLETE/ { s,^.*$,cached_incobsolete=true,p } /gl_AVOID(/ { - s,^.*gl_AVOID([[ ]*\([^])]*\).*$,cached_avoidlist="\1",p + s,^.*gl_AVOID([[ ]*\([^]"$`\\)]*\).*$,cached_avoidlist="\1",p } /gl_SOURCE_BASE(/ { - s,^.*gl_SOURCE_BASE([[ ]*\([^])]*\).*$,cached_sourcebase="\1",p + s,^.*gl_SOURCE_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_sourcebase="\1",p } /gl_M4_BASE(/ { - s,^.*gl_M4_BASE([[ ]*\([^])]*\).*$,cached_m4base="\1",p + s,^.*gl_M4_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_m4base="\1",p } /gl_PO_BASE(/ { - s,^.*gl_PO_BASE([[ ]*\([^])]*\).*$,cached_pobase="\1",p + s,^.*gl_PO_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_pobase="\1",p } /gl_DOC_BASE(/ { - s,^.*gl_DOC_BASE([[ ]*\([^])]*\).*$,cached_docbase="\1",p + s,^.*gl_DOC_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_docbase="\1",p } /gl_TESTS_BASE(/ { - s,^.*gl_TESTS_BASE([[ ]*\([^])]*\).*$,cached_testsbase="\1",p + 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 + s,^.*gl_LIB([[ ]*\([^]"$`\\)]*\).*$,cached_libname="\1",p } /gl_LGPL(/ { - s,^.*gl_LGPL([[ ]*\([^])]*\).*$,cached_lgpl="\1",p + s,^.*gl_LGPL([[ ]*\([^]"$`\\)]*\).*$,cached_lgpl="\1",p } /gl_LGPL/ { s,^.*$,cached_lgpl=yes,p } /gl_MAKEFILE_NAME(/ { - s,^.*gl_MAKEFILE_NAME([[ ]*\([^])]*\).*$,cached_makefile_name="\1",p + s,^.*gl_MAKEFILE_NAME([[ ]*\([^]"$`\\)]*\).*$,cached_makefile_name="\1",p } /gl_LIBTOOL/ { s,^.*$,cached_libtool=true,p } /gl_MACRO_PREFIX(/ { - s,^.*gl_MACRO_PREFIX([[ ]*\([^])]*\).*$,cached_macro_prefix="\1",p + s,^.*gl_MACRO_PREFIX([[ ]*\([^]"$`\\)]*\).*$,cached_macro_prefix="\1",p } /gl_PO_DOMAIN(/ { - s,^.*gl_PO_DOMAIN([[ ]*\([^])]*\).*$,cached_po_domain="\1",p + s,^.*gl_PO_DOMAIN([[ ]*\([^]"$`\\)]*\).*$,cached_po_domain="\1",p } /gl_VC_FILES(/ { - s,^.*gl_VC_FILES([[ ]*\([^])]*\).*$,cached_vc_files="\1",p + s,^.*gl_VC_FILES([[ ]*\([^]"$`\\)]*\).*$,cached_vc_files="\1",p }' eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-cache.m4` if test -f "$destdir"/$m4base/gnulib-comp.m4; then @@ -2375,6 +2613,7 @@ func_import () :a s,^\]).*$,", tb + s,["$`\\],,g p n ba @@ -2505,9 +2744,10 @@ func_import () # ignoring tests modules. Its lib/* sources go into $sourcebase/. If --lgpl # is specified, it will consist only of LGPLed source. # The tests-related module list is the transitive closure of the specified - # modules, including tests modules, minus the main module list. Its lib/* - # sources (brought in through dependencies of *-tests modules) go into - # $testsbase/. It may contain GPLed source, even if --lgpl is specified. + # modules, including tests modules, minus the main module list excluding + # 'link-warning'. Its lib/* sources (brought in through dependencies of + # *-tests modules) go into $testsbase/. It may contain GPLed source, even if + # --lgpl is specified. # Determine main module list. saved_inctests="$inctests" inctests="" @@ -2521,7 +2761,8 @@ func_import () fi # Determine tests-related module list. echo "$final_modules" | LC_ALL=C sort -u > "$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` + sed_remove_link_warning='/^link-warning$/d' + testsrelated_modules=`func_reset_sigpipe; echo "$main_modules" | LC_ALL=C sort -u | sed -e "$sed_remove_link_warning" | 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/^/ /' @@ -2538,15 +2779,15 @@ func_import () func_verify_nontests_module if test -n "$module"; then all_files=`func_get_filelist $module` - lib_files=`for f in $all_files; do \ - case $f in \ - lib/*) echo $f ;; \ - esac; \ - done | sed -e 's,^lib/,,'` - if test -n "$lib_files"; then - use_libtests=true - break - fi + # Test whether some file in $all_files lies in lib/. + for f in $all_files; do + case $f in + lib/*) + use_libtests=true + break 2 + ;; + esac + done fi done @@ -2569,7 +2810,7 @@ func_import () case "$lgpl" in yes | 3) case $license in - LGPL | LGPLv2+) ;; + LGPL | LGPLv2+ | LGPLv3+) ;; *) func_append license_incompatibilities "$module $license$nl" ;; esac ;; @@ -2631,11 +2872,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 @@ -2643,7 +2895,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 @@ -2679,22 +2931,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" @@ -2731,23 +2986,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='' @@ -2782,7 +3020,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" @@ -2800,6 +3039,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/*) @@ -2810,52 +3057,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" @@ -3274,9 +3481,6 @@ s,//*$,/,' if test -n "$uses_subdirs"; then echo " AC_REQUIRE([AM_PROG_CC_C_O])" fi - if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 >/dev/null 2>/dev/null; then - echo " AC_REQUIRE([AC_GNU_SOURCE])" - fi for module in $final_modules; do func_verify_module if test -n "$module"; then @@ -3464,8 +3668,8 @@ s,//*$,/,' 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 - if test -n "$anchor"; then sed -e "s,^,/^${doubly_escaped_anchor}," -e 's,$,\$/d,' < "$tmp"/ignore-removed; fi + { sed -e 's,/,\\/,g' -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed + if test -n "$anchor"; then sed -e 's,/,\\/,g' -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 @@ -3617,10 +3821,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` @@ -3705,13 +3908,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 \ @@ -3808,15 +4013,15 @@ 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" echo "AC_PROG_MAKE_SET" echo "AC_PROG_RANLIB" echo - if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then - echo "AC_GNU_SOURCE" + if test -n "$uses_subdirs"; then + echo "AM_PROG_CC_C_O" echo fi for module in $modules; do @@ -3902,7 +4107,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" @@ -3927,7 +4133,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" @@ -3948,10 +4154,6 @@ func_create_testdir () echo "AM_PROG_CC_C_O" echo fi - if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then - echo "AC_GNU_SOURCE" - echo - fi for module in $modules; do func_verify_nontests_module if test -n "$module"; then @@ -4022,7 +4224,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. @@ -4090,9 +4293,9 @@ func_create_testdir () ./configure || func_exit 1 cd "$sourcebase" echo 'built_sources: $(BUILT_SOURCES)' >> Makefile - make built_sources || func_exit 1 + $MAKE built_sources || func_exit 1 cd .. - make distclean || func_exit 1 + $MAKE distclean || func_exit 1 ) || func_exit 1 fi } @@ -4117,8 +4320,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" @@ -4145,6 +4347,7 @@ func_create_megatestdir () -e 's,^\([0-9]*\) \([0-9]*\) \([0-9]*\),\3\2\1,'` (echo '#!/bin/sh' echo "CVSDATE=$cvsdate" + echo ": \${MAKE=make}" echo "test -d logs || mkdir logs" echo "for module in $megasubdirs; do" echo " echo \"Working on module \$module...\"" @@ -4156,7 +4359,7 @@ 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 \$CONFIGURE_OPTIONS && make && make check && make distclean" + echo " cd \$module && ./configure \$CONFIGURE_OPTIONS && \$MAKE && \$MAKE check && \$MAKE distclean" echo " echo rc=\$?" echo " ) 2>&1 | { if test -n \"\$AUTOBUILD_SUBST\"; then sed -e \"\$AUTOBUILD_SUBST\"; else cat; fi; } > logs/\$safemodule" echo "done" @@ -4184,7 +4387,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. @@ -4223,7 +4427,7 @@ case $mode in if test -f "$destdir"/configure.in; then configure_ac="$destdir/configure.in" else - func_fatal_error "cannot find $destdir/configure.ac" + func_fatal_error "cannot find $destdir/configure.ac - make sure you run gnulib-tool from within your package's directory" fi fi @@ -4235,7 +4439,7 @@ case $mode in s,^dnl .*$,, s, dnl .*$,, /AC_CONFIG_AUX_DIR/ { - s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^])]*\).*$,guessed_auxdir="\1",p + s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^]"$`\\)]*\).*$,guessed_auxdir="\1",p } /A[CM]_PROG_LIBTOOL/ { s,^.*$,guessed_libtool=true,p @@ -4297,7 +4501,7 @@ case $mode in sedexpr2='s,^[^/]*$,.,' sedexpr3='s,/[^/]*$,,' m4dirs=`sed -n -e "$sedexpr1" aclocal.m4 | sed -e "$sedexpr2" -e "$sedexpr3" | LC_ALL=C sort -u` - m4dirs_count=`echo "$m4dirs" | wc -l` + m4dirs_count=`printf %s "$m4dirs" | wc -l` fi fi if test $m4dirs_count = 0; then @@ -4368,9 +4572,9 @@ case $mode in mkdir build cd build ../configure || func_exit 1 - make || func_exit 1 - make check || func_exit 1 - make distclean || func_exit 1 + $MAKE || func_exit 1 + $MAKE check || func_exit 1 + $MAKE distclean || func_exit 1 remaining=`find . -type f -print` if test -n "$remaining"; then echo "Remaining files:" $remaining 1>&2 @@ -4391,9 +4595,9 @@ case $mode in mkdir build cd build ../configure - make - make check - make distclean + $MAKE + $MAKE check + $MAKE distclean remaining=`find . -type f -print` if test -n "$remaining"; then echo "Remaining files:" $remaining 1>&2 @@ -4525,6 +4729,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