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