Fix misspellings of the word "instance" in comments
[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"
270 fi
271
272 rm -f testsuite_summary.txt testsuite_summary_stage1.txt
273
274 # Use LOCAL=0, see Note [Running tests in /tmp].
275 $make -C testsuite/tests $BINDIST \
276       $MAKE_TEST_TARGET stage=2 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \
277       NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../testsuite_summary.txt \
278       2>&1 | tee testlog
279
280 # Run a few tests using the stage1 compiler.
281 # See Note [Why is there no stage1 setup function?].
282 # Don't use BINDIST=YES, as stage1 is not available in a bindist.
283 $make -C testsuite/tests/stage1 \
284       $MAKE_TEST_TARGET stage=1 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \
285       NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../../testsuite_summary_stage1.txt \
286       2>&1 | tee testlog-stage1
287
288 echo
289 echo '==== STAGE 1 TESTS ==== '
290 cat testsuite_summary_stage1.txt
291
292 echo '==== STAGE 2 TESTS ==== '
293 cat testsuite_summary.txt
294
295 check_packages post-testsuite
296
297 if [ "$hpc" = YES ]
298 then
299     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
300 fi
301
302 if
303     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
304     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
305     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
306     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
307
308     grep '\<0 caused framework failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
309     grep '\<0 unexpected passes' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
310     grep '\<0 unexpected failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
311     grep '\<0 unexpected stat failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null ; then
312
313     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
314     then
315         cat <<EOF
316 -------------------------------------------------------------------
317 Congratulations!  This tree has passed minimal testing.
318
319 NOTE: If you have made changes that may cause failures not tested for by
320 the minimal testing procedure, please do further testing as necessary.
321
322 When you are satisfied that you haven't broken anything, go ahead and
323 push/send your patches.
324 EOF
325         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
326         then
327             cat <<EOF
328
329 WARNING: You seem to have things set in mk/validate.mk. Please check
330 that it is OK before pushing.
331 EOF
332         fi
333         cat <<EOF
334 -------------------------------------------------------------------
335 EOF
336     else
337         cat <<EOF
338 -------------------------------------------------------------------
339 I didn't find any problems, but this wasn't a complete validate run,
340 so be careful!
341
342 NOTE: If you have made changes that may cause failures not tested for by
343 the minimal testing procedure, please do further testing as necessary.
344 -------------------------------------------------------------------
345 EOF
346    fi
347 else
348     if [ $be_quiet -eq 0 ]
349     then
350        cat <<EOF
351 -------------------------------------------------------------------
352 Oops!  Looks like you have some unexpected test results or framework failures.
353 Please fix them before pushing/sending patches.
354 -------------------------------------------------------------------
355 EOF
356     fi
357     exit 1
358 fi