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