Renames some files to help with validation cleanup (#10212)
[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 be_quiet=0
42
43 while [ $# -gt 0 ]
44 do
45     case "$1" in
46     --no-clean)
47         no_clean=1
48         ;;
49     --testsuite-only)
50         testsuite_only=1
51         ;;
52     --hpc)
53         hpc=YES
54         ;;
55     --slow)
56         speed=SLOW
57         ;;
58     --fast)
59         speed=FAST
60         ;;
61     --normal)
62         speed=NORMAL
63         ;;
64     --no-dph) # for backward compat
65         use_dph=0
66         ;;
67     --dph)
68         use_dph=1
69         ;;
70     --quiet)
71         be_quiet=1
72         ;;
73     --help)
74         show_help
75         exit 0;;
76     *)
77         echo "$0: unrecognized argument '$1'" >&2
78         echo "Try '$0 --help' for more information." >&2
79         exit 1;;
80     esac
81     shift
82 done
83
84 check_packages () {
85     echo "== Start $1 package check"
86     if [ "$bindistdir" = "" ]
87     then
88         inplace/bin/ghc-pkg check -v
89     else
90         "$bindistdir"/bin/ghc-pkg check -v
91     fi
92     echo "== End $1 package check"
93 }
94
95 detect_cpu_count () {
96     if [ "$CPUS" = "" ]; then
97         # Windows standard environment variable
98         CPUS="$NUMBER_OF_PROCESSORS"
99     fi
100
101     if [ "$CPUS" = "" ]; then
102         # Linux
103         CPUS=`getconf _NPROCESSORS_ONLN 2>/dev/null`
104     fi
105
106     if [ "$CPUS" = "" ]; then
107         # FreeBSD
108         CPUS=`getconf NPROCESSORS_ONLN 2>/dev/null`
109     fi
110
111     if [ "$CPUS" = "" ]; then
112         # nothing helped
113         CPUS="1"
114     fi
115
116     echo "using ${CPUS} CPUs" >&2
117 }
118
119 detect_cpu_count
120
121 if ! [ -d testsuite ]
122 then
123     echo 'Could not find the testsuite for validation' >&2
124     exit 1
125 fi
126
127 if [ "$THREADS" = "" ]; then
128     threads=$(($CPUS + 1)) # `expr $CPUS + 1`
129 else
130     threads="$THREADS"
131 fi
132
133 if type gmake > /dev/null 2> /dev/null
134 then
135     if [ $be_quiet -eq 1 ]; then
136         make="gmake -s"
137     else
138         make="gmake"
139     fi
140 else
141     if [ $be_quiet -eq 1 ]; then
142         make="make -s"
143     else
144         make="make"
145     fi
146 fi
147
148 if [ $testsuite_only -eq 0 ]; then
149
150 if [ $no_clean -eq 0 ]; then
151     $make maintainer-clean NO_CLEAN_GMP=YES
152
153     INSTDIR=`pwd`/inst
154     if [ "$OSTYPE" = "cygwin" ]
155     then
156         INSTDIR=`cygpath -m "$INSTDIR"`
157     fi
158
159     if [ $use_dph -eq 1 ]; then
160         perl -w boot --validate --required-tag=dph
161     else
162         perl -w boot --validate
163     fi
164     ./configure --prefix="$INSTDIR" $config_args
165 fi
166
167 thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd`
168
169 echo "Validating=YES"       >  mk/are-validating.mk
170 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
171 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
172
173 if [ $be_quiet -eq 1 ]; then
174     echo "V=0"              >> mk/are-validating.mk # Less gunk
175     echo "GhcHcOpts="       >> mk/are-validating.mk # Remove -Rghc-timing
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