CircleCI: Fix check for git push retry limit.
[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   --build-only      don't test the compiler, just build it
18   --hpc             build stage2 with -fhpc, and see how much of the
19                     compiler the test suite covers.
20                     2008-07-01: 63% slower than the default.
21                     HTML generated here: testsuite/hpc_output/hpc_index.html
22   --fast            Omit binary distribution. Omit certain tests.
23   --slow            Build stage2 with -DDEBUG. Run tests for all WAYS,
24                     but skip those that call compiler_stats_num_field.
25                     2008-07-01: 14% slower than the default.
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 set the 'config_args' environment variable to pass flags to
37   'configure'.
38
39   You can also use environment variables to pass extra options to the
40   testsuite. For example:
41
42     TEST='read001 read002' ./validate --testsuite-only --fast
43
44 EOF
45 }
46
47 no_clean=0
48 testsuite_only=0
49 build_only=0
50 hpc=NO
51 speed=NORMAL
52 be_quiet=0
53 # Validate uses gzip compression for the binary distribution to avoid the rather
54 # heavy cost of xz, which is the typical default. The options are defined in
55 # mk/config.mk.in
56 tar_comp=gzip
57
58 while [ $# -gt 0 ]
59 do
60     case "$1" in
61     --no-clean)
62         no_clean=1
63         ;;
64     --testsuite-only)
65         testsuite_only=1
66         ;;
67     --build-only)
68         build_only=1
69         ;;
70     --hpc)
71         hpc=YES
72         ;;
73     --slow)
74         speed=SLOW
75         ;;
76     --fast)
77         speed=FAST
78         ;;
79     --normal) # for backward compat
80         speed=NORMAL
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 CPUS=`mk/detect-cpu-count.sh`
115
116 if ! [ -d testsuite ]
117 then
118     echo 'Could not find the testsuite for validation' >&2
119     exit 1
120 fi
121
122 if [ "$THREADS" = "" ]; then
123     threads=$(($CPUS + 1)) # `expr $CPUS + 1`
124 else
125     threads="$THREADS"
126 fi
127
128 echo "using THREADS=${threads}" >&2
129
130 if type gmake > /dev/null 2> /dev/null
131 then
132     make="gmake"
133 else
134     make="make"
135 fi
136
137 if [ $be_quiet -eq 1 ]; then
138     # See Note [Default build system verbosity].
139     make="$make -s"
140 fi
141
142 $make -C utils/checkUniques
143
144 if [ $testsuite_only -eq 0 ]; then
145
146 thisdir=`pwd`
147
148 if [ $no_clean -eq 0 ]; then
149     $make maintainer-clean
150
151     INSTDIR="$thisdir/inst"
152
153     python3 ./boot --validate
154     ./configure --prefix="$INSTDIR" $config_args
155 fi
156
157 echo "Validating=YES"       >  mk/are-validating.mk
158 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
159 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
160
161 # Note [Default build system verbosity].
162 #
163 # From https://ghc.haskell.org/trac/ghc/wiki/Design/BuildSystem:
164 #
165 #   "The build system should clearly report what it's doing (and sometimes
166 #   why), without being too verbose. It should emit actual command lines as
167 #   much as possible, so that they can be inspected and cut & pasted."
168 #
169 # That should be the default. Only suppress commands, by setting V=0 and using
170 # `make -s`, when user explicitly asks for it with `./validate --quiet`.
171 if [ $be_quiet -eq 1 ]; then
172     # See Note [Default build system verbosity].
173     echo "V=0"                  >> mk/are-validating.mk # Less gunk
174 fi
175
176 $make -j$threads
177 # For a "debug make", add "--debug=b --debug=m"
178
179 check_packages post-build
180
181 # -----------------------------------------------------------------------------
182 # Build and test a binary distribution (not --fast)
183
184 if [ $speed != "FAST" ]; then
185
186     $make binary-dist-prep TAR_COMP=$tar_comp
187     $make test_bindist TEST_PREP=YES TAR_COMP=$tar_comp
188
189     #
190     # Install the xhtml package into the bindist.
191     # This verifies that we can install a package into the
192     # bindist with Cabal.
193     #
194     bindistdir="bindisttest/install   dir"
195
196     check_packages post-install
197
198     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
199
200     check_packages post-xhtml
201 fi
202
203 fi # testsuite-only
204
205 # -----------------------------------------------------------------------------
206 # Run the testsuite
207
208 if [ "$build_only" -eq 1 ]; then
209     cat <<EOF
210 -------------------------------------------------------------------
211 Congratulations!  This tree has compiled successfully.
212
213 You can now test your new compiler using ./validate --testsuite-only.
214 EOF
215     exit 0
216 fi
217
218 if [ "$hpc" = YES ]
219 then
220     # XXX With threads we'd need to give a different tix file to each thread
221     #     and then sum them up at the end
222     threads=1
223     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
224     export HPCTIXFILE
225     rm -f $HPCTIXFILE
226 fi
227
228 case "$speed" in
229 SLOW)
230         MAKE_TEST_TARGET=slowtest
231         BINDIST="BINDIST=YES"
232         ;;
233 NORMAL)
234         MAKE_TEST_TARGET=test
235         BINDIST="BINDIST=YES"
236         ;;
237 FAST)
238         MAKE_TEST_TARGET=fasttest
239         BINDIST="BINDIST=NO"
240         ;;
241 esac
242
243 if [ $be_quiet -eq 1 ] && [ -z $VERBOSE ]; then
244     TEST_VERBOSITY="VERBOSE=1"
245 fi
246
247 # We need to be quite picky on Windows about which Python interpreter we use
248 # (#12554, #12661). Allow the user to override it.
249 if [ "z$PYTHON" != "z" ]; then
250     PYTHON_ARG="PYTHON=$PYTHON"
251 fi
252
253 rm -f testsuite_summary.txt testsuite_summary_stage1.txt
254
255 # Use LOCAL=0, see Note [Running tests in /tmp].
256 $make -C testsuite/tests $BINDIST $PYTHON_ARG \
257       $MAKE_TEST_TARGET stage=2 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \
258       NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../testsuite_summary.txt \
259       JUNIT_FILE=../../testsuite.xml \
260       2>&1 | tee testlog
261
262 # Run a few tests using the stage1 compiler.
263 # See Note [Why is there no stage1 setup function?].
264 # Don't use BINDIST=YES, as stage1 is not available in a bindist.
265 $make -C testsuite/tests/stage1 $PYTHON_ARG \
266       $MAKE_TEST_TARGET stage=1 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \
267       NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../../testsuite_summary_stage1.txt \
268       JUNIT_FILE=../../../testsuite_stage1.xml \
269       2>&1 | tee testlog-stage1
270
271 echo
272 echo '==== STAGE 1 TESTS ==== '
273 cat testsuite_summary_stage1.txt
274
275 echo '==== STAGE 2 TESTS ==== '
276 cat testsuite_summary.txt
277
278 check_packages post-testsuite
279
280 if [ "$hpc" = YES ]
281 then
282     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
283 fi
284
285 if
286     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
287     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
288     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
289     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
290
291     grep '\<0 caused framework failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
292     grep '\<0 unexpected passes' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
293     grep '\<0 unexpected failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
294     grep '\<0 unexpected stat failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null ; then
295
296     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
297     then
298         cat <<EOF
299 -------------------------------------------------------------------
300 Congratulations!  This tree has passed minimal testing.
301
302 NOTE: If you have made changes that may cause failures not tested for by
303 the minimal testing procedure, please do further testing as necessary.
304
305 When you are satisfied that you haven't broken anything, go ahead and
306 push/send your patches.
307 EOF
308         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
309         then
310             cat <<EOF
311
312 WARNING: You seem to have things set in mk/validate.mk. Please check
313 that it is OK before pushing.
314 EOF
315         fi
316         cat <<EOF
317 -------------------------------------------------------------------
318 EOF
319     else
320         cat <<EOF
321 -------------------------------------------------------------------
322 I didn't find any problems, but this wasn't a complete validate run,
323 so be careful!
324
325 NOTE: If you have made changes that may cause failures not tested for by
326 the minimal testing procedure, please do further testing as necessary.
327 -------------------------------------------------------------------
328 EOF
329    fi
330 else
331     if [ $be_quiet -eq 0 ]
332     then
333        cat <<EOF
334 -------------------------------------------------------------------
335 Oops!  Looks like you have some unexpected test results or framework failures.
336 Please fix them before pushing/sending patches.
337 -------------------------------------------------------------------
338 EOF
339     fi
340     exit 1
341 fi