From 3dee480d80bab18f527c483c73523edc53a58e9c Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Mon, 21 May 2012 22:23:56 +0200 Subject: [PATCH] [ng] serial-tests: simplify automake-time preprocessing Prefer make-time and recipe-time processing instead. Note that this change does not (nor is meant to) offer any simplification nor performance enhancement (in fact, it actually complicates the code); its purpose is to continue the trend of "move logic and knowledge out of the automake script and into the generated Makefiles". * NG-NEWS: Report that $(TESTS) and $(XFAIL_TESTS) are not rewritten anymore for $(EXEEXT) appending. * automake.in (handle_tests): Don't rewrite TESTS nor XFAIL_TESTS anymore. * lib/am/check.am: If 'EXEEXT' AC_SUBST is used, process $(TESTS) and $(XFAIL_TESTS) for $(EXEEXT) appending (for entries that are also compiled programs). Do so with the help of ... (am__check_cook_with_exeext_1, am__check_cook_with_exeext): ... this new internal make functions, and place the processed content into (am__cooked_tests, am__cooked_xfail_tests): ... these new internal variables respectively. (check-TESTS): Depend on and use $(am__cooked_tests) rather than plain $(TESTS). While we are at it, remove some code duplication with the help of the new 'is_xfail_test' shell function. * t/check5.sh: Adjust and extend. * t/check7.sh: Likewise. * t/serial-tests.sh: Adjust. * t/exeext4.sh: Adjust. Signed-off-by: Stefano Lattarini --- NG-NEWS | 8 ++++++++ automake.in | 6 +----- lib/am/check.am | 44 +++++++++++++++++++++++++++------------- t/check5.sh | 26 +++++++++++++++--------- t/check7.sh | 51 +++++++++++++++++++++++++++++++++++++++-------- t/exeext4.sh | 6 +++--- t/serial-tests.sh | 2 +- 7 files changed, 103 insertions(+), 40 deletions(-) diff --git a/NG-NEWS b/NG-NEWS index 2fbc0e4c2..74b0721ac 100644 --- a/NG-NEWS +++ b/NG-NEWS @@ -59,6 +59,14 @@ Warnings and diagnostic * The 'portability-recursive' warning category is obsolete, and has been removed. +Serial testsuite harness (obsolescent) +====================================== + +* The $(TESTS) and $(XFAIL_TESTS) variables are not anymore rewritten for + $(EXEEXT) appending. The use of compiled programs in $(TESTS) and + $(XFAIL_TESTS) still works as before though, even on systems where + $(EXEEXT) is non-empty. + Parallel testsuite harness ========================== diff --git a/automake.in b/automake.in index 201973484..6b4954382 100644 --- a/automake.in +++ b/automake.in @@ -4637,11 +4637,7 @@ sub handle_tests CHECK_DEPS => "@check"); if (option 'serial-tests') { - # Tests that are known programs should have $(EXEEXT) appended. - # For matching purposes, we need to adjust XFAIL_TESTS as well. - append_exeext { exists $known_programs{$_[0]} } 'TESTS'; - append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS' - if (var ('XFAIL_TESTS')); + 1; # Nothing to do, for now. } else { diff --git a/lib/am/check.am b/lib/am/check.am index 45bc61567..782fdd6ca 100644 --- a/lib/am/check.am +++ b/lib/am/check.am @@ -371,11 +371,33 @@ else %?SERIAL_TESTS% ## Obsolescent serial testsuite driver. -check-TESTS: $(TESTS) +if %?HANDLE-EXEEXT% +## This is suboptimal, but we need to preserve the order of $(TESTS). +am__check_cook_with_exeext_1 = \ + $(if $(filter $(am__all_progs), $1), $1$(EXEEXT), $1) +am__check_cook_with_exeext = $(strip \ + $(if $(EXEEXT), $(foreach am__t, $1, $(call $(0)_1, $(am__t))), $1)) +else !%?HANDLE-EXEEXT% +am__check_cook_with_exeext = $(strip $1) +endif !%?HANDLE-EXEEXT% + +# TESTS can contain compiled programs, in which case we might have +# to account for $(EXEEXT) appending. For matching purposes, we +# need to adjust XFAIL_TESTS as well. +am__cooked_tests = $(call am__check_cook_with_exeext, $(TESTS)) +am__cooked_xfail_tests = $(call am__check_cook_with_exeext, $(XFAIL_TESTS)) + +check-TESTS: $(am__cooked_tests) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ - list='$(TESTS)'; \ + list='$(am__cooked_tests)'; \ $(am__tty_colors); \ + is_xfail_test () { \ + case " $(strip $(am__cooked_xfail_tests)) " in \ + *" $$tst "*) return 0;; \ + *) return 1;; \ + esac; \ + }; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ @@ -383,29 +405,23 @@ check-TESTS: $(TESTS) if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ ## Success all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ + if is_xfail_test; then \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ - ;; \ - *) \ + else \ col=$$grn; res=PASS; \ - ;; \ - esac; \ + fi; \ elif test $$? -ne 77; then \ ## Failure all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ + if is_xfail_test; then \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ - ;; \ - *) \ + else \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ - ;; \ - esac; \ + fi; \ else \ ## Skipped skip=`expr $$skip + 1`; \ diff --git a/t/check5.sh b/t/check5.sh index 56504283d..2e5e792f2 100755 --- a/t/check5.sh +++ b/t/check5.sh @@ -32,9 +32,15 @@ check-local: test -f one$(EXEEXT) test -f two$(EXEEXT) touch ok -.PHONY: print-tests -print-tests: - echo BEG: $(TESTS) :END +prepare-for-fake-exeext: + rm -f ok + mv -f one$(EXEEXT) one.bin + mv -f two$(EXEEXT) two.bin +post-check-for-fake-exeext: + test -f ok + test ! -f one$(EXEEXT) + test ! -f two$(EXEEXT) +.PHONY: prepare-for-fake-exeext post-check-for-fake-exeext END $ACLOCAL @@ -50,13 +56,15 @@ END cp one.c two.c ./configure + $MAKE check test -f ok -$MAKE EXEEXT=.bin print-tests >stdout || { cat stdout; Exit 1; } -cat stdout -$FGREP 'BEG: one.bin two.bin :END' stdout -# No am__EXEEXT_* variable is needed. -grep '_EXEEXT_[1-9]' Makefile.in && Exit 1 -$FGREP 'TESTS = $(check_PROGRAMS)' Makefile.in + +$MAKE prepare-for-fake-exeext +$MAKE check EXEEXT=.bin +$MAKE post-check-for-fake-exeext + +# No TESTS rewriting has taken place. +grep '^TESTS = \$(check_PROGRAMS)$' Makefile.in : diff --git a/t/check7.sh b/t/check7.sh index 5e4cafb38..184ceb4a1 100755 --- a/t/check7.sh +++ b/t/check7.sh @@ -30,11 +30,22 @@ TESTS = $(XFAIL_TESTS) XFAIL_TESTS = a b c d check_PROGRAMS = a c d check_SCRIPTS = b +EXTRA_PROGRAMS = new old EXTRA_DIST = $(check_SCRIPTS) -.PHONY: print-xfail-tests -print-xfail-tests: - @echo BEG: $(XFAIL_TESTS) :END +prepare-for-fake-exeext: + rm -f out.new out.old + touch a.fake c.fake d.fake + mv -f new$(EXEEXT) new.fake + mv -f old$(EXEEXT) old.fake +post-check-for-fake-exeext: + test -f new.fake + test -f old.fake + test ! -f new + test ! -f new$(EXEEXT) + test ! -f old + test ! -f old$(EXEEXT) +.PHONY: prepare-for-fake-exeext post-check-for-fake-exeext END cat > b <<'END' @@ -54,6 +65,26 @@ END cp a.c c.c cp a.c d.c +cat > new.c <<'END' +#include +int main (void) +{ + FILE *fp = fopen ("out.new", "w"); + fprintf (fp, "%s!\n", "Hello, Brave New World"); + return (fclose (fp) != 0); +} +END + +cat > old.c <<'END' +#include +int main (void) +{ + FILE *fp = fopen ("out.old", "w"); + fprintf (fp, "%s!\n", "Hello, Europe"); + return (fclose (fp) == 0); +} +END + $ACLOCAL $AUTOCONF $AUTOMAKE -a @@ -61,11 +92,15 @@ $AUTOMAKE -a ./configure $MAKE check -if test x"$am_serial_tests" = x"yes"; then - $MAKE EXEEXT=.bin print-xfail-tests >stdout || { cat stdout; Exit 1; } - cat stdout - $FGREP 'BEG: a.bin b c.bin d.bin :END' stdout -fi +$MAKE check TESTS='old new' XFAIL_TESTS=old +grep 'Hello, Brave New World!' out.new +grep 'Hello, Europe!' out.old + +$MAKE prepare-for-fake-exeext +$MAKE check TESTS='old new' EXEEXT=.fake XFAIL_TESTS=old +$MAKE post-check-for-fake-exeext +grep 'Hello, Brave New World!' out.new +grep 'Hello, Europe!' out.old $MAKE distcheck diff --git a/t/exeext4.sh b/t/exeext4.sh index a8595e334..9d64b70d3 100755 --- a/t/exeext4.sh +++ b/t/exeext4.sh @@ -37,18 +37,18 @@ if COND BAZ = baz $(DEP) endif bin_PROGRAMS = $(programs) @programs@ prg3 $(BAR) $(BAZE) +sbin_PROGRAMS = prg4 $(BAZ) EXTRA_PROGRAMS = prg1 prg2 prg3 -TESTS = prg1 prg3 prg4 $(BAZ) .PHONY: test-cond test-nocond test-nocond: is $(bin_PROGRAMS) == prg1.x prg2.x prg1.x prg2.x prg3.x is $(EXTRA_PROGRAMS) == prg1.x prg2.x prg3.x - is $(TESTS) == prg1.x prg3.x prg4 + is $(sbin_PROGRAMS) == prg4.x test-cond: is $(bin_PROGRAMS) == prg1.x prg2.x prg1.x prg2.x prg3.x bar.x baz.x is $(EXTRA_PROGRAMS) == prg1.x prg2.x prg3.x - is $(TESTS) == prg1.x prg3.x prg4 baz.x bar.x + is $(sbin_PROGRAMS) == prg4.x baz.x bar.x is $(BAR) $(BAZ) == bar baz bar END diff --git a/t/serial-tests.sh b/t/serial-tests.sh index 3825f7045..353d94cc8 100755 --- a/t/serial-tests.sh +++ b/t/serial-tests.sh @@ -23,7 +23,7 @@ hasnt_parallel_tests () { $EGREP -i 'test_suite_log|test_(logs|bases)|\.log.*:' $1 && Exit 1 grep 'recheck.*:' $1 && Exit 1 - grep '^check-TESTS: \$(TESTS)$' $1 + grep '^check-TESTS: \$(am__cooked_tests)$' $1 } has_parallel_tests () -- 2.47.2