Comment only
[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 'You need the testsuite to validate' >&2
93     echo 'Run "./sync-all --testsuite get" to get it' >&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 $make -j$threads
140 # For a "debug make", add "--debug=b --debug=m"
141
142 check_packages post-build
143
144 # -----------------------------------------------------------------------------
145 # Build and test a binary distribution (not --fast)
146
147 if [ $speed != "FAST" ]; then
148
149     $make binary-dist-prep
150     $make test_bindist TEST_PREP=YES
151
152     #
153     # Install the xhtml package into the bindist.
154     # This verifies that we can install a package into the
155     # bindist with Cabal.
156     #
157     bindistdir="bindisttest/install   dir"
158
159     check_packages post-install
160
161     $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir"
162
163     check_packages post-xhtml
164 fi
165
166 fi # testsuite-only
167
168 # -----------------------------------------------------------------------------
169 # Run the testsuite
170
171 if [ "$hpc" = YES ]
172 then
173     # XXX With threads we'd need to give a different tix file to each thread
174     #     and then sum them up at the end
175     threads=1
176     HPCTIXFILE=$thisdir/testsuite/hpc_output/ghc.tix
177     export HPCTIXFILE
178     rm -f $HPCTIXFILE
179 fi
180
181 case "$speed" in
182 SLOW)
183         MAKE_TEST_TARGET=fulltest
184         BINDIST="BINDIST=YES"
185         ;;
186 NORMAL)
187         MAKE_TEST_TARGET=test
188         BINDIST="BINDIST=YES"
189         ;;
190 FAST)
191         MAKE_TEST_TARGET=test
192         BINDIST="BINDIST=NO"
193         ;;
194 esac
195
196 $make $MAKE_TEST_TARGET stage=2 $BINDIST THREADS=$threads 2>&1 | tee testlog
197
198 check_packages post-testsuite
199
200 if [ "$hpc" = YES ]
201 then
202     utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix
203 fi
204
205 echo "-------------------------------------------------------------------"
206 if
207     grep '\<0 caused framework failures' testlog >/dev/null 2>/dev/null &&
208     grep '\<0 unexpected passes' testlog >/dev/null 2>/dev/null &&
209     grep '\<0 unexpected failures' testlog >/dev/null 2>/dev/null &&
210     ! grep 'Some files are written by multiple tests' testlog >/dev/null 2>/dev/null ; then
211     if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ]
212     then
213         cat <<EOF
214 Congratulations!  This tree has passed minimal testing.
215
216 NOTE: If you have made changes that may cause failures not tested for by
217 the minimal testing procedure, please do further testing as necessary.
218
219 When you are satisfied that you haven't broken anything, go ahead and
220 push/send your patches.
221 EOF
222         if [ -f mk/validate.mk ] && grep -q "^[^#]" mk/validate.mk
223         then
224             cat <<EOF
225
226 WARNING: You seem to have things set in mk/validate.mk. Please check
227 that it is OK before pushing.
228 EOF
229         fi
230         cat <<EOF
231 -------------------------------------------------------------------
232 EOF
233     else
234         cat <<EOF
235 I didn't find any problems, but this wasn't a complete validate run,
236 so be careful!
237
238 NOTE: If you have made changes that may cause failures not tested for by
239 the minimal testing procedure, please do further testing as necessary.
240 -------------------------------------------------------------------
241 EOF
242    fi
243 else
244     cat <<EOF
245 Oops!  Looks like you have some unexpected test results or framework failures.
246 Please fix them before pushing/sending patches.
247 -------------------------------------------------------------------
248 EOF
249     exit 1
250 fi
251