Validate: by default do show commands
[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     if [ "$bindistdir" = "" ]
87     then
88         ghc_pkg=inplace/bin/ghc-pkg
89     else
90         ghc_pkg="$bindistdir"/bin/ghc-pkg
91     fi
92
93     if [ $be_quiet -eq 1 ]
94     then
95         "$ghc_pkg" check
96     else
97         echo "== Start $1 package check"
98         "$ghc_pkg" check -v
99         echo "== End $1 package check"
100     fi
101 }
102
103 detect_cpu_count () {
104     if [ "$CPUS" = "" ]; then
105         # Windows standard environment variable
106         CPUS="$NUMBER_OF_PROCESSORS"
107     fi
108
109     if [ "$CPUS" = "" ]; then
110         # Linux
111         CPUS=`getconf _NPROCESSORS_ONLN 2>/dev/null`
112     fi
113
114     if [ "$CPUS" = "" ]; then
115         # FreeBSD
116         CPUS=`getconf NPROCESSORS_ONLN 2>/dev/null`
117     fi
118
119     if [ "$CPUS" = "" ]; then
120         # nothing helped
121         CPUS="1"
122     fi
123
124     echo "using ${CPUS} CPUs" >&2
125 }
126
127 detect_cpu_count
128
129 if ! [ -d testsuite ]
130 then
131     echo 'Could not find the testsuite for validation' >&2
132     exit 1
133 fi
134
135 if [ "$THREADS" = "" ]; then
136     threads=$(($CPUS + 1)) # `expr $CPUS + 1`
137 else
138     threads="$THREADS"
139 fi
140
141 if type gmake > /dev/null 2> /dev/null
142 then
143     make="gmake"
144 else
145     make="make"
146 fi
147
148 if [ $be_quiet -eq 1 ]; then
149     # See Note [Default build system verbosity].
150     make="$make -s"
151 fi
152
153 if [ $testsuite_only -eq 0 ]; then
154
155 if [ $no_clean -eq 0 ]; then
156     $make maintainer-clean NO_CLEAN_GMP=YES
157
158     INSTDIR=`pwd`/inst
159     if [ "$OSTYPE" = "cygwin" ]
160     then
161         INSTDIR=`cygpath -m "$INSTDIR"`
162     fi
163
164     if [ $use_dph -eq 1 ]; then
165         perl -w boot --validate --required-tag=dph
166     else
167         perl -w boot --validate
168     fi
169     ./configure --prefix="$INSTDIR" $config_args
170 fi
171
172 thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd`
173
174 echo "Validating=YES"       >  mk/are-validating.mk
175 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
176 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
177
178 # Note [Default build system verbosity].
179 #
180 # From https://ghc.haskell.org/trac/ghc/wiki/Design/BuildSystem:
181 #
182 #   "The build system should clearly report what it's doing (and sometimes
183 #   why), without being too verbose. It should emit actual command lines as
184 #   much as possible, so that they can be inspected and cut & pasted."
185 #
186 # That should be the default. Only suppress commands, by setting V=0 and using
187 # `make -s`, when user explicitly asks for it with `./validate --quiet`.
188 if [ $be_quiet -eq 1 ]; then
189     # See Note [Default build system verbosity].
190     echo "V=0"                  >> mk/are-validating.mk # Less gunk
191 fi
192
193 if [ $speed != "FAST" ]; then
194     # Build the "extra" packages (see ./packages), to enable more tests.
195     echo "BUILD_EXTRA_PKGS=YES" >> mk/are-validating.mk
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=fulltest
249         BINDIST="BINDIST=YES"
250         ;;
251 NORMAL)
252         MAKE_TEST_TARGET=fasttest
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 ]; then
262     TEST_VERBOSITY="VERBOSE=1 NO_PRINT_SUMMARY=YES"
263 else
264     TEST_VERBOSITY="VERBOSE=2"
265 fi
266
267 $make $MAKE_TEST_TARGET stage=2 $BINDIST $TEST_VERBOSITY THREADS=$threads 2>&1 | tee testlog
268
269 check_packages post-testsuite
270
271 if [ "$hpc" = YES ]
272 then
273     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
274 fi
275
276 if
277     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
278     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
279     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
280     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
281     ! grep 'Some files are written by multiple tests' testsuite_summary.txt >/dev/null 2>/dev/null ; then
282     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
283     then
284         cat <<EOF
285 -------------------------------------------------------------------
286 Congratulations!  This tree has passed minimal testing.
287
288 NOTE: If you have made changes that may cause failures not tested for by
289 the minimal testing procedure, please do further testing as necessary.
290
291 When you are satisfied that you haven't broken anything, go ahead and
292 push/send your patches.
293 EOF
294         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
295         then
296             cat <<EOF
297
298 WARNING: You seem to have things set in mk/validate.mk. Please check
299 that it is OK before pushing.
300 EOF
301         fi
302         cat <<EOF
303 -------------------------------------------------------------------
304 EOF
305     else
306         cat <<EOF
307 -------------------------------------------------------------------
308 I didn't find any problems, but this wasn't a complete validate run,
309 so be careful!
310
311 NOTE: If you have made changes that may cause failures not tested for by
312 the minimal testing procedure, please do further testing as necessary.
313 -------------------------------------------------------------------
314 EOF
315    fi
316 else
317     if [ $be_quiet -eq 0 ]
318     then
319        cat <<EOF
320 -------------------------------------------------------------------
321 Oops!  Looks like you have some unexpected test results or framework failures.
322 Please fix them before pushing/sending patches.
323 -------------------------------------------------------------------
324 EOF
325     fi
326     exit 1
327 fi