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