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