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