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