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