Disable T12031 on linux
[ghc.git] / validate
1 #!/bin/sh
2
3 set -e
4
5 show_help () {
6     cat <<EOF
7 Usage: $0 [FLAGS]...
8
9 Validate GHC source tree against testsuite; see
10 http://ghc.haskell.org/trac/ghc/wiki/TestingPatches for more
11 information.
12
13 Flags:
14   --no-clean        don't make clean first, just carry on from
15                     a previous interrupted validation run
16   --testsuite-only  don't build the compiler, just run the test suite
17   --hpc             build stage2 with -fhpc, and see how much of the
18                     compiler the test suite covers.
19                     2008-07-01: 63% slower than the default.
20                     HTML generated here: testsuite/hpc_output/hpc_index.html
21   --fast            Omit binary distribution. Omit certain tests.
22   --slow            Build stage2 with -DDEBUG. Run tests for all WAYS,
23                     but skip those that call compiler_stats_num_field.
24                     2008-07-01: 14% slower than the default.
25   --dph             Also build libraries/dph and run associated tests.
26   --quiet           More pretty build log.
27                     See Note [Default build system verbosity].
28   --help            shows this usage help.
29
30   validate runs 'make -j\$THREADS', where by default THREADS is the number of
31   cpus your computer has +1. You can set the environment variable THREADS to
32   override this. For a sequential build you would for example use
33
34     THREADS=1 ./validate
35
36   You can set the 'config_args' environment variable to pass flags to
37   'configure'.
38
39   You can also use environment variables to pass extra options to the
40   testsuite. For example:
41
42     TEST='read001 read002' ./validate --testsuite-only --fast
43
44 EOF
45 }
46
47 no_clean=0
48 testsuite_only=0
49 hpc=NO
50 speed=NORMAL
51 use_dph=0
52 be_quiet=0
53 # Validate uses gzip compression for the binary distribution to avoid the rather
54 # heavy cost of xz, which is the typical default. The options are defined in
55 # mk/config.mk.in
56 tar_comp=gzip
57
58 while [ $# -gt 0 ]
59 do
60     case "$1" in
61     --no-clean)
62         no_clean=1
63         ;;
64     --testsuite-only)
65         testsuite_only=1
66         ;;
67     --hpc)
68         hpc=YES
69         ;;
70     --slow)
71         speed=SLOW
72         ;;
73     --fast)
74         speed=FAST
75         ;;
76     --normal) # for backward compat
77         speed=NORMAL
78         ;;
79     --no-dph) # for backward compat
80         use_dph=0
81         ;;
82     --dph)
83         use_dph=1
84         ;;
85     --quiet)
86         be_quiet=1
87         ;;
88     --help)
89         show_help
90         exit 0;;
91     *)
92         echo "$0: unrecognized argument '$1'" >&2
93         echo "Try '$0 --help' for more information." >&2
94         exit 1;;
95     esac
96     shift
97 done
98
99 check_packages () {
100     if [ "$bindistdir" = "" ]
101     then
102         ghc_pkg=inplace/bin/ghc-pkg
103     else
104         ghc_pkg="$bindistdir"/bin/ghc-pkg
105     fi
106
107     if [ $be_quiet -eq 1 ]
108     then
109         "$ghc_pkg" check
110     else
111         echo "== Start $1 package check"
112         "$ghc_pkg" check -v
113         echo "== End $1 package check"
114     fi
115 }
116
117 detect_cpu_count () {
118     if [ "$CPUS" = "" ]; then
119         # Windows standard environment variable
120         CPUS="$NUMBER_OF_PROCESSORS"
121     fi
122
123     if [ "$CPUS" = "" ]; then
124         # Linux
125         CPUS=`getconf _NPROCESSORS_ONLN 2>/dev/null`
126     fi
127
128     if [ "$CPUS" = "" ]; then
129         # FreeBSD
130         CPUS=`getconf NPROCESSORS_ONLN 2>/dev/null`
131     fi
132
133     if [ "$CPUS" = "" ]; then
134         # nothing helped
135         CPUS="1"
136     fi
137 }
138
139 detect_cpu_count
140
141 if ! [ -d testsuite ]
142 then
143     echo 'Could not find the testsuite for validation' >&2
144     exit 1
145 fi
146
147 if [ "$THREADS" = "" ]; then
148     threads=$(($CPUS + 1)) # `expr $CPUS + 1`
149 else
150     threads="$THREADS"
151 fi
152
153 echo "using THREADS=${threads}" >&2
154
155 if type gmake > /dev/null 2> /dev/null
156 then
157     make="gmake"
158 else
159     make="make"
160 fi
161
162 if [ $be_quiet -eq 1 ]; then
163     # See Note [Default build system verbosity].
164     make="$make -s"
165 fi
166
167 $make -C utils/checkUniques
168
169 if [ $testsuite_only -eq 0 ]; then
170
171 thisdir=`pwd`
172
173 if [ $no_clean -eq 0 ]; then
174     $make maintainer-clean NO_CLEAN_GMP=YES
175
176     INSTDIR="$thisdir/inst"
177
178     if [ $use_dph -eq 1 ]; then
179         perl -w boot --validate --required-tag=dph
180     else
181         perl -w boot --validate
182     fi
183     ./configure --prefix="$INSTDIR" $config_args
184 fi
185
186 echo "Validating=YES"       >  mk/are-validating.mk
187 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
188 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
189
190 # Note [Default build system verbosity].
191 #
192 # From https://ghc.haskell.org/trac/ghc/wiki/Design/BuildSystem:
193 #
194 #   "The build system should clearly report what it's doing (and sometimes
195 #   why), without being too verbose. It should emit actual command lines as
196 #   much as possible, so that they can be inspected and cut & pasted."
197 #
198 # That should be the default. Only suppress commands, by setting V=0 and using
199 # `make -s`, when user explicitly asks for it with `./validate --quiet`.
200 if [ $be_quiet -eq 1 ]; then
201     # See Note [Default build system verbosity].
202     echo "V=0"                  >> mk/are-validating.mk # Less gunk
203 fi
204
205 if [ $use_dph -eq 1 ]; then
206     echo "BUILD_DPH=YES"    >> mk/are-validating.mk
207 else
208     echo "BUILD_DPH=NO"     >> mk/are-validating.mk
209 fi
210
211 $make -j$threads
212 # For a "debug make", add "--debug=b --debug=m"
213
214 check_packages post-build
215
216 # -----------------------------------------------------------------------------
217 # Build and test a binary distribution (not --fast)
218
219 if [ $speed != "FAST" ]; then
220
221     $make binary-dist-prep TAR_COMP=$tar_comp
222     $make test_bindist TEST_PREP=YES TAR_COMP=$tar_comp
223
224     #
225     # Install the xhtml package into the bindist.
226     # This verifies that we can install a package into the
227     # bindist with Cabal.
228     #
229     bindistdir="bindisttest/install   dir"
230
231     check_packages post-install
232
233     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
234
235     check_packages post-xhtml
236 fi
237
238 fi # testsuite-only
239
240 # -----------------------------------------------------------------------------
241 # Run the testsuite
242
243 if [ "$hpc" = YES ]
244 then
245     # XXX With threads we'd need to give a different tix file to each thread
246     #     and then sum them up at the end
247     threads=1
248     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
249     export HPCTIXFILE
250     rm -f $HPCTIXFILE
251 fi
252
253 case "$speed" in
254 SLOW)
255         MAKE_TEST_TARGET=slowtest
256         BINDIST="BINDIST=YES"
257         ;;
258 NORMAL)
259         MAKE_TEST_TARGET=test
260         BINDIST="BINDIST=YES"
261         ;;
262 FAST)
263         MAKE_TEST_TARGET=fasttest
264         BINDIST="BINDIST=NO"
265         ;;
266 esac
267
268 if [ $be_quiet -eq 1 ] && [ -z $VERBOSE ]; then
269     TEST_VERBOSITY="VERBOSE=1 NO_PRINT_SUMMARY=YES"
270 fi
271
272 $make $MAKE_TEST_TARGET stage=2 $BINDIST $TEST_VERBOSITY THREADS=$threads 2>&1 | tee testlog
273
274 check_packages post-testsuite
275
276 if [ "$hpc" = YES ]
277 then
278     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
279 fi
280
281 if
282     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
283     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
284     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
285     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
286     ! grep 'Some files are written by multiple tests' testsuite_summary.txt >/dev/null 2>/dev/null ; then
287     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
288     then
289         cat <<EOF
290 -------------------------------------------------------------------
291 Congratulations!  This tree has passed minimal testing.
292
293 NOTE: If you have made changes that may cause failures not tested for by
294 the minimal testing procedure, please do further testing as necessary.
295
296 When you are satisfied that you haven't broken anything, go ahead and
297 push/send your patches.
298 EOF
299         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
300         then
301             cat <<EOF
302
303 WARNING: You seem to have things set in mk/validate.mk. Please check
304 that it is OK before pushing.
305 EOF
306         fi
307         cat <<EOF
308 -------------------------------------------------------------------
309 EOF
310     else
311         cat <<EOF
312 -------------------------------------------------------------------
313 I didn't find any problems, but this wasn't a complete validate run,
314 so be careful!
315
316 NOTE: If you have made changes that may cause failures not tested for by
317 the minimal testing procedure, please do further testing as necessary.
318 -------------------------------------------------------------------
319 EOF
320    fi
321 else
322     if [ $be_quiet -eq 0 ]
323     then
324        cat <<EOF
325 -------------------------------------------------------------------
326 Oops!  Looks like you have some unexpected test results or framework failures.
327 Please fix them before pushing/sending patches.
328 -------------------------------------------------------------------
329 EOF
330     fi
331     exit 1
332 fi