Merge remote-tracking branch 'origin/master' into ghc-parmake-gsoc
[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   --normal          Default settings
22   --fast            Omit dyn way, omit binary distribution
23   --slow            Build stage2 with -DDEBUG.
24                     2008-07-01: 14% slower than the default.
25   --help            shows this usage help.
26
27   Set environment variable 'CPUS' to number of cores, to exploit
28   multiple cpu cores, e.g.
29
30     CPUS=8 ./validate
31
32 EOF
33 }
34
35 no_clean=0
36 testsuite_only=0
37 hpc=NO
38 speed=NORMAL
39
40 while [ $# -gt 0 ]
41 do
42     case "$1" in
43     --no-clean)
44         no_clean=1
45         ;;
46     --testsuite-only)
47         testsuite_only=1
48         ;;
49     --hpc)
50         hpc=YES
51         ;;
52     --slow)
53         speed=SLOW
54         ;;
55     --fast)
56         speed=FAST
57         ;;
58     --normal)
59         speed=NORMAL
60         ;;
61     --help)
62         show_help
63         exit 0;;
64     *)
65         echo "$0: unrecognized argument '$1'" >&2
66         echo "Try '$0 --help' for more information." >&2
67         exit 1;;
68     esac
69     shift
70 done
71
72 check_packages () {
73     echo "== Start $1 package check"
74     if [ "$bindistdir" = "" ]
75     then
76         inplace/bin/ghc-pkg check -v
77     else
78         "$bindistdir"/bin/ghc-pkg check -v
79     fi
80     echo "== End $1 package check"
81 }
82
83 if ! [ -d testsuite ]
84 then
85     echo 'You need the testsuite to validate' >&2
86     echo 'Run "./sync-all --testsuite get" to get it' >&2
87     exit 1
88 fi
89
90 if [ "$THREADS" = "" ]; then
91     if [ "$CPUS" = "" ]; then
92         threads=2
93     else
94         threads=$(($CPUS + 1)) # `expr $CPUS + 1`
95     fi
96 else
97     threads="$THREADS"
98 fi
99
100 if type gmake > /dev/null 2> /dev/null
101 then
102     make="gmake"
103 else
104     make="make"
105 fi
106
107 if [ $testsuite_only -eq 0 ]; then
108
109 if [ $no_clean -eq 0 ]; then
110     $make maintainer-clean NO_CLEAN_GMP=YES
111
112     INSTDIR=`pwd`/inst
113     if [ "$OSTYPE" = "cygwin" ]
114     then
115         INSTDIR=`cygpath -m "$INSTDIR"`
116     fi
117
118     /usr/bin/perl -w boot --validate --required-tag=dph
119     ./configure --prefix="$INSTDIR" $config_args
120 fi
121
122 thisdir=`utils/ghc-pwd/dist-boot/ghc-pwd`
123
124 echo "Validating=YES"       >  mk/are-validating.mk
125 echo "ValidateSpeed=$speed" >> mk/are-validating.mk
126 echo "ValidateHpc=$hpc"     >> mk/are-validating.mk
127
128 $make -j$threads
129 # For a "debug make", add "--debug=b --debug=m"
130
131 check_packages post-build
132
133 # -----------------------------------------------------------------------------
134 # Build and test a binary distribution (not --fast)
135
136 if [ $speed != "FAST" ]; then
137
138     $make binary-dist-prep
139     $make test_bindist TEST_PREP=YES
140
141     #
142     # Install the xhtml package into the bindist.
143     # This verifies that we can install a package into the
144     # bindist with Cabal.
145     #
146     bindistdir="bindisttest/install   dir"
147
148     check_packages post-install
149
150     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
151
152     check_packages post-xhtml
153 fi
154
155 fi # testsuite-only
156
157 # -----------------------------------------------------------------------------
158 # Run the testsuite
159
160 if [ "$hpc" = YES ]
161 then
162     # XXX With threads we'd need to give a different tix file to each thread
163     #     and then sum them up at the end
164     threads=1
165     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
166     export HPCTIXFILE
167     rm -f $HPCTIXFILE
168 fi
169
170 case "$speed" in
171 SLOW)
172         MAKE_TEST_TARGET=fulltest
173         BINDIST="BINDIST=YES"
174         ;;
175 NORMAL)
176         MAKE_TEST_TARGET=test
177         BINDIST="BINDIST=YES"
178         ;;
179 FAST)
180         MAKE_TEST_TARGET=test
181         BINDIST="BINDIST=NO"
182         ;;
183 esac
184
185 $make $MAKE_TEST_TARGET stage=2 $BINDIST THREADS=$threads 2>&1 | tee testlog
186
187 check_packages post-testsuite
188
189 if [ "$hpc" = YES ]
190 then
191     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
192 fi
193
194 echo "-------------------------------------------------------------------"
195 if
196     grep '\<0 caused framework failures' testlog >/dev/null 2>/dev/null &&
197     grep '\<0 unexpected passes' testlog >/dev/null 2>/dev/null &&
198     grep '\<0 unexpected failures' testlog >/dev/null 2>/dev/null &&
199     ! grep 'Some files are written by multiple tests' testlog >/dev/null 2>/dev/null ; then
200     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
201     then
202         cat <<EOF
203 Congratulations!  This tree has passed minimal testing.
204
205 NOTE: If you have made changes that may cause failures not tested for by
206 the minimal testing procedure, please do further testing as necessary.
207
208 When you are satisfied that you haven't broken anything, go ahead and
209 push/send your patches.
210 EOF
211         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
212         then
213             cat <<EOF
214
215 WARNING: You seem to have things set in mk/validate.mk. Please check
216 that it is OK before pushing.
217 EOF
218         fi
219         cat <<EOF
220 -------------------------------------------------------------------
221 EOF
222     else
223         cat <<EOF
224 I didn't find any problems, but this wasn't a complete validate run,
225 so be careful!
226
227 NOTE: If you have made changes that may cause failures not tested for by
228 the minimal testing procedure, please do further testing as necessary.
229 -------------------------------------------------------------------
230 EOF
231    fi
232 else
233     cat <<EOF
234 Oops!  Looks like you have some unexpected test results or framework failures.
235 Please fix them before pushing/sending patches.
236 -------------------------------------------------------------------
237 EOF
238     exit 1
239 fi
240