Re: testsuite: distributed depending on non-distributed
Eric Blake <[email protected]>
| Newsgroups | gmane.comp.gnu.m4.patches |
|---|---|
| Message-ID | <[email protected]> |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 According to Eric Blake on 9/12/2006 6:56 AM: > > Thanks for the report. Both of these are a PATH issue. The testsuite > currently expects to execute tests/m4 (built from tests/m4.in), which > invokes the real m4 with -M modules (so it can find modtest), and > which normalizes stderr. But on installcheck, we are altering PATH to > pick up the installed m4, and bypassing the wrapper. I was not seeing > the failures because I was skipping too many tests (I ran with > TESTSUITEFLAGS=1, instead of TESTSUITEFLAGS='-59 61-'). Perhaps the > thing to do here would be renaming tests/m4 to tests/m4wrap, altering > AT_CHECK_M4 to call tests/m4wrap, and then having the wrapper script > pick up the correct m4 from the PATH. Or maybe follow autoconf's lead > and do all m4 output normalization inside testsuite.at. Also, since > modtest is not installed, but currently lives in the same build > directory as other modules that do get installed, that makes it hard > to tell if installcheck is testing the installed module or the built > one. Maybe it is worth splitting built modules into two directories, > based on whether they will be installed. > > I'll have to play with this some, but hope to have a patch soon. Here we go. The tests/m4 wrapper is still useful, and is similar to the wrappers in autoconf/tests, so I kept it, with modifications. I moved the stderr filtering out of the tests/m4 wrapper into the testsuite (so that installed m4 also gets filtered), updated the Makefile to build uninstalled modules directly into tests (so that '-M tests' now picks up only the test modules, and we can blindly use that instead of '-M modules' which would also pick up uninstalled libraries and hide a broken installation), and fixed a couple of shell portability bugs in the process. 2006-09-13 Eric Blake <[email protected]> Fix installcheck. * Makefile.am (check_LTLIBRARIES): Build test libraries in the tests directory, so we can be sure an installed build is not picking up uninstalled non-test libraries. (check-local, installcheck-local): Depend on test libraries. * tests/modules.at (AT_CHECK_M4_MODTEST): Don't use options after file name. Fix quoting. Remove skipping the test, now that makefile guarantees test modules will exist. (Freezing modules, modules: shadow, modules: unload) (modules: trace): Always put test modules in module path. (modules: importing): Likewise, and rely on AT_CHECK_M4 for stderr munging. * src/main.c (usage): Document default module search path. (import_environment, frozen_file_to_read, frozen_file_to_write): Move... (main): ...here. * tests/testsuite.at (AT_CHECK_M4): Filter stderr here... * tests/m4.in: ...not here. Reported by Ralf Wildenhues. - -- Life is short - so eat dessert first! Eric Blake [email protected] -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.1 (Cygwin) Comment: Public key at home.comcast.net/~ericblake/eblake.gpg Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFFCKQA84KuGfSFAYARAl7eAJ9amDqQR3tYAU6QxKnYFJDuWelxpwCeKr+W P51UiJxhdxVQkPk8P2bS1tY= =qBHX -----END PGP SIGNATURE----- _______________________________________________ M4-patches mailing list [email protected] http://lists.gnu.org/mailman/listinfo/m4-patches
m4.patch155
(text/plain, 12.2 KB)
Index: Makefile.am =================================================================== RCS file: /sources/m4/m4/Makefile.am,v retrieving revision 1.45 diff -u -p -r1.45 Makefile.am --- Makefile.am 8 Sep 2006 15:47:13 -0000 1.45 +++ Makefile.am 14 Sep 2006 00:35:16 -0000 @@ -177,26 +177,31 @@ EXTRA_DIST += modules/perl.c module_check = -rpath /dev/null check_LTLIBRARIES = \ - modules/import.la \ - modules/modtest.la \ - modules/shadow.la \ - modules/stdlib.la \ - modules/time.la - -modules_import_la_LDFLAGS = $(module_ldflags) $(module_check) -modules_import_la_LIBADD = $(module_libadd) - -modules_modtest_la_LDFLAGS = $(module_ldflags) $(module_check) -modules_modtest_la_LIBADD = $(module_libadd) - -modules_shadow_la_LDFLAGS = $(module_ldflags) $(module_check) -modules_shadow_la_LIBADD = $(module_libadd) - -modules_stdlib_la_LDFLAGS = $(module_ldflags) $(module_check) -modules_stdlib_la_LIBADD = $(module_libadd) - -modules_time_la_LDFLAGS = $(module_ldflags) $(module_check) -modules_time_la_LIBADD = $(module_libadd) + tests/import.la \ + tests/modtest.la \ + tests/shadow.la \ + tests/stdlib.la \ + tests/time.la + +tests_import_la_LDFLAGS = $(module_ldflags) $(module_check) +tests_import_la_LIBADD = $(module_libadd) +tests_import_la_SOURCES = modules/import.c + +tests_modtest_la_LDFLAGS = $(module_ldflags) $(module_check) +tests_modtest_la_LIBADD = $(module_libadd) +tests_modtest_la_SOURCES = modules/modtest.c + +tests_shadow_la_LDFLAGS = $(module_ldflags) $(module_check) +tests_shadow_la_LIBADD = $(module_libadd) +tests_shadow_la_SOURCES = modules/shadow.c + +tests_stdlib_la_LDFLAGS = $(module_ldflags) $(module_check) +tests_stdlib_la_LIBADD = $(module_libadd) +tests_stdlib_la_SOURCES = modules/stdlib.c + +tests_time_la_LDFLAGS = $(module_ldflags) $(module_check) +tests_time_la_LIBADD = $(module_libadd) +tests_time_la_SOURCES = modules/time.c EXTRA_DIST += \ modules/modtest.m4 \ @@ -414,13 +419,13 @@ DISTCLEANFILES += tests/atconfig CD_TESTDIR = cd ./tests # Hook the test suite into the check rule -check-local: tests/atconfig tests/m4 $(TESTSUITE) +check-local: tests/atconfig tests/m4 $(TESTSUITE) $(check_LTLIBRARIES) $(CD_TESTDIR); \ $(SHELL) '$(abs_srcdir)/tests/testsuite' $(TESTS_ENVIRONMENT) \ $(TESTSUITEFLAGS) # Run the test suite on the *installed* tree. -installcheck-local: tests/atconfig $(TESTSUITE) +installcheck-local: tests/atconfig $(TESTSUITE) $(check_LTLIBRARIES) $(CD_TESTDIR); \ $(SHELL) '$(abs_srcdir)/tests/testsuite' $(TESTS_ENVIRONMENT) \ AUTOTEST_PATH="$(bindir)" $(TESTSUITEFLAGS) Index: tests/m4.in =================================================================== RCS file: /sources/m4/m4/tests/m4.in,v retrieving revision 1.7 diff -u -p -r1.7 m4.in --- tests/m4.in 5 Sep 2006 23:16:40 -0000 1.7 +++ tests/m4.in 14 Sep 2006 00:35:16 -0000 @@ -23,22 +23,19 @@ # # Written by Gary V. Vaughan <[email protected]> -"@abs_top_builddir@/src/m4" \ - --module-directory="@abs_top_builddir@/modules" \ - ${1+"$@"} 2>/tmp/m4-$$ -status=$? -# Normalize stderr. -# - If configure --disable-shared, then src/m4 is a real program, -# neutralize the full path display -# - otherwise, it is a libtool wrapper, relying on PATH to execute the -# actual program, either lt-m4, or m4. -# -# - In both cases, beware of .exe. -# - Also, when tracing modules, lines of the form -# m4debug: module m4: opening file `m4.a' -# must be reduced, since module names are platform dependent. -sed -e 's,^[^:]*[lt-]*m4[.ex]*:,m4:,' \ - -e '/^m4debug: module/s/opening file.*/opening file/' /tmp/m4-$$ >&2 -rm /tmp/m4-$$ +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi -exit $status +exec "@abs_top_builddir@/src/m4" \ + --module-directory="@abs_top_builddir@/modules" \ + ${1+"$@"} +exit 1 Index: tests/modules.at =================================================================== RCS file: /sources/m4/m4/tests/modules.at,v retrieving revision 1.20 diff -u -p -r1.20 modules.at --- tests/modules.at 5 Sep 2006 16:58:02 -0000 1.20 +++ tests/modules.at 14 Sep 2006 00:35:16 -0000 @@ -50,19 +50,19 @@ test3 # First generate the `expout' ouput by running over the sources before # freezing. -AT_CHECK_M4([-m load frozen.m4 unfrozen.m4], 0, - [stdout], [stderr]) +AT_CHECK_M4([-M "$abs_builddir" -m load frozen.m4 unfrozen.m4], + [0], [stdout], [stderr]) mv stdout expout mv stderr experr # Now freeze the first source file. -AT_CHECK_M4([-m load -F frozen.m4f frozen.m4], 0, - [ignore], [ignore]) +AT_CHECK_M4([-M "$abs_builddir" -m load -F frozen.m4f frozen.m4], + [0], [], [ignore]) # Now rerun the original sequence, but using the frozen file. -AT_CHECK_M4([-R frozen.m4f unfrozen.m4], 0, - [expout], [experr]) +AT_CHECK_M4([-M "$abs_builddir" -R frozen.m4f unfrozen.m4], + [0], [expout], [experr]) AT_CLEANUP([frozen.m4f]) @@ -74,13 +74,12 @@ AT_CLEANUP([frozen.m4f]) # AT_CHECK_M4_MODTEST(TITLE, ENV-VARS, M4-OPTIONS) # ------------------------------------------------ -# Skip if modtest is not present (we are not in the package). +# Add a test named TITLE, running m4 with either ENV-VARS in the environment +# or M4-OPTIONS set to pick up test modules. m4_define([AT_CHECK_M4_MODTEST], [AT_SETUP([$1]) AT_CHECK_DYNAMIC_MODULE -AT_CHECK([test -f "$abs_top_builddir/modules/modtest.la" || exit 77]) - AT_DATA([input.m4], [[load(`modtest') test @@ -90,7 +89,7 @@ test Dumpdef: dumpdef(`test'). ]]) -AT_CHECK([$2 m4 -m load -d input.m4 $3], 0, +AT_CHECK([$2 m4 -m load -d $3 input.m4], [0], [[ Test module called. Dumpdef: . @@ -110,22 +109,22 @@ AT_CLEANUP AT_CHECK_M4_MODTEST([--module-directory: absolute path], - [], [-M $top_buildpath/modules]) + [], [-M "$abs_builddir"]) AT_CHECK_M4_MODTEST([--module-directory: relative path], - [], [-M $top_builddir/modules]) + [], [-M "$top_build_prefix/tests"]) AT_CHECK_M4_MODTEST([M4MODPATH: absolute path], - [M4MODPATH=$top_buildpath/modules], []) + [M4MODPATH="$abs_builddir"], []) AT_CHECK_M4_MODTEST([M4MODPATH: relative path], - [M4MODPATH=$top_builddir/modules], []) + [M4MODPATH="$top_build_prefix/tests"], []) AT_CHECK_M4_MODTEST([LTDL_LIBRARY_PATH: absolute path], - [LTDL_LIBRARY_PATH=$top_buildpath/modules], []) + [LTDL_LIBRARY_PATH="$abs_builddir"], []) AT_CHECK_M4_MODTEST([LTDL_LIBRARY_PATH: relative path], - [LTDL_LIBRARY_PATH=$top_builddir/modules], []) + [LTDL_LIBRARY_PATH="$top_build_prefix/tests"], []) @@ -264,8 +263,8 @@ test: <test> shadow: <shadow> ]]) -AT_CHECK_M4([-m load input.m4], 0, - [expout], [experr]) +AT_CHECK_M4([-M "$abs_builddir" -m load input.m4], [0], + [expout], [experr]) AT_CLEANUP @@ -332,7 +331,8 @@ Test module unloaded. ]]) -AT_CHECK_M4([-m load input.m4], 0, expout, experr) +AT_CHECK_M4([-M "$abs_builddir" -m load input.m4], + [0], [expout], [experr]) AT_CLEANUP @@ -380,22 +380,11 @@ Test module loaded. TRUE m4:input.m4:6: cannot load symbol `no_such' from module `modtest' -m4:input.m4:7: cannot open module `no_such': no_such.so: cannot open shared object file: No such file or directory +m4:input.m4:7: cannot open module `no_such' ]]) -AT_CHECK_M4([-m load input.m4], 1, expout, stderr) - -# The expected stderr from the m4 invocation above becomes the expected -# stdout of the following sed invocation to canonicalize the strerror message. -# Note that the choice of file name affects the behaviour of AT_CHECK, so -# we retain experr above for consistency with the rest of the testsuite, but -# rename it here to make it play nicely with AT_CHECK: -rm -f expout -mv experr expout - -AT_CHECK([sed '/^m4:input.m4:7:/ { - s,\(7:[[^:]]*:\).*$,\1 no_such.so: cannot open shared object file: No such file or directory,;q; }' stderr], 0, expout) - +AT_CHECK_M4([-M "$abs_builddir" -m load input.m4], + [1], [expout], [experr]) AT_CLEANUP @@ -437,6 +426,7 @@ m4trace: -1- test -> `Shadow::`test' cal ]]) -AT_CHECK_M4([-m load -t test input.m4], 0, expout, experr) +AT_CHECK_M4([-M "$abs_builddir" -m load -t test input.m4], + [0], [expout], [experr]) AT_CLEANUP Index: tests/testsuite.at =================================================================== RCS file: /sources/m4/m4/tests/testsuite.at,v retrieving revision 1.21 diff -u -p -r1.21 testsuite.at --- tests/testsuite.at 5 Sep 2006 16:58:02 -0000 1.21 +++ tests/testsuite.at 14 Sep 2006 00:35:16 -0000 @@ -24,9 +24,32 @@ m4_version_prereq([2.52e]) # AT_CHECK_M4(ARGS, [EXIT-STATUS = 0], [STDOUT = `'], [STDERR = `']) # ------------------------------------------------------------------ # Run m4 with ARGS, and stdin redirected from /dev/null. Expect EXIT-STATUS, -# with output matching STDOUT and STDERR as in AT_CHECK. +# with output matching STDOUT and STDERR as in AT_CHECK. If stderr is +# specified, normalize the observed error output. +# +# When testing an uninstalled wrapper, tests/m4 is on the path, but invokes +# src/m4, which may itself be a libtool wrapper. Also, some platforms +# choose to display argv[0] differently: +# path/to/lt-m4:file:line: message +# or m4.exe:file:line: message +# to m4:file:line +# +# When tracing modules, the module name is platform-dependent: +# m4debug: module gnu: opening file `gnu.so' +# or m4debug: module gnu: opening file `gnu.a' +# to m4debug: module gnu: opening file +# +# When testing modules, a failed module name is platform-dependent: +# m4:input.m4:7: cannot open module `no_such': no_such.so: cannot open shared object file: No such file or directory +# or m4:input.m4:7: cannot open module `no_such': can't open the module +# to m4:input.m4:7: cannot open module `no_such' m4_define([AT_CHECK_M4], -[AT_CHECK([m4 -b -d $1 < /dev/null], [$2], [$3], [$4]) +[AT_CHECK([m4 -b -d $1 < /dev/null], [$2], [$3], m4_ifval([$4], [stderr])) +m4_ifval([$4], +[AT_CHECK([[sed 's/^[^:]*[lt-]*m4[.ex]*:/m4:/ + /^m4debug: module/s/opening file.*/opening file/ + s/\(cannot open module [^:]*\):.*/\1/ + ' stderr >&2]], [0], [], [$4])]) ]) # AT_TEST_M4(TITLE, INPUT, [STDOUT = `'], [STDERR = `']) Index: src/main.c =================================================================== RCS file: /sources/m4/m4/src/main.c,v retrieving revision 1.80 diff -u -p -r1.80 main.c --- src/main.c 7 Sep 2006 23:53:04 -0000 1.80 +++ src/main.c 14 Sep 2006 00:35:16 -0000 @@ -24,21 +24,12 @@ #include "getopt.h" #include "version-etc.h" #include "gnu/progname.h" +#include "pathconf.h" #include <limits.h> #define AUTHORS _("Rene' Seindal"), "Gary V. Vaughan" - -/* Name of frozen file to digest after initialization. */ -const char *frozen_file_to_read = NULL; - -/* Name of frozen file to produce near completion. */ -const char *frozen_file_to_write = NULL; - -/* If nonzero, import the environment as macros. */ -static bool import_environment = false; - typedef struct macro_definition { struct macro_definition *next; @@ -105,9 +96,10 @@ SPEC is any one of:\n\ printf (_("\ \n\ Dynamic loading features:\n\ - -M, --module-directory=DIR add DIR to the module search path\n\ - -m, --load-module=MODULE load dynamic MODULE from %s\n\ -"), USER_MODULE_PATH_ENV); + -M, --module-directory=DIR add DIR to module search path before\n\ + `%s'\n\ + -m, --load-module=MODULE load dynamic MODULE\n\ +"), MODULE_PATH); fputs (_("\ \n\ Preprocessor features:\n\ @@ -237,12 +229,15 @@ main (int argc, char *const *argv, char FILE *fp; char *filename; bool read_stdin = false; /* true iff we have read from stdin */ + bool import_environment = false; /* true to import environment */ + const char *frozen_file_to_read = NULL; + const char *frozen_file_to_write = NULL; m4 *context; int exit_status; - /* Initialise gnulib error module. */ + /* Initialize gnulib error module. */ set_program_name (argv[0]); setlocale (LC_ALL, "");