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