users_guide: Move 7.12.1-notes to 8.0.1-notes
[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 $make -C utils/checkUniques
161
162 if [ $testsuite_only -eq 0 ]; then
163
164 if [ $no_clean -eq 0 ]; then
165     $make maintainer-clean NO_CLEAN_GMP=YES
166
167     INSTDIR=`pwd`/inst
168
169     if [ $use_dph -eq 1 ]; then
170         perl -w boot --validate --required-tag=dph
171     else
172         perl -w boot --validate
173     fi
174     ./configure --prefix="$INSTDIR" $config_args
175 fi
176
177 thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd`
178
179 echo "Validating=YES"       >  mk/are-validating.mk
180 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
181 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
182
183 # Note [Default build system verbosity].
184 #
185 # From https://ghc.haskell.org/trac/ghc/wiki/Design/BuildSystem:
186 #
187 #   "The build system should clearly report what it's doing (and sometimes
188 #   why), without being too verbose. It should emit actual command lines as
189 #   much as possible, so that they can be inspected and cut & pasted."
190 #
191 # That should be the default. Only suppress commands, by setting V=0 and using
192 # `make -s`, when user explicitly asks for it with `./validate --quiet`.
193 if [ $be_quiet -eq 1 ]; then
194     # See Note [Default build system verbosity].
195     echo "V=0"                  >> mk/are-validating.mk # Less gunk
196 fi
197
198 if [ $use_dph -eq 1 ]; then
199     echo "BUILD_DPH=YES"    >> mk/are-validating.mk
200 else
201     echo "BUILD_DPH=NO"     >> mk/are-validating.mk
202 fi
203
204 $make -j$threads
205 # For a "debug make", add "--debug=b --debug=m"
206
207 check_packages post-build
208
209 # -----------------------------------------------------------------------------
210 # Build and test a binary distribution (not --fast)
211
212 if [ $speed != "FAST" ]; then
213
214     $make binary-dist-prep
215     $make test_bindist TEST_PREP=YES
216
217     #
218     # Install the xhtml package into the bindist.
219     # This verifies that we can install a package into the
220     # bindist with Cabal.
221     #
222     bindistdir="bindisttest/install   dir"
223
224     check_packages post-install
225
226     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
227
228     check_packages post-xhtml
229 fi
230
231 fi # testsuite-only
232
233 # -----------------------------------------------------------------------------
234 # Run the testsuite
235
236 if [ "$hpc" = YES ]
237 then
238     # XXX With threads we'd need to give a different tix file to each thread
239     #     and then sum them up at the end
240     threads=1
241     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
242     export HPCTIXFILE
243     rm -f $HPCTIXFILE
244 fi
245
246 case "$speed" in
247 SLOW)
248         MAKE_TEST_TARGET=slowtest
249         BINDIST="BINDIST=YES"
250         ;;
251 NORMAL)
252         MAKE_TEST_TARGET=test
253         BINDIST="BINDIST=YES"
254         ;;
255 FAST)
256         MAKE_TEST_TARGET=fasttest
257         BINDIST="BINDIST=NO"
258         ;;
259 esac
260
261 if [ $be_quiet -eq 1 ] && [ -z $VERBOSE ]; then
262     TEST_VERBOSITY="VERBOSE=1 NO_PRINT_SUMMARY=YES"
263 fi
264
265 $make $MAKE_TEST_TARGET stage=2 $BINDIST $TEST_VERBOSITY THREADS=$threads 2>&1 | tee testlog
266
267 check_packages post-testsuite
268
269 if [ "$hpc" = YES ]
270 then
271     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
272 fi
273
274 if
275     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
276     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
277     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
278     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
279     ! grep 'Some files are written by multiple tests' testsuite_summary.txt >/dev/null 2>/dev/null ; then
280     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
281     then
282         cat <<EOF
283 -------------------------------------------------------------------
284 Congratulations!  This tree has passed minimal testing.
285
286 NOTE: If you have made changes that may cause failures not tested for by
287 the minimal testing procedure, please do further testing as necessary.
288
289 When you are satisfied that you haven't broken anything, go ahead and
290 push/send your patches.
291 EOF
292         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
293         then
294             cat <<EOF
295
296 WARNING: You seem to have things set in mk/validate.mk. Please check
297 that it is OK before pushing.
298 EOF
299         fi
300         cat <<EOF
301 -------------------------------------------------------------------
302 EOF
303     else
304         cat <<EOF
305 -------------------------------------------------------------------
306 I didn't find any problems, but this wasn't a complete validate run,
307 so be careful!
308
309 NOTE: If you have made changes that may cause failures not tested for by
310 the minimal testing procedure, please do further testing as necessary.
311 -------------------------------------------------------------------
312 EOF
313    fi
314 else
315     if [ $be_quiet -eq 0 ]
316     then
317        cat <<EOF
318 -------------------------------------------------------------------
319 Oops!  Looks like you have some unexpected test results or framework failures.
320 Please fix them before pushing/sending patches.
321 -------------------------------------------------------------------
322 EOF
323     fi
324     exit 1
325 fi