.gitignore update for some test files.
[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 [ $use_dph -eq 1 ]; then
197     echo "BUILD_DPH=YES"    >> mk/are-validating.mk
198 else
199     echo "BUILD_DPH=NO"     >> mk/are-validating.mk
200 fi
201
202 $make -j$threads
203 # For a "debug make", add "--debug=b --debug=m"
204
205 check_packages post-build
206
207 # -----------------------------------------------------------------------------
208 # Build and test a binary distribution (not --fast)
209
210 if [ $speed != "FAST" ]; then
211
212     $make binary-dist-prep
213     $make test_bindist TEST_PREP=YES
214
215     #
216     # Install the xhtml package into the bindist.
217     # This verifies that we can install a package into the
218     # bindist with Cabal.
219     #
220     bindistdir="bindisttest/install   dir"
221
222     check_packages post-install
223
224     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
225
226     check_packages post-xhtml
227 fi
228
229 fi # testsuite-only
230
231 # -----------------------------------------------------------------------------
232 # Run the testsuite
233
234 if [ "$hpc" = YES ]
235 then
236     # XXX With threads we'd need to give a different tix file to each thread
237     #     and then sum them up at the end
238     threads=1
239     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
240     export HPCTIXFILE
241     rm -f $HPCTIXFILE
242 fi
243
244 case "$speed" in
245 SLOW)
246         MAKE_TEST_TARGET=slowtest
247         BINDIST="BINDIST=YES"
248         ;;
249 NORMAL)
250         MAKE_TEST_TARGET=test
251         BINDIST="BINDIST=YES"
252         ;;
253 FAST)
254         MAKE_TEST_TARGET=fasttest
255         BINDIST="BINDIST=NO"
256         ;;
257 esac
258
259 if [ $be_quiet -eq 1 ] && [ -z $VERBOSE ]; then
260     TEST_VERBOSITY="VERBOSE=1 NO_PRINT_SUMMARY=YES"
261 fi
262
263 $make $MAKE_TEST_TARGET stage=2 $BINDIST $TEST_VERBOSITY THREADS=$threads 2>&1 | tee testlog
264
265 check_packages post-testsuite
266
267 if [ "$hpc" = YES ]
268 then
269     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
270 fi
271
272 if
273     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
274     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
275     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
276     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
277     ! grep 'Some files are written by multiple tests' testsuite_summary.txt >/dev/null 2>/dev/null ; then
278     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
279     then
280         cat <<EOF
281 -------------------------------------------------------------------
282 Congratulations!  This tree has passed minimal testing.
283
284 NOTE: If you have made changes that may cause failures not tested for by
285 the minimal testing procedure, please do further testing as necessary.
286
287 When you are satisfied that you haven't broken anything, go ahead and
288 push/send your patches.
289 EOF
290         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
291         then
292             cat <<EOF
293
294 WARNING: You seem to have things set in mk/validate.mk. Please check
295 that it is OK before pushing.
296 EOF
297         fi
298         cat <<EOF
299 -------------------------------------------------------------------
300 EOF
301     else
302         cat <<EOF
303 -------------------------------------------------------------------
304 I didn't find any problems, but this wasn't a complete validate run,
305 so be careful!
306
307 NOTE: If you have made changes that may cause failures not tested for by
308 the minimal testing procedure, please do further testing as necessary.
309 -------------------------------------------------------------------
310 EOF
311    fi
312 else
313     if [ $be_quiet -eq 0 ]
314     then
315        cat <<EOF
316 -------------------------------------------------------------------
317 Oops!  Looks like you have some unexpected test results or framework failures.
318 Please fix them before pushing/sending patches.
319 -------------------------------------------------------------------
320 EOF
321     fi
322     exit 1
323 fi