Bump terminfo to 0.4.1.4
[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 https://gitlab.haskell.org/ghc/ghc/wikis/testing-patches 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   --hadrian         Build the compiler and run the tests through hadrian.
29   --help            shows this usage help.
30
31   validate runs 'make -j\$THREADS', where by default THREADS is the number of
32   cpus your computer has +1. You can set the environment variable THREADS to
33   override this. For a sequential build you would for example use
34
35     THREADS=1 ./validate
36
37   You can set the 'config_args' environment variable to pass flags to
38   'configure'.
39
40   You can also use environment variables to pass extra options to the
41   testsuite. For example:
42
43     TEST='read001 read002' ./validate --testsuite-only --fast
44
45 EOF
46 }
47
48 no_clean=0
49 testsuite_only=0
50 build_only=0
51 hpc=NO
52 speed=NORMAL
53 be_quiet=0
54 # Validate uses gzip compression for the binary distribution to avoid the rather
55 # heavy cost of xz, which is the typical default. The options are defined in
56 # mk/config.mk.in
57 tar_comp=gzip
58 use_hadrian=NO
59
60 while [ $# -gt 0 ]
61 do
62     case "$1" in
63     --no-clean)
64         no_clean=1
65         ;;
66     --testsuite-only)
67         testsuite_only=1
68         ;;
69     --build-only)
70         build_only=1
71         ;;
72     --hpc)
73         hpc=YES
74         ;;
75     --slow)
76         speed=SLOW
77         ;;
78     --fast)
79         speed=FAST
80         ;;
81     --normal) # for backward compat
82         speed=NORMAL
83         ;;
84     --quiet)
85         be_quiet=1
86         ;;
87     --hadrian)
88         use_hadrian=YES
89         hadrian_build_root=_validatebuild
90         ;;
91     --help)
92         show_help
93         exit 0;;
94     *)
95         echo "$0: unrecognized argument '$1'" >&2
96         echo "Try '$0 --help' for more information." >&2
97         exit 1;;
98     esac
99     shift
100 done
101
102 check_packages () {
103     if [ "$bindistdir" = "" ]
104     then
105         if [ "$use_hadrian" = "YES" ]
106         then
107             ghc_pkg=$hadrian_build_root/stage1/bin/ghc-pkg
108         else
109             ghc_pkg=inplace/bin/ghc-pkg
110         fi
111     else
112         ghc_pkg="$bindistdir"/bin/ghc-pkg
113     fi
114
115     if [ $be_quiet -eq 1 ]
116     then
117         "$ghc_pkg" check
118     else
119         echo "== Start $1 package check"
120         "$ghc_pkg" check -v
121         echo "== End $1 package check"
122     fi
123 }
124
125 CPUS=`mk/detect-cpu-count.sh`
126
127 if ! [ -d testsuite ]
128 then
129     echo 'Could not find the testsuite for validation' >&2
130     exit 1
131 fi
132
133 if [ "$THREADS" = "" ]; then
134     threads=$(($CPUS + 1)) # `expr $CPUS + 1`
135 else
136     threads="$THREADS"
137 fi
138
139 echo "using THREADS=${threads}" >&2
140
141 if [ "$use_hadrian" = "NO" ]
142 then
143     make="gmake"
144    if type gmake > /dev/null 2> /dev/null
145    then
146        make="gmake"
147    else
148        make="make"
149    fi
150    if [ $be_quiet -eq 1 ]; then
151        # See Note [Default build system verbosity].
152        make="$make -s"
153    fi
154    $make -C utils/checkUniques
155 else
156     # Just build hadrian.
157     hadrian/build.sh --help > /dev/null
158     cd hadrian
159     hadrian_cmd=$(cabal new-exec -- which hadrian)
160     cd ..
161     # TODO: define a hadrian Flavour that mimics
162     # mk/flavours/validate.mk and use it here
163     # Until then, we're using the default flavour.
164     hadrian="$hadrian_cmd -j$threads --build-root=$hadrian_build_root"
165     if [ $be_quiet -eq 0 ]; then
166         hadrian="$hadrian -V"
167     fi
168     echo "Hadrian command: $hadrian"
169 fi
170
171 if [ $testsuite_only -eq 0 ]; then
172
173 thisdir=`pwd`
174
175 if [ $no_clean -eq 0 ]; then
176     if [ "$use_hadrian" = "NO" ]
177     then
178         $make maintainer-clean
179     else
180         $hadrian clean && rm -rf $hadrian_build_root
181     fi
182
183     INSTDIR="$thisdir/inst"
184
185     python3 ./boot --validate
186     ./configure --prefix="$INSTDIR" $config_args
187 fi
188
189 if [ "$use_hadrian" = "NO" ]
190 then
191     echo "Validating=YES"       >  mk/are-validating.mk
192     echo "ValidateSpeed=$speed" >> mk/are-validating.mk
193     echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
194
195     # Note [Default build system verbosity].
196     #
197     # From https://gitlab.haskell.org/ghc/ghc/wikis/design/build-system:
198     #
199     #   "The build system should clearly report what it's doing (and sometimes
200     #   why), without being too verbose. It should emit actual command lines as
201     #   much as possible, so that they can be inspected and cut & pasted."
202     #
203     # That should be the default. Only suppress commands, by setting V=0 and using
204     # `make -s`, when user explicitly asks for it with `./validate --quiet`.
205     if [ $be_quiet -eq 1 ]; then
206         # See Note [Default build system verbosity].
207         echo "V=0"                  >> mk/are-validating.mk # Less gunk
208     fi
209
210     $make -j$threads
211     # For a "debug make", add "--debug=b --debug=m"
212 else
213     # TODO: define a hadrian Flavour that mimics
214     # mk/flavours/validate.mk and use it here
215     $hadrian
216 fi
217
218 check_packages post-build
219
220 bindistdir="bindisttest/install   dir"
221 ghc="$bindistdir/bin/ghc"
222
223 # -----------------------------------------------------------------------------
224 # Build and test a binary distribution (not --fast)
225
226 if [ $speed != "FAST" ]; then
227     if [ "$use_hadrian" = "NO" ]
228     then
229         $make binary-dist-prep TAR_COMP=$tar_comp
230         $make test_bindist TEST_PREP=YES TAR_COMP=$tar_comp
231     else
232         $hadrian binary-dist --docs=no-sphinx
233         cfgdir=$(find $hadrian_build_root/bindist/ -name 'configure' | head -1)
234         dir=$(dirname $cfgdir)
235         cd "$dir"
236         ./configure --prefix="$thisdir/$bindistdir" && make install
237         cd $thisdir
238         "$ghc" -e 'Data.Text.IO.putStrLn (Data.Text.pack "bindist test: OK")'
239     fi
240
241     check_packages post-install
242
243     if [ "$use_hadrian" = "NO" ]
244     then
245         $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
246     else
247         cd libraries/xhtml
248         dynamicGhc=$("../../$ghc" --info | grep "GHC Dynamic" | cut -d',' -f3 | cut -d'"' -f2)
249         if [ "$dynamicGhc" = "NO" ]
250         then
251             libFlags="--enable-shared --disable-library-vanilla"
252         else
253             libFlags="--disable-shared --enable-library-vanilla"
254         fi
255         libFlags="$libFlags --disable-library-prof"
256
257        "../../$ghc" --make Setup
258        ./Setup configure \
259             --with-ghc="$thisdir/$ghc" \
260             --with-haddock="$thisdir/$bindistdir/bin/haddock" \
261             $libFlags \
262                     --global --builddir=dist-bindist \
263                     --prefix="$thisdir/$bindistdir"
264             ./Setup build --builddir=dist-bindist
265             ./Setup haddock -v0 --ghc-options=-optP-P --builddir=dist-bindist
266             ./Setup install --builddir=dist-bindist
267             ./Setup clean --builddir=dist-bindist
268             rm -f Setup Setup.exe Setup.hi Setup.o
269             cd ../../
270     fi
271
272     check_packages post-xhtml
273 fi
274
275 fi # testsuite-only
276
277 # -----------------------------------------------------------------------------
278 # Run the testsuite
279
280 if [ "$build_only" -eq 1 ]; then
281     cat <<EOF
282 -------------------------------------------------------------------
283 Congratulations!  This tree has compiled successfully.
284
285 You can now test your new compiler using ./validate --testsuite-only.
286 EOF
287     exit 0
288 fi
289
290 if [ "$hpc" = YES ]
291 then
292     # XXX With threads we'd need to give a different tix file to each thread
293     #     and then sum them up at the end
294     threads=1
295     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
296     export HPCTIXFILE
297     rm -f $HPCTIXFILE
298 fi
299
300 case "$speed" in
301 SLOW)
302         MAKE_TEST_TARGET=slowtest
303         BINDIST="BINDIST=YES"
304         HADRIAN_TEST_SPEED=slow
305         ;;
306 NORMAL)
307         MAKE_TEST_TARGET=test
308         BINDIST="BINDIST=YES"
309         HADRIAN_TEST_SPEED=normal
310         ;;
311 FAST)
312         MAKE_TEST_TARGET=fasttest
313         BINDIST="BINDIST=NO"
314         HADRIAN_TEST_SPEED=fast
315         ;;
316 esac
317
318 if [ $be_quiet -eq 1 ] && [ -z $VERBOSE ]; then
319     TEST_VERBOSITY="VERBOSE=1"
320 fi
321
322 # We need to be quite picky on Windows about which Python interpreter we use
323 # (#12554, #12661). Allow the user to override it.
324 if [ "z$PYTHON" != "z" ]; then
325     PYTHON_ARG="PYTHON=$PYTHON"
326 fi
327
328 rm -f testsuite_summary.txt testsuite_summary_stage1.txt
329
330 if [ "$use_hadrian" = "NO" ]
331 then
332     # Use LOCAL=0, see Note [Running tests in /tmp].
333     $make -C testsuite/tests $BINDIST $PYTHON_ARG \
334           $MAKE_TEST_TARGET stage=2 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \
335           NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../testsuite_summary.txt \
336           JUNIT_FILE=../../testsuite.xml \
337           2>&1 | tee testlog
338
339     # Run a few tests using the stage1 compiler.
340     # See Note [Why is there no stage1 setup function?].
341     # Don't use BINDIST=YES, as stage1 is not available in a bindist.
342     $make -C testsuite/tests/stage1 $PYTHON_ARG \
343           $MAKE_TEST_TARGET stage=1 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \
344           NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../../testsuite_summary_stage1.txt \
345           JUNIT_FILE=../../../testsuite_stage1.xml \
346           2>&1 | tee testlog-stage1
347 else
348     testghc="$thisdir/$ghc"
349     arg="test --test-speed=$HADRIAN_TEST_SPEED \
350               --test-compiler=\"$testghc\" \
351               --summary=$thisdir/testsuite_summary.txt \
352               --summary-junit=$thisdir/testsuite.xml"
353     sh -c "$hadrian $arg"
354     # TODO: Run testsuite/tests/stage1 using the stage 1 compiler when
355     # BINDIST=NO.
356 fi
357
358 echo
359 echo '==== STAGE 1 TESTS ==== '
360 cat testsuite_summary_stage1.txt
361
362 echo '==== STAGE 2 TESTS ==== '
363 cat testsuite_summary.txt
364
365 check_packages post-testsuite
366
367 if [ "$hpc" = YES ]
368 then
369     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
370 fi
371
372 if
373     grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
374     grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null &&
375     grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
376     grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null &&
377
378     grep '\<0 caused framework failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
379     grep '\<0 unexpected passes' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
380     grep '\<0 unexpected failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null &&
381     grep '\<0 unexpected stat failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null ; then
382
383     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
384     then
385         cat <<EOF
386 -------------------------------------------------------------------
387 Congratulations!  This tree has passed minimal testing.
388
389 NOTE: If you have made changes that may cause failures not tested for by
390 the minimal testing procedure, please do further testing as necessary.
391
392 When you are satisfied that you haven't broken anything, go ahead and
393 push/send your patches.
394 EOF
395         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
396         then
397             cat <<EOF
398
399 WARNING: You seem to have things set in mk/validate.mk. Please check
400 that it is OK before pushing.
401 EOF
402         fi
403         cat <<EOF
404 -------------------------------------------------------------------
405 EOF
406     else
407         cat <<EOF
408 -------------------------------------------------------------------
409 I didn't find any problems, but this wasn't a complete validate run,
410 so be careful!
411
412 NOTE: If you have made changes that may cause failures not tested for by
413 the minimal testing procedure, please do further testing as necessary.
414 -------------------------------------------------------------------
415 EOF
416    fi
417 else
418     if [ $be_quiet -eq 0 ]
419     then
420        cat <<EOF
421 -------------------------------------------------------------------
422 Oops!  Looks like you have some unexpected test results or framework failures.
423 Please fix them before pushing/sending patches.
424 -------------------------------------------------------------------
425 EOF
426     fi
427     exit 1
428 fi