Merge branch 'master' of http://darcs.haskell.org/ghc
[ghc.git] / validate
1 #!/bin/sh
2
3 # Flags:
4 #   --no-clean:       don't make clean first, just carry on from
5 #                     a previous interrupted validation run
6 #   --testsuite-only: don't build the compiler, just run
7 #                     the test suite
8 #   --hpc:            build stage2 with -fhpc, and see how much of the
9 #                     compiler the test suite covers.
10 #                     2008-07-01: 63% slower than the default.
11 #                     HTML generated here: testsuite/hpc_output/hpc_index.html
12 #   --normal:         Default settings
13 #   --fast:           Omit dyn way, omit binary distribution
14 #   --slow:           Build stage2 with -DDEBUG.
15 #                     2008-07-01: 14% slower than the default.
16
17 set -e
18
19 no_clean=0
20 testsuite_only=0
21 hpc=NO
22 speed=NORMAL
23
24 while [ $# -gt 0 ]
25 do
26     case "$1" in
27     --no-clean)
28         no_clean=1
29         ;;
30     --testsuite-only)
31         testsuite_only=1
32         ;;
33     --hpc)
34         hpc=YES
35         ;;
36     --slow)
37         speed=SLOW
38         ;;
39     --fast)
40         speed=FAST
41         ;;
42     --normal)
43         speed=NORMAL
44         ;;
45     *)
46         echo "Bad argument: $1" >&2
47         exit 1;;
48     esac
49     shift
50 done
51
52 if ! [ -d testsuite ]
53 then
54     echo 'You need the testsuite to validate' >&2
55     echo 'Run "./sync-all --testsuite get" to get it' >&2
56     exit 1
57 fi
58
59 if [ "$THREADS" = "" ]; then
60     if [ "$CPUS" = "" ]; then
61         threads=2
62     else
63         threads=$(($CPUS + 1)) # `expr $CPUS + 1`
64     fi
65 else
66     threads="$THREADS"
67 fi
68
69 if type gmake > /dev/null 2> /dev/null
70 then
71     make="gmake"
72 else
73     make="make"
74 fi
75
76 if [ $testsuite_only -eq 0 ]; then
77
78 if [ $no_clean -eq 0 ]; then
79     $make maintainer-clean NO_CLEAN_GMP=YES
80
81     INSTDIR=`pwd`/inst
82     if [ "$OSTYPE" = "cygwin" ]
83     then
84         INSTDIR=`cygpath -m "$INSTDIR"`
85     fi
86
87     /usr/bin/perl -w boot --validate --required-tag=dph
88     ./configure --prefix="$INSTDIR" $config_args
89 fi
90
91 thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd`
92
93 echo "Validating=YES"       >  mk/are-validating.mk
94 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
95 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
96
97 $make -j$threads
98 # For a "debug make", add "--debug=b --debug=m"
99
100 # -----------------------------------------------------------------------------
101 # Build and test a binary distribution (not --fast)
102
103 if [ $speed != "FAST" ]; then
104
105     $make binary-dist-prep
106     $make test_bindist TEST_PREP=YES
107
108     #
109     # Install the transformers package into the bindist, because it is
110     # used by some tests.
111     # It isn't essential that we do this (the failing tests will
112     # be treated as expected failures), but we get a bit more test
113     # coverage, and also verify that we can install a package into the
114     # bindist with Cabal.
115     #
116     bindistdir="bindisttest/install   dir"
117
118     $make validate_build_transformers BINDIST_PREFIX="$thisdir/$bindistdir"
119 fi
120
121 fi # testsuite-only
122
123 # -----------------------------------------------------------------------------
124 # Run the testsuite
125
126 if [ "$hpc" = YES ]
127 then
128     # XXX With threads we'd need to give a different tix file to each thread
129     #     and then sum them up at the end
130     threads=1
131     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
132     export HPCTIXFILE
133     rm -f $HPCTIXFILE
134 fi
135
136 case "$speed" in
137 SLOW)
138         MAKE_TEST_TARGET=fulltest
139         BINDIST="BINDIST=YES"
140         ;;
141 NORMAL)
142         MAKE_TEST_TARGET=test
143         BINDIST="BINDIST=YES"
144         ;;
145 FAST)
146         MAKE_TEST_TARGET=test
147         BINDIST="BINDIST=NO"
148         ;;
149 esac
150
151 $make $MAKE_TEST_TARGET stage=2 $BINDIST THREADS=$threads 2>&1 | tee testlog
152
153 if [ "$hpc" = YES ]
154 then
155     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
156 fi
157
158 echo "-------------------------------------------------------------------"
159 if
160     grep '\<0 caused framework failures' testlog >/dev/null 2>/dev/null &&
161     grep '\<0 unexpected passes' testlog >/dev/null 2>/dev/null &&
162     grep '\<0 unexpected failures' testlog >/dev/null 2>/dev/null &&
163     ! grep 'Some files are written by multiple tests' testlog >/dev/null 2>/dev/null ; then
164     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
165     then
166         cat <<EOF
167 Congratulations!  This tree has passed minimal testing.
168
169 NOTE: If you have made changes that may cause failures not tested for by
170 the minimal testing procedure, please do further testing as necessary.
171
172 When you are satisfied that you haven't broken anything, go ahead and
173 push/send your patches.
174 EOF
175         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
176         then
177             cat <<EOF
178
179 WARNING: You seem to have things set in mk/validate.mk. Please check
180 that it is OK before pushing.
181 EOF
182         fi
183         cat <<EOF
184 -------------------------------------------------------------------
185 EOF
186     else
187         cat <<EOF
188 I didn't find any problems, but this wasn't a complete validate run,
189 so be careful!
190
191 NOTE: If you have made changes that may cause failures not tested for by
192 the minimal testing procedure, please do further testing as necessary.
193 -------------------------------------------------------------------
194 EOF
195    fi
196 else
197     cat <<EOF
198 Oops!  Looks like you have some unexpected test results or framework failures.
199 Please fix them before pushing/sending patches.
200 -------------------------------------------------------------------
201 EOF
202     exit 1
203 fi
204