Testsuite: delete old cleanup code (#11980)
[ghc.git] / testsuite / mk / test.mk
index 644de5a..ccaf0f8 100644 (file)
@@ -44,6 +44,13 @@ TEST_HC_OPTS = -fforce-recomp -dcore-lint -dcmm-lint -dno-debug-output -no-user-
 #
 TEST_HC_OPTS += -fno-warn-tabs
 
+ifeq "$(MinGhcVersion711)" "YES"
+# Don't warn about missing specialisations. They can only occur with `-O`, but
+# we want tests to produce the same output for all test ways.
+TEST_HC_OPTS += -fno-warn-missed-specialisations
+TEST_HC_OPTS += -fshow-warning-groups 
+endif
+
 RUNTEST_OPTS =
 
 ifeq "$(filter $(TargetOS_CPP), cygwin32 mingw32)" ""
@@ -143,11 +150,11 @@ endif
 
 ifeq "$(LLC)" ""
 RUNTEST_OPTS += -e ghc_with_llvm=0
+else ifeq "$(TargetARCH_CPP)" "powerpc"
+RUNTEST_OPTS += -e ghc_with_llvm=0
 else ifneq "$(LLC)" "llc"
 # If we have a real detected value for LLVM, then it really ought to work
 RUNTEST_OPTS += -e ghc_with_llvm=1
-else ifneq "$(shell $(SHELL) -c 'llc --version | grep version' 2> /dev/null)" ""
-RUNTEST_OPTS += -e ghc_with_llvm=1
 else
 RUNTEST_OPTS += -e ghc_with_llvm=0
 endif
@@ -182,10 +189,12 @@ ifeq "$(SKIP_PERF_TESTS)" "YES"
 RUNTEST_OPTS += --skip-perf-tests
 endif
 
-ifneq "$(CLEAN_ONLY)" ""
-RUNTEST_OPTS += -e clean_only=True
+ifeq "$(CLEANUP)" "0"
+RUNTEST_OPTS += -e cleanup=False
+else ifeq "$(CLEANUP)" "NO"
+RUNTEST_OPTS += -e cleanup=False
 else
-RUNTEST_OPTS += -e clean_only=False
+RUNTEST_OPTS += -e cleanup=True
 endif
 
 ifneq "$(CHECK_FILES_WRITTEN)" ""
@@ -200,7 +209,6 @@ RUNTEST_OPTS +=  \
        -e 'config.os="$(TargetOS_CPP)"' \
        -e 'config.arch="$(TargetARCH_CPP)"' \
        -e 'config.wordsize="$(WORDSIZE)"' \
-       -e 'default_testopts.cleanup="$(CLEANUP)"' \
        -e 'config.timeout=int($(TIMEOUT)) or config.timeout' \
        -e 'config.exeext="$(exeext)"' \
        -e 'config.top="$(TOP_ABS)"'
@@ -243,10 +251,14 @@ else
 set_list_broken = 
 endif
 
-ifeq "$(fast)" "YES"
-setfast = -e config.fast=1
+# See Note [validate and testsuite speed] in toplevel Makefile.
+ifneq "$(SPEED)" ""
+setspeed = -e config.speed="$(SPEED)"
+else ifeq "$(fast)" "YES"
+# Backward compatibility. Maybe some people are running 'make accept fast=YES'?
+setspeed = -e config.speed=2
 else
-setfast = 
+setspeed =
 endif
 
 ifeq "$(accept)" "YES"
@@ -255,11 +267,7 @@ else
 setaccept = 
 endif
 
-TESTS       = 
-TEST        = 
-WAY =
-
-.PHONY: all boot test verbose accept fast list_broken
+.PHONY: all boot test verbose accept fast slow list_broken
 
 all: test
 
@@ -271,14 +279,17 @@ $(TIMEOUT_PROGRAM) :
        @echo "Looks like you don't have timeout, building it first..."
        $(MAKE) -C $(TOP)/timeout all
 
+# Use a '+' to make sure that any sub-MAKEs that python spawns can
+# communicate with the topmake.
+# See Note [Communicating options and variables to a submake]
 test: $(TIMEOUT_PROGRAM)
-       $(PYTHON) $(RUNTESTS) $(RUNTEST_OPTS) \
+       +$(PYTHON) $(RUNTESTS) $(RUNTEST_OPTS) \
                $(patsubst %, --only=%, $(TEST)) \
                $(patsubst %, --only=%, $(TESTS)) \
                $(patsubst %, --way=%, $(WAY)) \
                $(patsubst %, --skipway=%, $(SKIPWAY)) \
                $(set_list_broken) \
-               $(setfast) \
+               $(setspeed) \
                $(setaccept)
 
 verbose: test
@@ -287,8 +298,74 @@ accept:
        $(MAKE) accept=YES
 
 fast:
-       $(MAKE) fast=YES
+       # See Note [validate and testsuite speed] in toplevel Makefile.
+       $(MAKE) SPEED=2
+
+slow:
+       $(MAKE) SPEED=0
 
 list_broken:
        $(MAKE) list_broken=YES
 
+# Note [Communicating options and variables to a submake]
+#
+# Consider the following scenario:
+#   * A test foo is defined as
+#     test('foo', [], run_command, ['$MAKE footarget'])
+#   * A user calls 'make -j24 TEST=foo'
+#
+# What happens is something like this:
+#   * make (topmake) reads all options and variables given on the commandline
+#     and adds them to the variable MAKEFLAGS [1]. This variable is exported by
+#     default [1], so submakes can use them.
+#   * The 'test' target calls 'python ..'
+#   * Python calls 'make footarget' (submake)
+#
+# **First question**: what happens to the '-j24' option when calling make
+# recursively?
+#
+# From
+# https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html:
+#
+#     "The '-j' option is a special case (see Parallel Execution). If you set
+#     it to some numeric value 'N' and your operating system supports it (most
+#     any UNIX system will; others typically won't), the parent make and all the
+#     sub-makes will communicate to ensure that there are only 'N' jobs running
+#     at the same time between them all."
+#
+# In our scenario, the user will actually see the following warning [2]:
+#
+#     'warning: jobserver unavailable: using -j1. Add '+' to parent make rule.'
+#
+# The problem is that topmake and submake don't know about eachother, since
+# python is in between. To let them communicate, we have to use the '+'
+# option, by calling '+python' instead of 'python' [2]. This works,
+# magically, and fixes #11569.
+#
+# **Second question**: can't we just unexport MAKEFLAGS, instead of using
+# that '+' trick? The testsuite driver (python) mangages parallelism by
+# itself already, so '-j24' doesn't do the right thing anyway. You have to
+# use 'make test THREADS=24'. Unexporting MAKEFLAGS would mean ignoring
+# any '-j' flags passed to make (either from the user calling 'make -j'
+# explicitly or from having MAKEFLAGS=-j set in the shell, see #11569).
+#
+# This almost works, except when calling 'make fast/slow/accept TEST_HC=ghc'
+# instead of just 'make test'. These targets call 'make test FAST=YES'
+# recursively (and 'make test' calls python, as before).
+#
+# The problem is that in boilerplate.mk we try to override the variable
+# TEST_HC (See Note [The TEST_HC variable]). Somewhere somehow this
+# information (of us wanting to update TEST_HC) gets lost in the process,
+# resulting in the final TEST_HC always getting set to the inplace compiler.
+# It seems possible to remedy this yet again by exporting TEST_HC explicitly,
+# but I didn't understand nor test it thoroughly (what about the other
+# variables we override, see calls to canonicalise), and the '+' trick seems
+# to work at least equally well (just don't run something like
+# 'make test fast slow accept').
+#
+# Tests:
+# * `make TEST=T3307 -j2` should not show a warning.
+# * `make TEST=tc001 TEST_HC=ghc fast` should not use the inplace compiler.
+#
+# [1] https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html
+# [2] https://www.gnu.org/software/make/manual/html_node/Error-Messages.html