#!/bin/sh set -e show_help () { cat <&2 echo "Try '$0 --help' for more information." >&2 exit 1;; esac shift done check_packages () { if [ "$bindistdir" = "" ] then if [ "$use_hadrian" = "YES" ] then ghc_pkg=$hadrian_build_root/stage1/bin/ghc-pkg else ghc_pkg=inplace/bin/ghc-pkg fi else ghc_pkg="$bindistdir"/bin/ghc-pkg fi if [ $be_quiet -eq 1 ] then "$ghc_pkg" check else echo "== Start $1 package check" "$ghc_pkg" check -v echo "== End $1 package check" fi } CPUS=`mk/detect-cpu-count.sh` if ! [ -d testsuite ] then echo 'Could not find the testsuite for validation' >&2 exit 1 fi if [ "$THREADS" = "" ]; then threads=$(($CPUS + 1)) # `expr $CPUS + 1` else threads="$THREADS" fi echo "using THREADS=${threads}" >&2 if [ "$use_hadrian" = "NO" ] then make="gmake" if type gmake > /dev/null 2> /dev/null then make="gmake" else make="make" fi if [ $be_quiet -eq 1 ]; then # See Note [Default build system verbosity]. make="$make -s" fi $make -C utils/checkUniques else # Just build hadrian. if [ "$use_stack" = "NO" ] then hadrian/build.sh --help > /dev/null cd hadrian hadrian_cmd=$(cabal new-exec -- which hadrian) else if [ $no_clean -eq 0 ]; then rm -rf hadrian/.stack-work fi hadrian/build.stack.sh --help > /dev/null cd hadrian hadrian_cmd=$(stack exec -- which hadrian) fi cd .. # TODO: define a hadrian Flavour that mimics # mk/flavours/validate.mk and use it here # Until then, we're using the default flavour. hadrian="$hadrian_cmd -j$threads --build-root=$hadrian_build_root" if [ $be_quiet -eq 0 ]; then hadrian="$hadrian -V" fi echo "Hadrian command: $hadrian" fi if [ $testsuite_only -eq 0 ]; then thisdir=`pwd` if [ $no_clean -eq 0 ]; then if [ "$use_hadrian" = "NO" ] then $make maintainer-clean else $hadrian clean && rm -rf $hadrian_build_root fi INSTDIR="$thisdir/inst" python3 ./boot --validate ./configure --prefix="$INSTDIR" $config_args fi if [ "$use_hadrian" = "NO" ] then echo "Validating=YES" > mk/are-validating.mk echo "ValidateSpeed=$speed" >> mk/are-validating.mk echo "ValidateHpc=$hpc" >> mk/are-validating.mk # Note [Default build system verbosity]. # # From https://gitlab.haskell.org/ghc/ghc/wikis/design/build-system: # # "The build system should clearly report what it's doing (and sometimes # why), without being too verbose. It should emit actual command lines as # much as possible, so that they can be inspected and cut & pasted." # # That should be the default. Only suppress commands, by setting V=0 and using # `make -s`, when user explicitly asks for it with `./validate --quiet`. if [ $be_quiet -eq 1 ]; then # See Note [Default build system verbosity]. echo "V=0" >> mk/are-validating.mk # Less gunk fi $make -j$threads # For a "debug make", add "--debug=b --debug=m" else case $speed in SLOW) flavour=slow-validate ;; NORMAL) flavour=validate ;; FAST) flavour=validate ;; esac $hadrian --flavour=$flavour fi check_packages post-build bindistdir="bindisttest/install dir" ghc="$bindistdir/bin/ghc" # ----------------------------------------------------------------------------- # Build and test a binary distribution (not --fast) if [ $speed != "FAST" ]; then if [ "$use_hadrian" = "NO" ] then $make binary-dist-prep TAR_COMP=$tar_comp $make test_bindist TEST_PREP=YES TAR_COMP=$tar_comp else $hadrian binary-dist --docs=no-sphinx cfgdir=$(find $hadrian_build_root/bindist/ -name 'configure' | head -1) dir=$(dirname $cfgdir) cd "$dir" ./configure --prefix="$thisdir/$bindistdir" && make install cd $thisdir "$ghc" -e 'Data.Text.IO.putStrLn (Data.Text.pack "bindist test: OK")' fi check_packages post-install if [ "$use_hadrian" = "NO" ] then $make validate_build_xhtml BINDIST_PREFIX="$thisdir/$bindistdir" else cd libraries/xhtml dynamicGhc=$("../../$ghc" --info | grep "GHC Dynamic" | cut -d',' -f3 | cut -d'"' -f2) if [ "$dynamicGhc" = "NO" ] then libFlags="--enable-shared --disable-library-vanilla" else libFlags="--disable-shared --enable-library-vanilla" fi libFlags="$libFlags --disable-library-prof" "../../$ghc" --make Setup ./Setup configure \ --with-ghc="$thisdir/$ghc" \ --with-haddock="$thisdir/$bindistdir/bin/haddock" \ $libFlags \ --global --builddir=dist-bindist \ --prefix="$thisdir/$bindistdir" ./Setup build --builddir=dist-bindist ./Setup haddock -v0 --ghc-options=-optP-P --builddir=dist-bindist ./Setup install --builddir=dist-bindist ./Setup clean --builddir=dist-bindist rm -f Setup Setup.exe Setup.hi Setup.o cd ../../ fi check_packages post-xhtml fi fi # testsuite-only # ----------------------------------------------------------------------------- # Run the testsuite if [ "$build_only" -eq 1 ]; then cat <&1 | tee testlog # Run a few tests using the stage1 compiler. # See Note [Why is there no stage1 setup function?]. # Don't use BINDIST=YES, as stage1 is not available in a bindist. $make -C testsuite/tests/stage1 $PYTHON_ARG \ $MAKE_TEST_TARGET stage=1 LOCAL=0 $TEST_VERBOSITY THREADS=$threads \ NO_PRINT_SUMMARY=YES SUMMARY_FILE=../../../testsuite_summary_stage1.txt \ JUNIT_FILE=../../../testsuite_stage1.xml \ 2>&1 | tee testlog-stage1 else testghc="$thisdir/$ghc" arg="test --test-speed=$HADRIAN_TEST_SPEED \ --test-compiler=\"$testghc\" \ --summary=$thisdir/testsuite_summary.txt \ --summary-junit=$thisdir/testsuite.xml" sh -c "$hadrian $arg" # TODO: Run testsuite/tests/stage1 using the stage 1 compiler when # BINDIST=NO. fi echo echo '==== STAGE 1 TESTS ==== ' cat testsuite_summary_stage1.txt echo '==== STAGE 2 TESTS ==== ' cat testsuite_summary.txt check_packages post-testsuite if [ "$hpc" = YES ] then utils/hpc/hpc markup --hpcdir=. --srcdir=compiler --srcdir=testsuite/hpc_output --destdir=testsuite/hpc_output testsuite/hpc_output/ghc.tix fi if grep '\<0 caused framework failures' testsuite_summary.txt >/dev/null 2>/dev/null && grep '\<0 unexpected passes' testsuite_summary.txt >/dev/null 2>/dev/null && grep '\<0 unexpected failures' testsuite_summary.txt >/dev/null 2>/dev/null && grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null && grep '\<0 caused framework failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null && grep '\<0 unexpected passes' testsuite_summary_stage1.txt >/dev/null 2>/dev/null && grep '\<0 unexpected failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null && grep '\<0 unexpected stat failures' testsuite_summary_stage1.txt >/dev/null 2>/dev/null ; then if [ $testsuite_only -eq 0 ] && [ $no_clean -eq 0 ] then cat <