Merge branch 'maint'
[platform/upstream/automake.git] / lib / am / check.am
index ad970ad..ac3dc44 100644 (file)
@@ -418,7 +418,7 @@ check-TESTS recheck:
 ## cannot use '$?' to compute the set of lazily rerun tests, lest
 ## we rely on .PHONY to work portably.
        @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @$(am__set_TESTS_bases); \
+       @set +e; $(am__set_TESTS_bases); \
        if test $@ = recheck; then \
 ## If running a "make recheck", we must only consider tests that had an
 ## unexpected outcome (FAIL or XPASS) in the earlier run.
@@ -434,15 +434,42 @@ check-TESTS recheck:
 ## be problematic.  In this particular case, trailing white space is known
 ## to have caused segmentation faults on Solaris 10 XPG4 make:
        log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-## Under "make recheck", remove the .log and .trs files associated
-## with the files to recheck, so that those will be rerun by the
-## "make test-suite.log" recursive invocation below.  But use a proper
-## hack to avoid extra files removal when running under "make -n".
+## Under "make recheck", move the '.log' and '.trs' files associated
+## with the tests to be re-run out of the way, so that those tests will
+## be re-run by the "make test-suite.log" recursive invocation below.
+## Two tricky requirements:
+##   - we must avoid extra files removal when running under "make -n";
+##   - in case the test is a compiled program whose compilation fails,
+##     we must ensure that any '.log' and '.trs' file referring to such
+##     test are preserved, so that future "make recheck" invocations
+##     will still try to re-compile and re-run it (automake bug#11791).
+## The extra contortions below cater to such requirements.
+       am_backupdir=.am-recheck; \
        if test $@ != recheck || $(am__make_dryrun); then :; else \
-         test -z "$$log_list" || rm -f $$log_list; \
-         test -z "$$trs_list" || rm -f $$trs_list; \
+         if test -n "$$trs_list$$log_list"; then \
+           { test ! -d $$am_backupdir || rm -rf $$am_backupdir; } \
+             && $(MKDIR_P) $$am_backupdir || exit 1; \
+           test -z "$$log_list" \
+             || mv -f $$log_list $$am_backupdir 2>/dev/null; \
+           test -z "$$trs_list" \
+             || mv -f $$trs_list $$am_backupdir 2>/dev/null; \
+         fi; \
+       fi; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       st=$$?; \
+       if test $@ != recheck || $(am__make_dryrun) || test ! -d $$am_backupdir; then :; else \
+         for f in $$log_list $$trs_list; do \
+           test -f $$f || mv $$am_backupdir/$$f . || exit 1; \
+         done; \
+         rm -rf $$am_backupdir || exit 1; \
        fi; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"
+## Be sure to exit with the proper exit status.  The use of "exit" below
+## is required to work around a FreeBSD make bug (present only when
+## running in concurrent mode).  See automake bug#9245:
+##  <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9245>
+## and FreeBSD PR bin/159730:
+##  <http://www.freebsd.org/cgi/query-pr.cgi?pr=159730>.
+       exit $$st;
 
 ## Recheck must depend on $(check_SCRIPTS), $(check_PROGRAMS), etc.
 ## It must also depend on the 'all' target.  See automake bug#11252.