#!/bin/sh # Flags: # --no-clean: don't make clean first, just carry on from # a previous interrupted validation run # --testsuite-only: don't build the compiler, just run # the test suite # --hpc: build stage2 with -fhpc, and see how much of the # compiler the test suite covers. # 2008-07-01: 63% slower than the default. # HTML generated here: testsuite/hpc_output/hpc_index.html # --normal: Default settings # --fast: Omit dyn way, omit binary distribution # --slow: Build stage2 with -DDEBUG. # 2008-07-01: 14% slower than the default. set -e no_clean=0 testsuite_only=0 hpc=NO speed=NORMAL while [ $# -gt 0 ] do case "$1" in --no-clean) no_clean=1 ;; --testsuite-only) testsuite_only=1 ;; --hpc) hpc=YES ;; --slow) speed=SLOW ;; --fast) speed=FAST ;; --normal) speed=NORMAL ;; *) echo "Bad argument: $1" >&2 exit 1;; esac shift done if ! [ -d testsuite ] then echo 'You need the testsuite to validate' >&2 echo 'Run "./sync-all --testsuite get" to get it' >&2 exit 1 fi if [ "$THREADS" = "" ]; then if [ "$CPUS" = "" ]; then threads=2 else threads=$(($CPUS + 1)) # `expr $CPUS + 1` fi else threads="$THREADS" fi if type gmake > /dev/null 2> /dev/null then make="gmake" else make="make" fi if [ $testsuite_only -eq 0 ]; then if [ $no_clean -eq 0 ]; then $make maintainer-clean NO_CLEAN_GMP=YES INSTDIR=`pwd`/inst if [ "$OSTYPE" = "cygwin" ] then INSTDIR=`cygpath -m "$INSTDIR"` fi /usr/bin/perl -w boot --validate ./configure --prefix="$INSTDIR" $config_args fi thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd` echo "Validating=YES" > mk/are-validating.mk echo "ValidateSpeed=$speed" >> mk/are-validating.mk echo "ValidateHpc=$hpc" >> mk/are-validating.mk $make -j$threads # For a "debug make", add "--debug=b --debug=m" # ----------------------------------------------------------------------------- # Build and test a binary distribution (not --fast) if [ $speed != "FAST" ]; then $make binary-dist-prep $make test_bindist TEST_PREP=YES # # Install the mtl package into the bindist, because it is used by some # tests. It isn't essential that we do this (the failing tests will # be treated as expected failures), but we get a bit more test # coverage, and also verify that we can install a package into the # bindist with Cabal. # bindistdir="bindisttest/install dir" cd libraries/mtl "$thisdir/$bindistdir/bin/ghc" --make Setup ./Setup configure --with-ghc="$thisdir/$bindistdir/bin/ghc" --with-haddock="$thisdir/$bindistdir/bin/haddock" --global --builddir=dist-bindist --prefix="$thisdir/$bindistdir" ./Setup build --builddir=dist-bindist ./Setup haddock --builddir=dist-bindist ./Setup install --builddir=dist-bindist ./Setup clean --builddir=dist-bindist rm -f Setup Setup.exe Setup.hi Setup.o cd $thisdir fi fi # testsuite-only # ----------------------------------------------------------------------------- # Run the testsuite if [ "$hpc" = YES ] then # XXX With threads we'd need to give a different tix file to each thread # and then sum them up at the end threads=1 HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix export HPCTIXFILE rm -f $HPCTIXFILE fi case "$speed" in SLOW) MAKE_TEST_TARGET=fulltest BINDIST="BINDIST=YES" ;; NORMAL) MAKE_TEST_TARGET=test BINDIST="BINDIST=YES" ;; FAST) MAKE_TEST_TARGET=test BINDIST="BINDIST=NO" ;; esac $make $MAKE_TEST_TARGET stage=2 $BINDIST THREADS=$threads 2>&1 | tee testlog if [ "$hpc" = YES ] then utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix fi echo "-------------------------------------------------------------------" if grep '\<0 caused framework failures' testlog >/dev/null 2>/dev/null && grep '\<0 unexpected passes' testlog >/dev/null 2>/dev/null && grep '\<0 unexpected failures' testlog >/dev/null 2>/dev/null && ! grep 'Some files are written by multiple tests' testlog >/dev/null 2>/dev/null ; then if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ] then cat <