# You can set GETTEXTPATH to empty if autopoint 0.15 is already in your PATH.
GETTEXTPATH=
+# You can set LIBTOOLPATH to empty if libtoolize 2.x is already in your PATH.
+LIBTOOLPATH=
+
# If you didn't set AUTOCONFPATH and AUTOMAKEPATH, you can also set the
# variables AUTOCONF, AUTOHEADER, ACLOCAL, AUTOMAKE, AUTORECONF individually.
if test -z "${AUTOCONF}" || test -n "${AUTOCONFPATH}"; then
AUTOPOINT="${GETTEXTPATH}autopoint"
fi
+# If you didn't set LIBTOOLPATH, you can also set the variable LIBTOOLIZE.
+if test -z "${LIBTOOLIZE}" || test -n "${LIBTOOLPATH}"; then
+ LIBTOOLIZE="${LIBTOOLPATH}libtoolize"
+fi
+
# You can set MAKE.
if test -z "${MAKE}"; then
MAKE=make
gnulib-tool --test --dir=directory module1 ... moduleN
gnulib-tool --megatest --dir=directory [module1 ... moduleN]
gnulib-tool --extract-description module
+ gnulib-tool --extract-comment module
gnulib-tool --extract-status module
gnulib-tool --extract-notice module
gnulib-tool --extract-applicability module
--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-comment extract the comment
+ --extract-status extract the status (obsolete etc.)
--extract-notice extract the notice or banner
+ --extract-applicability extract the applicability
--extract-filelist extract the list of files
--extract-dependencies extract the dependencies
--extract-autoconf-snippet extract the snippet for configure.ac
--verbose Increase verbosity. May be repeated.
--quiet Decrease verbosity. May be repeated.
+Options for --import, --update:
+ --dry-run Only print what would have been done.
+
+Options for --import, --create-[mega]testdir, --[mega]test:
+ --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.
+ --with-c++-tests Include even unit tests for C++ interoperability.
+ --with-longrunning-tests
+ Include even unit tests that are long-runners.
+ --with-privileged-tests
+ Include even unit tests that require root
+ privileges.
+ --with-unportable-tests
+ Include even unit tests that fail on some platforms.
+ --with-all-tests Include all kinds of problematic unit tests.
+ --avoid=MODULE Avoid including the given MODULE. Useful if you
+ have code that provides equivalent functionality.
+ This option can be repeated.
+ --libtool Use libtool rules.
+ --no-libtool Don't use libtool rules.
+
Options for --import:
--lib=LIBRARY Specify the library name. Defaults to 'libgnu'.
--source-base=DIRECTORY
placed (default \"tests\").
--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.
--lgpl[=2|=3] Abort if modules aren't available under the LGPL.
Also modify license template from GPL to LGPL.
The version number of the LGPL can be specified;
--makefile-name=NAME Name of makefile in automake syntax in the
source-base and tests-base directories
(default \"Makefile.am\").
- --libtool Use libtool rules.
- --no-libtool Don't use libtool rules.
--macro-prefix=PREFIX Specify the prefix of the macros 'gl_EARLY' and
'gl_INIT'. Default is 'gl'.
--po-domain=NAME Specify the prefix of the i18n domain. Usually use
(.gitignore and/or .cvsignore).
--no-changelog Don't update or create ChangeLog files.
-Options for --import and --update:
- --dry-run For --import, only print what would have been done.
+Options for --create-[mega]testdir, --[mega]test:
+ --without-c++-tests Exclude unit tests for C++ interoperability.
+ --without-longrunning-tests
+ Exclude unit tests that are long-runners.
+ --without-privileged-tests
+ Exclude unit tests that require root privileges.
+ --without-unportable-tests
+ Exclude unit tests that fail on some platforms.
+
+Options for --import, --update, --create-[mega]testdir, --[mega]test:
-s, --symbolic, --symlink Make symbolic links instead of copying files.
--local-symlink Make symbolic links instead of copying files, only
for files from the local override directory.
+
+Options for --import, --update:
-S, --more-symlinks Make symbolic links instead of copying files, and
don't replace copyright notices.
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. Probably it occurs only with
- # bash-3.2. For the reasons, see
- # <http://lists.gnu.org/archive/html/bug-bash/2008-12/msg00050.html>.
- # 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:
+# Ensure an 'echo' command that
+# 1. does not interpret backslashes and
+# 2. does not print an error message "broken pipe" when writing into a pipe
+# with no writers.
+#
+# Test cases for problem 1:
# echo '\n' | wc -l prints 1 when OK, 2 when KO
# echo '\t' | grep t > /dev/null has return code 0 when OK, 1 when KO
-# This problem is a weird heritage from SVR4. BSD got it right (except that
+# Test cases for problem 2:
+# echo hi | true frequently prints
+# "bash: echo: write error: Broken pipe"
+# to standard error in bash 3.2.
+#
+# Problem 1 is a weird heritage from SVR4. BSD got it right (except that
# BSD echo interprets '-n' as an option, which is also not desirable).
# Nowadays the problem occurs in 4 situations:
# - in bash, when the shell option xpg_echo is set (bash >= 2.04)
# - otherwise: respawn using /bin/sh and rely on the workarounds.
# When respawning, we pass --no-reexec as first argument, so as to avoid
# turning this script into a fork bomb in unlucky situations.
+#
+# Problem 2 is specific to bash 3.2 and affects the 'echo' built-in, but not
+# the 'printf' built-in. See
+# <http://lists.gnu.org/archive/html/bug-bash/2008-12/msg00050.html>
+# <http://lists.gnu.org/archive/html/bug-gnulib/2010-02/msg00154.html>
+# The workaround is: define echo to a function that uses the printf built-in.
have_echo=
if echo '\t' | grep t > /dev/null; then
have_echo=yes # Lucky!
# For bash >= 2.0: define echo to a function that uses the printf built-in.
# For bash < 2.0: define echo to a function that uses cat of a here document.
# (There is no win in using 'printf' over 'cat' if it is not a shell built-in.)
-if test -z "$have_echo" \
+# Also handle problem 2, specific to bash 3.2, here.
+if { test -z "$have_echo" \
+ || case "$BASH_VERSION" in 3.2*) true;; *) false;; esac; \
+ } \
&& test -n "$BASH_VERSION"; then \
if type printf 2>/dev/null | grep / > /dev/null; then
# 'printf' is not a shell built-in.
# - auxdir from --aux-dir
# - inctests true if --with-tests was given, blank otherwise
# - incobsolete true if --with-obsolete was given, blank otherwise
+# - inc_cxx_tests true if --with-c++-tests was given, blank otherwise
+# - inc_longrunning_tests true if --with-longrunning-tests was given, blank
+# otherwise
+# - inc_privileged_tests true if --with-privileged-tests was given, blank
+# otherwise
+# - inc_unportable_tests true if --with-unportable-tests was given, blank
+# otherwise
+# - inc_all_tests true if --with-all-tests was given, blank otherwise
+# - excl_cxx_tests true if --without-c++-tests was given, blank otherwise
+# - excl_longrunning_tests true if --without-longrunning-tests was given,
+# blank otherwise
+# - excl_privileged_tests true if --without-privileged-tests was given, blank
+# otherwise
+# - excl_unportable_tests true if --without-unportable-tests 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
auxdir=
inctests=
incobsolete=
+ inc_cxx_tests=
+ inc_longrunning_tests=
+ inc_privileged_tests=
+ inc_unportable_tests=
+ inc_all_tests=
+ excl_cxx_tests=
+ excl_longrunning_tests=
+ excl_privileged_tests=
+ excl_unportable_tests=
avoidlist=
lgpl=
makefile_name=
--aux-dir=* )
auxdir=`echo "X$1" | sed -e 's/^X--aux-dir=//'`
shift ;;
- --with-tests )
+ --with-tests | --with-test | --with-tes | --with-te | --with-t)
inctests=true
shift ;;
- --with-obsolete )
+ --with-obsolete | --with-obsolet | --with-obsole | --with-obsol | --with-obso | --with-obs | --with-ob | --with-o)
incobsolete=true
shift ;;
+ --with-c++-tests | --with-c++-test | --with-c++-tes | --with-c++-te | --with-c++-t | --with-c++- | --with-c++ | --with-c+ | --with-c)
+ inc_cxx_tests=true
+ shift ;;
+ --with-longrunning-tests | --with-longrunning-test | --with-longrunning-tes | --with-longrunning-te | --with-longrunning-t | --with-longrunning- | --with-longrunning | --with-longrunnin | --with-longrunni | --with-longrunn | --with-longrun | --with-longru | --with-longr | --with-long | --with-lon | --with-lo | --with-l)
+ inc_longrunning_tests=true
+ shift ;;
+ --with-privileged-tests | --with-privileged-test | --with-privileged-tes | --with-privileged-te | --with-privileged-t | --with-privileged- | --with-privileged | --with-privilege | --with-privileg | --with-privile | --with-privil | --with-privi | --with-priv | --with-pri | --with-pr | --with-p)
+ inc_privileged_tests=true
+ shift ;;
+ --with-unportable-tests | --with-unportable-test | --with-unportable-tes | --with-unportable-te | --with-unportable-t | --with-unportable- | --with-unportable | --with-unportabl | --with-unportab | --with-unporta | --with-unport | --with-unpor | --with-unpo | --with-unp | --with-un | --with-u)
+ inc_unportable_tests=true
+ shift ;;
+ --with-all-tests | --with-all-test | --with-all-tes | --with-all-te | --with-all-t | --with-all- | --with-all | --with-al | --with-a)
+ inc_all_tests=true
+ shift ;;
+ --without-c++-tests | --without-c++-test | --without-c++-tes | --without-c++-te | --without-c++-t | --without-c++- | --without-c++ | --without-c+ | --without-c)
+ excl_cxx_tests=true
+ shift ;;
+ --without-longrunning-tests | --without-longrunning-test | --without-longrunning-tes | --without-longrunning-te | --without-longrunning-t | --without-longrunning- | --without-longrunning | --without-longrunnin | --without-longrunni | --without-longrunn | --without-longrun | --without-longru | --without-longr | --without-long | --without-lon | --without-lo | --without-l)
+ excl_longrunning_tests=true
+ shift ;;
+ --without-privileged-tests | --without-privileged-test | --without-privileged-tes | --without-privileged-te | --without-privileged-t | --without-privileged- | --without-privileged | --without-privilege | --without-privileg | --without-privile | --without-privil | --without-privi | --without-priv | --without-pri | --without-pr | --without-p)
+ excl_privileged_tests=true
+ shift ;;
+ --without-unportable-tests | --without-unportable-test | --without-unportable-tes | --without-unportable-te | --without-unportable-t | --without-unportable- | --without-unportable | --without-unportabl | --without-unportab | --without-unporta | --without-unport | --without-unpor | --without-unpo | --without-unp | --without-un | --without-u)
+ excl_unportable_tests=true
+ shift ;;
--avoid )
shift
if test $# = 0; then
esac
done
+ if test "$mode" = import; then
+ if test -n "$excl_cxx_tests" || test -n "$excl_longrunning_tests" \
+ || test -n "$excl_privileged_tests" || test -n "$excl_unportable_tests"; then
+ echo "gnulib-tool: invalid options for 'import' mode" 1>&2
+ echo "Try 'gnulib-tool --help' for more information." 1>&2
+ func_exit 1
+ fi
+ fi
if test "$mode" = update; then
if test $# != 0; then
echo "gnulib-tool: too many arguments in 'update' mode" 1>&2
|| test -n "$sourcebase" || test -n "$m4base" || test -n "$pobase" \
|| test -n "$docbase" || test -n "$testsbase" || test -n "$auxdir" \
|| test -n "$inctests" || test -n "$incobsolete" \
+ || test -n "$inc_cxx_tests" || test -n "$inc_longrunning_tests" \
+ || test -n "$inc_privileged_tests" || test -n "$inc_unportable_tests" \
+ || test -n "$inc_all_tests" \
+ || test -n "$excl_cxx_tests" || test -n "$excl_longrunning_tests" \
+ || test -n "$excl_privileged_tests" || test -n "$excl_unportable_tests" \
|| test -n "$avoidlist" || test -n "$lgpl" || test -n "$makefile_name" \
|| test -n "$macro_prefix" || test -n "$po_domain" \
|| test -n "$vc_files"; then
| LC_ALL=C sort -u
}
+# func_exists_module module
+# tests whether a module, given by name, exists
+# Input:
+# - local_gnulib_dir from --local-dir
+func_exists_module ()
+{
+ { test -f "$gnulib_dir/modules/$1" \
+ || { test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules" \
+ && test -f "$local_gnulib_dir/modules/$1"; }; } \
+ && test "CVS" != "$1" \
+ && test "ChangeLog" != "$1" \
+ && test "COPYING" != "$1" \
+ && test "README" != "$1" \
+ && test "TEMPLATE" != "$1" \
+ && test "TEMPLATE-EXTENDED" != "$1" \
+ && test "TEMPLATE-TESTS" != "$1"
+}
+
# func_verify_module
# verifies a module name
# Input:
# - module module name argument
func_verify_module ()
{
- if { test -f "$gnulib_dir/modules/$module" \
- || { test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules" \
- && test -f "$local_gnulib_dir/modules/$module"; }; } \
- && test "CVS" != "$module" \
- && test "ChangeLog" != "$module" \
- && test "COPYING" != "$module" \
- && test "README" != "$module" \
- && test "TEMPLATE" != "$module" \
- && test "TEMPLATE-EXTENDED" != "$module" \
- && test "TEMPLATE-TESTS" != "$module"; then
+ if func_exists_module "$module"; then
# OK, $module is a correct module name.
# Verify that building the module description with 'patch' succeeds.
func_lookup_file "modules/$module"
:a
n
s/^Description:[ ]*$//
+ s/^Comment:[ ]*$//
s/^Status:[ ]*$//
s/^Notice:[ ]*$//
s/^Applicability:[ ]*$//
# NOTE: Keep this in sync with sed_extract_prog above!
sed_extract_field_header='
s/^Description:[ ]*$/description/
+ s/^Comment:[ ]*$/comment/
s/^Status:[ ]*$/status/
s/^Notice:[ ]*$/notice/
s/^Applicability:[ ]*$/applicability/
if $modcache; then
# Note: The 'eval' silences stderr output in dash.
- if declare -A x 2>/dev/null && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }; then
+ if (declare -A x && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }) 2>/dev/null; then
# Zsh 4 and Bash 4 have associative arrays.
have_associative=true
else
fi
}
+# func_get_comment module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_comment ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Comment$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_comment[$1]+set}"; then
+ echo "${modcache_comment[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_comment_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_comment\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
# func_get_status module
# Input:
# - local_gnulib_dir from --local-dir
# - modcache true or false, from --cache-modules/--no-cache-modules
func_get_dependencies ()
{
- # ${module}-tests always implicitly depends on ${module}.
+ # ${module}-tests implicitly depends on ${module}, if that module exists.
case "$1" in
*-tests)
fgd1="$1"
func_remove_suffix fgd1 '-tests'
- echo "$fgd1"
+ if func_exists_module "$fgd1"; then
+ echo "$fgd1"
+ fi
;;
esac
# Then the explicit dependencies listed in the module description.
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; \
- for f in $already_mentioned_files; do echo $f; done \
+ extra_files=`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
# - inctests true if tests should be included, blank otherwise
# - incobsolete true if obsolete modules among dependencies should be
# included, blank otherwise
+# - inc_cxx_tests true if C++ interoperability tests should be included,
+# blank otherwise
+# - inc_longrunning_tests true if long-runnings tests should be included,
+# blank otherwise
+# - inc_privileged_tests true if tests that require root privileges should be
+# included, blank otherwise
+# - inc_unportable_tests true if tests that fail on some platforms should be
+# included, blank otherwise
+# - inc_all_direct_tests true if all kinds of problematic unit tests among
+# the unit tests of the specified modules should be
+# included, blank otherwise
+# - inc_all_indirect_tests true if all kinds of problematic unit tests among
+# the unit tests of the dependencies should be
+# included, blank otherwise
+# - excl_cxx_tests true if C++ interoperability tests should be excluded,
+# blank otherwise
+# - excl_longrunning_tests true if long-runnings tests should be excluded,
+# blank otherwise
+# - excl_privileged_tests true if tests that require root privileges should be
+# excluded, blank otherwise
+# - excl_unportable_tests true if tests that fail on some platforms should be
+# excluded, blank otherwise
# - avoidlist list of modules to avoid
# - tmp pathname of a temporary directory
# Output:
handledmodules=
inmodules="$modules"
outmodules=
+ fmtc_inc_all_tests="$inc_all_direct_tests"
while test -n "$inmodules"; do
inmodules_this_round="$inmodules"
inmodules= # Accumulator, queue for next round
if test -n "$duplicated_deps"; then
func_warning "module $module has duplicated dependencies: "`echo $duplicated_deps`
fi
- 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
- func_append inmodules " $testsmodule"
+ deps="$deps $testsmodule"
fi
fi
+ for dep in $deps; do
+ # Determine whether to include the dependency or tests module.
+ inc=true
+ for word in `func_get_status $dep`; do
+ case "$word" in
+ obsolete)
+ test -n "$incobsolete" \
+ || inc=false
+ ;;
+ c++-test)
+ test -z "$excl_cxx_tests" \
+ || inc=false
+ test -n "$fmtc_inc_all_tests" || test -n "$inc_cxx_tests" \
+ || inc=false
+ ;;
+ longrunning-test)
+ test -z "$excl_longrunning_tests" \
+ || inc=false
+ test -n "$fmtc_inc_all_tests" || test -n "$inc_longrunning_tests" \
+ || inc=false
+ ;;
+ privileged-test)
+ test -z "$excl_privileged_tests" \
+ || inc=false
+ test -n "$fmtc_inc_all_tests" || test -n "$inc_privileged_tests" \
+ || inc=false
+ ;;
+ unportable-test)
+ test -z "$excl_unportable_tests" \
+ || inc=false
+ test -n "$fmtc_inc_all_tests" || test -n "$inc_unportable_tests" \
+ || inc=false
+ ;;
+ *-test)
+ test -n "$fmtc_inc_all_tests" \
+ || inc=false
+ ;;
+ esac
+ done
+ if $inc; then
+ func_append inmodules " $dep"
+ fi
+ done
fi
fi
done
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=`func_reset_sigpipe; echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
+ inmodules=`echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
+ fmtc_inc_all_tests="$inc_all_indirect_tests"
done
modules=`for m in $outmodules; do echo $m; done | LC_ALL=C sort -u`
rm -f "$tmp"/queued-modules
}
+# func_show_module_list
+# Input:
+# - specified_modules list of specified modules (one per line, sorted)
+# - modules complete list of modules (one per line, sorted)
+# - tmp pathname of a temporary directory
+func_show_module_list ()
+{
+ if case "$TERM" in
+ xterm*) test -t 1;;
+ *) false;;
+ esac; then
+ # Assume xterm compatible escape sequences.
+ bold_on=`printf '\x1b[1m'`
+ bold_off=`printf '\x1b[0m'`
+ else
+ bold_on=
+ bold_off=
+ fi
+ echo "Module list with included dependencies (indented):"
+ echo "$specified_modules" | sed -e '/^$/d' -e 's/$/| /' > "$tmp"/specified-modules
+ echo "$modules" | sed -e '/^$/d' \
+ | LC_ALL=C join -t '|' -a 2 "$tmp"/specified-modules - \
+ | sed -e 's/^\(.*\)|.*/|\1/' -e 's/^/ /' -e 's/^ |\(.*\)$/ '"${bold_on}"'\1'"${bold_off}"'/'
+}
+
# func_modules_add_dummy
# Input:
# - local_gnulib_dir from --local-dir
if test -n "$module"; then
{
func_get_automake_snippet "$module" |
+ LC_ALL=C \
sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \
-e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
-e "$sed_eliminate_LDFLAGS" \
done
if test -z "$makefile_name"; then
echo
- echo "AM_CPPFLAGS ="
+ if $for_test; then
+ echo "AM_CPPFLAGS = -DGNULIB_STRICT_CHECKING=1"
+ else
+ echo "AM_CPPFLAGS ="
+ fi
echo "AM_CFLAGS ="
fi
echo
echo "$files" | sed -n -e "s,^lib/,$sourcebase/,p"
}
-# func_emit_tests_Makefile_am
+# func_emit_tests_Makefile_am witness_macro
# emits the contents of tests makefile to standard output.
# Input:
# - local_gnulib_dir from --local-dir
# - uses_subdirs nonempty if object files in subdirs exist
func_emit_tests_Makefile_am ()
{
+ witness_macro="$1"
if test "$libtool" = true; then
libext=la
sed_eliminate_LDFLAGS="$sed_noop"
if test -n "$module"; then
{
func_get_automake_snippet "$module" |
+ LC_ALL=C \
sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \
-e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
-e "$sed_eliminate_LDFLAGS" \
} > "$tmp"/amsnippet
# Skip the contents if it's entirely empty.
if grep '[^ ]' "$tmp"/amsnippet > /dev/null ; then
- echo "## begin gnulib module $module"
- echo
- cat "$tmp"/amsnippet
- echo "## end gnulib module $module"
- echo
+ # Mention long-running tests at the end.
+ ofd=3
+ for word in `func_get_status "$module"`; do
+ if test "$word" = 'longrunning-test'; then
+ ofd=4
+ break
+ fi
+ done
+ { echo "## begin gnulib module $module"
+ echo
+ cat "$tmp"/amsnippet
+ echo "## end gnulib module $module"
+ echo
+ } >&$ofd
fi
rm -f "$tmp"/amsnippet
# Test whether there are some source files in subdirectories.
done
fi
done
- } > "$tmp"/allsnippets
+ } 3> "$tmp"/main_snippets 4> "$tmp"/longrunning_snippets
# 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).
# Nothing is being added to SUBDIRS; nevertheless the existence of this
# variable is needed to avoid an error from automake:
# "AM_GNU_GETTEXT used but SUBDIRS not defined"
- echo "SUBDIRS ="
+ echo "SUBDIRS = ."
echo "TESTS ="
echo "XFAIL_TESTS ="
echo "TESTS_ENVIRONMENT ="
fi
# Automake versions < 1.9b create an empty pkgdatadir at installation time
# if you specify pkgdata_DATA to empty. This is a workaround.
- if grep '^pkgdata_DATA *+=' "$tmp"/allsnippets > /dev/null; then
+ if grep '^pkgdata_DATA *+=' "$tmp"/main_snippets "$tmp"/longrunning_snippets > /dev/null; then
echo "pkgdata_DATA ="
fi
echo "EXTRA_DIST ="
done
echo
echo "AM_CPPFLAGS = \\"
+ if $for_test; then
+ echo " -DGNULIB_STRICT_CHECKING=1 \\"
+ fi
+ if test -n "${witness_macro}"; then
+ echo " -D@${witness_macro}@=1 \\"
+ fi
echo " -I. -I\$(srcdir) \\"
echo " -I${testsbase_inverse} -I\$(srcdir)/${testsbase_inverse} \\"
echo " -I${testsbase_inverse}/${sourcebase-lib} -I\$(srcdir)/${testsbase_inverse}/${sourcebase-lib}"
# srcdir is defined by autoconf and automake.
echo "TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' srcdir='\$(srcdir)'"
echo
- cat "$tmp"/allsnippets \
+ cat "$tmp"/main_snippets "$tmp"/longrunning_snippets \
| sed -e 's|\$(top_srcdir)/build-aux/|$(top_srcdir)/'"$auxdir"'/|g'
echo "# Clean up after Solaris cc."
echo "clean-local:"
echo " fi; \\"
echo " done; \\"
echo " :"
- rm -f "$tmp"/allsnippets
+ rm -f "$tmp"/main_snippets "$tmp"/longrunning_snippets
}
# func_emit_initmacro_start macro_prefix
# - 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
+# - inc_cxx_tests true if --with-c++-tests was given, blank otherwise
+# - inc_longrunning_tests true if --with-longrunning-tests was given, blank
+# otherwise
+# - inc_privileged_tests true if --with-privileged-tests was given, blank
+# otherwise
+# - inc_unportable_tests true if --with-unportable-tests was given, blank
+# otherwise
+# - inc_all_tests true if --with-all-tests 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
cached_local_gnulib_dir=
cached_specified_modules=
cached_incobsolete=
+ cached_inc_cxx_tests=
+ cached_inc_longrunning_tests=
+ cached_inc_privileged_tests=
+ cached_inc_unportable_tests=
+ cached_inc_all_tests=
cached_avoidlist=
cached_sourcebase=
cached_m4base=
/gl_WITH_OBSOLETE/ {
s,^.*$,cached_incobsolete=true,p
}
+ /gl_WITH_CXX_TESTS/ {
+ s,^.*$,cached_inc_cxx_tests=true,p
+ }
+ /gl_WITH_LONGRUNNING_TESTS/ {
+ s,^.*$,cached_inc_longrunning_tests=true,p
+ }
+ /gl_WITH_PRIVILEGED_TESTS/ {
+ s,^.*$,cached_inc_privileged_tests=true,p
+ }
+ /gl_WITH_UNPORTABLE_TESTS/ {
+ s,^.*$,cached_inc_unportable_tests=true,p
+ }
+ /gl_WITH_ALL_TESTS/ {
+ s,^.*$,cached_inc_all_tests=true,p
+ }
/gl_AVOID(/ {
s,^.*gl_AVOID([[ ]*\([^]"$`\\)]*\).*$,cached_avoidlist="\1",p
}
if test -z "$incobsolete"; then
incobsolete="$cached_incobsolete"
fi
+ # Included special kinds of tests modules among the dependencies if specified
+ # either way.
+ if test -z "$inc_cxx_tests"; then
+ inc_cxx_tests="$cached_inc_cxx_tests"
+ fi
+ if test -z "$inc_longrunning_tests"; then
+ inc_longrunning_tests="$cached_inc_longrunning_tests"
+ fi
+ if test -z "$inc_privileged_tests"; then
+ inc_privileged_tests="$cached_inc_privileged_tests"
+ fi
+ if test -z "$inc_unportable_tests"; then
+ inc_unportable_tests="$cached_inc_unportable_tests"
+ fi
+ if test -z "$inc_all_tests"; then
+ inc_all_tests="$cached_inc_all_tests"
+ fi
+ # --without-*-tests options are not supported here.
+ excl_cxx_tests=
+ excl_longrunning_tests=
+ excl_privileged_tests=
+ excl_unportable_tests=
# 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`
# Canonicalize the list of specified modules.
specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u`
+ # Include all kinds of tests modules if --with-all-tests was specified.
+ inc_all_direct_tests="$inc_all_tests"
+ inc_all_indirect_tests="$inc_all_tests"
+
# Determine final module list.
modules="$specified_modules"
func_modules_transitive_closure
if test $verbose -ge 0; then
- echo "Module list with included dependencies:"
- echo "$modules" | sed -e 's/^/ /'
+ func_show_module_list
fi
final_modules="$modules"
fi
# Determine tests-related module list.
echo "$final_modules" | LC_ALL=C sort -u > "$tmp"/final-modules
- testsrelated_modules=`func_reset_sigpipe
- for module in $main_modules; do
+ testsrelated_modules=`for module in $main_modules; do
if test \`func_get_applicability $module\` = main; then
echo $module
fi
if test -n "$incobsolete"; then
func_append actioncmd " --with-obsolete"
fi
+ if test -n "$inc_cxx_tests"; then
+ func_append actioncmd " --with-c++-tests"
+ fi
+ if test -n "$inc_longrunning_tests"; then
+ func_append actioncmd " --with-longrunning-tests"
+ fi
+ if test -n "$inc_privileged_tests"; then
+ func_append actioncmd " --with-privileged-tests"
+ fi
+ if test -n "$inc_unportable_tests"; then
+ func_append actioncmd " --with-unportable-tests"
+ fi
+ if test -n "$inc_all_tests"; then
+ func_append actioncmd " --with-all-tests"
+ fi
for module in $avoidlist; do
func_append actioncmd " --avoid=$module"
done
echo "$specified_modules" | sed -e 's/^/ /g'
echo "])"
test -z "$incobsolete" || echo "gl_WITH_OBSOLETE"
+ test -z "$inc_cxx_tests" || echo "gl_WITH_CXX_TESTS"
+ test -z "$inc_longrunning_tests" || echo "gl_WITH_LONGRUNNING_TESTS"
+ test -z "$inc_privileged_tests" || echo "gl_WITH_PRIVILEGED_TESTS"
+ test -z "$inc_unportable_tests" || echo "gl_WITH_UNPORTABLE_TESTS"
+ test -z "$inc_all_tests" || echo "gl_WITH_ALL_TESTS"
echo "gl_AVOID([$avoidlist])"
echo "gl_SOURCE_BASE([$sourcebase])"
echo "gl_M4_BASE([$m4base])"
for module in $final_modules; do
func_verify_module
if test -n "$module"; then
+ echo "# Code from module $module:"
func_get_autoconf_early_snippet "$module"
fi
done \
else
sed_replace_build_aux="$sed_noop"
fi
+ echo " gl_m4_base='$m4base'"
func_emit_initmacro_start $macro_prefix
echo " gl_source_base='$sourcebase'"
for module in $main_modules; do
func_verify_module
if test -n "$module"; then
+ echo " # Code from module $module:"
func_get_autoconf_snippet "$module" \
| sed -e '/^$/d;' -e 's/^/ /' \
-e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac./' \
fi
fi
done
+ echo " # End of code from modules"
func_emit_initmacro_end $macro_prefix
echo " gltests_libdeps="
echo " gltests_ltlibdeps="
func_emit_initmacro_start ${macro_prefix}tests
echo " gl_source_base='$testsbase'"
+ # Define a tests witness macro that depends on the package.
+ # PACKAGE is defined by AM_INIT_AUTOMAKE, PACKAGE_TARNAME is defined by AC_INIT.
+ # See <http://lists.gnu.org/archive/html/automake/2009-05/msg00145.html>.
+ echo "changequote(,)dnl"
+ echo " ${macro_prefix}tests_WITNESS=IN_\`echo \"\${PACKAGE-\$PACKAGE_TARNAME}\" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'\`_GNULIB_TESTS"
+ echo "changequote([, ])dnl"
+ echo " AC_SUBST([${macro_prefix}tests_WITNESS])"
+ echo " gl_module_indicator_condition=\$${macro_prefix}tests_WITNESS"
+ echo " m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [\$gl_module_indicator_condition])"
for module in $testsrelated_modules; do
func_verify_module
if test -n "$module"; then
-e 's/gl_ltlibdeps/gltests_ltlibdeps/g'
fi
done
+ echo " m4_popdef([gl_MODULE_INDICATOR_CONDITION])"
func_emit_initmacro_end ${macro_prefix}tests
# _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
# created using libtool, because libtool already handles the dependencies.
func_dest_tmpfilename $testsbase/$makefile_am
destfile="$testsbase/$makefile_am"
modules="$testsrelated_modules"
- func_emit_tests_Makefile_am > "$tmpfile"
+ func_emit_tests_Makefile_am "${macro_prefix}tests_WITNESS" > "$tmpfile"
if test -f "$destdir"/$testsbase/$makefile_am; then
if cmp "$destdir"/$testsbase/$makefile_am "$tmpfile" > /dev/null; then
rm -f "$tmpfile"
if test -f "$destdir/$dir$ignore"; then
if test -n "$dir_added" || test -n "$dir_removed"; then
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 \
+ (echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u \
| LC_ALL=C join -v 1 - "$tmp"/ignore > "$tmp"/ignore-added
echo "$dir_removed" | sed -e '/^$/d' | LC_ALL=C sort -u \
| LC_ALL=C join -v 1 - "$tmp"/ignore > "$tmp"/ignore-removed
# - local_gnulib_dir from --local-dir
# - modcache true or false, from --cache-modules/--no-cache-modules
# - auxdir directory relative to destdir where to place build aux files
+# - inctests true if tests should be included, blank otherwise
+# - incobsolete true if obsolete modules among dependencies should be
+# included, blank otherwise
+# - excl_cxx_tests true if C++ interoperability tests should be excluded,
+# blank otherwise
+# - excl_longrunning_tests true if long-runnings tests should be excluded,
+# blank otherwise
+# - excl_privileged_tests true if tests that require root privileges should be
+# excluded, blank otherwise
+# - excl_unportable_tests true if tests that fail on some platforms should be
+# excluded, blank otherwise
+# - avoidlist list of modules to avoid
+# - libtool true if --libtool was given, false if --no-libtool was
+# given, blank otherwise
+# - symbolic true if files should be symlinked, copied otherwise
+# - lsymbolic true if files from local_gnulib_dir should be symlinked,
+# copied otherwise
func_create_testdir ()
{
testdir="$1"
# All modules together.
# Except config-h, which breaks all modules which use HAVE_CONFIG_H.
# Except ftruncate, mountlist, which abort the configuration on mingw. FIXME.
+ # Except lib-ignore, which leads to link errors when Sun C++ is used. FIXME.
modules=`func_all_modules`
- modules=`for m in $modules; do case $m in config-h | ftruncate | mountlist) ;; *) echo $m;; esac; done`
+ modules=`for m in $modules; do case $m in config-h | ftruncate | mountlist | lib-ignore) ;; *) echo $m;; esac; done`
fi
- modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u`
+ specified_modules="$modules"
+
+ # Canonicalize the list of specified modules.
+ specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u`
+
+ # Unlike in func_import, here we want to include all kinds of tests for the
+ # directly specified modules, but not for dependencies.
+ inc_all_direct_tests=true
+ inc_all_indirect_tests="$inc_all_tests"
# Check that the license of every module is consistent with the license of
# its dependencies.
- saved_modules="$modules"
saved_inctests="$inctests"
# When computing transitive closures, don't consider $module to depend on
# $module-tests. Need this becauses tests are implicitly GPL and may depend
# on GPL modules - therefore we don't want a warning in this case.
inctests=""
- for requested_module in $saved_modules; do
+ for requested_module in $specified_modules; do
requested_license=`func_get_license "$requested_module"`
if test "$requested_license" != GPL; then
# Here we use func_modules_transitive_closure, not just
done
fi
done
- modules="$saved_modules"
inctests="$saved_inctests"
# Subdirectory names.
vc_files=
# Determine final module list.
+ modules="$specified_modules"
func_modules_transitive_closure
if test $verbose -ge 0; then
- echo "Module list with included dependencies:"
- echo "$modules" | sed -e 's/^/ /'
+ func_show_module_list
fi
# Add the dummy module if needed.
# Create $testsbase/Makefile.am.
use_libtests=false
destfile="$testsbase/Makefile.am"
- func_emit_tests_Makefile_am > "$testdir/$testsbase/Makefile.am"
+ func_emit_tests_Makefile_am "" > "$testdir/$testsbase/Makefile.am"
any_uses_subdirs="$any_uses_subdirs$uses_subdirs"
# Create $testsbase/configure.ac.
(echo "# Process this file with autoconf to produce a configure script."
done \
| sed -e '/^$/d;' -e 's/AC_REQUIRE(\[\([^()]*\)\])/\1/'
if test "$libtool" = true; then
+ echo "LT_INIT([win32-dll])"
+ echo "LT_LANG([C++])"
echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
echo "gl_cond_libtool=true"
else
s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:'"$auxdir"'/\2)|
ba
}'
+ echo "gl_m4_base='../$m4base'"
func_emit_initmacro_start $macro_prefix
# We don't have explicit ordering constraints between the various
# autoconf snippets. It's cleanest to put those of the library before
done \
| sed -e '/^$/d;' -e 's/AC_REQUIRE(\[\([^()]*\)\])/\1/'
if test "$libtool" = true; then
+ echo "LT_INIT([win32-dll])"
+ echo "LT_LANG([C++])"
echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
echo "gl_cond_libtool=true"
else
else
sed_replace_build_aux="$sed_noop"
fi
+ echo "gl_m4_base='$m4base'"
func_emit_initmacro_start $macro_prefix
echo "gl_source_base='$sourcebase'"
for module in $modules; do
fi
done
fi
+ if test "$libtool" = true; then
+ func_execute_command ${LIBTOOLIZE} --copy || func_exit 1
+ fi
func_execute_command ${ACLOCAL} -I $m4base || func_exit 1
if ! test -d build-aux; then
func_execute_command mkdir build-aux || func_exit 1
fi
# Need to run configure and make once, to create built files that are to be
# distributed (such as getdate.c).
+ sed_remove_make_variables='s,[$]([A-Za-z0-9_]*),,g'
# Extract the value of "CLEANFILES += ..." and "MOSTLYCLEANFILES += ...".
cleaned_files=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \
| sed -n -e 's,^CLEANFILES[ ]*+=\([^#]*\).*$,\1,p' -e 's,^MOSTLYCLEANFILES[ ]*+=\([^#]*\).*$,\1,p'`
cleaned_files=`for file in $cleaned_files; do echo " $file "; done`
# Extract the value of "BUILT_SOURCES += ...". Remove variable references
# such $(FOO_H) because they don't refer to distributed files.
- sed_remove_make_variables='s,[$]([A-Za-z0-9_]*),,g'
built_sources=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \
| sed -n -e 's,^BUILT_SOURCES[ ]*+=\([^#]*\).*$,\1,p' \
| sed -e "$sed_remove_make_variables"`
*) echo $file ;;
esac;
done`
- if test -n "$distributed_built_sources"; then
+ tests_distributed_built_sources=
+ if test -n "$inctests"; then
+ # Likewise for built files in the $testsbase directory.
+ tests_cleaned_files=`sed -e "$sed_remove_backslash_newline" < "$testdir/$testsbase/Makefile.am" \
+ | sed -n -e 's,^CLEANFILES[ ]*+=\([^#]*\).*$,\1,p' -e 's,^MOSTLYCLEANFILES[ ]*+=\([^#]*\).*$,\1,p'`
+ tests_cleaned_files=`for file in $tests_cleaned_files; do echo " $file "; done`
+ tests_built_sources=`sed -e "$sed_remove_backslash_newline" < "$testdir/$testsbase/Makefile.am" \
+ | sed -n -e 's,^BUILT_SOURCES[ ]*+=\([^#]*\).*$,\1,p' \
+ | sed -e "$sed_remove_make_variables"`
+ tests_distributed_built_sources=`for file in $tests_built_sources; do
+ case "$tests_cleaned_files" in
+ *" "$file" "*) ;;
+ *) echo $file ;;
+ esac;
+ done`
+ fi
+ if test -n "$distributed_built_sources" || test -n "$tests_distributed_built_sources"; then
(cd "$testdir"
./configure || func_exit 1
- cd "$sourcebase"
- echo 'built_sources: $(BUILT_SOURCES)' >> Makefile
- $MAKE built_sources || func_exit 1
- cd ..
- $MAKE distclean || func_exit 1
+ if test -n "$distributed_built_sources"; then
+ cd "$sourcebase"
+ echo 'built_sources: $(BUILT_SOURCES)' >> Makefile
+ $MAKE AUTOCONF="${AUTOCONF}" AUTOHEADER="${AUTOHEADER}" ACLOCAL="${ACLOCAL}" AUTOMAKE="${AUTOMAKE}" AUTORECONF="${AUTORECONF}" AUTOPOINT="${AUTOPOINT}" LIBTOOLIZE="${LIBTOOLIZE}" \
+ built_sources \
+ || func_exit 1
+ cd ..
+ fi
+ if test -n "$tests_distributed_built_sources"; then
+ cd "$testsbase"
+ echo 'built_sources: $(BUILT_SOURCES)' >> Makefile
+ $MAKE AUTOCONF="${AUTOCONF}" AUTOHEADER="${AUTOHEADER}" ACLOCAL="${ACLOCAL}" AUTOMAKE="${AUTOMAKE}" AUTORECONF="${AUTORECONF}" AUTOPOINT="${AUTOPOINT}" LIBTOOLIZE="${LIBTOOLIZE}" \
+ built_sources \
+ || func_exit 1
+ cd ..
+ fi
+ $MAKE AUTOCONF="${AUTOCONF}" AUTOHEADER="${AUTOHEADER}" ACLOCAL="${ACLOCAL}" AUTOMAKE="${AUTOMAKE}" AUTORECONF="${AUTORECONF}" AUTOPOINT="${AUTOPOINT}" LIBTOOLIZE="${LIBTOOLIZE}" \
+ distclean \
+ || func_exit 1
) || func_exit 1
fi
}
for m4base in $m4dirs; do
# Perform func_import in a subshell, so that variable values
# such as
- # local_gnulib_dir, incobsolete, avoidlist, sourcebase, m4base,
- # pobase, docbase, testsbase, inctests, libname, lgpl,
+ # local_gnulib_dir, incobsolete, inc_cxx_tests,
+ # inc_longrunning_tests, inc_privileged_tests,
+ # inc_unportable_tests, inc_all_tests, 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
;;
+ extract-comment )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_comment "$module"
+ fi
+ done
+ ;;
+
extract-status )
for module
do