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