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