#!/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 ghc_pkg=$basedir/$hadrian_build_root/stage1/bin/ghc-pkg else ghc_pkg=$basedir/$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 } if ! [ -d testsuite ]; then echo 'Could not find the testsuite for validation' >&2 exit 1 fi CPUS=$(mk/detect-cpu-count.sh) # Use CPU cores + 1 if not already set threads=${THREADS:-$((CPUS + 1))} echo "using THREADS=${threads}" >&2 configure_cmd="./configure" # Figure out name of `make`, needed to install binary distributions 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 # Set up configuration, commands for building if [ "$use_stack" = "NO" ]; then hadrian/build --help > /dev/null echo "Entering ./hadrian directory..." cd hadrian hadrian_cmd=$(cabal new-exec -- which hadrian | grep 'hadrian$') else if [ $no_clean -eq 0 ]; then rm -rf hadrian/.stack-work fi hadrian/build-stack --help > /dev/null echo "Entering ./hadrian directory..." cd hadrian hadrian_cmd=$(stack exec -- which hadrian) configure_cmd="stack --stack-yaml hadrian/stack.yaml exec -- ./configure" fi cd .. echo "Back to $basedir" echo "Hadrian configure command: $configure_cmd" hadrian="$hadrian_cmd -j$threads --build-root=$hadrian_build_root" if [ $be_quiet -eq 0 ]; then hadrian="$hadrian -V" fi echo "Hadrian command: $hadrian" # For details of the following flavours, refer to # ./hadrian/src/Settings/Flavours case $speed in SLOW) flavour=slow-validate ;; NORMAL) flavour=validate ;; FAST) flavour=quick-validate ;; esac if [ $build_only -eq 1 ] || { [ $build_only -eq 0 ] && [ $testsuite_only -eq 0 ]; }; then if [ $no_clean -eq 0 ]; then $hadrian clean && rm -rf $hadrian_build_root python3 ./boot $configure_cmd --enable-tarballs-autodownload $CONFIG_ARGS fi if [ $debugging -eq 1 ]; then hadrian="$hadrian --debug" fi $hadrian --flavour=$flavour check_packages post-build # ------------------------------------------------------------------------- # Build a binary distribution (not --fast) if [ $speed != "FAST" ]; then # Set bindistdir only when a binary distribution is built bindistdir="bindisttest/install dir" ghc="$basedir/$bindistdir/bin/ghc" $hadrian binary-dist --docs=no-sphinx cfgdir="$(dirname "$(find $hadrian_build_root/bindist/ -name 'configure' | head -1)")" cd "$cfgdir" ./configure --prefix="$basedir/$bindistdir" && make install cd "$basedir" "$ghc" -e 'Data.Text.IO.putStrLn (Data.Text.pack "bindist test: OK")' check_packages post-install cd "$basedir/libraries/xhtml" dynamicGhc=$("$ghc" --info | grep "GHC Dynamic" | cut -d',' -f3 | cut -d'"' -f2) if [ "$dynamicGhc" = "NO" ]; then libFlags="--disable-shared --enable-library-vanilla" else libFlags="--enable-shared --disable-library-vanilla" fi libFlags="$libFlags --disable-library-prof" "$ghc" --make Setup # shellcheck disable=SC2086 ./Setup configure \ --with-ghc="$ghc" \ --with-haddock="$basedir/$bindistdir/bin/haddock" $libFlags \ --global --builddir=dist-bindist \ --prefix="$basedir/$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 "$basedir" check_packages post-xhtml fi if [ $build_only -eq 1 ]; then cat </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; then no_hadrian_stage_2_failures=1 if [ "$BINDIST" = "NO" ]; then 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; no_hadrian_stage_1_failures=1 fi if [ "$BINDIST" = "NO" ]; then no_hadrian_test_failures=$no_hadrian_stage_1_failures && $no_hadrian_stage_2_failures else no_hadrian_test_failures=$no_hadrian_stage_2_failures fi fi if grep '\<0 unexpected stat failures' testsuite_summary.txt >/dev/null 2>/dev/null; then no_hadrian_perf_test_failures=1 fi if [ $no_hadrian_test_failures ] || [ $no_make_test_failures ]; then if [ $no_hadrian_perf_test_failures -eq 1 ] || [ $no_make_perf_test_failures -eq 1 ]; then if [ "$ignore_perf_all" = "YES" ] || [ "$ignore_perf_increases" = "YES" ] || [ "$ignore_perf_decreases" = "YES" ]; then cat <