Merge branch 'msvc'
[platform/upstream/automake.git] / lib / am / check.am
1 ## automake - create Makefile.in from Makefile.am
2 ## Copyright (C) 2001, 2003, 2006, 2007, 2008, 2009, 2010 Free Software
3 ## Foundation, Inc.
4
5 ## This program is free software; you can redistribute it and/or modify
6 ## it under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 2, or (at your option)
8 ## any later version.
9
10 ## This program is distributed in the hope that it will be useful,
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ## GNU General Public License for more details.
14
15 ## You should have received a copy of the GNU General Public License
16 ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 if %?COLOR%
19 # If stdout is a non-dumb tty, use colors.  If test -t is not supported,
20 # then this fails; a conservative approach.  Of course do not redirect
21 # stdout here, just stderr.
22 am__tty_colors = \
23 red=; grn=; lgn=; blu=; std=; \
24 test "X$(AM_COLOR_TESTS)" != Xno \
25 && test "X$$TERM" != Xdumb \
26 && { test "X$(AM_COLOR_TESTS)" = Xalways || test -t 1 2>/dev/null; } \
27 && { \
28   red='\e[0;31m'; \
29   grn='\e[0;32m'; \
30   lgn='\e[1;32m'; \
31   blu='\e[1;34m'; \
32   std='\e[m'; \
33 }
34 else !%?COLOR%
35 am__tty_colors = \
36 red=; grn=; lgn=; blu=; std=
37 endif !%?COLOR%
38
39 .PHONY: check-TESTS
40
41 if %?PARALLEL_TESTS%
42
43 include inst-vars.am
44
45 ## New parallel test driver.
46 ##
47 ## This code is adapted from check.mk which was originally
48 ## written at EPITA/LRDE, further developed at Gostai, then made
49 ## its way from GNU coreutils to end up, largely rewritten, in
50 ## Automake.
51 ##
52 ## It provides special support for "unit tests", that is to say,
53 ## tests that (once run) no longer need to be re-compiled and
54 ## re-run at each "make check", unless their sources changed.  To
55 ## enable unit-test supports, set RECHECK_LOGS to empty.  In such a
56 ## setting, that heavily relies on correct dependencies, its users may
57 ## prefer to define EXTRA_PROGRAMS instead of check_PROGRAMS, because
58 ## it allows intertwined compilation and execution of the tests.
59 ## Sometimes this helps catching errors earlier (you don't have to
60 ## wait for all the tests to be compiled).
61 ##
62 ## Define TEST_SUITE_LOG to be the name of the global log to create.
63 ## Define TEST_LOGS to the set of logs to include in it.  It defaults
64 ## to $(TESTS), with `.test' and `@EXEEXT@' removed, and `'.log'
65 ## appended.
66 ##
67 ## In addition to the magic "exit 77 means SKIP" feature (which was
68 ## imported from automake), there is a magic "exit 99 means FAIL" feature
69 ## which is useful if you need to issue a hard error no matter whether the
70 ## test is XFAIL or not.  You can disable this feature by setting the
71 ## variable DISABLE_HARD_ERRORS to a nonempty value.
72
73 # Restructured Text title and section.
74 am__rst_title   = sed 's/.*/   &   /;h;s/./=/g;p;x;p;g;p;s/.*//'
75 am__rst_section = sed 'p;s/./=/g;p;g'
76
77 # Put stdin (possibly several lines separated by ".  ") in a box.
78 am__text_box = $(AWK) '{                                \
79   n = split($$0, lines, "\\.  "); max = 0;              \
80   for (i = 1; i <= n; ++i)                              \
81     if (max < length(lines[i]))                         \
82       max = length(lines[i]);                           \
83   for (i = 0; i < max; ++i) line = line "=";            \
84   print line;                                           \
85   for (i = 1; i <= n; ++i) if (lines[i]) print lines[i];\
86   print line;                                           \
87 }'
88
89 # Solaris 10 'make', and several other traditional 'make' implementations,
90 # pass "-e" to $(SHELL).  This contradicts POSIX.  Work around the problem
91 # by disabling -e (using the XSI extension "set +e") if it's set.
92 am__sh_e_setup = case $$- in *e*) set +e;; esac
93
94 # To be inserted before the command running the test.  Creates the
95 # directory for the log if needed.  Stores in $dir the directory
96 # containing $f, in $tst the test, in $log the log, and passes
97 # TESTS_ENVIRONMENT.  Save and restore TERM around use of
98 # TESTS_ENVIRONMENT, in case that unsets it.
99 am__check_pre =                                         \
100 $(am__sh_e_setup);                                      \
101 $(am__vpath_adj_setup) $(am__vpath_adj)                 \
102 srcdir=$(srcdir); export srcdir;                        \
103 rm -f $@-t;                                             \
104 am__trap='rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st'; \
105 trap "st=129; $$am__trap" 1; trap "st=130; $$am__trap" 2;       \
106 trap "st=141; $$am__trap" 13; trap "st=143; $$am__trap" 15; \
107 am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;            \
108 test "x$$am__odir" = x. || $(MKDIR_P) "$$am__odir" || exit $$?; \
109 if test -f "./$$f"; then dir=./;                        \
110 elif test -f "$$f"; then dir=;                          \
111 else dir="$(srcdir)/"; fi;                              \
112 tst=$$dir$$f; log='$@'; __SAVED_TERM=$$TERM;            \
113 $(TESTS_ENVIRONMENT)
114
115 # To be appended to the command running the test.  Handle the stdout
116 # and stderr redirection, and catch the exit status.
117 am__check_post =                                        \
118 >$@-t 2>&1;                                             \
119 estatus=$$?;                                            \
120 if test -n '$(DISABLE_HARD_ERRORS)'                     \
121    && test $$estatus -eq 99; then                       \
122   estatus=1;                                            \
123 fi;                                                     \
124 TERM=$$__SAVED_TERM; export TERM;                       \
125 $(am__tty_colors);                                      \
126 xfailed=PASS;                                           \
127 case " $(XFAIL_TESTS) " in                              \
128   *[\ \ ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
129     xfailed=XFAIL;;                                     \
130 esac;                                                   \
131 case $$estatus:$$xfailed in                             \
132     0:XFAIL) col=$$red; res=XPASS;;                     \
133     0:*)     col=$$grn; res=PASS ;;                     \
134     77:*)    col=$$blu; res=SKIP ;;                     \
135     99:*)    col=$$red; res=FAIL ;;                     \
136     *:XFAIL) col=$$lgn; res=XFAIL;;                     \
137     *:*)     col=$$red; res=FAIL ;;                     \
138 esac;                                                   \
139 echo "$${col}$$res$${std}: $$f";                        \
140 echo "$$res: $$f (exit: $$estatus)" |                   \
141   $(am__rst_section) >$@;                               \
142 cat $@-t >>$@;                                          \
143 rm -f $@-t
144
145 $(TEST_SUITE_LOG): $(TEST_LOGS)
146         @$(am__sh_e_setup);                                             \
147         list='$(TEST_LOGS)';                                            \
148         results=`for f in $$list; do                                    \
149                    read line < $$f && echo "$$line" || echo FAIL;       \
150                  done`;                                                 \
151         all=`echo "$$results" | sed '/^$$/d' | wc -l | sed -e 's/^[      ]*//'`; \
152         fail=`echo "$$results" | grep -c '^FAIL'`;                      \
153         pass=`echo "$$results" | grep -c '^PASS'`;                      \
154         skip=`echo "$$results" | grep -c '^SKIP'`;                      \
155         xfail=`echo "$$results" | grep -c '^XFAIL'`;                    \
156         xpass=`echo "$$results" | grep -c '^XPASS'`;                    \
157         failures=`expr $$fail + $$xpass`;                               \
158         all=`expr $$all - $$skip`;                                      \
159         if test "$$all" -eq 1; then tests=test; All=;                   \
160         else tests=tests; All="All "; fi;                               \
161         case fail=$$fail:xpass=$$xpass:xfail=$$xfail in                 \
162           fail=0:xpass=0:xfail=0)                                       \
163             msg="$$All$$all $$tests passed.  ";                         \
164             exit=true;;                                                 \
165           fail=0:xpass=0:xfail=*)                                       \
166             msg="$$All$$all $$tests behaved as expected";               \
167             if test "$$xfail" -eq 1; then xfailures=failure;            \
168             else xfailures=failures; fi;                                \
169             msg="$$msg ($$xfail expected $$xfailures).  ";              \
170             exit=true;;                                                 \
171           fail=*:xpass=0:xfail=*)                                       \
172             msg="$$fail of $$all $$tests failed.  ";                    \
173             exit=false;;                                                \
174           fail=*:xpass=*:xfail=*)                                       \
175             msg="$$failures of $$all $$tests did not behave as expected"; \
176             if test "$$xpass" -eq 1; then xpasses=pass;                 \
177             else xpasses=passes; fi;                                    \
178             msg="$$msg ($$xpass unexpected $$xpasses).  ";              \
179             exit=false;;                                                \
180           *)                                                            \
181             echo >&2 "incorrect case"; exit 4;;                         \
182         esac;                                                           \
183         if test "$$skip" -ne 0; then                                    \
184           if test "$$skip" -eq 1; then                                  \
185             msg="$$msg($$skip test was not run).  ";                    \
186           else                                                          \
187             msg="$$msg($$skip tests were not run).  ";                  \
188           fi;                                                           \
189         fi;                                                             \
190         {                                                               \
191           echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
192             $(am__rst_title);                                           \
193           echo "$$msg";                                                 \
194           echo;                                                         \
195           echo ".. contents:: :depth: 2";                               \
196           echo;                                                         \
197           for f in $$list; do                                           \
198             read line < $$f;                                            \
199             case $$line in                                              \
200               PASS:*|XFAIL:*);;                                         \
201               *) echo; cat $$f;;                                        \
202             esac;                                                       \
203           done;                                                         \
204         } >$(TEST_SUITE_LOG).tmp;                                       \
205         mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
206         if test "$$failures" -ne 0; then                                \
207           msg="$${msg}See $(subdir)/$(TEST_SUITE_LOG).  ";              \
208           if test -n "$(PACKAGE_BUGREPORT)"; then                       \
209             msg="$${msg}Please report to $(PACKAGE_BUGREPORT).  ";      \
210           fi;                                                           \
211         fi;                                                             \
212         test x"$$VERBOSE" = x || $$exit || cat $(TEST_SUITE_LOG);       \
213         $(am__tty_colors);                                              \
214         if $$exit; then                                                 \
215           echo $(ECHO_N) "$$grn$(ECHO_C)";                              \
216          else                                                           \
217           echo $(ECHO_N) "$$red$(ECHO_C)";                              \
218         fi;                                                             \
219         echo "$$msg" | $(am__text_box);                                 \
220         echo $(ECHO_N) "$$std$(ECHO_C)";                                \
221         $$exit
222
223 RECHECK_LOGS = $(TEST_LOGS)
224
225 # Run all the tests.
226 check-TESTS:
227 ## Expand $(RECHECK_LOGS) only once, to avoid exceeding line length limits.
228         @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
229 ## We always have to remove TEST_SUITE_LOG, to ensure its rule is run
230 ## in any case even in lazy mode: otherwise, if no test needs rerunning,
231 ## or a prior run plus reruns all happen within the same timestamp
232 ## (can happen with a prior `make TESTS=<subset>'),
233 ## then we get no log output.
234 ## OTOH, this means that, in the rule for `$(TEST_SUITE_LOG)', we
235 ## cannot use `$?' to compute the set of lazily rerun tests, lest
236 ## we rely on .PHONY to work portably.
237         @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
238         @list='$(TEST_LOGS)';                                           \
239         list=`for f in $$list; do                                       \
240           test .log = $$f || echo $$f;                                  \
241         done | tr '\012\015' '  '`;                                     \
242         $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$list"
243
244 AM_RECURSIVE_TARGETS += check
245
246 ## -------------- ##
247 ## Produce HTML.  ##
248 ## -------------- ##
249
250 .log.html:
251         @list='$(RST2HTML) $$RST2HTML rst2html rst2html.py';            \
252         for r2h in $$list; do                                           \
253           if ($$r2h --version) >/dev/null 2>&1; then                    \
254             R2H=$$r2h;                                                  \
255           fi;                                                           \
256         done;                                                           \
257         if test -z "$$R2H"; then                                        \
258           echo >&2 "cannot find rst2html, cannot create $@";            \
259           exit 2;                                                       \
260         fi;                                                             \
261         $$R2H $< >$@.tmp
262         @mv $@.tmp $@
263
264 # Be sure to run check first, and then to convert the result.
265 # Beware of concurrent executions.  Run "check" not "check-TESTS", as
266 # check-SCRIPTS and other dependencies are rebuilt by the former only.
267 # And expect check to fail.
268 check-html:
269         @if $(MAKE) $(AM_MAKEFLAGS) check; then                 \
270           rv=0; else rv=$$?;                                    \
271         fi;                                                     \
272         $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) || exit 4;   \
273         exit $$rv
274
275 .PHONY: check-html
276 .MAKE: check-html
277
278 AM_RECURSIVE_TARGETS += check-html
279
280 ## -------------------- ##
281 ## Rechecking failures. ##
282 ## -------------------- ##
283
284 ## Rerun all FAILed or XPASSed tests.
285 recheck recheck-html:
286         @target=`echo $@ | sed 's,^re,,'`;                              \
287         list='$(TEST_LOGS)';                                            \
288         list=`for f in $$list; do                                       \
289                 test -f $$f || continue;                                \
290                 if read line < $$f; then                                \
291                   case $$line in FAIL*|XPASS*) echo $$f;; esac;         \
292                 else echo $$f; fi;                                      \
293               done | tr '\012\015' '  '`;                               \
294 ## This apparently useless munging helps to avoid a nasty bug (a
295 ## segmentation fault!) on Solaris XPG4 make.
296         list=`echo "$$list" | sed 's/ *$$//'`;                          \
297         $(MAKE) $(AM_MAKEFLAGS) $$target AM_MAKEFLAGS='$(AM_MAKEFLAGS) TEST_LOGS="'"$$list"'"'
298
299 .PHONY: recheck recheck-html
300 .MAKE: recheck recheck-html
301
302 AM_RECURSIVE_TARGETS += recheck recheck-html
303
304 else !%?PARALLEL_TESTS%
305
306 check-TESTS: $(TESTS)
307         @failed=0; all=0; xfail=0; xpass=0; skip=0; \
308         srcdir=$(srcdir); export srcdir; \
309 ## Make sure Solaris VPATH-expands all members of this list, even
310 ## the first and the last one; thus the spaces around $(TESTS)
311         list=' $(TESTS) '; \
312         $(am__tty_colors); \
313         if test -n "$$list"; then \
314           for tst in $$list; do \
315             if test -f ./$$tst; then dir=./; \
316 ## Note: Solaris 2.7 seems to expand TESTS using VPATH.  That's
317 ## why we also try `dir='
318             elif test -f $$tst; then dir=; \
319             else dir="$(srcdir)/"; fi; \
320             if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
321 ## Success
322               all=`expr $$all + 1`; \
323               case " $(XFAIL_TESTS) " in \
324               *[\ \     ]$$tst[\ \      ]*) \
325                 xpass=`expr $$xpass + 1`; \
326                 failed=`expr $$failed + 1`; \
327                 col=$$red; res=XPASS; \
328               ;; \
329               *) \
330                 col=$$grn; res=PASS; \
331               ;; \
332               esac; \
333             elif test $$? -ne 77; then \
334 ## Failure
335               all=`expr $$all + 1`; \
336               case " $(XFAIL_TESTS) " in \
337               *[\ \     ]$$tst[\ \      ]*) \
338                 xfail=`expr $$xfail + 1`; \
339                 col=$$lgn; res=XFAIL; \
340               ;; \
341               *) \
342                 failed=`expr $$failed + 1`; \
343                 col=$$red; res=FAIL; \
344               ;; \
345               esac; \
346             else \
347 ## Skipped
348               skip=`expr $$skip + 1`; \
349               col=$$blu; res=SKIP; \
350             fi; \
351             echo "$${col}$$res$${std}: $$tst"; \
352           done; \
353 ## Prepare the banner
354           if test "$$all" -eq 1; then \
355             tests="test"; \
356             All=""; \
357           else \
358             tests="tests"; \
359             All="All "; \
360           fi; \
361           if test "$$failed" -eq 0; then \
362             if test "$$xfail" -eq 0; then \
363               banner="$$All$$all $$tests passed"; \
364             else \
365               if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
366               banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
367             fi; \
368           else \
369             if test "$$xpass" -eq 0; then \
370               banner="$$failed of $$all $$tests failed"; \
371             else \
372               if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
373               banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
374             fi; \
375           fi; \
376 ## DASHES should contain the largest line of the banner.
377           dashes="$$banner"; \
378           skipped=""; \
379           if test "$$skip" -ne 0; then \
380             if test "$$skip" -eq 1; then \
381               skipped="($$skip test was not run)"; \
382             else \
383               skipped="($$skip tests were not run)"; \
384             fi; \
385             test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
386               dashes="$$skipped"; \
387           fi; \
388           report=""; \
389           if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
390             report="Please report to $(PACKAGE_BUGREPORT)"; \
391             test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
392               dashes="$$report"; \
393           fi; \
394           dashes=`echo "$$dashes" | sed s/./=/g`; \
395           if test "$$failed" -eq 0; then \
396             echo "$$grn$$dashes"; \
397           else \
398             echo "$$red$$dashes"; \
399           fi; \
400           echo "$$banner"; \
401           test -z "$$skipped" || echo "$$skipped"; \
402           test -z "$$report" || echo "$$report"; \
403           echo "$$dashes$$std"; \
404           test "$$failed" -eq 0; \
405         else :; fi
406
407 endif !%?PARALLEL_TESTS%