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