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