X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=2e7b73dd974f2f2c2213c63cf770dbfa9afc371f;hb=2b4912f774e30251dd1e5affb5e41b7e4e0cdd82;hp=79d82e27613fb587cbfa69cd872213f7338ccaca;hpb=2f1b8f52a0866f8c09fbebad420222702fa20b98;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index 79d82e276..2e7b73dd9 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 () @@ -96,6 +100,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-status module gnulib-tool --extract-notice module gnulib-tool --extract-filelist module gnulib-tool --extract-dependencies module @@ -122,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-status extract the status (obsolete or not) --extract-notice extract the notice or banner --extract-filelist extract the list of files --extract-dependencies extract the dependencies @@ -161,6 +167,9 @@ Options for --import: --aux-dir=DIRECTORY Directory relative to --dir where auxiliary build tools are placed (default \"build-aux\"). --with-tests Include unit tests for the included modules. + --with-obsolete Include obsolete modules when they occur among the + dependencies. By default, dependencies to obsolete + modules are ignored. --avoid=MODULE Avoid including the given MODULE. Useful if you have code that provides equivalent functionality. This option can be repeated. @@ -212,7 +221,7 @@ q date=`echo "$date" | sed -e "$sed_year_before_time"` # Use GNU date to compute the time in GMT. date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"` - version=' '`"$gnulib_dir"/build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'` + version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'` else if test -d "$gnulib_dir"/CVS \ && (cvs --version) >/dev/null 2>/dev/null; then @@ -258,7 +267,9 @@ func_emit_copyright_notice () } # func_exit STATUS -# exit with status +# exits with a given status. +# This function needs to be used, rather than 'exit', when a 'trap' handler is +# in effect that refers to $?. func_exit () { (exit $1); exit $1 @@ -266,14 +277,16 @@ func_exit () # func_gnulib_dir # locates the directory where the gnulib repository lives +# Input: +# - progname name of this program # Sets variables # - self_abspathname absolute pathname of gnulib-tool # - gnulib_dir absolute pathname of gnulib repository func_gnulib_dir () { - case "$0" in - /*) self_abspathname="$0" ;; - */*) self_abspathname=`pwd`/"$0" ;; + case "$progname" in + /*) self_abspathname="$progname" ;; + */*) self_abspathname=`pwd`/"$progname" ;; *) # Look in $PATH. # Iterate through the elements of $PATH. @@ -320,8 +333,8 @@ func_gnulib_dir () for d in $pathx; do IFS="$save_IFS" test -z "$d" && d=. - if test -x "$d/$0" && test ! -d "$d/$0"; then - self_abspathname="$d/$0" + if test -x "$d/$progname" && test ! -d "$d/$progname"; then + self_abspathname="$d/$progname" break fi done @@ -345,6 +358,8 @@ func_gnulib_dir () # func_tmpdir # creates a temporary directory. +# Input: +# - progname name of this program # Sets variable # - tmp pathname of freshly created temporary directory func_tmpdir () @@ -369,7 +384,7 @@ func_tmpdir () (umask 077 && mkdir "$tmp") } || { - echo "$0: cannot create a temporary directory in $TMPDIR" >&2 + echo "$progname: cannot create a temporary directory in $TMPDIR" >&2 func_exit 1 } } @@ -392,10 +407,12 @@ fi # func_fatal_error message # outputs to stderr a fatal error message, and terminates the program. +# Input: +# - progname name of this program func_fatal_error () { - echo "gnulib-tool: *** $1" 1>&2 - echo "gnulib-tool: *** Stop." 1>&2 + echo "$progname: *** $1" 1>&2 + echo "$progname: *** Stop." 1>&2 func_exit 1 } @@ -548,6 +565,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 @@ -708,6 +751,7 @@ fi # - testsbase from --tests-base # - auxdir from --aux-dir # - inctests true if --with-tests was given, blank otherwise +# - incobsolete true if --with-obsolete was given, blank otherwise # - avoidlist list of modules to avoid, from --avoid # - lgpl yes or a number if --lgpl was given, blank otherwise # - makefile_name from --makefile-name @@ -738,6 +782,7 @@ fi testsbase= auxdir= inctests= + incobsolete= avoidlist= lgpl= makefile_name= @@ -880,6 +925,9 @@ fi --with-tests ) inctests=true shift ;; + --with-obsolete ) + incobsolete=true + shift ;; --avoid ) shift if test $# = 0; then @@ -990,9 +1038,10 @@ fi if test -n "$local_gnulib_dir" || test -n "$supplied_libname" \ || test -n "$sourcebase" || test -n "$m4base" || test -n "$pobase" \ || test -n "$docbase" || test -n "$testsbase" || test -n "$auxdir" \ - || test -n "$inctests" || test -n "$avoidlist" || test -n "$lgpl" \ - || test -n "$makefile_name" || test -n "$macro_prefix" \ - || test -n "$po_domain" || test -n "$vc_files"; then + || test -n "$inctests" || test -n "$incobsolete" \ + || test -n "$avoidlist" || test -n "$lgpl" || test -n "$makefile_name" \ + || test -n "$macro_prefix" || test -n "$po_domain" \ + || test -n "$vc_files"; then echo "gnulib-tool: invalid options for 'update' mode" 1>&2 echo "Try 'gnulib-tool --help' for more information." 1>&2 echo "If you really want to modify the gnulib configuration of your project," 1>&2 @@ -1218,6 +1267,7 @@ sed_extract_prog=':[ ]*$/ { :a n s/^Description:[ ]*$// + s/^Status:[ ]*$// s/^Notice:[ ]*$// s/^Files:[ ]*$// s/^Depends-on:[ ]*$// @@ -1243,6 +1293,15 @@ func_get_description () sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file" } +# func_get_status module +# Input: +# - local_gnulib_dir from --local-dir +func_get_status () +{ + func_lookup_file "modules/$1" + sed -n -e "/^Status$sed_extract_prog" < "$lookedup_file" +} + # func_get_notice module # Input: # - local_gnulib_dir from --local-dir @@ -1262,8 +1321,7 @@ func_get_filelist () echo m4/gnulib-common.m4 case "$autoconf_minversion" in 2.59) - #echo m4/onceonly.m4 - echo m4/onceonly_2_57.m4 + echo m4/onceonly.m4 ;; esac } @@ -1343,7 +1401,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 @@ -1469,6 +1528,8 @@ func_acceptable () # - local_gnulib_dir from --local-dir # - modules list of specified modules # - inctests true if tests should be included, blank otherwise +# - incobsolete true if obsolete modules among dependencies should be +# included, blank otherwise # - avoidlist list of modules to avoid # - tmp pathname of a temporary directory # Output: @@ -1497,7 +1558,12 @@ func_modules_transitive_closure () if test -n "$duplicated_deps"; then echo "warning: module $module has duplicated dependencies: "`echo $duplicated_deps` 1>&2 fi - func_append inmodules " $deps" + for dep in $deps; do + if test -n "$incobsolete" \ + || { status=`func_get_status $dep`; test "$status" != obsolete; }; then + func_append inmodules " $dep" + fi + done if test -n "$inctests"; then testsmodule=`func_get_tests_module $module` if test -n "$testsmodule"; then @@ -1510,7 +1576,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 @@ -1603,7 +1669,7 @@ func_execute_command () echo "executing $*" "$@" else - # Commands like automake produce output to stderr even when the succeed. + # Commands like automake produce output to stderr even when they succeed. # Turn this output off if the command succeeds. "$@" > "$tmp"/cmdout 2>&1 cmdret=$? @@ -1632,6 +1698,10 @@ func_execute_command () # - po_domain prefix of i18n domain to use (without -gnulib suffix) # - actioncmd (optional) command that will reproduce this invocation # - for_test true if creating a package for testing, false otherwise +# - destfile filename relative to destdir of makefile being generated +# Input/Output: +# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val} +# list of edits to be done to Makefile.am variables # Output: # - uses_subdirs nonempty if object files in subdirs exist func_emit_lib_Makefile_am () @@ -1646,7 +1716,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= @@ -1659,7 +1729,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." @@ -1687,7 +1757,7 @@ func_emit_lib_Makefile_am () echo "${libname}_${libext}_DEPENDENCIES += @${perhapsLT}ALLOCA@" fi } > amsnippet.tmp - # Skip the contents if its entirely empty. + # Skip the contents if it's entirely empty. if grep '[^ ]' amsnippet.tmp > /dev/null ; then echo "## begin gnulib module $module" echo @@ -1716,6 +1786,7 @@ func_emit_lib_Makefile_am () fi echo if test -z "$makefile_name"; then + echo "SUBDIRS =" echo "noinst_HEADERS =" echo "noinst_LIBRARIES =" echo "noinst_LTLIBRARIES =" @@ -1734,11 +1805,27 @@ func_emit_lib_Makefile_am () echo "CLEANFILES =" echo "DISTCLEANFILES =" echo "MAINTAINERCLEANFILES =" + fi + # Execute edits that apply to the Makefile.am being generated. + edit=0 + while test $edit != $makefile_am_edits; do + edit=`expr $edit + 1` + eval dir=\"\$makefile_am_edit${edit}_dir\" + eval var=\"\$makefile_am_edit${edit}_var\" + eval val=\"\$makefile_am_edit${edit}_val\" + if test -n "$var"; then + if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then + echo "${var} += ${val}" + eval "makefile_am_edit${edit}_var=" + fi + fi + done + if test -z "$makefile_name"; then echo 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. : @@ -1749,7 +1836,7 @@ func_emit_lib_Makefile_am () echo echo "${libname}_${libext}_SOURCES =" # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, - # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@. + # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" echo "EXTRA_${libname}_${libext}_SOURCES =" @@ -1775,7 +1862,7 @@ func_emit_lib_Makefile_am () } # func_emit_po_Makevars -# emits the contents of po/ makefile parametrization to standard output. +# emits the contents of po/ makefile parameterization to standard output. # Input: # - local_gnulib_dir from --local-dir # - sourcebase directory relative to destdir where to place source code @@ -1865,13 +1952,17 @@ func_emit_po_POTFILES_in () # - macro_prefix prefix of gl_LIBOBJS macros to use # - for_test true if creating a package for testing, false otherwise # - use_libtests true if a libtests.a should be built, false otherwise +# - destfile filename relative to destdir of makefile being generated +# Input/Output: +# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val} +# list of edits to be done to Makefile.am variables # Output: # - uses_subdirs nonempty if object files in subdirs exist 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' @@ -1883,7 +1974,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!" @@ -1913,7 +2004,7 @@ func_emit_tests_Makefile_am () echo "libtests_a_DEPENDENCIES += @${perhapsLT}ALLOCA@" fi } > amsnippet.tmp - # Skip the contents if its entirely empty. + # Skip the contents if it's entirely empty. if grep '[^ ]' amsnippet.tmp > /dev/null ; then echo "## begin gnulib module $module" echo @@ -1976,6 +2067,20 @@ func_emit_tests_Makefile_am () echo "CLEANFILES =" echo "DISTCLEANFILES =" echo "MAINTAINERCLEANFILES =" + # Execute edits that apply to the Makefile.am being generated. + edit=0 + while test $edit != $makefile_am_edits; do + edit=`expr $edit + 1` + eval dir=\"\$makefile_am_edit${edit}_dir\" + eval var=\"\$makefile_am_edit${edit}_var\" + eval val=\"\$makefile_am_edit${edit}_val\" + if test -n "$var"; then + if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then + echo "${var} += ${val}" + eval "makefile_am_edit${edit}_var=" + fi + fi + done echo echo "AM_CPPFLAGS = \\" echo " -I. -I\$(srcdir) \\" @@ -2001,7 +2106,7 @@ func_emit_tests_Makefile_am () if $use_libtests; then echo "libtests_a_SOURCES =" # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, - # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@. + # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. echo "libtests_a_LIBADD = \$(${macro_prefix}tests_LIBOBJS)" echo "libtests_a_DEPENDENCIES = \$(${macro_prefix}tests_LIBOBJS)" echo "EXTRA_libtests_a_SOURCES =" @@ -2047,6 +2152,15 @@ func_emit_initmacro_start () # We let automake know about the files to be distributed through the # EXTRA_lib_SOURCES variable. echo " m4_pushdef([AC_LIBSOURCES], m4_defn([${macro_prefix_arg}_LIBSOURCES]))" + # Create data variables for checking the presence of files that are mentioned + # as AC_LIBSOURCES arguments. These are m4 variables, not shell variables, + # because we want the check to happen when the configure file is created, + # not when it is run. ${macro_prefix_arg}_LIBSOURCES_LIST is the list of + # files to check for. ${macro_prefix_arg}_LIBSOURCES_DIR is the subdirectory + # in which to expect them. + echo " m4_pushdef([${macro_prefix_arg}_LIBSOURCES_LIST], [])" + echo " m4_pushdef([${macro_prefix_arg}_LIBSOURCES_DIR], [])" + echo " gl_COMMON" } # func_emit_initmacro_end macro_prefix @@ -2055,6 +2169,23 @@ func_emit_initmacro_start () func_emit_initmacro_end () { macro_prefix_arg="$1" + # Check the presence of files that are mentioned as AC_LIBSOURCES arguments. + # The check is performed only when autoconf is run from the directory where + # 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 ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[ ||" + echo " for gl_file in ]${macro_prefix_arg}_LIBSOURCES_LIST[ ; do" + 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" + echo " m4_if(m4_sysval, [0], []," + echo " [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])" + echo " ])" + echo " m4_popdef([${macro_prefix_arg}_LIBSOURCES_DIR])" + echo " m4_popdef([${macro_prefix_arg}_LIBSOURCES_LIST])" echo " m4_popdef([AC_LIBSOURCES])" echo " m4_popdef([AC_REPLACE_FUNCS])" echo " m4_popdef([AC_LIBOBJ])" @@ -2090,13 +2221,6 @@ func_emit_initmacro_done () echo " ${macro_prefix_arg}_LIBOBJS=\"\$${macro_prefix_arg}_LIBOBJS \$1.\$ac_objext\"" echo "])" echo - echo "# m4_foreach_w is provided by autoconf-2.59c and later." - echo "# This definition is to accommodate developers using versions" - echo "# of autoconf older than that." - echo "m4_ifndef([m4_foreach_w]," - echo " [m4_define([m4_foreach_w]," - echo " [m4_foreach([\$1], m4_split(m4_normalize([\$2]), [ ]), [\$3])])])" - echo echo "# Like AC_REPLACE_FUNCS, except that the module name goes" echo "# into ${macro_prefix_arg}_LIBOBJS instead of into LIBOBJS." echo "AC_DEFUN([${macro_prefix_arg}_REPLACE_FUNCS], [" @@ -2105,15 +2229,14 @@ func_emit_initmacro_done () echo "])" echo echo "# Like AC_LIBSOURCES, except the directory where the source file is" - echo "# expected is derived from the gnulib-tool parametrization," + echo "# expected is derived from the gnulib-tool parameterization," 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_arg}_LIBSOURCES], [" echo " m4_foreach([_gl_NAME], [\$1], [" echo " m4_if(_gl_NAME, [alloca.c], [], [" - echo " m4_syscmd([test -r $sourcebase_arg/]_gl_NAME[ || test ! -d $sourcebase_arg])dnl" - echo " m4_if(m4_sysval, [0], []," - echo " [AC_FATAL([missing $sourcebase_arg/]_gl_NAME)])" + echo " m4_define([${macro_prefix_arg}_LIBSOURCES_DIR], [$sourcebase_arg])" + echo " m4_append([${macro_prefix_arg}_LIBSOURCES_LIST], _gl_NAME, [ ])" echo " ])" echo " ])" echo "])" @@ -2132,6 +2255,7 @@ func_emit_initmacro_done () # - testsbase directory relative to destdir where to place unit test code # - auxdir directory relative to destdir where to place build aux files # - inctests true if --with-tests was given, blank otherwise +# - incobsolete true if --with-obsolete was given, blank otherwise # - avoidlist list of modules to avoid, from --avoid # - lgpl yes or a number if library's license shall be LGPL, # blank otherwise @@ -2155,6 +2279,7 @@ func_import () # Get the cached settings. cached_local_gnulib_dir= cached_specified_modules= + cached_incobsolete= cached_avoidlist= cached_sourcebase= cached_m4base= @@ -2180,8 +2305,18 @@ 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_WITH_OBSOLETE/ { + s,^.*$,cached_incobsolete=true,p + } /gl_AVOID(/ { s,^.*gl_AVOID([[ ]*\([^])]*\).*$,cached_avoidlist="\1",p } @@ -2276,6 +2411,10 @@ func_import () # Append the cached and the specified module names. So that # "gnulib-tool --import foo" means to add the module foo. specified_modules="$cached_specified_modules $1" + # Included obsolete modules among the dependencies if specified either way. + if test -z "$incobsolete"; then + incobsolete="$cached_incobsolete" + fi # Append the cached and the specified avoidlist. This is probably better # than dropping the cached one when --avoid is specified at least once. avoidlist=`for m in $cached_avoidlist $avoidlist; do echo $m; done | LC_ALL=C sort -u` @@ -2382,7 +2521,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/^/ /' @@ -2420,6 +2559,7 @@ func_import () # If --lgpl, verify that the licenses of modules are compatible. if test -n "$lgpl"; then + license_incompatibilities= for module in $main_modules; do license=`func_get_license $module` case $license in @@ -2430,13 +2570,13 @@ func_import () yes | 3) case $license in LGPL | LGPLv2+) ;; - *) func_fatal_error "incompatible license on module $module: $license" ;; + *) func_append license_incompatibilities "$module $license$nl" ;; esac ;; 2) case $license in LGPLv2+) ;; - *) func_fatal_error "incompatible license on module $module: $license" ;; + *) func_append license_incompatibilities "$module $license$nl" ;; esac ;; *) func_fatal_error "invalid value lgpl=$lgpl" ;; @@ -2444,6 +2584,13 @@ func_import () ;; esac done + if test -n "$license_incompatibilities"; then + # Format the license incompatibilities as a table. + sed_expand_column1_width50_indent17='s,^\([^ ]*\) ,\1 , +s,^\(.................................................[^ ]*\) *, \1 ,' + license_incompatibilities=`echo "$license_incompatibilities" | sed -e "$sed_expand_column1_width50_indent17"` + func_fatal_error "incompatible license on modules:$nl$license_incompatibilities" + fi fi # Show banner notice of every module. @@ -2754,10 +2901,14 @@ func_import () func_append actioncmd " --po-base=$pobase" fi func_append actioncmd " --doc-base=$docbase" + func_append actioncmd " --tests-base=$testsbase" func_append actioncmd " --aux-dir=$auxdir" if test -n "$inctests"; then func_append actioncmd " --with-tests" fi + if test -n "$incobsolete"; then + func_append actioncmd " --with-obsolete" + fi for module in $avoidlist; do func_append actioncmd " --avoid=$module" done @@ -2799,8 +2950,61 @@ func_import () # Create normal Makefile.ams. for_test=false + # Setup list of Makefile.am edits that are to be performed afterwards. + # Some of these edits apply to files that we will generate; others are + # under the responsibility of the developer. + makefile_am_edits=0 + # func_note_Makefile_am_edit dir var value + # remembers that ${dir}Makefile.am needs to be edited to that ${var} mentions + # ${value}. + func_note_Makefile_am_edit () + { + makefile_am_edits=`expr $makefile_am_edits + 1` + eval makefile_am_edit${makefile_am_edits}_dir=\"\$1\" + eval makefile_am_edit${makefile_am_edits}_var=\"\$2\" + eval makefile_am_edit${makefile_am_edits}_val=\"\$3\" + } + if test "$makefile_am" = Makefile.am; then + sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'` + sourcebase_base=`basename "$sourcebase"` + func_note_Makefile_am_edit "$sourcebase_dir" SUBDIRS "$sourcebase_base" + fi + if test -n "$pobase"; then + pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'` + pobase_base=`basename "$pobase"` + func_note_Makefile_am_edit "$pobase_dir" SUBDIRS "$pobase_base" + fi + if test -n "$inctests"; then + if test "$makefile_am" = Makefile.am; then + testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'` + testsbase_base=`basename "$testsbase"` + func_note_Makefile_am_edit "$testsbase_dir" SUBDIRS "$testsbase_base" + fi + fi + func_note_Makefile_am_edit "" ACLOCAL_AMFLAGS "-I ${m4base}" + { + # Find the first parent directory of $m4base that contains or will contain + # a Makefile.am. + sed_last='s,^.*/\([^/][^/]*\)//*$,\1/, +s,//*$,/,' + sed_butlast='s,[^/][^/]*//*$,,' + dir1="${m4base}/"; dir2="" + while test -n "$dir1" \ + && ! { test -f "${destdir}/${dir1}Makefile.am" \ + || test "${dir1}Makefile.am" = "$sourcebase/$makefile_am" \ + || test "./${dir1}Makefile.am" = "$sourcebase/$makefile_am" \ + || { test -n "$inctests" \ + && { test "${dir1}Makefile.am" = "$testsbase/$makefile_am" \ + || test "./${dir1}Makefile.am" = "$testsbase/$makefile_am"; }; }; }; do + dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2" + dir1=`echo "$dir1" | sed -e "$sed_butlast"` + done + func_note_Makefile_am_edit "$dir1" EXTRA_DIST "${dir2}gnulib-cache.m4" + } + # Create library makefile. func_dest_tmpfilename $sourcebase/$makefile_am + destfile="$sourcebase/$makefile_am" modules="$main_modules" func_emit_lib_Makefile_am > "$tmpfile" if test -f "$destdir"/$sourcebase/$makefile_am; then @@ -2858,7 +3062,7 @@ func_import () func_append added_files "$pobase/$file$nl" fi done - # Create po makefile parametrization, part 1. + # Create po makefile parameterization, part 1. func_dest_tmpfilename $pobase/Makevars func_emit_po_Makevars > "$tmpfile" if test -f "$destdir"/$pobase/Makevars; then @@ -2884,7 +3088,7 @@ func_import () fi func_append added_files "$pobase/Makevars$nl" fi - # Create po makefile parametrization, part 2. + # Create po makefile parameterization, part 2. func_dest_tmpfilename $pobase/POTFILES.in func_emit_po_POTFILES_in > "$tmpfile" if test -f "$destdir"/$pobase/POTFILES.in; then @@ -2987,7 +3191,10 @@ 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 "])" + test -z "$incobsolete" || echo "gl_WITH_OBSOLETE" echo "gl_AVOID([$avoidlist])" echo "gl_SOURCE_BASE([$sourcebase])" echo "gl_M4_BASE([$m4base])" @@ -3100,7 +3307,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'" @@ -3192,6 +3399,7 @@ func_import () if test -n "$inctests"; then # Create tests makefile. func_dest_tmpfilename $testsbase/$makefile_am + destfile="$testsbase/$makefile_am" modules="$testsrelated_modules" func_emit_tests_Makefile_am > "$tmpfile" if test -f "$destdir"/$testsbase/$makefile_am; then @@ -3223,6 +3431,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. @@ -3230,20 +3440,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}~)" @@ -3260,7 +3486,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" @@ -3366,24 +3592,16 @@ func_import () echo " - \"include $makefile_name\" from within \"$testsbase/Makefile.am\"," fi fi - if test "$makefile_am" = Makefile.am; then - sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'` - sourcebase_base=`basename "$sourcebase"` - echo " - mention \"${sourcebase_base}\" in SUBDIRS in ${sourcebase_dir}Makefile.am," - fi - if test -n "$pobase"; then - pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'` - pobase_base=`basename "$pobase"` - echo " - mention \"${pobase_base}\" in SUBDIRS in ${pobase_dir}Makefile.am," - fi - if test -n "$inctests"; then - if test "$makefile_am" = Makefile.am; then - testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'` - testsbase_base=`basename "$testsbase"` - echo " - mention \"${testsbase_base}\" in SUBDIRS in ${testsbase_dir}Makefile.am," + edit=0 + while test $edit != $makefile_am_edits; do + edit=`expr $edit + 1` + eval dir=\"\$makefile_am_edit${edit}_dir\" + eval var=\"\$makefile_am_edit${edit}_var\" + eval val=\"\$makefile_am_edit${edit}_val\" + if test -n "$var"; then + echo " - mention \"${val}\" in ${var} in ${dir}Makefile.am," fi - fi - echo " - mention \"-I ${m4base}\" in ACLOCAL_AMFLAGS in Makefile.am," + done echo " - invoke ${macro_prefix}_EARLY in $configure_ac, right after AC_PROG_CC," echo " - invoke ${macro_prefix}_INIT in $configure_ac." } @@ -3540,8 +3758,12 @@ func_create_testdir () # Create Makefile.ams that are for testing. for_test=true + # No special edits are needed. + makefile_am_edits=0 + # Create $sourcebase/Makefile.am. mkdir -p "$testdir/$sourcebase" + destfile="$sourcebase/Makefile.am" func_emit_lib_Makefile_am > "$testdir/$sourcebase/Makefile.am" any_uses_subdirs="$uses_subdirs" @@ -3577,6 +3799,7 @@ func_create_testdir () auxdir=`echo "$testsbase/"|sed 's%[^/][^/]*//*%../%g'`"$auxdir" # Create $testsbase/Makefile.am. use_libtests=false + destfile="$testsbase/Makefile.am" func_emit_tests_Makefile_am > "$testdir/$testsbase/Makefile.am" any_uses_subdirs="$any_uses_subdirs$uses_subdirs" # Create $testsbase/configure.ac. @@ -3747,7 +3970,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'" @@ -4083,9 +4306,9 @@ case $mode in for m4base in $m4dirs; do # Perform func_import in a subshell, so that variable values # such as - # local_gnulib_dir, avoidlist, sourcebase, m4base, pobase, - # docbase, testsbase, inctests, libname, lgpl, makefile_name, - # libtool, macro_prefix, po_domain, vc_files + # local_gnulib_dir, incobsolete, avoidlist, sourcebase, m4base, + # pobase, docbase, testsbase, inctests, libname, lgpl, + # makefile_name, libtool, macro_prefix, po_domain, vc_files # don't propagate from one directory to another. (func_import) || func_exit 1 done @@ -4174,6 +4397,16 @@ case $mode in done ;; + extract-status ) + for module + do + func_verify_module + if test -n "$module"; then + func_get_status "$module" + fi + done + ;; + extract-notice ) for module do