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