testdriver: delete unused ways
[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   --normal          Default settings
22   --fast            Omit dyn way, omit binary distribution
23   --slow            Build stage2 with -DDEBUG. Skips tests that call
24                     `compiler_stats_num_field`.
25                     2008-07-01: 14% slower than the default.
26   --dph:            Also build libraries/dph and run associated tests.
27   --help            shows this usage help.
28
29   Set environment variable 'CPUS' to number of cores, to exploit
30   multiple cpu cores, e.g.
31
32     CPUS=8 ./validate
33
34 EOF
35 }
36
37 no_clean=0
38 testsuite_only=0
39 hpc=NO
40 speed=NORMAL
41 use_dph=0
42 be_quiet=0
43
44 while [ $# -gt 0 ]
45 do
46     case "$1" in
47     --no-clean)
48         no_clean=1
49         ;;
50     --testsuite-only)
51         testsuite_only=1
52         ;;
53     --hpc)
54         hpc=YES
55         ;;
56     --slow)
57         speed=SLOW
58         ;;
59     --fast)
60         speed=FAST
61         ;;
62     --normal)
63         speed=NORMAL
64         ;;
65     --no-dph) # for backward compat
66         use_dph=0
67         ;;
68     --dph)
69         use_dph=1
70         ;;
71     --quiet)
72         be_quiet=1
73         ;;
74     --help)
75         show_help
76         exit 0;;
77     *)
78         echo "$0: unrecognized argument '$1'" >&2
79         echo "Try '$0 --help' for more information." >&2
80         exit 1;;
81     esac
82     shift
83 done
84
85 check_packages () {
86     echo "== Start $1 package check"
87     if [ "$bindistdir" = "" ]
88     then
89         inplace/bin/ghc-pkg check -v
90     else
91         "$bindistdir"/bin/ghc-pkg check -v
92     fi
93     echo "== End $1 package check"
94 }
95
96 detect_cpu_count () {
97     if [ "$CPUS" = "" ]; then
98         # Windows standard environment variable
99         CPUS="$NUMBER_OF_PROCESSORS"
100     fi
101
102     if [ "$CPUS" = "" ]; then
103         # Linux
104         CPUS=`getconf _NPROCESSORS_ONLN 2>/dev/null`
105     fi
106
107     if [ "$CPUS" = "" ]; then
108         # FreeBSD
109         CPUS=`getconf NPROCESSORS_ONLN 2>/dev/null`
110     fi
111
112     if [ "$CPUS" = "" ]; then
113         # nothing helped
114         CPUS="1"
115     fi
116
117     echo "using ${CPUS} CPUs" >&2
118 }
119
120 detect_cpu_count
121
122 if ! [ -d testsuite ]
123 then
124     echo 'Could not find the testsuite for validation' >&2
125     exit 1
126 fi
127
128 if [ "$THREADS" = "" ]; then
129     threads=$(($CPUS + 1)) # `expr $CPUS + 1`
130 else
131     threads="$THREADS"
132 fi
133
134 if type gmake > /dev/null 2> /dev/null
135 then
136     if [ $be_quiet -eq 1 ]; then
137         make="gmake -s"
138     else
139         make="gmake"
140     fi
141 else
142     if [ $be_quiet -eq 1 ]; then
143         make="make -s"
144     else
145         make="make"
146     fi
147 fi
148
149 if [ $testsuite_only -eq 0 ]; then
150
151 if [ $no_clean -eq 0 ]; then
152     $make maintainer-clean NO_CLEAN_GMP=YES
153
154     INSTDIR=`pwd`/inst
155     if [ "$OSTYPE" = "cygwin" ]
156     then
157         INSTDIR=`cygpath -m "$INSTDIR"`
158     fi
159
160     if [ $use_dph -eq 1 ]; then
161         perl -w boot --validate --required-tag=dph
162     else
163         perl -w boot --validate
164     fi
165     ./configure --prefix="$INSTDIR" $config_args
166 fi
167
168 thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd`
169
170 echo "Validating=YES"       >  mk/are-validating.mk
171 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
172 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
173
174 if [ $be_quiet -eq 1 ]; then
175     echo "V=0"              >> mk/are-validating.mk # Less gunk
176 fi
177
178 if [ $use_dph -eq 1 ]; then
179     echo "BUILD_DPH=YES"    >> mk/are-validating.mk
180 else
181     echo "BUILD_DPH=NO"     >> mk/are-validating.mk
182 fi
183
184 $make -j$threads
185 # For a "debug make", add "--debug=b --debug=m"
186
187 check_packages post-build
188
189 # -----------------------------------------------------------------------------
190 # Build and test a binary distribution (not --fast)
191
192 if [ $speed != "FAST" ]; then
193
194     $make binary-dist-prep
195     $make test_bindist TEST_PREP=YES
196
197     #
198     # Install the xhtml package into the bindist.
199     # This verifies that we can install a package into the
200     # bindist with Cabal.
201     #
202     bindistdir="bindisttest/install   dir"
203
204     check_packages post-install
205
206     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
207
208     check_packages post-xhtml
209 fi
210
211 fi # testsuite-only
212
213 # -----------------------------------------------------------------------------
214 # Run the testsuite
215
216 if [ "$hpc" = YES ]
217 then
218     # XXX With threads we'd need to give a different tix file to each thread
219     #     and then sum them up at the end
220     threads=1
221     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
222     export HPCTIXFILE
223     rm -f $HPCTIXFILE
224 fi
225
226 case "$speed" in
227 SLOW)
228         MAKE_TEST_TARGET=fulltest
229         BINDIST="BINDIST=YES"
230         ;;
231 NORMAL)
232         MAKE_TEST_TARGET=fasttest
233         BINDIST="BINDIST=YES"
234         ;;
235 FAST)
236         MAKE_TEST_TARGET=fasttest
237         BINDIST="BINDIST=NO"
238         ;;
239 esac
240
241 verbosity=3
242 if [ $be_quiet -eq 1 ]; then
243    verbosity=2
244 fi
245
246 $make $MAKE_TEST_TARGET stage=2 $BINDIST VERBOSE=$verbosity THREADS=$threads 2>&1 | tee testlog
247
248 check_packages post-testsuite
249
250 if [ "$hpc" = YES ]
251 then
252     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
253 fi
254
255 echo "-------------------------------------------------------------------"
256 if
257     grep '\<0 caused framework failures' testlog >/dev/null 2>/dev/null &&
258     grep '\<0 unexpected passes' testlog >/dev/null 2>/dev/null &&
259     grep '\<0 unexpected failures' testlog >/dev/null 2>/dev/null &&
260     grep '\<0 unexpected stat failures' testlog >/dev/null 2>/dev/null &&
261     ! grep 'Some files are written by multiple tests' testlog >/dev/null 2>/dev/null ; then
262     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
263     then
264         cat <<EOF
265 Congratulations!  This tree has passed minimal testing.
266
267 NOTE: If you have made changes that may cause failures not tested for by
268 the minimal testing procedure, please do further testing as necessary.
269
270 When you are satisfied that you haven't broken anything, go ahead and
271 push/send your patches.
272 EOF
273         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
274         then
275             cat <<EOF
276
277 WARNING: You seem to have things set in mk/validate.mk. Please check
278 that it is OK before pushing.
279 EOF
280         fi
281         cat <<EOF
282 -------------------------------------------------------------------
283 EOF
284     else
285         cat <<EOF
286 I didn't find any problems, but this wasn't a complete validate run,
287 so be careful!
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 EOF
293    fi
294 else
295     cat <<EOF
296 Oops!  Looks like you have some unexpected test results or framework failures.
297 Please fix them before pushing/sending patches.
298 -------------------------------------------------------------------
299 EOF
300     exit 1
301 fi