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