diff --git a/libraries/base/tests/IO/T12010/test.T b/libraries/base/tests/IO/T12010/test.T
index 73dac44c47ae326926672221ba9bb0b232888385..43403abe31f57812967815754ea1c8338bf39666 100644
--- a/libraries/base/tests/IO/T12010/test.T
+++ b/libraries/base/tests/IO/T12010/test.T
@@ -4,5 +4,4 @@ test('T12010',
         only_ways(['threaded1']),
         extra_ways(['threaded1']),
         cmd_prefix('WAY_FLAGS="' + ' '.join(config.way_flags['threaded1']) + '"')],
-     run_command,
-     ['$MAKE -s --no-print-directory T12010'])
+     makefile_test, [])
diff --git a/libraries/base/tests/IO/all.T b/libraries/base/tests/IO/all.T
index dba0e5e3d72713ddca47237ed297d7cc1a582fb1..1912be7c9405713ad571791f268dc2dafc9e8033 100644
--- a/libraries/base/tests/IO/all.T
+++ b/libraries/base/tests/IO/all.T
@@ -89,14 +89,14 @@ test('hDuplicateTo001', [], compile_and_run, [''])
 test('countReaders001', [], compile_and_run, [''])
 
 test('concio001', [normal, multi_cpu_race],
-     run_command, ['$MAKE -s --no-print-directory test.concio001'])
+     makefile_test, ['test.concio001'])
 test('concio001.thr', [extra_files(['concio001.hs']), multi_cpu_race],
-     run_command, ['$MAKE -s --no-print-directory test.concio001.thr'])
+     makefile_test, ['test.concio001.thr'])
 
 test('concio002', reqlib('process'), compile_and_run, [''])
 
 test('T2122', [], compile_and_run, [''])
-test('T3307', [], run_command, ['$MAKE -s --no-print-directory T3307-test'])
+test('T3307', [], makefile_test, ['T3307-test'])
 test('T4855', normal, compile_and_run, [''])
 
 test('hSetEncoding001',extra_run_opts('hSetEncoding001.in'), compile_and_run, [''])
@@ -118,8 +118,7 @@ test('encoding003', normal, compile_and_run, [''])
 test('encoding004', extra_files(['encoded-data/']), compile_and_run, [''])
 test('encoding005', normal, compile_and_run, [''])
 
-test('environment001', [], run_command,
-     ['$MAKE -s --no-print-directory environment001-test'])
+test('environment001', [], makefile_test, ['environment001-test'])
 
 test('newline001', [], compile_and_run, [''])
 
diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index d29024ddc05d3610767c002742fa87b99a41e305..040e674312eb1ddc506bb8bd9876ba6069c91c8d 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -896,7 +896,7 @@ def do_test(name, way, func, args, files):
                 framework_fail(name, way,
                     'extra_file does not exist: ' + extra_file)
 
-    if func.__name__ == 'run_command' or opts.pre_cmd:
+    if func.__name__ == 'run_command' or func.__name__ == 'makefile_test' or opts.pre_cmd:
         # When running 'MAKE' make sure 'TOP' still points to the
         # root of the testsuite.
         src_makefile = in_srcdir('Makefile')
diff --git a/testsuite/tests/annotations/should_compile/th/all.T b/testsuite/tests/annotations/should_compile/th/all.T
index 368959b906f688fbe7225f0ef46dded919ff89e2..6975b8de010c378898a07c3d5f3aab1e84994144 100644
--- a/testsuite/tests/annotations/should_compile/th/all.T
+++ b/testsuite/tests/annotations/should_compile/th/all.T
@@ -6,9 +6,9 @@
 test('annth_make',
      [extra_files(['AnnHelper.hs', 'TestModule.hs', 'TestModuleTH.hs', 'annth.hs']),
       req_interp, omit_ways(prof_ways), unless(have_dynamic(), skip)],
-     run_command, ['$MAKE -s --no-print-directory annth_make'])
+     makefile_test, ['annth_make'])
 
 test('annth_compunits',
      [extra_files(['AnnHelper.hs', 'TestModule.hs', 'TestModuleTH.hs', 'annth.hs']),
       req_interp, omit_ways(prof_ways), unless(have_dynamic(), skip)],
-     run_command, ['$MAKE -s --no-print-directory annth_compunits'])
+     makefile_test, ['annth_compunits'])
diff --git a/testsuite/tests/cabal/T12485/all.T b/testsuite/tests/cabal/T12485/all.T
index 709943c96e5083c3966e736775fbd032a2699ee3..c8d217e366d7b55d61cef2a207445165cfe5fae4 100644
--- a/testsuite/tests/cabal/T12485/all.T
+++ b/testsuite/tests/cabal/T12485/all.T
@@ -1 +1 @@
-test('T12485', [extra_files(['a.pkg', 'b.pkg', 'Main.hs'])], run_command, ['$MAKE -s --no-print-directory T12485'])
+test('T12485', [extra_files(['a.pkg', 'b.pkg', 'Main.hs'])], makefile_test, [])
diff --git a/testsuite/tests/cabal/all.T b/testsuite/tests/cabal/all.T
index 5f1b30856572ecee8883c3e2db64bad16bde9e53..3f07527584199db740a8052071b2322a416354f1 100644
--- a/testsuite/tests/cabal/all.T
+++ b/testsuite/tests/cabal/all.T
@@ -4,16 +4,14 @@ def normaliseDynlibNames(str):
 def ignore_warnings(str):
     return re.sub(r'Warning:.*\n', '', str)
 
-test('ghcpkg01', [extra_files(['test.pkg', 'test2.pkg', 'test3.pkg'])], run_command, ['$MAKE -s --no-print-directory ghcpkg01'])
+test('ghcpkg01', [extra_files(['test.pkg', 'test2.pkg', 'test3.pkg'])], makefile_test, [])
 
 # Use ignore_stderr to prevent (when HADDOCK_DOCS=NO):
 #  warning: haddock-interfaces .. doesn't exist or isn't a file
-test('ghcpkg02', [ignore_stderr], run_command,
-     ['$MAKE -s --no-print-directory ghcpkg02'])
+test('ghcpkg02', [ignore_stderr], makefile_test, [])
 
 test('ghcpkg03', [extra_files(['test.pkg', 'test2.pkg', 'test4.pkg']),
-                  normalise_errmsg_fun(normaliseDynlibNames)], run_command,
-     ['$MAKE -s --no-print-directory ghcpkg03'])
+                  normalise_errmsg_fun(normaliseDynlibNames)], makefile_test, [])
 
 def normalise_package_order(s):
     # Package order is not deterministic?
@@ -22,8 +20,7 @@ def normalise_package_order(s):
                   s)
 
 test('ghcpkg04', [extra_files(['test.pkg', 'test5.pkg']),
-                  normalise_errmsg_fun(normalise_package_order)], run_command,
-     ['$MAKE -s --no-print-directory ghcpkg04'])
+                  normalise_errmsg_fun(normalise_package_order)], makefile_test, [])
 
 # Sometimes we get spurious warnings from ghc-pkg about missing
 # haddock-interfaces; this filters them out.
@@ -33,27 +30,27 @@ def normalise_haddock_junk( str ):
 test('ghcpkg05',
      [extra_files(['test2.pkg', 'test3.pkg']),
       normalise_errmsg_fun(normalise_haddock_junk, normaliseDynlibNames, ignore_warnings)],
-     run_command, ['$MAKE -s --no-print-directory ghcpkg05'])
-test('ghcpkg06', [extra_files(['test.pkg', 'testdup.pkg'])], run_command, ['$MAKE -s --no-print-directory ghcpkg06'])
+     makefile_test, [])
+test('ghcpkg06', [extra_files(['test.pkg', 'testdup.pkg'])], makefile_test, [])
 
-test('ghcpkg07', [extra_files(['test.pkg', 'test7a.pkg', 'test7b.pkg'])], run_command, ['$MAKE -s --no-print-directory ghcpkg07'])
+test('ghcpkg07', [extra_files(['test.pkg', 'test7a.pkg', 'test7b.pkg'])], makefile_test, [])
 
 # Test that we *can* compile a module that also belongs to a package
 # (this was disallowed in GHC 6.4 and earlier)
 test('pkg01', normal, compile, [''])
 
-test('T1750', [], run_command, ['$MAKE -s --no-print-directory T1750'])
+test('T1750', [], makefile_test, [])
 
-test('T5442a', [extra_files(['test.pkg'])], run_command, ['$MAKE -s --no-print-directory T5442a'])
+test('T5442a', [extra_files(['test.pkg'])], makefile_test, [])
 
-test('T5442b', [extra_files(['test.pkg'])], run_command, ['$MAKE -s --no-print-directory T5442b'])
+test('T5442b', [extra_files(['test.pkg'])], makefile_test, [])
 
-test('T5442c', [extra_files(['test.pkg'])], run_command, ['$MAKE -s --no-print-directory T5442c'])
+test('T5442c', [extra_files(['test.pkg'])], makefile_test, [])
 
-test('T5442d', [extra_files(['shadow1.pkg', 'shadow2.pkg', 'shadow4.pkg'])], run_command, ['$MAKE -s --no-print-directory T5442d'])
+test('T5442d', [extra_files(['shadow1.pkg', 'shadow2.pkg', 'shadow4.pkg'])], makefile_test, [])
 
-test('shadow', [], run_command, ['$MAKE -s --no-print-directory shadow'])
+test('shadow', [], makefile_test, [])
 
-test('T12485a', [extra_files(['shadow1.pkg', 'shadow2.pkg', 'shadow3.pkg'])], run_command, ['$MAKE -s --no-print-directory T12485a'])
+test('T12485a', [extra_files(['shadow1.pkg', 'shadow2.pkg', 'shadow3.pkg'])], makefile_test, [])
 
-test('T13703', [extra_files(['test13703a.pkg', 'test13703b.pkg'])], run_command, ['$MAKE -s --no-print-directory T13703'])
+test('T13703', [extra_files(['test13703a.pkg', 'test13703b.pkg'])], makefile_test, [])
diff --git a/testsuite/tests/cmm/opt/all.T b/testsuite/tests/cmm/opt/all.T
index b2c0f5f8e716305ce61ef4eaa8405244bf85e18f..24572a219b9e72f1b70944583bf9af38cf08000c 100644
--- a/testsuite/tests/cmm/opt/all.T
+++ b/testsuite/tests/cmm/opt/all.T
@@ -1,3 +1,3 @@
 # Verify that we optimize away conditional branches which always jump
 # to the same target.
-test('T15188', normal, run_command, ['$MAKE -s --no-print-directory T15188'])
+test('T15188', normal, makefile_test, [])
diff --git a/testsuite/tests/codeGen/should_compile/all.T b/testsuite/tests/codeGen/should_compile/all.T
index 7217d93e300933587d0675e506961f1e3f9872b1..45924efc33470593bd7ade3f1b28befb48dec3d5 100644
--- a/testsuite/tests/codeGen/should_compile/all.T
+++ b/testsuite/tests/codeGen/should_compile/all.T
@@ -12,7 +12,7 @@ test('T2388', normal, compile, [''])
 test('T3132', normal, compile, ['-dcmm-lint'])
 test('T3286', [], multimod_compile, ['T3286', '-v0'])
 test('T3579', normal, compile, [''])
-test('T2578', normal, run_command, ['$MAKE -s --no-print-directory T2578'])
+test('T2578', normal, makefile_test, [])
 # skip llvm on i386 as we don't support fPIC
 test('jmp_tbl', when(arch('i386'), omit_ways(llvm_ways)), compile, ['-fPIC -O'])
 test('massive_array',
@@ -27,7 +27,7 @@ test('T9329', [when(unregisterised(), expect_broken(15467)), cmm_src], compile,
 
 test('debug',
      [when((arch('powerpc64') or arch('powerpc64le')), expect_broken(11261))],
-     run_command, ['$MAKE -s --no-print-directory debug'])
+     makefile_test, [])
 test('T9964', normal, compile, ['-O'])
 test('T10518', [cmm_src], compile, [''])
 test('T10667', [ when((arch('powerpc64') or arch('powerpc64le')),
@@ -40,15 +40,15 @@ test('T14999',
       when(unregisterised(), skip),
       unless(opsys('linux') and arch('x86_64') and have_gdb() and
         have_readelf(), skip)],
-     run_command, ['$MAKE -s --no-print-directory T14999'])
+     makefile_test, [])
 
 # Verify that we optimize away redundant jumps for unordered comparisons.
 test('T15196',
   [ unless(arch('x86_64'),skip),
     only_ways('normal'),
-  ], run_command, ['$MAKE -s --no-print-directory T15196'])
+  ], makefile_test, [])
 
 test('T15723',
   [ unless(have_profiling(), skip),
     unless(have_dynamic(), skip),
-  ], run_command, ['$MAKE -s --no-print-directory T15723'])
+  ], makefile_test, [])
diff --git a/testsuite/tests/codeGen/should_run/T15038/all.T b/testsuite/tests/codeGen/should_run/T15038/all.T
index 6b284784ae249c52970649a257db83f706845143..08910f0c960019e60dad354dc483eb5713252d9e 100644
--- a/testsuite/tests/codeGen/should_run/T15038/all.T
+++ b/testsuite/tests/codeGen/should_run/T15038/all.T
@@ -1,4 +1,3 @@
 test('T15038',
      [reqlib('containers'), reqlib('ghc-prim'), reqlib('primitive')],
-     run_command,
-     ['$MAKE -s --no-print-directory T15038'])
+     makefile_test, [])
diff --git a/testsuite/tests/deSugar/should_compile/all.T b/testsuite/tests/deSugar/should_compile/all.T
index 9951047e99cbd384fa829d0a5e7023d6cb50295b..6186df06e92b4f88fc4a91981f9aded3475fd552 100644
--- a/testsuite/tests/deSugar/should_compile/all.T
+++ b/testsuite/tests/deSugar/should_compile/all.T
@@ -77,13 +77,12 @@ test('T4439', normal, compile, [''])
 test('T4488', normal, compile, [''])
 test('T4870', [only_ways(['optasm'])], multimod_compile, ['T4870', '-v0'])
 test('T5117', normal, compile, [''])
-test('T5252', [], run_command, ['$MAKE -s --no-print-directory T5252'])
+test('T5252', [], makefile_test, [])
 test('T5455', normal, compile, [''])
 test('T5001', [only_ways(['optasm'])], multimod_compile, ['T5001', '-v0'])
 
 # T5252Take2 failed when compiled *wihtout* optimisation
-test('T5252Take2', [], run_command,
-     ['$MAKE -s --no-print-directory T5252Take2'])
+test('T5252Take2', [], makefile_test, [])
 test('T2431', normal, compile, ['-ddump-simpl -dsuppress-uniques'])
 test('T7669', normal, compile, [''])
 test('T8470', normal, compile, [''])
@@ -106,4 +105,4 @@ test('T14546c', normal, compile, ['-Wincomplete-patterns'])
 test('T14547', normal, compile, ['-Wincomplete-patterns'])
 test('T14773a', normal, compile, ['-Wincomplete-patterns'])
 test('T14773b', normal, compile, ['-Wincomplete-patterns'])
-test('T14815', [], run_command, ['$MAKE -s --no-print-directory T14815'])
+test('T14815', [], makefile_test, ['T14815'])
diff --git a/testsuite/tests/dependent/should_compile/all.T b/testsuite/tests/dependent/should_compile/all.T
index 632ef4018c9f8d0411b49daeaee360229569f4e8..31a853b61ea3f6920e8e31a2f6ae65752a0ca1bb 100644
--- a/testsuite/tests/dependent/should_compile/all.T
+++ b/testsuite/tests/dependent/should_compile/all.T
@@ -41,8 +41,7 @@ test('T12742', normal, compile, [''])
 #       (2) Build the program twice: once with -dynamic, and then
 #           with -prof using -osuf to set a different object file suffix.
 test('T13910', omit_ways(['profasm']), compile, [''])
-test('T13938', [extra_files(['T13938a.hs'])], run_command,
-     ['$MAKE -s --no-print-directory T13938'])
+test('T13938', [extra_files(['T13938a.hs'])], makefile_test, ['T13938'])
 test('T14556', normal, compile, [''])
 test('T14720', normal, compile, [''])
 test('T14066a', normal, compile, [''])
diff --git a/testsuite/tests/deriving/should_compile/all.T b/testsuite/tests/deriving/should_compile/all.T
index ef6259df54a1ca10b1665afe8f54eba4db7dfb84..656cc0de4b3a0af8f2a3647a9306ffac5c85d544 100644
--- a/testsuite/tests/deriving/should_compile/all.T
+++ b/testsuite/tests/deriving/should_compile/all.T
@@ -40,7 +40,7 @@ test('deriving-via-compile', normal, compile, [''])
 test('deriving-via-standalone', normal, compile, [''])
 test('T6031', [], multimod_compile, ['T6031', '-v0 -O'])
 # Adding -O on T6031 to expose Trac #11245 regardless of way
-test('T1133', [], run_command, ['$MAKE --no-print-directory -s T1133'])
+test('T1133', [], makefile_test, [])
 test('T7704', normal, compile, [''])
 test('T7710', normal, compile, [''])
 
@@ -65,8 +65,7 @@ test('T7947', [], multimod_compile, ['T7947', '-v0'])
 test('T10561', normal, compile, [''])
 test('T10487', [], multimod_compile, ['T10487', '-v0'])
 test('T10524', normal, compile, [''])
-test('T11148', normal, run_command,
-     ['$MAKE -s --no-print-directory T11148'])
+test('T11148', normal, makefile_test, [])
 test('T9968', normal, compile, [''])
 test('T9968a', normal, compile, [''])
 test('T11174', normal, compile, [''])
diff --git a/testsuite/tests/deriving/should_fail/all.T b/testsuite/tests/deriving/should_fail/all.T
index 0cc85ea4aa904d1e8c854b3f07c1ade1a58bc124..1f674805a36576e63c4a0a0de096f65594718900 100644
--- a/testsuite/tests/deriving/should_fail/all.T
+++ b/testsuite/tests/deriving/should_fail/all.T
@@ -12,8 +12,7 @@ test('drvfail011', normal, compile_fail, [''])
 test('drvfail012', normal, compile_fail, [''])
 test('drvfail013', normal, compile_fail, [''])
 test('drvfail015', normal, compile_fail, [''])
-test('drvfail016', [], run_command,
-     ['$MAKE --no-print-directory -s drvfail016'])
+test('drvfail016', [], makefile_test, [])
 test('T1830_1', normal, compile_fail, [''])
 test('T2394', normal, compile_fail, [''])
 # T2604 was removed as it was out of date re: fixing #9858
@@ -33,7 +32,7 @@ test('T5287', normal, compile_fail, [''])
 test('T5478', normal, compile_fail, [''])
 test('T5686', normal, compile_fail, [''])
 test('T5922', normal, compile_fail, [''])
-test('T1133A', [], run_command, ['$MAKE --no-print-directory -s T1133A'])
+test('T1133A', [], makefile_test, [])
 # 5863a was removed as it was out of date re: fixing #9858
 test('T7959', normal, compile_fail, [''])
 
diff --git a/testsuite/tests/determinism/T13807/all.T b/testsuite/tests/determinism/T13807/all.T
index 465d57c23969b5f33082d0cad545ec710b7dbec6..415917ca4870f5d77f674330458152ecc6874d87 100644
--- a/testsuite/tests/determinism/T13807/all.T
+++ b/testsuite/tests/determinism/T13807/all.T
@@ -1 +1 @@
-test('T13807', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory T13807'])
+test('T13807', [extra_files(['A.hs'])], makefile_test, ['T13807'])
diff --git a/testsuite/tests/determinism/determ002/all.T b/testsuite/tests/determinism/determ002/all.T
index 1642c2f8c60d09adba3c409cf7b11c2413f070ac..02870df068b51fab2ba6c802da2e6793811de7b6 100644
--- a/testsuite/tests/determinism/determ002/all.T
+++ b/testsuite/tests/determinism/determ002/all.T
@@ -1 +1 @@
-test('determ002', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ002'])
+test('determ002', [extra_files(['A.hs'])], makefile_test, ['determ002'])
diff --git a/testsuite/tests/determinism/determ003/all.T b/testsuite/tests/determinism/determ003/all.T
index b4bc18c1a2766281d40a709a50797a41becc8123..07e696499474381f899e021ef6acc6f12e5b12d0 100644
--- a/testsuite/tests/determinism/determ003/all.T
+++ b/testsuite/tests/determinism/determ003/all.T
@@ -1 +1 @@
-test('determ003', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ003'])
+test('determ003', [extra_files(['A.hs'])], makefile_test, ['determ003'])
diff --git a/testsuite/tests/determinism/determ005/all.T b/testsuite/tests/determinism/determ005/all.T
index c39aa8b203d367d9e61ab5a9070278131737e88d..2a5e189e1af4ae8e65c836c0020011b9c6f500bb 100644
--- a/testsuite/tests/determinism/determ005/all.T
+++ b/testsuite/tests/determinism/determ005/all.T
@@ -1 +1 @@
-test('determ005', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ005'])
+test('determ005', [extra_files(['A.hs'])], makefile_test, ['determ005'])
diff --git a/testsuite/tests/determinism/determ006/all.T b/testsuite/tests/determinism/determ006/all.T
index a0e547beeac23f64ea80b1bff7b7845f503aa6d9..71c7bbb04ecb962d232521a0202f68e2002a3c81 100644
--- a/testsuite/tests/determinism/determ006/all.T
+++ b/testsuite/tests/determinism/determ006/all.T
@@ -1 +1 @@
-test('determ006', [extra_files(['spec-inline-determ.hs'])], run_command, ['$MAKE -s --no-print-directory determ006'])
+test('determ006', [extra_files(['spec-inline-determ.hs'])], makefile_test, ['determ006'])
diff --git a/testsuite/tests/determinism/determ007/all.T b/testsuite/tests/determinism/determ007/all.T
index d9f1f5bfa772ee7490457075a106db8da5488b7c..0330980ebe2e5513d2c980074392807490f1bff6 100644
--- a/testsuite/tests/determinism/determ007/all.T
+++ b/testsuite/tests/determinism/determ007/all.T
@@ -1 +1 @@
-test('determ007', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ007'])
+test('determ007', [extra_files(['A.hs'])], makefile_test, ['determ007'])
diff --git a/testsuite/tests/determinism/determ008/all.T b/testsuite/tests/determinism/determ008/all.T
index da539a055b6484fc6687ebfa5331172812e5b3ae..8fb078d818a5923f90ca99b647e60f73988650ed 100644
--- a/testsuite/tests/determinism/determ008/all.T
+++ b/testsuite/tests/determinism/determ008/all.T
@@ -1 +1 @@
-test('determ008', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ008'])
+test('determ008', [extra_files(['A.hs'])], makefile_test, ['determ008'])
diff --git a/testsuite/tests/determinism/determ009/all.T b/testsuite/tests/determinism/determ009/all.T
index 7b2e4cc6fd548bf4994efc4485ee9df46a8ba98f..c239ddb6473f44267f2b85bef7c68d1c08323864 100644
--- a/testsuite/tests/determinism/determ009/all.T
+++ b/testsuite/tests/determinism/determ009/all.T
@@ -1 +1 @@
-test('determ009', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ009'])
+test('determ009', [extra_files(['A.hs'])], makefile_test, ['determ009'])
diff --git a/testsuite/tests/determinism/determ010/all.T b/testsuite/tests/determinism/determ010/all.T
index 10c89af35111f30a917ca9cf2632b7379250c9ca..3585ad15f3efdcef4c435e84343487682fbaff8c 100644
--- a/testsuite/tests/determinism/determ010/all.T
+++ b/testsuite/tests/determinism/determ010/all.T
@@ -1 +1 @@
-test('determ010', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ010'])
+test('determ010', [extra_files(['A.hs'])], makefile_test, ['determ010'])
diff --git a/testsuite/tests/determinism/determ011/all.T b/testsuite/tests/determinism/determ011/all.T
index fedb3a02110f3e99585c042c8af706fc5483b28d..d608caf3407a83d9708438b6e32b9cb492b71a5d 100644
--- a/testsuite/tests/determinism/determ011/all.T
+++ b/testsuite/tests/determinism/determ011/all.T
@@ -1 +1 @@
-test('determ011', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ011'])
+test('determ011', [extra_files(['A.hs'])], makefile_test, ['determ011'])
diff --git a/testsuite/tests/determinism/determ012/all.T b/testsuite/tests/determinism/determ012/all.T
index 17f557cbf0d0802180f4623ba0b3315317b5a2f9..9d806e1399708d085f24580c7d60d7bba1fe6fc6 100644
--- a/testsuite/tests/determinism/determ012/all.T
+++ b/testsuite/tests/determinism/determ012/all.T
@@ -1 +1 @@
-test('determ012', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ012'])
+test('determ012', [extra_files(['A.hs'])], makefile_test, ['determ012'])
diff --git a/testsuite/tests/determinism/determ013/all.T b/testsuite/tests/determinism/determ013/all.T
index 21ea1f4344df41272b74bab13384472ea6f0dc9f..149362d94373ba4697c4abe023ede054ecd7922a 100644
--- a/testsuite/tests/determinism/determ013/all.T
+++ b/testsuite/tests/determinism/determ013/all.T
@@ -1 +1 @@
-test('determ013', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ013'])
+test('determ013', [extra_files(['A.hs'])], makefile_test, ['determ013'])
diff --git a/testsuite/tests/determinism/determ014/all.T b/testsuite/tests/determinism/determ014/all.T
index 4e27332bb5716c5d32663e27f32810c2247fa37e..50359fd48be5332b833cd1800ba23e85730e1f9d 100644
--- a/testsuite/tests/determinism/determ014/all.T
+++ b/testsuite/tests/determinism/determ014/all.T
@@ -1 +1 @@
-test('determ014', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ014'])
+test('determ014', [extra_files(['A.hs'])], makefile_test, ['determ014'])
diff --git a/testsuite/tests/determinism/determ015/all.T b/testsuite/tests/determinism/determ015/all.T
index 2b8ec7c8838116c9e5d2b9b5dd55cfb7affb53d7..1a2a9b990a9361737c003b5a16ad9a97d12aa730 100644
--- a/testsuite/tests/determinism/determ015/all.T
+++ b/testsuite/tests/determinism/determ015/all.T
@@ -1 +1 @@
-test('determ015', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ015'])
+test('determ015', [extra_files(['A.hs'])], makefile_test, ['determ015'])
diff --git a/testsuite/tests/determinism/determ016/all.T b/testsuite/tests/determinism/determ016/all.T
index bb3a2cfa887c55c033016a371b8ed7ecea0cb4fa..6d4da6774e3f9b37b5d93c8a71bdbad57be1ee53 100644
--- a/testsuite/tests/determinism/determ016/all.T
+++ b/testsuite/tests/determinism/determ016/all.T
@@ -1 +1 @@
-test('determ016', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ016'])
+test('determ016', [extra_files(['A.hs'])], makefile_test, ['determ016'])
diff --git a/testsuite/tests/determinism/determ017/all.T b/testsuite/tests/determinism/determ017/all.T
index a81692d6390a481aa6a7445e5d05da17f4c5ddac..75f5470726b83c58dea05a7c952d21f2ff07aab1 100644
--- a/testsuite/tests/determinism/determ017/all.T
+++ b/testsuite/tests/determinism/determ017/all.T
@@ -1 +1 @@
-test('determ017', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ017'])
+test('determ017', [extra_files(['A.hs'])], makefile_test, ['determ017'])
diff --git a/testsuite/tests/determinism/determ018/all.T b/testsuite/tests/determinism/determ018/all.T
index 9d672264c2f6d89f23102f23d214b496d7f7f012..f75dcd67fbd4de3a14fd9e844d8861df2f3840db 100644
--- a/testsuite/tests/determinism/determ018/all.T
+++ b/testsuite/tests/determinism/determ018/all.T
@@ -1 +1 @@
-test('determ018', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ018'])
+test('determ018', [extra_files(['A.hs'])], makefile_test, ['determ018'])
diff --git a/testsuite/tests/determinism/determ019/all.T b/testsuite/tests/determinism/determ019/all.T
index fc44db070ae10465536fc084edbcfb5689cb5232..ae07e7bea0ec28211d1526730fecd24835d92a3c 100644
--- a/testsuite/tests/determinism/determ019/all.T
+++ b/testsuite/tests/determinism/determ019/all.T
@@ -1 +1 @@
-test('determ019', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ019'])
+test('determ019', [extra_files(['A.hs'])], makefile_test, ['determ019'])
diff --git a/testsuite/tests/determinism/determ021/all.T b/testsuite/tests/determinism/determ021/all.T
index 331d1f1a2150426f4eb43df1887175cb0de8e144..afad3581f5ab5c6ecc7727b39defdfa8f98658c7 100644
--- a/testsuite/tests/determinism/determ021/all.T
+++ b/testsuite/tests/determinism/determ021/all.T
@@ -1,4 +1,3 @@
 test('determ021',
      [normalise_fun(normalise_errmsg), extra_files(['A.hs'])],
-     run_command,
-     ['$MAKE -s --no-print-directory determ021'])
+     makefile_test, ['determ021'])
diff --git a/testsuite/tests/determinism/determ022/all.T b/testsuite/tests/determinism/determ022/all.T
index 3ecdf3ca1c75ccd6a008798b13808f8959a81c1a..868649e66cbc4f3fcfd9f3181c2cd07e30f7475f 100644
--- a/testsuite/tests/determinism/determ022/all.T
+++ b/testsuite/tests/determinism/determ022/all.T
@@ -1 +1 @@
-test('determ022', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory determ022'])
+test('determ022', [extra_files(['A.hs'])], makefile_test, ['determ022'])
diff --git a/testsuite/tests/driver/T13392/all.T b/testsuite/tests/driver/T13392/all.T
index 1f2bd40a1058ca876ef4d824a9b6f2c30a15ad78..4e3fea70d06c79532d4f9abbee822bf7d7b05ef5 100644
--- a/testsuite/tests/driver/T13392/all.T
+++ b/testsuite/tests/driver/T13392/all.T
@@ -1,3 +1,3 @@
 # Test for #13392, it makes sure 'ghc --show-options' does not print each flag more than once.
 
-test('T13392', normal, run_command, ['$MAKE -s --no-print-directory T13392'])
+test('T13392', normal, makefile_test, [])
diff --git a/testsuite/tests/driver/T13710/all.T b/testsuite/tests/driver/T13710/all.T
index 64daacc96ba173e99b03741890ffeb6c081481d3..eb9d25b98b41c39e4ccf30bb6fefc556b2471b09 100644
--- a/testsuite/tests/driver/T13710/all.T
+++ b/testsuite/tests/driver/T13710/all.T
@@ -1,4 +1,3 @@
 test('T13710',
      [extra_files(['A.hs', 'A.hs-boot', 'B.hs'])],
-     run_command,
-     ['$MAKE -s --no-print-directory T13710'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/T1372/all.T b/testsuite/tests/driver/T1372/all.T
index 9414ce70dd6e6df58a788d1a59cc43403ebe22a7..0edd81d6222e96cbb35f4a88ac56910e7670ca9f 100644
--- a/testsuite/tests/driver/T1372/all.T
+++ b/testsuite/tests/driver/T1372/all.T
@@ -1 +1 @@
-test('T1372', [extra_files(['p1/', 'p2/'])], run_command, ['$MAKE -s --no-print-directory T1372'])
+test('T1372', [extra_files(['p1/', 'p2/'])], makefile_test, ['T1372'])
diff --git a/testsuite/tests/driver/T13803/all.T b/testsuite/tests/driver/T13803/all.T
index bfd720cae9afeeebfeef7d451013486dff40db9b..25ed815a4069950711eca156c3ffaf4bd64702e6 100644
--- a/testsuite/tests/driver/T13803/all.T
+++ b/testsuite/tests/driver/T13803/all.T
@@ -1,4 +1,3 @@
 test('T13803',
      [extra_files(['D.hs', 'E.hs-boot', 'E.hs', 'Y.hs', 'Y.hs-boot'])],
-     run_command,
-     ['$MAKE -s --no-print-directory T13803'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/T13914/all.T b/testsuite/tests/driver/T13914/all.T
index 2e6a952e57ebe00eceb4b40aa725dedc7c03478a..7b11a62f0ae31fc28a7fcc98120aa6a9865a647a 100644
--- a/testsuite/tests/driver/T13914/all.T
+++ b/testsuite/tests/driver/T13914/all.T
@@ -1,4 +1,3 @@
 test('T13914',
      [extra_files(['main.hs'])],
-     run_command,
-     ['$MAKE -s --no-print-directory t13914'])
+     makefile_test, ['t13914'])
diff --git a/testsuite/tests/driver/T14075/all.T b/testsuite/tests/driver/T14075/all.T
index 4f6371a963d91e2b6510db5502714fdecdd7c223..9cc75e2feb95fd9f81d7288d817602fc4076e3ea 100644
--- a/testsuite/tests/driver/T14075/all.T
+++ b/testsuite/tests/driver/T14075/all.T
@@ -2,5 +2,4 @@ test('T14075',
      [ extra_files(['F.hs', 'F.hs-boot', 'O.hs', 'V.hs', 'V.hs-boot'])
      , req_smp, # uses ghc --make -j2
      ],
-     run_command,
-     ['$MAKE -s --no-print-directory T14075'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/T15970/all.T b/testsuite/tests/driver/T15970/all.T
index 5c496f07d5cd6a78237bdf200dec3c7d81036a01..54260047a0cb085609d0d8b7aba953f551765f81 100644
--- a/testsuite/tests/driver/T15970/all.T
+++ b/testsuite/tests/driver/T15970/all.T
@@ -1,2 +1,2 @@
 test('T15970', [extra_files(['A1.hs', 'A2.hs', 'B.hs', 'C.hs'])],
-               run_command, ['$MAKE -s --no-print-directory T15970'])
+               makefile_test, [])
diff --git a/testsuite/tests/driver/T1959/test.T b/testsuite/tests/driver/T1959/test.T
index e8eb3756d7a07e549302a998d349318efb38d07c..77cfd75dc6626da9f8309f61351ab9b89ae7e6b5 100644
--- a/testsuite/tests/driver/T1959/test.T
+++ b/testsuite/tests/driver/T1959/test.T
@@ -1 +1 @@
-test('T1959', [extra_files(['B.hs', 'C.hs', 'D.hs', 'E1.hs', 'E2.hs'])], run_command, ['$MAKE -s --no-print-directory dotest'])
+test('T1959', [extra_files(['B.hs', 'C.hs', 'D.hs', 'E1.hs', 'E2.hs'])], makefile_test, ['dotest'])
diff --git a/testsuite/tests/driver/T3007/all.T b/testsuite/tests/driver/T3007/all.T
index 803357ba029c7dab2cd33a1a4c6bbd1dda12d258..2a360f9890b0db439ee271d8fa454464bb885c0e 100644
--- a/testsuite/tests/driver/T3007/all.T
+++ b/testsuite/tests/driver/T3007/all.T
@@ -1,4 +1,3 @@
 test('T3007',
      extra_files(['A/', 'B/']),
-     run_command,
-     ['$MAKE -s --no-print-directory T3007'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/T437/all.T b/testsuite/tests/driver/T437/all.T
index a679ce2611fbef593765b9410b4a2245ad0216ce..538699bc3be9439f7141d9030808c509be22ad45 100644
--- a/testsuite/tests/driver/T437/all.T
+++ b/testsuite/tests/driver/T437/all.T
@@ -1,3 +1,3 @@
 # Test for #437, a recompilation bug with '-main-is'
 
-test('T437', [extra_files(['Test.hs', 'Test2.hs'])], run_command, ['$MAKE -s --no-print-directory T437'])
+test('T437', [extra_files(['Test.hs', 'Test2.hs'])], makefile_test, [])
diff --git a/testsuite/tests/driver/T5147/all.T b/testsuite/tests/driver/T5147/all.T
index a83a005f1f0e692ca070d9773892368dc1e49c94..a77c5da16573e67e8550ed9488a294bd5c3f602c 100644
--- a/testsuite/tests/driver/T5147/all.T
+++ b/testsuite/tests/driver/T5147/all.T
@@ -1 +1 @@
-test('T5147', [extra_files(['A.hs', 'B1.hs', 'B2.hs'])], run_command, ['$MAKE -s --no-print-directory T5147'])
+test('T5147', [extra_files(['A.hs', 'B1.hs', 'B2.hs'])], makefile_test, [])
diff --git a/testsuite/tests/driver/T7373/all.T b/testsuite/tests/driver/T7373/all.T
index d7926afce51dc36af2297504410d68e62e4eaa5a..842d065f18dbae4a339671eaa4d405777859d6ef 100644
--- a/testsuite/tests/driver/T7373/all.T
+++ b/testsuite/tests/driver/T7373/all.T
@@ -1,3 +1,3 @@
 test('T7373', [extra_files(['D.hs', 'pkg/']),
-               expect_broken(7373)], run_command,
-     ['$MAKE -s --no-print-directory T7373'])
+               expect_broken(7373)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/T7835/all.T b/testsuite/tests/driver/T7835/all.T
index a5a09e69205104c06745a2b9e3ce9ad279a2b93f..aa5ba23a944e5e9f308ec83e6b5251acc6b6ad77 100644
--- a/testsuite/tests/driver/T7835/all.T
+++ b/testsuite/tests/driver/T7835/all.T
@@ -1,2 +1,2 @@
 
-test('T7835', [extra_files(['Test.hs', 'TestPrim.hs', 'test-prims.cmm'])], run_command, ['$MAKE -s --no-print-directory T7835'])
+test('T7835', [extra_files(['Test.hs', 'TestPrim.hs', 'test-prims.cmm'])], makefile_test, [])
diff --git a/testsuite/tests/driver/T8184/all.T b/testsuite/tests/driver/T8184/all.T
index e2cc32afc024b9cd4d89d7b344b26b0ee2af0185..08008c1e1c1cde9206355764ebe3a77d7a3c2155 100644
--- a/testsuite/tests/driver/T8184/all.T
+++ b/testsuite/tests/driver/T8184/all.T
@@ -1,2 +1 @@
-test('T8184', extra_files(['A.hs', 'B.hs', 'B.hs-boot', 'C.hs']), run_command,
-     ['$MAKE -s --no-print-directory T8184'])
+test('T8184', extra_files(['A.hs', 'B.hs', 'B.hs-boot', 'C.hs']), makefile_test, [])
diff --git a/testsuite/tests/driver/T9562/all.T b/testsuite/tests/driver/T9562/all.T
index caa0c31f258c4eb55f98989218c45460fb8dad52..bf09556fc4dc3de4f34b1b388b0fcbf16102c9a9 100644
--- a/testsuite/tests/driver/T9562/all.T
+++ b/testsuite/tests/driver/T9562/all.T
@@ -1,3 +1,3 @@
 test('T9562', [extra_files(['A.hs', 'B.hs', 'B.hs-boot', 'C.hs', 'D.hs', 'Main.hs']),
-               expect_broken(9562)], run_command,
-     ['$MAKE -s --no-print-directory T9562'])
+               expect_broken(9562)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/all.T b/testsuite/tests/driver/all.T
index 02eeeb321bf5e1fcf27a16e99b5998e027dddf3d..64b9aeb61deedd143de6ff7849158df9e11d0043 100644
--- a/testsuite/tests/driver/all.T
+++ b/testsuite/tests/driver/all.T
@@ -1,115 +1,110 @@
-test('driver011', [extra_files(['A011.hs'])], run_command, ['$MAKE -s --no-print-directory test011'])
+test('driver011', [extra_files(['A011.hs'])], makefile_test, ['test011'])
 
-test('driver012', [extra_files(['A012.hs'])], run_command, ['$MAKE -s --no-print-directory test012'])
+test('driver012', [extra_files(['A012.hs'])], makefile_test, ['test012'])
 
-test('driver013', [extra_files(['A013.hs'])], run_command, ['$MAKE -s --no-print-directory test013'])
+test('driver013', [extra_files(['A013.hs'])], makefile_test, ['test013'])
 
-test('driver014', [extra_files(['A014.hs'])], run_command, ['$MAKE -s --no-print-directory test014'])
+test('driver014', [extra_files(['A014.hs'])], makefile_test, ['test014'])
 
-test('driver015', [extra_files(['A015.hs'])], run_command, ['$MAKE -s --no-print-directory test015'])
+test('driver015', [extra_files(['A015.hs'])], makefile_test, ['test015'])
 
-test('driver016', [extra_files(['F016.hs'])], run_command, ['$MAKE -s --no-print-directory test016'])
+test('driver016', [extra_files(['F016.hs'])], makefile_test, ['test016'])
 
-test('driver017', [extra_files(['F017.hs'])], run_command, ['$MAKE -s --no-print-directory test017'])
+test('driver017', [extra_files(['F017.hs'])], makefile_test, ['test017'])
 
-test('driver018', [extra_files(['F018.hs'])], run_command, ['$MAKE -s --no-print-directory test018'])
+test('driver018', [extra_files(['F018.hs'])], makefile_test, ['test018'])
 
-test('driver018a', [extra_files(['F018a.hs'])], run_command, ['$MAKE -s --no-print-directory test018a'])
+test('driver018a', [extra_files(['F018a.hs'])], makefile_test, ['test018a'])
 
-test('driver019', [extra_files(['F019.hs'])], run_command, ['$MAKE -s --no-print-directory test019'])
+test('driver019', [extra_files(['F019.hs'])], makefile_test, ['test019'])
 
-test('driver021', [extra_files(['B021/'])], run_command, ['$MAKE -s --no-print-directory test021'])
+test('driver021', [extra_files(['B021/'])], makefile_test, ['test021'])
 
-test('driver022', [extra_files(['B022/'])], run_command, ['$MAKE -s --no-print-directory test022'])
+test('driver022', [extra_files(['B022/'])], makefile_test, ['test022'])
 
-test('driver023', [extra_files(['B023/'])], run_command, ['$MAKE -s --no-print-directory test023'])
+test('driver023', [extra_files(['B023/'])], makefile_test, ['test023'])
 
-test('driver024', [extra_files(['B024/'])], run_command, ['$MAKE -s --no-print-directory test024'])
+test('driver024', [extra_files(['B024/'])], makefile_test, ['test024'])
 
-test('driver024a', [], run_command, ['$MAKE -s --no-print-directory test024a'])
+test('driver024a', [], makefile_test, ['test024a'])
 
-test('driver025', [extra_files(['B025/'])], run_command, ['$MAKE -s --no-print-directory test025'])
+test('driver025', [extra_files(['B025/'])], makefile_test, ['test025'])
 
-test('driver026', [extra_files(['d026/'])], run_command, ['$MAKE -s --no-print-directory test026'])
+test('driver026', [extra_files(['d026/'])], makefile_test, ['test026'])
 
-test('driver027', [extra_files(['B027/'])], run_command, ['$MAKE -s --no-print-directory test027'])
+test('driver027', [extra_files(['B027/'])], makefile_test, ['test027'])
 
-test('driver028', [extra_files(['B028/'])], run_command, ['$MAKE -s --no-print-directory test028'])
+test('driver028', [extra_files(['B028/'])], makefile_test, ['test028'])
 
-test('driver031', [extra_files(['A031.hs'])], run_command, ['$MAKE -s --no-print-directory test031'])
+test('driver031', [extra_files(['A031.hs'])], makefile_test, ['test031'])
 
-test('driver032', [extra_files(['A032.hs'])], run_command, ['$MAKE -s --no-print-directory test032'])
+test('driver032', [extra_files(['A032.hs'])], makefile_test, ['test032'])
 
-test('driver033', [extra_files(['A033.hs'])], run_command, ['$MAKE -s --no-print-directory test033'])
+test('driver033', [extra_files(['A033.hs'])], makefile_test, ['test033'])
 
-test('driver034', [extra_files(['F034.hs'])], run_command, ['$MAKE -s --no-print-directory test034'])
+test('driver034', [extra_files(['F034.hs'])], makefile_test, ['test034'])
 
-test('driver035', [extra_files(['F035.hs'])], run_command, ['$MAKE -s --no-print-directory test035'])
+test('driver035', [extra_files(['F035.hs'])], makefile_test, ['test035'])
 
-test('driver041', [extra_files(['B041/'])], run_command, ['$MAKE -s --no-print-directory test041'])
+test('driver041', [extra_files(['B041/'])], makefile_test, ['test041'])
 
-test('driver042', [extra_files(['B042/'])], run_command, ['$MAKE -s --no-print-directory test042'])
+test('driver042', [extra_files(['B042/'])], makefile_test, ['test042'])
 
-test('driver042stub', [extra_files(['B042stub/'])], run_command,
-     ['$MAKE -s --no-print-directory test042stub'])
+test('driver042stub', [extra_files(['B042stub/'])], makefile_test, ['test042stub'])
 
-test('driver043', [extra_files(['B043/'])], run_command, ['$MAKE -s --no-print-directory test043'])
+test('driver043', [extra_files(['B043/'])], makefile_test, ['test043'])
 
-test('driver044', [extra_files(['B044/'])], run_command, ['$MAKE -s --no-print-directory test044'])
+test('driver044', [extra_files(['B044/'])], makefile_test, ['test044'])
 
-test('driver045', [extra_files(['B045/'])], run_command, ['$MAKE -s --no-print-directory test045'])
+test('driver045', [extra_files(['B045/'])], makefile_test, ['test045'])
 
-test('driver051', [extra_files(['d051_1/', 'd051_2/'])], run_command, ['$MAKE -s --no-print-directory test051'])
+test('driver051', [extra_files(['d051_1/', 'd051_2/'])], makefile_test, ['test051'])
 
-test('driver052', [extra_files(['d052_1/', 'd052_2/'])], run_command, ['$MAKE -s --no-print-directory test052'])
+test('driver052', [extra_files(['d052_1/', 'd052_2/'])], makefile_test, ['test052'])
 
-test('driver053', [extra_files(['d053_1/', 'd053_2/'])], run_command, ['$MAKE -s --no-print-directory test053'])
+test('driver053', [extra_files(['d053_1/', 'd053_2/'])], makefile_test, ['test053'])
 
-test('driver061a', [extra_files(['A061a.hs'])], run_command, ['$MAKE -s --no-print-directory test061a'])
+test('driver061a', [extra_files(['A061a.hs'])], makefile_test, ['test061a'])
 
-test('driver061b', [extra_files(['A061b.hs'])], run_command, ['$MAKE -s --no-print-directory test061b'])
+test('driver061b', [extra_files(['A061b.hs'])], makefile_test, ['test061b'])
 
 
-test('driver062a', [], run_command, ['$MAKE -s --no-print-directory test062a'])
-test('driver062b', [], run_command, ['$MAKE -s --no-print-directory test062b'])
-test('driver062c', [], run_command, ['$MAKE -s --no-print-directory test062c'])
-test('driver062d', [], run_command, ['$MAKE -s --no-print-directory test062d'])
-test('driver062e', [], run_command, ['$MAKE -s --no-print-directory test062e'])
+test('driver062a', [], makefile_test, ['test062a'])
+test('driver062b', [], makefile_test, ['test062b'])
+test('driver062c', [], makefile_test, ['test062c'])
+test('driver062d', [], makefile_test, ['test062d'])
+test('driver062e', [], makefile_test, ['test062e'])
 
-test('driver063', [extra_files(['D063.hs'])], run_command, ['$MAKE -s --no-print-directory test063'])
+test('driver063', [extra_files(['D063.hs'])], makefile_test, ['test063'])
 
-test('driver064', [extra_files(['A064.hs'])], run_command, ['$MAKE -s --no-print-directory test064'])
+test('driver064', [extra_files(['A064.hs'])], makefile_test, ['test064'])
 
-test('driver065', [extra_files(['A065.hs'])], run_command, ['$MAKE -s --no-print-directory test065'])
+test('driver065', [extra_files(['A065.hs'])], makefile_test, ['test065'])
 
-test('driver066', [extra_files(['A066.hs'])], run_command, ['$MAKE -s --no-print-directory test066'])
+test('driver066', [extra_files(['A066.hs'])], makefile_test, ['test066'])
 
-test('driver067', [extra_files(['A067.hs'])], run_command, ['$MAKE -s --no-print-directory test067'])
+test('driver067', [extra_files(['A067.hs'])], makefile_test, ['test067'])
 
-test('driver070', [extra_files(['A070.hs'])], run_command, ['$MAKE -s --no-print-directory test070'])
+test('driver070', [extra_files(['A070.hs'])], makefile_test, ['test070'])
 
-test('driver071', [extra_files(['A071.hs'])], run_command, ['$MAKE -s --no-print-directory test071'])
+test('driver071', [extra_files(['A071.hs'])], makefile_test, ['test071'])
 
-test('driver081a', [], run_command, ['$MAKE -s --no-print-directory test081a'])
+test('driver081a', [], makefile_test, ['test081a'])
 
-test('driver081b', [], run_command, ['$MAKE -s --no-print-directory test081b'])
+test('driver081b', [], makefile_test, ['test081b'])
 
-test('driver100', [extra_files(['overlap/'])], run_command, ['$MAKE -s --no-print-directory test100'])
+test('driver100', [extra_files(['overlap/'])], makefile_test, ['test100'])
 
-test('driver200', [extra_files(['A200.hs', 'B200/', 'D200.hs'])], run_command, ['$MAKE -s --no-print-directory test200'])
+test('driver200', [extra_files(['A200.hs', 'B200/', 'D200.hs'])], makefile_test, ['test200'])
 
-test('T2566',
-     normalise_fun(normalise_errmsg),
-     run_command,
-     ['$MAKE -s --no-print-directory T2566'])
+test('T2566', normalise_fun(normalise_errmsg), makefile_test, [])
 
 test('pragma001', normal, compile, [''])
 test('pragma002', normal, compile, [''])
 
 test('T2499', normal, compile_fail, [''])
 
-test('mode001', normal, run_command,
-     ['$MAKE -s --no-print-directory mode001'])
+test('mode001', normal, makefile_test, [])
 
 if config.os == 'mingw32':
      only_windows = normal
@@ -117,8 +112,8 @@ else:
      only_windows = skip
 
 test('shared001', [extra_files(['Shared001.hs']),
-                   only_windows], run_command,
-     ['$MAKE -s --no-print-directory shared001'])
+                   only_windows],
+     makefile_test, ['shared001'])
 
 if config.os == 'darwin':
   only_darwin = normal
@@ -126,8 +121,8 @@ else:
   only_darwin = skip
 
 test('static001', [extra_files(['Static001.hs']),
-                   only_darwin, expect_broken(8127)], run_command,
-     ['$MAKE -s --no-print-directory static001'])
+                   only_darwin, expect_broken(8127)],
+     makefile_test, ['static001'])
 
 test('dynHelloWorld',
      only_ways(['dyn']),
@@ -141,18 +136,14 @@ test('T5313',
      ['-package ghc'])
 
 test('T2464', normal, compile, [''])
-test('T3674', [], run_command, ['$MAKE -s --no-print-directory T3674'])
+test('T3674', [], makefile_test, [])
 
-test('rtsopts001', [extra_files(['rtsOpts.hs'])], run_command,
-     ['$MAKE -s --no-print-directory rtsopts001'])
-test('rtsopts002', normal, run_command,
-                ['$MAKE -s --no-print-directory rtsopts002'])
+test('rtsopts001', [extra_files(['rtsOpts.hs'])], makefile_test, [])
+test('rtsopts002', normal, makefile_test, [])
 
-test('withRtsOpts', [], run_command,
-     ['$MAKE -s --no-print-directory withRtsOpts'])
+test('withRtsOpts', [], makefile_test, [])
 test('T3389', normal, compile_and_run, [''])
-test('T3364', normalise_fun(normalise_errmsg), run_command,
-     ['$MAKE -s --no-print-directory T3364'])
+test('T3364', normalise_fun(normalise_errmsg), makefile_test, [])
 
 # T4437: A test to ensure that Cabal's language extension list remains
 # consistent with those known by GHC.
@@ -162,7 +153,7 @@ test('T4437', only_ways(['normal']), compile_and_run, ['-package ghc'])
 
 test('werror', normal, compile_fail, [''])
 
-test('T706', [req_interp], run_command, ['$MAKE -s --no-print-directory T706'])
+test('T706', [req_interp], makefile_test, [])
 test('spacesInArgs',
      extra_run_opts('"a   b"   "c   d"'),
      compile_and_run,
@@ -176,32 +167,27 @@ test( 'T4114c', [fobject_code, expect_broken_for(4114, ['ghci'])], compile_and_r
 test( 'T4114d', [fobject_code, expect_broken_for(4114, ['ghci'])], compile_and_run,
      ['-hisuf .myhi -osuf .myo -no-keep-o-files'])
 
-test('T5584', [], run_command, ['$MAKE -s --no-print-directory T5584'])
-test('T5198', [], run_command, ['$MAKE -s --no-print-directory T5198'])
-test('T7060', [], run_command, ['$MAKE -s --no-print-directory T7060'])
+test('T5584', [], makefile_test, [])
+test('T5198', [], makefile_test, [])
+test('T7060', [], makefile_test, [])
 test('T7130', normal, compile_fail, ['-fflul-laziness'])
-test('T7563', when(unregisterised(), skip), run_command,
-     ['$MAKE -s --no-print-directory T7563'])
+test('T7563', when(unregisterised(), skip), makefile_test, [])
 test('T6037',
      # The testsuite doesn't know how to set a non-Unicode locale on Windows or Mac OS X
      [when(opsys('mingw32'), expect_fail), when(opsys('darwin'), expect_fail)],
-     run_command,
-     ['$MAKE -s --no-print-directory T6037'])
+     makefile_test, [])
 test('T2507',
      # The testsuite doesn't know how to set a non-Unicode locale on Windows or Mac OS X
      [when(opsys('mingw32'), expect_fail), when(opsys('darwin'), expect_fail)],
-     run_command,
-     ['$MAKE -s --no-print-directory T2507'])
+     makefile_test, [])
 test('T8959a',
      # The testsuite doesn't know how to set a non-Unicode locale on Windows or Mac OS X
      [when(opsys('mingw32'), expect_fail), when(opsys('darwin'), expect_fail)],
-     run_command,
-     ['$MAKE -s --no-print-directory T8959a'])
+     makefile_test, [])
 
 # Requires readelf
-test('T703', unless(opsys('linux'), skip),
-     run_command, ['$MAKE -s --no-print-directory T703'])
-test('T2182', normal, run_command, ['$MAKE -s --no-print-directory T2182'])
+test('T703', unless(opsys('linux'), skip), makefile_test, [])
+test('T2182', normal, makefile_test, [])
 test('T8101', normal, compile, ['-Wall -fno-code'])
 test('T8101b', normal, multimod_compile,
      ['T8101b', '-Wall -fno-code'])
@@ -210,17 +196,15 @@ test('T10600', normal, compile_fail, ['-fno-code'])
 # Should not panic when compiling cmm file together with -outputdir.
 test('T9050', cmm_src, compile, ['-outputdir=.'])
 
-test('write_interface_oneshot', [extra_files(['A011.hs'])], run_command,
-     ['$MAKE -s --no-print-directory write_interface_oneshot'])
+test('write_interface_oneshot', [extra_files(['A011.hs'])], makefile_test, [])
 
-test('write_interface_make', [extra_files(['A011.hs'])], run_command,
-     ['$MAKE -s --no-print-directory write_interface_make'])
+test('write_interface_make', [extra_files(['A011.hs'])], makefile_test, [])
 
 test('T9776', normal, compile_fail, ['-drule-check'])
 
-test('T9938', [], run_command, ['$MAKE -s --no-print-directory T9938'])
+test('T9938', [], makefile_test, [])
 
-test('T9938B', [], run_command, ['$MAKE -s --no-print-directory T9938B'])
+test('T9938B', [], makefile_test, [])
 
 test('T9963', exit_code(1), run_command,
      ['{compiler} --interactive -ignore-dot-ghci --print-libdir'])
@@ -234,9 +218,9 @@ test('T10220', normal, run_command,
      # Preprocessed T10220.hspp imports T10220B. Should work in --make mode.
      ['{compiler} --make T10220.hspp -fno-code -v0'])
 
-test('T10182', [], run_command, ['$MAKE -s --no-print-directory T10182'])
+test('T10182', [], makefile_test, [])
 
-test('T10869', [], run_command, ['$MAKE -s --no-print-directory T10869'])
+test('T10869', [], makefile_test, [])
 
 test('T365',
      [pre_cmd('touch test_preprocessor.txt'), unless(opsys('mingw32'), skip)],
@@ -254,36 +238,35 @@ test('T11429b', normal, compile, ['-Wno-unrecognised-warning-flags -Wfoobar'])
 test('T11429c', normal, compile_fail, ['-Wunrecognised-warning-flags -Werror -Wfoobar'])
 test('T11763', normal, compile_and_run, ['-fno-version-macros'])
 
-test('T10320', [], run_command, ['$MAKE -s --no-print-directory T10320'])
+test('T10320', [], makefile_test, [])
 
 test('T12056a', normal, compile, ['-w -Wfoo -Wbar'])
 test('T12056b', normal, compile, ['-w -XOverlappingInstances -Wfoo -Wunrecognised-warning-flags -Wbar'])
 test('T12056c', normal, compile,
      ['-w -Wdeprecated-flags -XOverlappingInstances -Wfoo -Wunrecognised-warning-flags -Wbar'])
 
-test('T12135', [expect_broken(12135)], run_command,
-     ['$MAKE -s --no-print-directory T12135'])
+test('T12135', [expect_broken(12135)], makefile_test, [])
 
 test('T12192', normal, run_command, ['mkdir foo && (cd foo && {compiler} -v0 ../T12192)'])
 
-test('T10923', [], run_command, ['$MAKE -s --no-print-directory T10923'])
+test('T10923', [], makefile_test, [])
 
 test('T12625', normal, compile_fail, ['-I'])
 
 test('T12752pass', normal, compile, ['-DSHOULD_PASS=1 -Wcpp-undef'])
 
-test('T12955', normal, run_command, ['$MAKE -s --no-print-directory T12955'])
+test('T12955', normal, makefile_test, [])
 
-test('T12971', ignore_stdout, run_command, ['$MAKE -s --no-print-directory T12971'])
+test('T12971', ignore_stdout, makefile_test, [])
 test('json', normal, compile_fail, ['-ddump-json'])
 test('json2', normal, compile, ['-ddump-types -ddump-json'])
-test('T13604', [], run_command, ['$MAKE -s --no-print-directory T13604'])
-test('T13604a', [], run_command, ['$MAKE -s --no-print-directory T13604a'])
+test('T13604', [], makefile_test, [])
+test('T13604a', [], makefile_test, [])
 # omitting hpc and profasm because they affect the
 # inlining and unfoldings
 test('inline-check', omit_ways(['hpc', 'profasm'])
                    , compile
 		   , ['-dinline-check foo -O -ddebug-output'])
 
-test('T14452', [], run_command, ['$MAKE -s --no-print-directory T14452'])
+test('T14452', [], makefile_test, [])
 test('T15396', normal, compile_and_run, ['-package ghc'])
diff --git a/testsuite/tests/driver/bug1677/all.T b/testsuite/tests/driver/bug1677/all.T
index 4d25fed713b65d4e68b752c60c6610ac86b12acc..745d316b7d302f674bc4e32d514ef48a84a9a6fc 100644
--- a/testsuite/tests/driver/bug1677/all.T
+++ b/testsuite/tests/driver/bug1677/all.T
@@ -1 +1 @@
-test('bug1677', extra_files(['Bar.hs', 'Foo.hs']), run_command, ['$MAKE bug1677 -s --no-print-directory'])
+test('bug1677', extra_files(['Bar.hs', 'Foo.hs']), makefile_test, [])
diff --git a/testsuite/tests/driver/conflicting_flags/test.T b/testsuite/tests/driver/conflicting_flags/test.T
index 0a6769a77a62c83a9a0311b271b34362e828ee87..dfee6c0cdd37e9876d3de5457521a77425629946 100644
--- a/testsuite/tests/driver/conflicting_flags/test.T
+++ b/testsuite/tests/driver/conflicting_flags/test.T
@@ -1,3 +1,2 @@
-test('conflicting_flags', normal, run_command,
-     ['$MAKE -s --no-print-directory conflicting_flags'])
+test('conflicting_flags', normal, makefile_test, [])
 
diff --git a/testsuite/tests/driver/dynamicToo/all.T b/testsuite/tests/driver/dynamicToo/all.T
index c190c6bcfc7f6287c0570ac9b3e36aea6a423cca..0c890efd70fae51d2d1f02a852cece90ce27a944 100644
--- a/testsuite/tests/driver/dynamicToo/all.T
+++ b/testsuite/tests/driver/dynamicToo/all.T
@@ -1,5 +1,5 @@
 
 test('dynamicToo003',
      [extra_files(['A003.hs']),
-      unless(have_vanilla(), skip), unless(have_dynamic(), skip)], run_command,
-     ['$MAKE -s --no-print-directory dynamicToo003'])
+      unless(have_vanilla(), skip), unless(have_dynamic(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/dynamicToo/dynamicToo001/test.T b/testsuite/tests/driver/dynamicToo/dynamicToo001/test.T
index 0d3f81e2e90a3ec711139c54dd371f74a9da73c4..67b1566b54de68379765b69b4e5c85a05c91056e 100644
--- a/testsuite/tests/driver/dynamicToo/dynamicToo001/test.T
+++ b/testsuite/tests/driver/dynamicToo/dynamicToo001/test.T
@@ -3,4 +3,4 @@ test('dynamicToo001',
      [extra_files(['A.hs', 'B.hs', 'B1.hs', 'B2.hs', 'C.hs']),
       when(opsys('mingw32'), expect_broken(7665)), unless(have_vanilla(), skip),
       unless(have_dynamic(), skip)],
-     run_command, ['$MAKE -s --no-print-directory dynamicToo001'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/dynamicToo/dynamicToo002/test.T b/testsuite/tests/driver/dynamicToo/dynamicToo002/test.T
index fe94f3758ff4a23e5d5810935a2a91ae3f82e25c..64e7817d6f30ab87a51e195dfa8ec71bea9de5db 100644
--- a/testsuite/tests/driver/dynamicToo/dynamicToo002/test.T
+++ b/testsuite/tests/driver/dynamicToo/dynamicToo002/test.T
@@ -1,5 +1,5 @@
 
 test('dynamicToo002',
      [extra_files(['A.hs', 'B.hs', 'C.hs']),
-      unless(have_vanilla(), skip), unless(have_dynamic(), skip)], run_command,
-     ['$MAKE -s --no-print-directory dynamicToo002'])
+      unless(have_vanilla(), skip), unless(have_dynamic(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/dynamicToo/dynamicToo004/test.T b/testsuite/tests/driver/dynamicToo/dynamicToo004/test.T
index 72810baa8c30b4264b25095d810b5819172ccf86..e551c952df6217c9004a2d43e659bf08089394ac 100644
--- a/testsuite/tests/driver/dynamicToo/dynamicToo004/test.T
+++ b/testsuite/tests/driver/dynamicToo/dynamicToo004/test.T
@@ -4,6 +4,5 @@ test('dynamicToo004',
       expect_broken(7665),
       unless(have_vanilla(), skip),
       unless(have_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory dynamicToo004'])
+     makefile_test, [])
 
diff --git a/testsuite/tests/driver/dynamicToo/dynamicToo005/test.T b/testsuite/tests/driver/dynamicToo/dynamicToo005/test.T
index f062a21485b3947d388040744305af2ac20710ee..58eb6f77ac28a1ee06c5fd320f864687c0614d69 100644
--- a/testsuite/tests/driver/dynamicToo/dynamicToo005/test.T
+++ b/testsuite/tests/driver/dynamicToo/dynamicToo005/test.T
@@ -1,5 +1,5 @@
 
 test('dynamicToo005',
      [extra_files(['dynamicToo005.bkp']),
-      unless(have_vanilla(), skip), unless(have_dynamic(), skip)], run_command,
-     ['$MAKE -s --no-print-directory dynamicToo005'])
+      unless(have_vanilla(), skip), unless(have_dynamic(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/dynamic_flags_001/all.T b/testsuite/tests/driver/dynamic_flags_001/all.T
index d019a667e357382be4c2574c3c0258f768aa0e51..6be71bc60ab668b6a9ada652896e03795fed8802 100644
--- a/testsuite/tests/driver/dynamic_flags_001/all.T
+++ b/testsuite/tests/driver/dynamic_flags_001/all.T
@@ -1,3 +1,3 @@
 test('dynamic_flags_001', [extra_files(['A.hs', 'B.hs', 'C.hs']),
-                           when(fast(), skip)], run_command,
-     ['$MAKE -s --no-print-directory dynamic_flags_001'])
+                           when(fast(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/linkwhole/all.T b/testsuite/tests/driver/linkwhole/all.T
index adc10844b9350632fef80d9b4fbeffae86c7e285..ed5b9cc9f0c5390c7e57dd41a67f1e4235290618 100644
--- a/testsuite/tests/driver/linkwhole/all.T
+++ b/testsuite/tests/driver/linkwhole/all.T
@@ -3,4 +3,4 @@ test('linkwhole',
       when(arch('powerpc64') or arch('powerpc64le'), expect_broken(11259)),
       when(opsys('freebsd'), expect_broken(16035)),
       when(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory linkwhole'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp001/all.T b/testsuite/tests/driver/recomp001/all.T
index 4c046da3e3eedb82192183ce7eba4bf48a0280a2..b10b210ee2f48afa3e7274fb0aae8e7cdd956da3 100644
--- a/testsuite/tests/driver/recomp001/all.T
+++ b/testsuite/tests/driver/recomp001/all.T
@@ -1,3 +1,3 @@
 test('recomp001', [extra_files(['A.hs', 'B1.hs', 'B2.hs', 'C.hs']),
-                   when(fast(), skip)], run_command,
-     ['$MAKE -s --no-print-directory recomp001'])
+                   when(fast(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp002/all.T b/testsuite/tests/driver/recomp002/all.T
index d8a5ee7d1bf1840dbe5f23520051197328d97a21..7634bf03b896624e7c56c453f279128dae2acc09 100644
--- a/testsuite/tests/driver/recomp002/all.T
+++ b/testsuite/tests/driver/recomp002/all.T
@@ -1,3 +1,3 @@
 test('recomp002', [extra_files(['Q.hs', 'W.hs', 'W.hs-boot']),
-                   when(fast(), skip)], run_command,
-     ['$MAKE -s --no-print-directory recomp002'])
+                   when(fast(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp003/all.T b/testsuite/tests/driver/recomp003/all.T
index 0437626e31f912b5d13255536f6b57a46419c9d6..10d935f1d8fee9d19bafee5741b2cf775b48e28d 100644
--- a/testsuite/tests/driver/recomp003/all.T
+++ b/testsuite/tests/driver/recomp003/all.T
@@ -1 +1,2 @@
-test('recomp003', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory recomp003'])
+test('recomp003', [extra_files(['A.hs'])],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp004/all.T b/testsuite/tests/driver/recomp004/all.T
index 945d8a1543ca1e4ea004f8612aea0b52566d4728..cfb8a201dd20de4aaba53cf9402251c17bfd9979 100644
--- a/testsuite/tests/driver/recomp004/all.T
+++ b/testsuite/tests/driver/recomp004/all.T
@@ -1 +1,2 @@
-test('recomp004', [extra_files(['Main.hs', 'c.h', 'c1.c', 'c2.c'])], run_command, ['$MAKE -s --no-print-directory recomp004'])
+test('recomp004', [extra_files(['Main.hs', 'c.h', 'c1.c', 'c2.c'])],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp005/all.T b/testsuite/tests/driver/recomp005/all.T
index 533b7d6c8d63e64762d46dc12e941ce05f428714..34b3fa7117b7513f06b29366fa32aa1e473caf3a 100644
--- a/testsuite/tests/driver/recomp005/all.T
+++ b/testsuite/tests/driver/recomp005/all.T
@@ -1,3 +1,4 @@
-test('recomp005', [extra_files(['A.hs', 'B.hs', 'C1.hs', 'C2.hs', 'D.hs', 'E.hs']),
-                   when(fast(), skip)], run_command,
-     ['$MAKE -s --no-print-directory recomp005'])
+test('recomp005',
+     [extra_files(['A.hs', 'B.hs', 'C1.hs', 'C2.hs', 'D.hs', 'E.hs']),
+      when(fast(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp006/all.T b/testsuite/tests/driver/recomp006/all.T
index c7252efd7861fd668ce527dd03b4edca8e2ff6d5..6c584082707b23a0df3f47375dd02a6b4d03b892 100644
--- a/testsuite/tests/driver/recomp006/all.T
+++ b/testsuite/tests/driver/recomp006/all.T
@@ -1,3 +1,3 @@
 test('recomp006', [extra_files(['A.hs', 'B1.hs', 'B2.hs']),
-                   when(fast(), skip)], run_command,
-     ['$MAKE -s --no-print-directory recomp006'])
+                   when(fast(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp007/all.T b/testsuite/tests/driver/recomp007/all.T
index d4283ddeddd1d74bc9bf4141a39a3492c69b2441..34061addfa28c0d9b73e627bf030d349bef38e35 100644
--- a/testsuite/tests/driver/recomp007/all.T
+++ b/testsuite/tests/driver/recomp007/all.T
@@ -3,5 +3,5 @@
 #   "Fix a recompilation checking bug when a package dependency changes"
 
 test('recomp007', [extra_files(['Setup.hs', 'a1/', 'a2/', 'b/']),
-                   when(fast(), skip), normalise_slashes], run_command,
-     ['$MAKE -s --no-print-directory recomp007'])
+                   when(fast(), skip), normalise_slashes],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp008/all.T b/testsuite/tests/driver/recomp008/all.T
index 42f52cd090b1bc6197a0243b69d817bcee813c42..07bfd1477638ac38a2fe64f6c13bbe84dfd851c2 100644
--- a/testsuite/tests/driver/recomp008/all.T
+++ b/testsuite/tests/driver/recomp008/all.T
@@ -1,5 +1,6 @@
 # Test for #4469, a recompilation bug related to instances
 
-test('recomp008', [extra_files(['A1.hs', 'A2.hs', 'B.hs', 'Main.hs']),
-                   when(fast(), skip), normalise_slashes], run_command,
-     ['$MAKE -s --no-print-directory recomp008'])
+test('recomp008',
+     [extra_files(['A1.hs', 'A2.hs', 'B.hs', 'Main.hs']),
+      when(fast(), skip), normalise_slashes],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp009/all.T b/testsuite/tests/driver/recomp009/all.T
index 2b5d2afaf37f21ace7742ab53701e788ee087c97..5e20e09110d3bb9632ae1d47da7618925eb88fc7 100644
--- a/testsuite/tests/driver/recomp009/all.T
+++ b/testsuite/tests/driver/recomp009/all.T
@@ -1,3 +1,3 @@
 # Test for #481, a recompilation bug with Template Haskell
 
-test('recomp009', [extra_files(['Main.hs', 'Sub1.hs', 'Sub2.hs'])], run_command, ['$MAKE -s --no-print-directory recomp009'])
+test('recomp009', [extra_files(['Main.hs', 'Sub1.hs', 'Sub2.hs'])], makefile_test, [])
diff --git a/testsuite/tests/driver/recomp010/all.T b/testsuite/tests/driver/recomp010/all.T
index 5eea6a10d05a953848086ac93002aa0031150525..9040232e53b074d143d261ccb5c4764fd94bbdc4 100644
--- a/testsuite/tests/driver/recomp010/all.T
+++ b/testsuite/tests/driver/recomp010/all.T
@@ -1,3 +1,3 @@
 # Test for #5614, a recompilation bug
 
-test('recomp010', [extra_files(['Main.hs', 'X1.hs', 'X2.hs'])], run_command, ['$MAKE -s --no-print-directory recomp010'])
+test('recomp010', [extra_files(['Main.hs', 'X1.hs', 'X2.hs'])], makefile_test, [])
diff --git a/testsuite/tests/driver/recomp011/all.T b/testsuite/tests/driver/recomp011/all.T
index c22a6951a250372f673489d5195056204b6c054d..88144ae5f6ef1240095db0bbec57e2cb3c605024 100644
--- a/testsuite/tests/driver/recomp011/all.T
+++ b/testsuite/tests/driver/recomp011/all.T
@@ -3,4 +3,4 @@
 test('recomp011',
      [extra_files(['Main.hs']),
       when(arch('powerpc64') or arch('powerpc64le'), expect_broken(11260))],
-     run_command, ['$MAKE -s --no-print-directory recomp011'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp012/all.T b/testsuite/tests/driver/recomp012/all.T
index b1b599ecd42d142d593e5d36af5fc8f2de2ece44..8cb83195359dd449b43817e182f676421de56ee1 100644
--- a/testsuite/tests/driver/recomp012/all.T
+++ b/testsuite/tests/driver/recomp012/all.T
@@ -1,3 +1,3 @@
 # Test for #7215, a recompilation bug
 
-test('recomp012', [], run_command, ['$MAKE -s --no-print-directory recomp012'])
+test('recomp012', [], makefile_test, [])
diff --git a/testsuite/tests/driver/recomp013/all.T b/testsuite/tests/driver/recomp013/all.T
index 9481b01bd813dbab0c9f7ebcd8c8bfd8609ae407..01d78ca611eba90b42419661785d5a186530a2cc 100644
--- a/testsuite/tests/driver/recomp013/all.T
+++ b/testsuite/tests/driver/recomp013/all.T
@@ -1,3 +1,3 @@
 # Test for #8247, a recompilation bug
 
-test('recomp013', [], run_command, ['$MAKE -s --no-print-directory recomp013'])
+test('recomp013', [], makefile_test, [])
diff --git a/testsuite/tests/driver/recomp015/all.T b/testsuite/tests/driver/recomp015/all.T
index 9399534c4ed1acc56be5e3e27174b5d5fa58bc8d..5b77fe0f3af417d7eeb33090cfb9e58ee7604bd3 100644
--- a/testsuite/tests/driver/recomp015/all.T
+++ b/testsuite/tests/driver/recomp015/all.T
@@ -6,6 +6,5 @@ test('recomp015',
        unless(opsys('linux') or opsys('solaris2') or opsys('openbsd'), skip),
        when(arch('arm'), skip),
        when(arch('powerpc64') or arch('powerpc64le'), expect_broken(11323))],
-     run_command,
-     ['$MAKE -s --no-print-directory recomp015'])
+     makefile_test, [])
 
diff --git a/testsuite/tests/driver/recomp016/all.T b/testsuite/tests/driver/recomp016/all.T
index 54b33723c048eebc816797942ea6303814e751b9..afd6c2ad95206b037ac30b46b6031fc97160e200 100644
--- a/testsuite/tests/driver/recomp016/all.T
+++ b/testsuite/tests/driver/recomp016/all.T
@@ -1,3 +1,5 @@
 # Test for #12723, a recompilation bug
 
-test('recomp016', [extra_files(['A.hs', 'A2.hs', 'C.hs', 'D.hs', 'E.hs'])], run_command, ['$MAKE -s --no-print-directory recomp016'])
+test('recomp016',
+     [extra_files(['A.hs', 'A2.hs', 'C.hs', 'D.hs', 'E.hs'])],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp017/all.T b/testsuite/tests/driver/recomp017/all.T
index ac473e04c8a5c375305ee67e2059b155da371bb4..0855f0bce8eb22cd56b3408e0c5ccf25916fc8c7 100644
--- a/testsuite/tests/driver/recomp017/all.T
+++ b/testsuite/tests/driver/recomp017/all.T
@@ -3,4 +3,4 @@
 test('recomp017',
      [extra_files(['A.hs', 'B.hs', 'C.hs', 'C2.hs', 'D.hs', 'E.hs']),
       ignore_stdout, expect_broken(13099)],
-     run_command, ['$MAKE -s --no-print-directory recomp017'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/recomp018/all.T b/testsuite/tests/driver/recomp018/all.T
index 0d8faf70ca27c508509cd7be562fcc91bf2a5519..dc5eb7c43c04d8e5d3ec4e48e84124e367c35d9d 100644
--- a/testsuite/tests/driver/recomp018/all.T
+++ b/testsuite/tests/driver/recomp018/all.T
@@ -2,4 +2,4 @@
 
 test('recomp018',
      [extra_files(['A.hs', 'B.hs', 'C.hs'])],
-     run_command, ['$MAKE -s --no-print-directory recomp018'])
+     makefile_test, [])
diff --git a/testsuite/tests/driver/retc001/all.T b/testsuite/tests/driver/retc001/all.T
index a5b0c827e1f612cc62d706ef4d91a239d85b9319..a1ec634dd32daf2bd817c4c41460fa44e7339cdb 100644
--- a/testsuite/tests/driver/retc001/all.T
+++ b/testsuite/tests/driver/retc001/all.T
@@ -2,6 +2,5 @@ test('retc001',
      [extra_files(['A.hs', 'B1.hs', 'B2.hs', 'C.hs']),
 # See issue 11204, this test sometimes passes and sometimes fails on OSX
       when(opsys('darwin'), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory retc001'])
+     makefile_test, [])
 
diff --git a/testsuite/tests/driver/retc002/all.T b/testsuite/tests/driver/retc002/all.T
index a2b67e47b0af2369646e32e9b83002875c21830c..bf5c81dabec6d0895a48a4ab539afda4e8d42762 100644
--- a/testsuite/tests/driver/retc002/all.T
+++ b/testsuite/tests/driver/retc002/all.T
@@ -1,3 +1,3 @@
 test('retc002', [extra_files(['Q.hs', 'W.hs', 'W.hs-boot']),
-                 when(fast(), skip)], run_command,
-     ['$MAKE -s --no-print-directory retc002'])
+                 when(fast(), skip)],
+     makefile_test, [])
diff --git a/testsuite/tests/driver/retc003/all.T b/testsuite/tests/driver/retc003/all.T
index 0bfefce6b5840e07aaedf744e2716594d85b94e5..53a99b8255e9ab0ee32bcab227f8733bb7126d2c 100644
--- a/testsuite/tests/driver/retc003/all.T
+++ b/testsuite/tests/driver/retc003/all.T
@@ -1 +1 @@
-test('retc003', [extra_files(['A.hs'])], run_command, ['$MAKE -s --no-print-directory retc003'])
+test('retc003', [extra_files(['A.hs'])], makefile_test, [])
diff --git a/testsuite/tests/dynlibs/all.T b/testsuite/tests/dynlibs/all.T
index 88ce37f44525838627fb47611c45bb7587e90a26..aaa7a627747997dd5abf3086e754a286d9dd0e5c 100644
--- a/testsuite/tests/dynlibs/all.T
+++ b/testsuite/tests/dynlibs/all.T
@@ -1,13 +1,9 @@
 
-test('T3807', [req_shared_libs, when(opsys('mingw32'), skip)], run_command,
-     ['$MAKE --no-print-directory -s T3807'])
+test('T3807', [req_shared_libs, when(opsys('mingw32'), skip)], makefile_test, [])
 
-test('T4464', [req_shared_libs, unless(opsys('mingw32'), skip)], run_command,
-     ['$MAKE --no-print-directory -s T4464'])
+test('T4464', [req_shared_libs, unless(opsys('mingw32'), skip)], makefile_test, [])
 
-test('T5373', [req_shared_libs], run_command,
-     ['$MAKE --no-print-directory -s T5373'])
+test('T5373', [req_shared_libs], makefile_test, [])
 
 # It's not clear exactly what platforms we can expect this to succeed on.
-test('T13702', unless(opsys('linux'), skip), run_command,
-     ['$MAKE --no-print-directory -s T13702'])
+test('T13702', unless(opsys('linux'), skip), makefile_test, [])
diff --git a/testsuite/tests/ffi/should_run/all.T b/testsuite/tests/ffi/should_run/all.T
index 5bc1ab27e1c0375e36af3e00b1b8727996789c78..e9ea97586e6c960955085eb4ad6ec9d6b51eae2f 100644
--- a/testsuite/tests/ffi/should_run/all.T
+++ b/testsuite/tests/ffi/should_run/all.T
@@ -160,11 +160,11 @@ test('T5594', [ omit_ways(['ghci']),
                 # needs it.
                 compile_and_run, ['T5594_c.c -no-hs-main'])
 
-test('Capi_Ctype_001', [extra_files(['Capi_Ctype_A_001.hsc', 'capi_ctype_001.h', 'capi_ctype_001_c.c'])], run_command,
-     ['$MAKE -s --no-print-directory Capi_Ctype_001'])
+test('Capi_Ctype_001', [extra_files(['Capi_Ctype_A_001.hsc', 'capi_ctype_001.h', 'capi_ctype_001_c.c'])],
+     makefile_test, ['Capi_Ctype_001'])
 
-test('Capi_Ctype_002', [extra_files(['Capi_Ctype_A_002.hsc', 'capi_ctype_002_A.h', 'capi_ctype_002_B.h'])], run_command,
-     ['$MAKE -s --no-print-directory Capi_Ctype_002'])
+test('Capi_Ctype_002', [extra_files(['Capi_Ctype_A_002.hsc', 'capi_ctype_002_A.h', 'capi_ctype_002_B.h'])],
+     makefile_test, ['Capi_Ctype_002'])
 
 test('ffi_parsing_001', [omit_ways(['ghci'])], compile_and_run,
      ['ffi_parsing_001_c.c'])
diff --git a/testsuite/tests/gadt/all.T b/testsuite/tests/gadt/all.T
index 395cce8c12b78f180ee5a271ff3a130052322098..86a9b0c9103c477fd94fd0b795ded1dd9ce83824 100644
--- a/testsuite/tests/gadt/all.T
+++ b/testsuite/tests/gadt/all.T
@@ -19,7 +19,7 @@ test('gadt14', normal, compile, [''])
 test('gadt15', normal, compile, [''])
 test('gadt16', normal, compile, [''])
 
-test('gadt17', [extra_files(['Gadt17_help.hs'])], run_command, ['$MAKE -s --no-print-directory gadt17'])
+test('gadt17', [extra_files(['Gadt17_help.hs'])], makefile_test, ['gadt17'])
 
 test('gadt18', normal, compile, [''])
 test('gadt19', normal, compile, [''])
@@ -27,7 +27,7 @@ test('gadt20', normal, compile, [''])
 test('gadt21', normal, compile_fail, [''])
 test('gadt22', normal, compile, [''])
 
-test('gadt23', [extra_files(['Gadt23_AST.hs'])], run_command, ['$MAKE -s --no-print-directory gadt23'])
+test('gadt23', [extra_files(['Gadt23_AST.hs'])], makefile_test, ['gadt23'])
 
 test('gadt24', normal, compile, [''])
 
@@ -107,7 +107,7 @@ test('FloatEq', normal, compile, [''])
 test('T7205', normal, compile, [''])
 test('T7293', normal, compile_fail, ['-Werror'])
 test('T7294', normal, compile, [''])
-test('T7321', [], run_command, ['$MAKE -s --no-print-directory T7321'])
+test('T7321', [], makefile_test, [])
 test('T7974', normal, compile, [''])
 test('T7558', normal, compile_fail, [''])
 test('T9096', normal, compile, [''])
diff --git a/testsuite/tests/generics/all.T b/testsuite/tests/generics/all.T
index f127f7895f31f3ef521e01069e64eb954c14b63b..4887d491cbe04699de213ebdfe32c7d5d202b7d0 100644
--- a/testsuite/tests/generics/all.T
+++ b/testsuite/tests/generics/all.T
@@ -43,5 +43,4 @@ test('T10361a', normal, compile, [''])
 test('T10361b', normal, compile, [''])
 test('T11358', normal, compile_and_run, [''])
 test('T12220', normal, compile, [''])
-test('T15012', [extra_files(['T15012.hs', 'T15012a.hs'])], run_command,
-               ['$MAKE -s --no-print-directory T15012'])
+test('T15012', [extra_files(['T15012.hs', 'T15012a.hs'])], makefile_test, [])
diff --git a/testsuite/tests/ghc-api/T10052/all.T b/testsuite/tests/ghc-api/T10052/all.T
index e76eae07057907944afb9bb24c2fc24c13c4bedc..7913ba4b4e24dde6e60053ea952cff64d4943557 100644
--- a/testsuite/tests/ghc-api/T10052/all.T
+++ b/testsuite/tests/ghc-api/T10052/all.T
@@ -1,3 +1,3 @@
 test('T10052', [when(arch('powerpc64') or arch('powerpc64le'),
                 expect_broken(11259)), req_interp],
-     run_command, ['$MAKE -s --no-print-directory T10052'])
+     makefile_test, ['T10052'])
diff --git a/testsuite/tests/ghc-api/T4891/all.T b/testsuite/tests/ghc-api/T4891/all.T
index 1e61d62c6c5cabcff83e391e58ed1513af38dbfa..c179398c331c85f6f785a9230c671cde858843b8 100644
--- a/testsuite/tests/ghc-api/T4891/all.T
+++ b/testsuite/tests/ghc-api/T4891/all.T
@@ -1 +1 @@
-test('T4891', [extra_files(['X.hs'])], run_command, ['$MAKE -s --no-print-directory T4891'])
+test('T4891', [extra_files(['X.hs'])], makefile_test, ['T4891'])
diff --git a/testsuite/tests/ghc-api/T7478/all.T b/testsuite/tests/ghc-api/T7478/all.T
index e4b43d0114b536853c440ddf509f013591063843..0b6346c4a83f7de9087ba402e792cc609eec16d7 100644
--- a/testsuite/tests/ghc-api/T7478/all.T
+++ b/testsuite/tests/ghc-api/T7478/all.T
@@ -1,3 +1,3 @@
 test('T7478', [extra_files(['A.hs', 'B.hs', 'C.hs']),
-               unless(have_dynamic(), skip)], run_command,
-     ['$MAKE -s --no-print-directory T7478'])
+               unless(have_dynamic(), skip)],
+     makefile_test, ['T7478'])
diff --git a/testsuite/tests/ghc-api/all.T b/testsuite/tests/ghc-api/all.T
index 377c1e398721c5fc16f24ceb41210795372747ea..b4e24ec2fd0db5ad23593c9f1ef1c879320952d6 100644
--- a/testsuite/tests/ghc-api/all.T
+++ b/testsuite/tests/ghc-api/all.T
@@ -1,15 +1,11 @@
 test('ghcApi', normal, compile_and_run, ['-package ghc'])
-test('T6145', normal,
-              run_command,
-              ['$MAKE -s --no-print-directory T6145'])
+test('T6145', normal, makefile_test, ['T6145'])
 test('T8639_api', when(arch('powerpc64') or arch('powerpc64le'),
                        expect_broken(11259)),
-              run_command,
-              ['$MAKE -s --no-print-directory T8639_api'])
+              makefile_test, ['T8639_api'])
 test('T8628', when(arch('powerpc64') or arch('powerpc64le'),
                    expect_broken(11259)),
-              run_command,
-              ['$MAKE -s --no-print-directory T8628'])
+              makefile_test, ['T8628'])
 test('T9595', extra_run_opts('"' + config.libdir + '"'),
               compile_and_run,
               ['-package ghc'])
diff --git a/testsuite/tests/ghc-api/annotations-literals/all.T b/testsuite/tests/ghc-api/annotations-literals/all.T
index c8c511f25616e956bf8b72e4e2d23491db033513..75284e5a97a92b577475148ba17bc87e40bcc751 100644
--- a/testsuite/tests/ghc-api/annotations-literals/all.T
+++ b/testsuite/tests/ghc-api/annotations-literals/all.T
@@ -1,2 +1,2 @@
-test('literals', [extra_files(['LiteralsTest.hs'])], run_command, ['$MAKE -s --no-print-directory literals'])
-test('parsed', [extra_files(['LiteralsTest2.hs'])], run_command, ['$MAKE -s --no-print-directory parsed'])
+test('literals', [extra_files(['LiteralsTest.hs'])], makefile_test, ['literals'])
+test('parsed', [extra_files(['LiteralsTest2.hs'])], makefile_test, ['parsed'])
diff --git a/testsuite/tests/ghc-api/annotations/all.T b/testsuite/tests/ghc-api/annotations/all.T
index 49f0780021d0180f6b1ac7afb0a70a34634bf141..97c3c60c215f6c42656040979f9db3c015a90751 100644
--- a/testsuite/tests/ghc-api/annotations/all.T
+++ b/testsuite/tests/ghc-api/annotations/all.T
@@ -1,65 +1,66 @@
 test('annotations', [extra_files(['AnnotationLet.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory annotations'])
+                     ignore_stderr], makefile_test, ['annotations'])
 test('parseTree',   [extra_files(['AnnotationTuple.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory parseTree'])
+                     ignore_stderr], makefile_test, ['parseTree'])
 test('comments',    [extra_files(['CommentsTest.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory comments'])
+                     ignore_stderr], makefile_test, ['comments'])
 test('exampleTest', [extra_files(['AnnotationTuple.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory exampleTest'])
+                     ignore_stderr], makefile_test, ['exampleTest'])
 test('listcomps',   [extra_files(['ListComprehensions.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory listcomps'])
+                     ignore_stderr], makefile_test, ['listcomps'])
 test('T10255',      [extra_files(['Test10255.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10255'])
+                     ignore_stderr], makefile_test, ['T10255'])
 test('T10268',      [extra_files(['Test10268.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10268'])
+                     ignore_stderr], makefile_test, ['T10268'])
 test('T10269',      [extra_files(['Test10269.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10269'])
+                     ignore_stderr], makefile_test, ['T10269'])
 test('T10280',      [extra_files(['Test10280.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10280'])
+                     ignore_stderr], makefile_test, ['T10280'])
 test('T10312',      [extra_files(['Test10312.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10312'])
+                     ignore_stderr], makefile_test, ['T10312'])
 test('T10307',      [extra_files(['Test10307.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10307'])
+                     ignore_stderr], makefile_test, ['T10307'])
 test('T10309',      [extra_files(['Test10309.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10309'])
+                     ignore_stderr], makefile_test, ['T10309'])
 test('boolFormula', [extra_files(['TestBoolFormula.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory boolFormula'])
+                     ignore_stderr], makefile_test, ['boolFormula'])
 test('T10357',      [extra_files(['Test10357.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10357'])
+                     ignore_stderr], makefile_test, ['T10357'])
 test('T10358',      [extra_files(['Test10358.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10358'])
+                     ignore_stderr], makefile_test, ['T10358'])
 test('T10278',      [extra_files(['Test10278.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10278'])
+                     ignore_stderr], makefile_test, ['T10278'])
 test('T10354',      [extra_files(['Test10354.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10354'])
+                     ignore_stderr], makefile_test, ['T10354'])
 test('T10396',      [extra_files(['Test10396.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10396'])
+                     ignore_stderr], makefile_test, ['T10396'])
 test('T10399',      [extra_files(['Test10399.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10399'])
+                     ignore_stderr], makefile_test, ['T10399'])
 test('T10313',      [extra_files(['Test10313.hs', 'stringSource.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10313'])
+                     ignore_stderr], makefile_test, ['T10313'])
 # Stricter tests from trac #16217 now causes this to fail. Will be fixed for trac #16212
-test('T11018',      [expect_broken(11018),extra_files(['Test11018.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T11018'])
+test('T11018',      [expect_broken(11018),
+                     extra_files(['Test11018.hs']),
+                     ignore_stderr], makefile_test, ['T11018'])
 test('bundle-export', [extra_files(['BundleExport.hs']),
-                       ignore_stderr], run_command, ['$MAKE -s --no-print-directory bundle-export'])
+                       ignore_stderr], makefile_test, ['bundle-export'])
 test('T10276',      [extra_files(['Test10276.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10276'])
+                     ignore_stderr], makefile_test, ['T10276'])
 test('T10598',      [extra_files(['Test10598.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T10598'])
+                     ignore_stderr], makefile_test, ['T10598'])
 test('T11321',      [extra_files(['Test11321.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T11321'])
+                     ignore_stderr], makefile_test, ['T11321'])
 test('T11332',      [extra_files(['Test11332.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T11332'])
+                     ignore_stderr], makefile_test, ['T11332'])
 test('T11430',      [extra_files(['Test11430.hs', 't11430.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T11430'])
-test('load-main',   ignore_stderr, run_command, ['$MAKE -s --no-print-directory load-main'])
+                     ignore_stderr], makefile_test, ['T11430'])
+test('load-main',   ignore_stderr, makefile_test, ['load-main'])
 test('T12417',      [extra_files(['Test12417.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T12417'])
+                     ignore_stderr], makefile_test, ['T12417'])
 test('T13163',      [extra_files(['Test13163.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T13163'])
+                     ignore_stderr], makefile_test, ['T13163'])
 test('T15303',      [extra_files(['Test15303.hs']),
-                     ignore_stderr], run_command, ['$MAKE -s --no-print-directory T15303'])
+                     ignore_stderr], makefile_test, ['T15303'])
 # Stricter tests from trac #16217 now causes this to fail. Will be fixed for trac #16212
 test('T16212',      [expect_broken(16212),extra_files(['Test16212.hs']),
                      ignore_stderr], run_command, ['$MAKE -s --no-print-directory T16212'])
diff --git a/testsuite/tests/ghc-api/apirecomp001/all.T b/testsuite/tests/ghc-api/apirecomp001/all.T
index 7b17e138f47ff96ed25e621d631aaf17873b8be1..363f9c05ab05c65b3e0f04a049485f4334b9b965 100644
--- a/testsuite/tests/ghc-api/apirecomp001/all.T
+++ b/testsuite/tests/ghc-api/apirecomp001/all.T
@@ -1,4 +1,3 @@
 test('apirecomp001',
      extra_files(['A.hs', 'B.hs', 'myghc.hs']),
-     run_command,
-     ['$MAKE -s --no-print-directory apirecomp001'])
+     makefile_test, ['apirecomp001'])
diff --git a/testsuite/tests/ghc-api/show-srcspan/all.T b/testsuite/tests/ghc-api/show-srcspan/all.T
index 100b3f03ea0d745760157f7e3fed19c7f774dc86..3f9fb75287e7d70d1b1b6303057a8b16f79e7577 100644
--- a/testsuite/tests/ghc-api/show-srcspan/all.T
+++ b/testsuite/tests/ghc-api/show-srcspan/all.T
@@ -1 +1 @@
-test('showsrcspan', normal, run_command, ['$MAKE -s --no-print-directory showsrcspan'])
+test('showsrcspan', normal, makefile_test, ['showsrcspan'])
diff --git a/testsuite/tests/ghc-e/should_fail/all.T b/testsuite/tests/ghc-e/should_fail/all.T
index 9a75481621d05cd3a766684d7a1bdad86c47fffe..76f9afe0a85a58b762a5719fc12730209dde97d9 100644
--- a/testsuite/tests/ghc-e/should_fail/all.T
+++ b/testsuite/tests/ghc-e/should_fail/all.T
@@ -1,23 +1,16 @@
-test('T7962', req_interp, run_command,
-     ['$MAKE --no-print-directory -s T7962'])
+test('T7962', req_interp, makefile_test, ['T7962'])
 
-test('T9905fail1', req_interp, run_command,
-     ['$MAKE --no-print-directory -s T9905fail1'])
+test('T9905fail1', req_interp, makefile_test, ['T9905fail1'])
 
-test('T9905fail2', req_interp, run_command,
-     ['$MAKE --no-print-directory -s T9905fail2'])
+test('T9905fail2', req_interp, makefile_test, ['T9905fail2'])
 
-test('T9905fail3', req_interp, run_command,
-     ['$MAKE --no-print-directory -s T9905fail3'])
+test('T9905fail3', req_interp, makefile_test, ['T9905fail3'])
 
-test('ghc-e-fail1', req_interp, run_command,
-     ['$MAKE --no-print-directory -s ghc-e-fail1'])
+test('ghc-e-fail1', req_interp, makefile_test, ['ghc-e-fail1'])
 
-test('ghc-e-fail2', req_interp, run_command,
-     ['$MAKE --no-print-directory -s ghc-e-fail2'])
+test('ghc-e-fail2', req_interp, makefile_test, ['ghc-e-fail2'])
 
 # Don't run on Windows, as executable is written to T9930.exe
 # and no failure is induced.
 test('T9930fail', [extra_files(['T9930']), when(opsys('mingw32'), skip)],
-     run_command,
-     ['$MAKE --no-print-directory -s T9930fail'])
+     makefile_test, ['T9930fail'])
diff --git a/testsuite/tests/ghc-e/should_run/all.T b/testsuite/tests/ghc-e/should_run/all.T
index a10fb0d816c3e4997b74b99c23394ceb5a339abd..a2e50ab9ec541362b7c4d051884712e3be5750e8 100644
--- a/testsuite/tests/ghc-e/should_run/all.T
+++ b/testsuite/tests/ghc-e/should_run/all.T
@@ -1,19 +1,18 @@
 
-test('ghc-e001', req_interp, run_command, ['$MAKE --no-print-directory -s ghc-e001'])
-test('ghc-e002', req_interp, run_command, ['$MAKE --no-print-directory -s ghc-e002'])
-test('ghc-e003', req_interp, run_command, ['$MAKE --no-print-directory -s ghc-e003'])
-test('ghc-e004', req_interp, run_command, ['$MAKE --no-print-directory -s ghc-e004'])
-test('ghc-e005', req_interp, run_command, ['$MAKE --no-print-directory -s ghc-e005'])
-test('ghc-e006', req_interp, run_command, ['$MAKE --no-print-directory -s ghc-e006'])
+test('ghc-e001', req_interp, makefile_test, ['ghc-e001'])
+test('ghc-e002', req_interp, makefile_test, ['ghc-e002'])
+test('ghc-e003', req_interp, makefile_test, ['ghc-e003'])
+test('ghc-e004', req_interp, makefile_test, ['ghc-e004'])
+test('ghc-e005', req_interp, makefile_test, ['ghc-e005'])
+test('ghc-e006', req_interp, makefile_test, ['ghc-e006'])
 
 test('T2228',
      [req_interp, when(ghc_dynamic(), expect_broken(7298))],
-     run_command,
-     ['$MAKE --no-print-directory -s T2228'])
-test('T2636', req_interp, run_command, ['$MAKE --no-print-directory -s T2636'])
-test('T3890', req_interp, run_command, ['$MAKE --no-print-directory -s T3890'])
-test('T7299', req_interp, run_command, ['$MAKE --no-print-directory -s T7299'])
-test('T9086', req_interp, run_command, ['$MAKE --no-print-directory -s T9086'])
-test('T9905', req_interp, run_command, ['$MAKE --no-print-directory -s T9905'])
-test('T9905b', req_interp, run_command, ['$MAKE --no-print-directory -s T9905b'])
-test('T11478', req_interp, run_command, ['$MAKE --no-print-directory -s T11478'])
+     makefile_test, ['T2228'])
+test('T2636', req_interp, makefile_test, ['T2636'])
+test('T3890', req_interp, makefile_test, ['T3890'])
+test('T7299', req_interp, makefile_test, ['T7299'])
+test('T9086', req_interp, makefile_test, ['T9086'])
+test('T9905', req_interp, makefile_test, ['T9905'])
+test('T9905b', req_interp, makefile_test, ['T9905b'])
+test('T11478', req_interp, makefile_test, ['T11478'])
diff --git a/testsuite/tests/ghci/linking/all.T b/testsuite/tests/ghci/linking/all.T
index d5ee2ff4fca2e71755c8f873efae1778e264d61e..37ab64301cb0cbf56844455527f94538a222f8e0 100644
--- a/testsuite/tests/ghci/linking/all.T
+++ b/testsuite/tests/ghci/linking/all.T
@@ -3,45 +3,40 @@ test('ghcilink001',
       when(ghc_dynamic(), expect_fail), # dynamic ghci can't load '.a's
       unless(doing_ghci, skip),
       extra_clean(['dir001/*','dir001'])],
-     run_command,
-     ['$MAKE -s --no-print-directory ghcilink001'])
+     makefile_test, ['ghcilink001'])
 
 test('ghcilink002', [extra_files(['TestLink.hs', 'f.c']),
                      # Fragile when unregisterised; see #16085
                      when(unregisterised(), skip),
-                     unless(doing_ghci, skip)], run_command,
-     ['$MAKE -s --no-print-directory ghcilink002'])
+                     unless(doing_ghci, skip)],
+     makefile_test, ['ghcilink002'])
 
-test('ghcilink003', [unless(doing_ghci, skip)], run_command,
-     ['$MAKE -s --no-print-directory ghcilink003'])
+test('ghcilink003', [unless(doing_ghci, skip)], makefile_test, ['ghcilink003'])
 
 test('ghcilink004',
      [extra_files(['TestLink.hs', 'f.c']),
       unless(doing_ghci, skip),
       when(arch('powerpc64') or arch('powerpc64le'), expect_broken(11259))],
-     run_command, ['$MAKE -s --no-print-directory ghcilink004'])
+     makefile_test, ['ghcilink004'])
 
 test('ghcilink005',
      [extra_files(['TestLink.hs', 'f.c']),
       # Fragile when unregisterised; see #16085
       when(unregisterised(), skip),
       unless(doing_ghci, skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory ghcilink005'])
+     makefile_test, ['ghcilink005'])
 
-test('ghcilink006', [unless(doing_ghci, skip)], run_command,
-     ['$MAKE -s --no-print-directory ghcilink006'])
+test('ghcilink006', [unless(doing_ghci, skip)], makefile_test, ['ghcilink006'])
 
 test('T3333',
      [unless(doing_ghci, skip),
       unless(opsys('linux') or opsys('darwin') or ghc_dynamic(),
              expect_broken(3333))],
-     run_command, ['$MAKE -s --no-print-directory T3333'])
+     makefile_test, ['T3333'])
 
 test('T14708',
      [extra_files(['T14708.hs', 'add.c']),
       unless(doing_ghci, skip),
       unless(ghc_dynamic(), skip),
       extra_clean(['T14708scratch/*', 'T14708'])],
-     run_command,
-     ['$MAKE -s --no-print-directory T14708'])
+     makefile_test, ['T14708'])
diff --git a/testsuite/tests/ghci/linking/dyn/all.T b/testsuite/tests/ghci/linking/dyn/all.T
index f8679bcbfef1540719fb7aff560d2a3a8f18460a..2efcbbb4fa0e74ecb3e84789aa822b54791de364 100644
--- a/testsuite/tests/ghci/linking/dyn/all.T
+++ b/testsuite/tests/ghci/linking/dyn/all.T
@@ -1,18 +1,17 @@
 test('load_short_name', [extra_files(['A.c']),
-                         unless(doing_ghci, skip)], run_command,
-     ['$MAKE -s --no-print-directory load_short_name'])
+                         unless(doing_ghci, skip)],
+     makefile_test, ['load_short_name'])
 
 test('T1407',
      [extra_files(['A.c']),
       unless(doing_ghci, skip),
       pre_cmd('$MAKE -s --no-print-directory compile_libT1407'),
       extra_hc_opts('-L"$PWD/T1407dir"')],
-     run_command, ['$MAKE --no-print-directory -s T1407'])
+     makefile_test, [])
 
 test('T3242',
      [unless(doing_ghci, skip), unless(opsys('mingw32'), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory T3242'])
+     makefile_test, ['T3242'])
 
 test('T10955',
      [extra_files(['A.c', 'B.c']),
@@ -21,8 +20,7 @@ test('T10955',
       extra_hc_opts('-L. -L./bin_dep')],
      ghci_script, ['T10955.script'])
 
-test('T10955dyn', [extra_files(['A.c', 'B.c'])], run_command,
-     ['$MAKE -s --no-print-directory compile_libAB_dyn'])
+test('T10955dyn', [extra_files(['A.c', 'B.c'])], makefile_test, ['compile_libAB_dyn'])
 
 test('T10458',
      [extra_files(['A.c']),
@@ -33,16 +31,16 @@ test('T10458',
 
 test('T11072gcc', [extra_files(['A.c', 'T11072.hs']),
                    unless(doing_ghci, skip), unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory compile_libAS_impl_gcc'])
+     makefile_test, ['compile_libAS_impl_gcc'])
 
 test('T11072msvc', [extra_files(['A.c', 'T11072.hs', 'libAS.def', 'i686/', 'x86_64/']),
                     unless(doing_ghci, skip), unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory compile_libAS_impl_msvc'])
+     makefile_test, ['compile_libAS_impl_msvc'])
 
 test('T13606', [unless(doing_ghci, skip), unless(opsys('mingw32'), skip),
                 exit_code(0)],
-     run_command, ['$MAKE -s --no-print-directory T13606'])
+     makefile_test, ['T13606'])
 
 test('big-obj', [extra_files(['big-obj-c.c', 'big-obj.hs']),
                     unless(doing_ghci, skip), unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory big-obj'])
+     makefile_test, ['big-obj'])
diff --git a/testsuite/tests/ghci/prog004/prog004.T b/testsuite/tests/ghci/prog004/prog004.T
index 31ac04a100fa38657d23beaab4499abf1112792a..74ec8ded1f9d2867a170dbe59b4809f4af9e3605 100644
--- a/testsuite/tests/ghci/prog004/prog004.T
+++ b/testsuite/tests/ghci/prog004/prog004.T
@@ -3,5 +3,4 @@ def f(name, opts):
         opts.skip = 1
 setTestOpts(f)
 
-test('ghciprog004', [], run_command,
-     ['$MAKE -s --no-print-directory ghciprog004'])
+test('ghciprog004', [], makefile_test, ['ghciprog004'])
diff --git a/testsuite/tests/ghci/scripts/all.T b/testsuite/tests/ghci/scripts/all.T
index 1394a9af56971e47be908b68f40a37c8f418d19e..2cb93b8aac05a0e3c127f981dc131a562a79299c 100755
--- a/testsuite/tests/ghci/scripts/all.T
+++ b/testsuite/tests/ghci/scripts/all.T
@@ -53,12 +53,10 @@ test('ghci022', normal, ghci_script, ['ghci022.script'])
 test('ghci023', normal, ghci_script, ['ghci023.script'])
 test('ghci024',
      [req_interp, when(fast(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory ghci024'])
+     makefile_test, [])
 test('T9367',
      [req_interp, when(fast() or config.os != 'mingw32', skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory T9367'])
+     makefile_test, [])
 test('ghci025', extra_files(['Ghci025B.hs', 'Ghci025C.hs', 'Ghci025D.hs']), ghci_script, ['ghci025.script'])
 test('ghci026', extra_files(['../prog002']), ghci_script, ['ghci026.script'])
 
@@ -72,7 +70,7 @@ test('ghci033', normal, ghci_script, ['ghci033.script'])
 test('ghci034', normal, ghci_script, ['ghci034.script'])
 test('ghci035', normal, ghci_script, ['ghci035.script'])
 test('ghci036', normal, ghci_script, ['ghci036.script'])
-test('ghci037', req_interp, run_command, ['$MAKE -s --no-print-directory ghci037'])
+test('ghci037', req_interp, makefile_test, [])
 test('ghci038', extra_files(['../shell.hs']), ghci_script, ['ghci038.script'])
 test('ghci039', normal, ghci_script, ['ghci039.script'])
 test('ghci040', normal, ghci_script, ['ghci040.script'])
@@ -219,8 +217,7 @@ test('T10122', normal, ghci_script, ['T10122.script'])
 
 test('T10321', normal, ghci_script, ['T10321.script'])
 
-test('T10408', req_interp, run_command,
-    ['$MAKE -s --no-print-directory T10408'])
+test('T10408', req_interp, makefile_test, [])
 test('T10248', normal, ghci_script, ['T10248.script'])
 test('T10110', normal, ghci_script, ['T10110.script'])
 test('T10322', normal, ghci_script, ['T10322.script'])
@@ -244,7 +241,7 @@ test('T11051a', normal, ghci_script, ['T11051a.script'])
 test('T11051b', normal, ghci_script, ['T11051b.script'])
 test('T11266', ignore_stdout, ghci_script, ['T11266.script'])
 
-test('T11389', req_interp, run_command, ['$MAKE -s --no-print-directory T11389'])
+test('T11389', req_interp, makefile_test, [])
 test('T11524a', normal, ghci_script, ['T11524a.script'])
 test('T11456', normal, ghci_script, ['T11456.script'])
 test('TypeAppData', normal, ghci_script, ['TypeAppData.script'])
@@ -255,8 +252,7 @@ test('T11975', normal, ghci_script, ['T11975.script'])
 test('T10963', normal, ghci_script, ['T10963.script'])
 test('T11721', normal, ghci_script, ['T11721.script'])
 test('T12005', normal, ghci_script, ['T12005.script'])
-test('T12023', normal, run_command,
-               ['$MAKE -s --no-print-directory T12023'])
+test('T12023', normal, makefile_test, [])
 test('T12520', normal, ghci_script, ['T12520.script'])
 test('T12091', [extra_run_opts('-fobject-code')], ghci_script,
      ['T12091.script'])
diff --git a/testsuite/tests/ghci/should_run/all.T b/testsuite/tests/ghci/should_run/all.T
index a9eded46d97234f24d74f6218391f9fa4b870681..54400197a76d7d2db0ae2bec34f290af36d0bf02 100644
--- a/testsuite/tests/ghci/should_run/all.T
+++ b/testsuite/tests/ghci/should_run/all.T
@@ -14,8 +14,7 @@ test('T3171',
       skip, # This test is quite flaky (#15383)
       req_interp,
       combined_output],
-     run_command,
-     ['$MAKE -s --no-print-directory T3171'])
+     makefile_test, [])
 
 test('ghcirun004', just_ghci, compile_and_run, [''])
 test('T8377',      just_ghci, compile_and_run, [''])
diff --git a/testsuite/tests/hp2ps/all.T b/testsuite/tests/hp2ps/all.T
index bebeb568e3889c5269ca2a8b654f2ce5cdb603a7..b884ecf456ed2657c20d3eb91095db1be14fb2a9 100644
--- a/testsuite/tests/hp2ps/all.T
+++ b/testsuite/tests/hp2ps/all.T
@@ -1 +1 @@
-test('T15904', [], run_command, ['$MAKE -s --no-print-directory T15904'])
+test('T15904', [], makefile_test, [])
diff --git a/testsuite/tests/hpc/all.T b/testsuite/tests/hpc/all.T
index 274674b95f9ab7e7695a68479bd2662c8da0b9a2..ed68e293321fe98f9d53c080162e0fbd343fc4b0 100644
--- a/testsuite/tests/hpc/all.T
+++ b/testsuite/tests/hpc/all.T
@@ -3,7 +3,7 @@ test('T10138', [extra_files(['.keepme.hpc.T10138/']),
      # Using --hpcdir with an absolute path should work (exit code 0).
      ['{hpc} report T10138.keepme.tix --hpcdir="`pwd`/.keepme.hpc.T10138"'])
 
-test('T11798', normal, run_command, ['$MAKE -s --no-print-directory T11798'])
+test('T11798', normal, makefile_test, [])
 
 # Run tests below only for the hpc way.
 #
diff --git a/testsuite/tests/hsc2hs/all.T b/testsuite/tests/hsc2hs/all.T
index d42f38589f09d650bf9756497495eabf90538919..ab67d012ee303ee04219b906535177b68357323b 100644
--- a/testsuite/tests/hsc2hs/all.T
+++ b/testsuite/tests/hsc2hs/all.T
@@ -1,23 +1,22 @@
 
-test('hsc2hs001', [], run_command, ['$MAKE -s --no-print-directory hsc2hs001'])
+test('hsc2hs001', [], makefile_test, [])
 
-test('hsc2hs002', [], run_command, ['$MAKE -s --no-print-directory hsc2hs002'])
+test('hsc2hs002', [], makefile_test, [])
 
-test('hsc2hs003', [], run_command, ['$MAKE -s --no-print-directory hsc2hs003'])
+test('hsc2hs003', [], makefile_test, [])
 
-test('hsc2hs004', [], run_command, ['$MAKE -s --no-print-directory hsc2hs004'])
+test('hsc2hs004', [], makefile_test, [])
 
 
-test('T3837', [], run_command, ['$MAKE -s --no-print-directory T3837'])
+test('T3837', [], makefile_test, [])
 
-test('T4340', [], run_command, ['$MAKE -s --no-print-directory T4340'])
+test('T4340', [], makefile_test, [])
 
-test('T10272', [], run_command, ['$MAKE -s --no-print-directory T10272'])
+test('T10272', [], makefile_test, [])
 
-test('T11004', [], run_command, ['$MAKE -s --no-print-directory T11004'])
+test('T11004', [], makefile_test, [])
 
-test('T12504', [extra_files(['T12504']), ignore_stdout], run_command,
-     ['$MAKE -s --no-print-directory T12504'])
+test('T12504', [extra_files(['T12504']), ignore_stdout], makefile_test, [])
 
 # Make sure response files are read and used.
-test('T15758', [], run_command, ['$MAKE -s --no-print-directory T15758'])
+test('T15758', [], makefile_test, [])
diff --git a/testsuite/tests/indexed-types/should_compile/T13092b/all.T b/testsuite/tests/indexed-types/should_compile/T13092b/all.T
index a3047a60e5fc05b2c189944fd1b0c25fac348df5..e5245ad9a35336c75bd39c326af0d42124ee8d6e 100644
--- a/testsuite/tests/indexed-types/should_compile/T13092b/all.T
+++ b/testsuite/tests/indexed-types/should_compile/T13092b/all.T
@@ -1,5 +1,4 @@
 # Test that we don't load all family instance interface files
 # when importing a module that defines a family instance
 
-test('T13092b', ignore_stdout,
-     run_command, ['$MAKE -s --no-print-directory T13092b'])
+test('T13092b', ignore_stdout, makefile_test, ['T13092b'])
diff --git a/testsuite/tests/indexed-types/should_compile/all.T b/testsuite/tests/indexed-types/should_compile/all.T
index 484d843672cb981e97f630aaea2c469a33cbe72f..dbebdf051d75bfa31f9ce807972fc93291ad70e5 100644
--- a/testsuite/tests/indexed-types/should_compile/all.T
+++ b/testsuite/tests/indexed-types/should_compile/all.T
@@ -39,7 +39,7 @@ test('Records', normal, compile, [''])
 # The point about this test is that it compiles NewTyCo1 and NewTyCo2
 # *separately*
 #
-test('NewTyCo', [], run_command, ['$MAKE -s --no-print-directory NewTyCo'])
+test('NewTyCo', [], makefile_test, ['NewTyCo'])
 
 test('Infix', normal, compile, [''])
 test('Kind', normal, compile, [''])
@@ -130,8 +130,7 @@ test('IndTypesPerf',
        extra_clean(['IndTypesPerf.o', 'IndTypesPerf.hi',
                     'IndTypesPerfMerge.o', 'IndTypesPerfMerge.hi'])
      ] ,
-     run_command,
-     ['$MAKE -s --no-print-directory IndTypesPerf'])
+     makefile_test, ['IndTypesPerf'])
 
 test('T4120', normal, compile, [''])
 test('T3787', normal, compile, [''])
@@ -171,13 +170,9 @@ test('HO', normal, compile, [''])
 
 # The point about this test is that it compiles the two T5955
 # modules *separately*
-test('T5955', [], run_command, ['$MAKE -s --no-print-directory T5955'])
-
-test('T6152',
-     normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T6152'])
+test('T5955', [], makefile_test, ['T5955'])
 
+test('T6152', normal, makefile_test, ['T6152'])
 test('T7082', normal, compile, [''])
 
 test('Overlap1', normal, compile, [''])
@@ -206,22 +201,13 @@ test('T7837', normal, compile,
 test('T4185', normal, compile, [''])
 
 # Caused infinite loop in the compiler
-test('T8002',
-     normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T8002'])
+test('T8002', normal, makefile_test, ['T8002'])
 
 # Import and export of associated types
-test('T8011',
-     normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T8011'])
+test('T8011', normal, makefile_test, ['T8011'])
 
 # Marshalling of associated types
-test('T8500',
-     normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T8500'])
+test('T8500', normal, makefile_test, ['T8500'])
 
 test('T8018', normal, compile, [''])
 test('T8020', normal, compile, [''])
diff --git a/testsuite/tests/indexed-types/should_fail/T13092/all.T b/testsuite/tests/indexed-types/should_fail/T13092/all.T
index 090d10db96e7f651c2132fcc07da546fd29221ba..2f2d1db393b143f800227a0fd880b819682ee8ff 100644
--- a/testsuite/tests/indexed-types/should_fail/T13092/all.T
+++ b/testsuite/tests/indexed-types/should_fail/T13092/all.T
@@ -2,4 +2,4 @@
 # with imported ones
 
 test('T13092', extra_files(['A.hs', 'B.hs', 'C.hs', 'Main.hs']),
-     run_command, ['$MAKE -s --no-print-directory T13092'])
+     makefile_test, ['T13092'])
diff --git a/testsuite/tests/indexed-types/should_fail/T13092c/all.T b/testsuite/tests/indexed-types/should_fail/T13092c/all.T
index c4e38be0543853aacf920834aba40c11b8e94f2b..359bc0486ebb2c7bb74e1436a372df3a7c9982d5 100644
--- a/testsuite/tests/indexed-types/should_fail/T13092c/all.T
+++ b/testsuite/tests/indexed-types/should_fail/T13092c/all.T
@@ -5,4 +5,4 @@
 # defined in T13092c_4, and would not be read otherwise.)
 
 test('T13092c', ignore_stdout,
-     run_command, ['$MAKE -s --no-print-directory T13092c'])
+     makefile_test, ['T13092c'])
diff --git a/testsuite/tests/indexed-types/should_fail/T13102/all.T b/testsuite/tests/indexed-types/should_fail/T13102/all.T
index bdde35430e715e943d287269d8308952568f468b..53564c176c7f3dcccab01b825e76d18191a2f31f 100644
--- a/testsuite/tests/indexed-types/should_fail/T13102/all.T
+++ b/testsuite/tests/indexed-types/should_fail/T13102/all.T
@@ -2,4 +2,4 @@
 
 test('T13102', [expect_broken(13102),
      extra_files(['A.hs', 'B.hs', 'orphan'])],
-     run_command, ['$MAKE -s --no-print-directory T13102'])
+     makefile_test, ['T13102'])
diff --git a/testsuite/tests/indexed-types/should_fail/all.T b/testsuite/tests/indexed-types/should_fail/all.T
index 4f6863bc44b575f8c71b4d29a506863a31b4771c..4e29910c21c74aecf8d7de1ecfeca1dded21a1e4 100644
--- a/testsuite/tests/indexed-types/should_fail/all.T
+++ b/testsuite/tests/indexed-types/should_fail/all.T
@@ -86,7 +86,7 @@ test('Overlap11', normal, compile_fail, [''])
 test('Overlap15', normal, compile_fail, [''])
 test('T7194', normal, compile_fail, [''])
 test('T7354', normal, compile_fail, [''])
-test('T7354a', [extra_files(['T7354b.hs'])], run_command, ['$MAKE -s --no-print-directory T7354a'])
+test('T7354a', [extra_files(['T7354b.hs'])], makefile_test, ['T7354a'])
 test('T7536', normal, compile_fail, [''])
 
 test('T7729', normal, compile_fail, [''])
@@ -100,11 +100,8 @@ test('T7938', normal, compile_fail, [''])
 test('ClosedFam3', [], multimod_compile_fail, ['ClosedFam3', '-v0'])
 test('ClosedFam4', normal, compile_fail, [''])
 test('T8155', normal, compile_fail, [''])
-test('T8227', [], run_command, ['$MAKE -s --no-print-directory T8227'])
-test('T8129',
-     normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T8129'])
+test('T8227', [], makefile_test, ['T8227'])
+test('T8129', normal, makefile_test, ['T8129'])
 
 test('T8368', normal, compile_fail, [''])
 test('T8368a', normal, compile_fail, [''])
diff --git a/testsuite/tests/layout/all.T b/testsuite/tests/layout/all.T
index cde69bfa1b66f85f67ef8df3a6e14febf61756af..8826bf9f7b731d4eed2c82eb6cbf40be8104176c 100644
--- a/testsuite/tests/layout/all.T
+++ b/testsuite/tests/layout/all.T
@@ -1,19 +1,18 @@
 
-test('layout001', [], run_command, ['$MAKE -s --no-print-directory layout001'])
+test('layout001', [], makefile_test, ['layout001'])
 
-test('layout002', [], run_command, ['$MAKE -s --no-print-directory layout002'])
+test('layout002', [], makefile_test, ['layout002'])
 
-test('layout003', [], run_command, ['$MAKE -s --no-print-directory layout003'])
+test('layout003', [], makefile_test, ['layout003'])
 
-test('layout004', [], run_command, ['$MAKE -s --no-print-directory layout004'])
+test('layout004', [], makefile_test, ['layout004'])
 
-test('layout005', [], run_command, ['$MAKE -s --no-print-directory layout005'])
+test('layout005', [], makefile_test, ['layout005'])
 
-test('layout006', [], run_command, ['$MAKE -s --no-print-directory layout006'])
+test('layout006', [], makefile_test, ['layout006'])
 
-test('layout007', [req_interp], run_command,
-     ['$MAKE -s --no-print-directory layout007'])
+test('layout007', [req_interp], makefile_test, ['layout007'])
 
-test('layout008', [], run_command, ['$MAKE -s --no-print-directory layout008'])
+test('layout008', [], makefile_test, ['layout008'])
 
-test('layout009', [], run_command, ['$MAKE -s --no-print-directory layout009'])
+test('layout009', [], makefile_test, ['layout009'])
diff --git a/testsuite/tests/lib/integer/all.T b/testsuite/tests/lib/integer/all.T
index fda9a4a791f7cf652477af7f5bb2a9566464fbb3..5e629b95df14bc0ea0287742777c006d4270f88d 100644
--- a/testsuite/tests/lib/integer/all.T
+++ b/testsuite/tests/lib/integer/all.T
@@ -3,10 +3,7 @@ test('integerConversions', normal, compile_and_run, [''])
 # skip ghci as it doesn't support unboxed tuples
 test('integerGmpInternals', [reqlib('integer-gmp'), omit_ways('ghci')], compile_and_run, [''])
 test('plusMinusInteger', [omit_ways('ghci')], compile_and_run, [''])
-test('integerConstantFolding', normal, run_command,
-     ['$MAKE -s --no-print-directory integerConstantFolding'])
-test('fromToInteger', [], run_command,
-     ['$MAKE -s --no-print-directory fromToInteger'])
-test('IntegerConversionRules', [], run_command,
-     ['$MAKE -s --no-print-directory IntegerConversionRules'])
+test('integerConstantFolding', normal, makefile_test, ['integerConstantFolding'])
+test('fromToInteger', [], makefile_test, ['fromToInteger'])
+test('IntegerConversionRules', [], makefile_test, ['IntegerConversionRules'])
 test('gcdInteger', normal, compile_and_run, [''])
diff --git a/testsuite/tests/llvm/should_run/subsections_via_symbols/all.T b/testsuite/tests/llvm/should_run/subsections_via_symbols/all.T
index ca6bc0a24f053f389c5cb723f2bc70805ad73e7c..ef586bc6a08302be97ea8df46ed638f6fd1d790b 100644
--- a/testsuite/tests/llvm/should_run/subsections_via_symbols/all.T
+++ b/testsuite/tests/llvm/should_run/subsections_via_symbols/all.T
@@ -13,5 +13,4 @@ setTestOpts(f)
 # Please refer to https://ghc.haskell.org/trac/ghc/ticket/5019
 # for the subsections_via_symbols.stderr
 
-test('subsections_via_symbols', [only_darwin], run_command,
-     ['$MAKE -s --no-print-directory subsections_via_symbols_test'])
+test('subsections_via_symbols', [only_darwin], makefile_test, [])
diff --git a/testsuite/tests/module/all.T b/testsuite/tests/module/all.T
index 33ce3aeefe11a4696e3b943d57a4d8c7dadbfc40..6ff69b07587c87d5d7ebc8b7337e79d99b892bd2 100644
--- a/testsuite/tests/module/all.T
+++ b/testsuite/tests/module/all.T
@@ -198,11 +198,11 @@ test('mod142', [extra_files(['Mod142_A.hs'])], multimod_compile_fail, ['mod142',
 
 test('mod143', [extra_files(['Mod143_A.hs'])], multimod_compile_fail, ['mod143', '-v0'])
 
-test('mod144', [extra_files(['Mod144_A.hs'])], run_command, ['$MAKE -s --no-print-directory mod144'])
+test('mod144', [extra_files(['Mod144_A.hs'])], makefile_test, [])
 
 test('mod145', [extra_files(['Mod145_A.hs'])], multimod_compile_fail, ['mod145', '-v0'])
 
-test('mod146', [extra_files(['Mod145_A.hs'])], run_command, ['$MAKE -s --no-print-directory mod146'])
+test('mod146', [extra_files(['Mod145_A.hs'])], makefile_test, [])
 
 test('mod147', [extra_files(['Mod147_A.hs'])], multimod_compile_fail, ['mod147', '-v0'])
 
@@ -217,11 +217,11 @@ test('mod155', normal, compile_fail, [''])
 test('mod156', normal, compile, [''])
 test('mod157', [extra_files(['Mod157_A.hs', 'Mod157_B.hs', 'Mod157_C.hs', 'Mod157_D.hs'])], multimod_compile, ['mod157', '-v0'])
 
-test('mod158', [extra_files(['Mod157_A.hs', 'Mod157_B.hs', 'Mod157_C.hs', 'Mod157_D.hs'])], run_command, ['$MAKE -s --no-print-directory mod158'])
+test('mod158', [extra_files(['Mod157_A.hs', 'Mod157_B.hs', 'Mod157_C.hs', 'Mod157_D.hs'])], makefile_test, [])
 
 test('mod159', [extra_files(['Mod159_A.hs', 'Mod159_B.hs', 'Mod159_C.hs', 'Mod159_D.hs'])], multimod_compile, ['mod159', '-v0'])
 
-test('mod160', [extra_files(['Mod159_A.hs', 'Mod159_B.hs', 'Mod159_C.hs', 'Mod159_D.hs'])], run_command, ['$MAKE -s --no-print-directory mod160'])
+test('mod160', [extra_files(['Mod159_A.hs', 'Mod159_B.hs', 'Mod159_C.hs', 'Mod159_D.hs'])], makefile_test, [])
 
 test('mod161', normal, compile_fail, [''])
 test('mod162', [extra_files(['Mod162_A.hs'])], multimod_compile, ['mod162', '-v0'])
@@ -230,13 +230,13 @@ test('mod163', [extra_files(['Mod163_A.hs'])], multimod_compile, ['mod163', '-v0
 
 test('mod164', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])], multimod_compile_fail, ['mod164', '-v0'])
 
-test('mod165', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])], run_command, ['$MAKE -s --no-print-directory mod165'])
+test('mod165', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])], makefile_test, [])
 
-test('mod166', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])], run_command,
-     ['$MAKE -s --no-print-directory mod166 MAKELEVEL='])
+test('mod166', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])],
+     run_command, ['$MAKE -s --no-print-directory mod166 MAKELEVEL='])
 
-test('mod167', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])], run_command,
-     ['$MAKE -s --no-print-directory mod167 MAKELEVEL='])
+test('mod167', [extra_files(['Mod164_A.hs', 'Mod164_B.hs'])],
+     run_command, ['$MAKE -s --no-print-directory mod167 MAKELEVEL='])
 
 test('mod168', normal, compile, [''])
 test('mod169', normal, compile, [''])
diff --git a/testsuite/tests/module/base01/all.T b/testsuite/tests/module/base01/all.T
index 6c1c207e10122ab44310e6828f19262af5e26c1f..739e9664886a3d0bfea14200390bd081d399b3f9 100644
--- a/testsuite/tests/module/base01/all.T
+++ b/testsuite/tests/module/base01/all.T
@@ -1,3 +1,3 @@
 test('base01', [extra_files(['GHC']),
-                normalise_slashes], run_command,
-     ['$MAKE -s base01 --no-print-directory'])
+                normalise_slashes],
+     makefile_test, [])
diff --git a/testsuite/tests/module/mod175/all.T b/testsuite/tests/module/mod175/all.T
index b6639e8edae1160fd6ad77013c25c4ba135f3eda..2340e636a01b2aa2d3f37b0c98a6db23197b1fbe 100644
--- a/testsuite/tests/module/mod175/all.T
+++ b/testsuite/tests/module/mod175/all.T
@@ -1 +1 @@
-test('mod175', [extra_files(['Test.hs', 'Test2.hs'])], run_command, ['$MAKE -s --no-print-directory mod175'])
+test('mod175', [extra_files(['Test.hs', 'Test2.hs'])], makefile_test, ['mod175'])
diff --git a/testsuite/tests/numeric/should_compile/all.T b/testsuite/tests/numeric/should_compile/all.T
index 6177c66775e645c21a3933dacde1da40d40e5538..625951f4d628a1c5522a116b2609ec5fb663d816 100644
--- a/testsuite/tests/numeric/should_compile/all.T
+++ b/testsuite/tests/numeric/should_compile/all.T
@@ -1,7 +1,7 @@
-test('T7116', normal, run_command, ['$MAKE -s --no-print-directory T7116'])
+test('T7116', normal, makefile_test, ['T7116'])
 # These test Core output that depends upon integer-gmp
-test('T14170', reqlib("integer-gmp"), run_command, ['$MAKE -s --no-print-directory T14170'])
-test('T14465', reqlib("integer-gmp"), run_command, ['$MAKE -s --no-print-directory T14465'])
+test('T14170', reqlib("integer-gmp"), makefile_test, ['T14170'])
+test('T14465', reqlib("integer-gmp"), makefile_test, ['T14465'])
 test('T7895', normal, compile, [''])
 test('T7881', normal, compile, [''])
 # For T8542, the hpc way adds extra annotations that prevent
diff --git a/testsuite/tests/numeric/should_run/all.T b/testsuite/tests/numeric/should_run/all.T
index 295e81892a4f748174a39078acc39071ce99570e..a966038fa4fa035c9a4628e9c7cb0a56f9acb269 100644
--- a/testsuite/tests/numeric/should_run/all.T
+++ b/testsuite/tests/numeric/should_run/all.T
@@ -54,7 +54,7 @@ test('mul2', normal, compile_and_run, ['-fobject-code'])
 test('quotRem2', normal, compile_and_run, ['-fobject-code'])
 test('T5863', normal, compile_and_run, [''])
 
-test('T7014', [], run_command, ['$MAKE -s --no-print-directory T7014'])
+test('T7014', [], makefile_test, [])
 
 test('T7233', normal, compile_and_run, [''])
 test('NumDecimals', normal, compile_and_run, [''])
diff --git a/testsuite/tests/parser/should_compile/T7476/all.T b/testsuite/tests/parser/should_compile/T7476/all.T
index cef48ae4a5ee2df339ae20d510b32e7f419ac796..f9cb339b9bb264ffcf744724f0474476e66c714d 100644
--- a/testsuite/tests/parser/should_compile/T7476/all.T
+++ b/testsuite/tests/parser/should_compile/T7476/all.T
@@ -2,4 +2,4 @@
 # This test is in its own subdirectory as it needs to use the global
 # filename "Main.imports"
 
-test('T7476', [], run_command, ['$MAKE -s --no-print-directory T7476'])
+test('T7476', [], makefile_test, ['T7476'])
diff --git a/testsuite/tests/patsyn/should_compile/T13350/all.T b/testsuite/tests/patsyn/should_compile/T13350/all.T
index e8d82a7a9aac612ec127b4d73ae04e93497d574e..67b4101ba522265a43afe5de529bdab38e7dcf34 100644
--- a/testsuite/tests/patsyn/should_compile/T13350/all.T
+++ b/testsuite/tests/patsyn/should_compile/T13350/all.T
@@ -2,5 +2,4 @@
 
 test('T13350',
      extra_files(['T13350.hs', 'boolean']),
-     run_command,
-     ['$MAKE -s --no-print-directory T13350'])
+     makefile_test, ['T13350'])
diff --git a/testsuite/tests/perf/compiler/all.T b/testsuite/tests/perf/compiler/all.T
index b2ca109000217bfe55a9c0b1dbbfcf3b492eda85..91037199be24faaf5148d83500075456c3132d16 100644
--- a/testsuite/tests/perf/compiler/all.T
+++ b/testsuite/tests/perf/compiler/all.T
@@ -98,10 +98,7 @@ test('T3064',
      compile,
      [''])
 
-test('T4007',
-     normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T4007'])
+test('T4007', normal, makefile_test, ['T4007'])
 
 test('T5030',
      [collect_compiler_stats('bytes allocated', 10),
diff --git a/testsuite/tests/perf/should_run/all.T b/testsuite/tests/perf/should_run/all.T
index 6095317ac13703951d45113f8689e179369f6ee7..2273ddd400d14d4dc97a6642faf9630c08b7266f 100644
--- a/testsuite/tests/perf/should_run/all.T
+++ b/testsuite/tests/perf/should_run/all.T
@@ -93,7 +93,7 @@ test('T4321',
      omit_ways(['ghci']),
      compile_and_run, ['-O ' + sse2_opts])
 
-test('T3736', [], run_command, ['$MAKE -s --no-print-directory T3736'])
+test('T3736', [], makefile_test, ['T3736'])
 test('T3738',
      [extra_clean(['T3738a.hi', 'T3738a.o']),
       collect_stats('peak_megabytes_allocated', 0),
@@ -110,15 +110,14 @@ test('MethSharing',
       ],
      compile_and_run,
      ['-O'])
-test('T2902', [], run_command, ['$MAKE -s --no-print-directory T2902'])
+test('T2902', [], makefile_test, ['T2902'])
 test('T149',
      [ # expect_broken(149),
        # working (2 Jul 2013, x86-64/Linux)
       extra_clean(['T149_A',    'T149_B',
                    'T149_A.hi', 'T149_B.hi',
                    'T149_A.o',  'T149_B.o'])],
-     run_command,
-     ['$MAKE -s --no-print-directory T149'])
+     makefile_test, ['T149'])
 
 test('T5113',
      [collect_stats('bytes allocated',5),
diff --git a/testsuite/tests/plugins/all.T b/testsuite/tests/plugins/all.T
index 7a5be6593c3abc0d031077d2e03f01a5f75e2445..75709385ac302502c9711327422acfd02c5217a0 100644
--- a/testsuite/tests/plugins/all.T
+++ b/testsuite/tests/plugins/all.T
@@ -9,7 +9,7 @@ test('plugins01',
      [extra_files(['simple-plugin/']), only_ways([config.ghc_plugin_way]),
       when(opsys('mingw32'), multi_cpu_race),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins01 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins01'])
+     makefile_test, [])
 
 test('plugins02',
      [extra_files(['simple-plugin/']), only_ways([config.ghc_plugin_way]),
@@ -49,103 +49,103 @@ test('plugins07',
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C rule-defining-plugin package.plugins07 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins07'])
+     makefile_test, [])
 
 test('plugins08',
      [extra_files(['simple-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins08 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins08'])
+     makefile_test, [])
 
 test('plugins09',
      [extra_files(['simple-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins09 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins09'])
+     makefile_test, [])
 
 test('plugins10',
      [extra_files(['simple-plugin/', 'QuasiQuotation.hs']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins10 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins10'])
+     makefile_test, [])
 
 test('plugins11',
      [extra_files(['simple-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins11 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins11'])
+     makefile_test, [])
 
 test('plugins12',
      [extra_files(['simple-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins12 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins12'])
+     makefile_test, [])
 
 test('plugins13',
      [extra_files(['simple-plugin/', 'PluginFilteredExport.hs']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins13 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins13'])
+     makefile_test, [])
 
 test('plugins14',
      [extra_files(['simple-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins14 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins14'])
+     makefile_test, [])
 
 test('plugins15',
      [extra_files(['simple-plugin/', 'MetaRemoveHelper.hs']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.plugins15 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory plugins15'])
+     makefile_test, [])
 
 test('T10420',
      [extra_files(['rule-defining-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C rule-defining-plugin package.T10420 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory T10420'])
+     makefile_test, [])
 
 test('T10294',
      [extra_files(['annotation-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C annotation-plugin package.T10294 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory T10294'])
+     makefile_test, [])
 
 test('T10294a',
      [extra_files(['annotation-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C annotation-plugin package.T10294a TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory T10294a'])
+     makefile_test, [])
 
 test('frontend01', [extra_files(['FrontendPlugin.hs']),
                     only_ways([config.ghc_plugin_way]),
                     when(opsys('mingw32'), multi_cpu_race),
-                    unless(have_dynamic(), expect_broken(10301))], run_command,
-     ['$MAKE -s --no-print-directory frontend01'])
+                    unless(have_dynamic(), expect_broken(10301))],
+     makefile_test, [])
 
 test('T11244',
      [extra_files(['rule-defining-plugin/']),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C rule-defining-plugin package.T11244 TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory T11244'])
+     makefile_test, [])
 
 test('T12567a',
      [extra_files(['T12567b.hs', 'simple-plugin/']),
       when(opsys('mingw32'), multi_cpu_race),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C simple-plugin package.T12567a TOP={top}')],
-     run_command, ['$MAKE -s --no-print-directory T12567a'])
+     makefile_test, [])
 
 test('T14335',
      [extra_files(['simple-plugin/', 'plugins01.hs']),
@@ -162,7 +162,7 @@ test('plugin-recomp-pure',
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}')
       ],
-     run_command, ['$MAKE -s --no-print-directory plugin-recomp-pure'])
+     makefile_test, [])
 
 test('plugin-recomp-impure',
      [extra_files(['plugin-recomp/', 'plugin-recomp-test.hs']),
@@ -170,7 +170,7 @@ test('plugin-recomp-impure',
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}')
       ],
-     run_command, ['$MAKE -s --no-print-directory plugin-recomp-impure'])
+     makefile_test, [])
 
 test('plugin-recomp-flags',
      [extra_files(['plugin-recomp/', 'plugin-recomp-test.hs']),
@@ -178,14 +178,14 @@ test('plugin-recomp-flags',
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}')
       ],
-     run_command, ['$MAKE -s --no-print-directory plugin-recomp-flags'])
+     makefile_test, [])
 
 test('plugin-recomp-change',
      [extra_files(['plugin-recomp/', 'plugin-recomp-test.hs']),
       only_ways([config.ghc_plugin_way]),
       pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}')
       ],
-     run_command, ['$MAKE -s --no-print-directory plugin-recomp-change'])
+     makefile_test, [])
 
 test('plugin-recomp-change-prof',
      [extra_files(['plugin-recomp/', 'plugin-recomp-test.hs']),
@@ -193,7 +193,7 @@ test('plugin-recomp-change-prof',
       pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}'),
       when(not config.have_profiling,skip)
       ],
-     run_command, ['$MAKE -s --no-print-directory plugin-recomp-change-prof'])
+     makefile_test, [])
 
 test('static-plugins',
      [extra_files(['simple-plugin/']),
diff --git a/testsuite/tests/polykinds/all.T b/testsuite/tests/polykinds/all.T
index 21de7f87cc2706d255cff881991071ec50b54091..9c34ed426369c649cd5f1ed5f068d3c113702217 100644
--- a/testsuite/tests/polykinds/all.T
+++ b/testsuite/tests/polykinds/all.T
@@ -25,7 +25,7 @@ test('T5771', normal, compile, [''])
 test('T5717', normal, compile, [''])
 test('T5862', normal, compile, [''])
 test('T5912', normal, compile, [''])
-test('T5881', normal, run_command, ['$MAKE -s --no-print-directory T5881'])
+test('T5881', normal, makefile_test, [])
 test('T5716', normal, compile_fail, [''])
 test('T5716a', normal, compile_fail, [''])
 test('T5937', normal, compile, [''])
@@ -35,13 +35,13 @@ test('T5948', normal, compile, [''])
 test('T6020', normal, compile, [''])
 test('T6035', normal, compile, [''])
 test('T6036', normal, compile, [''])
-test('T6025', normal, run_command, ['$MAKE -s --no-print-directory T6025'])
+test('T6025', normal, makefile_test, [])
 test('T6002', normal, compile, [''])
 test('T6039', normal, compile, [''])
 test('T6021', normal, compile, [''])
 test('T6020a', normal, compile, [''])
 test('T6044', normal, compile, [''])
-test('T6054', normal, run_command, ['$MAKE -s --no-print-directory T6054'])
+test('T6054', normal, makefile_test, [])
 test('T6081', normal, compile, [''])
 test('T6015', normal, compile, [''])
 test('T6015a', normal, compile, [''])
@@ -55,7 +55,7 @@ test('T6129', normal, compile_fail,[''])
 test('T7053', normal, compile,[''])
 test('T7053a', normal, compile,[''])
 test('T7020', normal, compile,[''])
-test('T7022', normal, run_command, ['$MAKE -s --no-print-directory T7022'])
+test('T7022', normal, makefile_test, [])
 test('T7073', normal, compile,[''])
 test('T7128', normal, compile,[''])
 test('T7151', normal, compile_fail,[''])
@@ -73,7 +73,7 @@ test('T7347', normal, compile,[''])
 test('T7341', normal, compile_fail,[''])
 test('T7422', normal, compile,[''])
 test('T7433', normal, compile_fail,[''])
-test('T7438', normal, run_command, ['$MAKE -s --no-print-directory T7438'])
+test('T7438', normal, makefile_test, [])
 test('T7404', normal, compile,[''])
 test('T7502', normal, compile,[''])
 test('T7488', normal, compile,[''])
@@ -87,7 +87,7 @@ test('T7939a', normal, compile_fail, [''])
 test('T8132', normal, compile_fail, [''])
 test('T8359', normal, compile, [''])
 test('T8391', normal, compile, [''])
-test('T8449', normal, run_command, ['$MAKE -s --no-print-directory T8449'])
+test('T8449', normal, makefile_test, [])
 test('T8534', normal, compile, [''])
 test('T8566', normal, compile_fail,[''])
 test('T8616', normal, compile_fail,[''])
@@ -99,7 +99,7 @@ test('T9106', normal, compile_fail, [''])
 test('T9144', normal, compile_fail, [''])
 test('T9222', normal, compile_fail, [''])
 test('T9264', normal, compile, [''])
-test('T9263', normal, run_command, ['$MAKE -s --no-print-directory T9263'])
+test('T9263', normal, makefile_test, [])
 test('T9063', normal, compile, [''])
 test('T9200', normal, compile, [''])
 test('T9200b', normal, compile_fail, [''])
diff --git a/testsuite/tests/printer/all.T b/testsuite/tests/printer/all.T
index 7f45c74a6a563453824d3572484d587f1806deb4..879d2aa51ca8033b700e6eb82063a01f196cb2ea 100644
--- a/testsuite/tests/printer/all.T
+++ b/testsuite/tests/printer/all.T
@@ -1,59 +1,59 @@
-test('Ppr001', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr001'])
-test('Ppr002', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr002'])
-test('Ppr003', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr003'])
-test('Ppr004', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr004'])
-test('Ppr005', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr005'])
-test('Ppr006', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr006'])
-test('Ppr007', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr007'])
-test('Ppr008', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr008'])
-test('Ppr009', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr009'])
-test('Ppr010', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr010'])
-test('Ppr011', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr011'])
-test('Ppr012', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr012'])
-test('Ppr013', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr013'])
-test('Ppr014', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr014'])
-test('Ppr015', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr015'])
-test('Ppr016', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr016'])
-test('Ppr017', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr017'])
-test('Ppr018', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr018'])
-test('Ppr019', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr019'])
-test('Ppr020', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr020'])
-test('Ppr021', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr021'])
-test('Ppr022', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr022'])
-test('Ppr023', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr023'])
-test('Ppr024', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr024'])
-test('Ppr025', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr025'])
-test('Ppr026', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr026'])
-test('Ppr027', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr027'])
-test('Ppr028', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr028'])
-test('Ppr029', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr029'])
-test('Ppr030', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr030'])
-test('Ppr031', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr031'])
-test('Ppr032', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr032'])
-test('Ppr033', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr033'])
-test('Ppr034', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr034'])
-test('Ppr035', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr035'])
-test('Ppr036', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr036'])
-test('Ppr037', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr037'])
-test('Ppr038', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr038'])
-test('Ppr039', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr039'])
-test('Ppr040', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr040'])
-test('Ppr041', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr041'])
-test('Ppr042', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr042'])
-test('Ppr043', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr043'])
-test('Ppr044', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr044'])
-test('Ppr045', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr045'])
-test('Ppr046', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr046'])
-test('Ppr047', expect_fail, run_command, ['$MAKE -s --no-print-directory ppr047'])
-test('Ppr048', ignore_stderr, run_command, ['$MAKE -s --no-print-directory ppr048'])
-test('T13199', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T13199'])
-test('T13050p', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T13050p'])
-test('T13550', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T13550'])
-test('T13942', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T13942'])
-test('T14289', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T14289'])
-test('T14289b', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T14289b'])
-test('T14289c', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T14289c'])
-test('T14306', ignore_stderr, run_command, ['$MAKE -s --no-print-directory T14306'])
+test('Ppr001', ignore_stderr, makefile_test, ['ppr001'])
+test('Ppr002', ignore_stderr, makefile_test, ['ppr002'])
+test('Ppr003', ignore_stderr, makefile_test, ['ppr003'])
+test('Ppr004', ignore_stderr, makefile_test, ['ppr004'])
+test('Ppr005', ignore_stderr, makefile_test, ['ppr005'])
+test('Ppr006', ignore_stderr, makefile_test, ['ppr006'])
+test('Ppr007', ignore_stderr, makefile_test, ['ppr007'])
+test('Ppr008', ignore_stderr, makefile_test, ['ppr008'])
+test('Ppr009', ignore_stderr, makefile_test, ['ppr009'])
+test('Ppr010', ignore_stderr, makefile_test, ['ppr010'])
+test('Ppr011', ignore_stderr, makefile_test, ['ppr011'])
+test('Ppr012', ignore_stderr, makefile_test, ['ppr012'])
+test('Ppr013', ignore_stderr, makefile_test, ['ppr013'])
+test('Ppr014', ignore_stderr, makefile_test, ['ppr014'])
+test('Ppr015', ignore_stderr, makefile_test, ['ppr015'])
+test('Ppr016', ignore_stderr, makefile_test, ['ppr016'])
+test('Ppr017', ignore_stderr, makefile_test, ['ppr017'])
+test('Ppr018', ignore_stderr, makefile_test, ['ppr018'])
+test('Ppr019', ignore_stderr, makefile_test, ['ppr019'])
+test('Ppr020', ignore_stderr, makefile_test, ['ppr020'])
+test('Ppr021', ignore_stderr, makefile_test, ['ppr021'])
+test('Ppr022', ignore_stderr, makefile_test, ['ppr022'])
+test('Ppr023', ignore_stderr, makefile_test, ['ppr023'])
+test('Ppr024', ignore_stderr, makefile_test, ['ppr024'])
+test('Ppr025', ignore_stderr, makefile_test, ['ppr025'])
+test('Ppr026', ignore_stderr, makefile_test, ['ppr026'])
+test('Ppr027', ignore_stderr, makefile_test, ['ppr027'])
+test('Ppr028', ignore_stderr, makefile_test, ['ppr028'])
+test('Ppr029', ignore_stderr, makefile_test, ['ppr029'])
+test('Ppr030', ignore_stderr, makefile_test, ['ppr030'])
+test('Ppr031', ignore_stderr, makefile_test, ['ppr031'])
+test('Ppr032', ignore_stderr, makefile_test, ['ppr032'])
+test('Ppr033', ignore_stderr, makefile_test, ['ppr033'])
+test('Ppr034', ignore_stderr, makefile_test, ['ppr034'])
+test('Ppr035', ignore_stderr, makefile_test, ['ppr035'])
+test('Ppr036', ignore_stderr, makefile_test, ['ppr036'])
+test('Ppr037', ignore_stderr, makefile_test, ['ppr037'])
+test('Ppr038', ignore_stderr, makefile_test, ['ppr038'])
+test('Ppr039', ignore_stderr, makefile_test, ['ppr039'])
+test('Ppr040', ignore_stderr, makefile_test, ['ppr040'])
+test('Ppr041', ignore_stderr, makefile_test, ['ppr041'])
+test('Ppr042', ignore_stderr, makefile_test, ['ppr042'])
+test('Ppr043', ignore_stderr, makefile_test, ['ppr043'])
+test('Ppr044', ignore_stderr, makefile_test, ['ppr044'])
+test('Ppr045', ignore_stderr, makefile_test, ['ppr045'])
+test('Ppr046', ignore_stderr, makefile_test, ['ppr046'])
+test('Ppr047', expect_fail, makefile_test, ['ppr047'])
+test('Ppr048', ignore_stderr, makefile_test, ['ppr048'])
+test('T13199', ignore_stderr, makefile_test, ['T13199'])
+test('T13050p', ignore_stderr, makefile_test, ['T13050p'])
+test('T13550', ignore_stderr, makefile_test, ['T13550'])
+test('T13942', ignore_stderr, makefile_test, ['T13942'])
+test('T14289', ignore_stderr, makefile_test, ['T14289'])
+test('T14289b', ignore_stderr, makefile_test, ['T14289b'])
+test('T14289c', ignore_stderr, makefile_test, ['T14289c'])
+test('T14306', ignore_stderr, makefile_test, ['T14306'])
 test('T14343', normal, compile_fail, [''])
 test('T14343b', normal, compile_fail, [''])
 test('T15761', normal, compile_fail, [''])
diff --git a/testsuite/tests/profiling/should_compile/all.T b/testsuite/tests/profiling/should_compile/all.T
index 999fa538fdcf41b876595738e55584b9eaf3e151..a29d29099e921e40d33da3642e2a9c3bea6c4463 100644
--- a/testsuite/tests/profiling/should_compile/all.T
+++ b/testsuite/tests/profiling/should_compile/all.T
@@ -6,5 +6,5 @@ test('prof002', [only_ways(['normal']), req_profiling], compile_and_run, ['-prof
 test('T2410', [only_ways(['normal']), req_profiling], compile, ['-O2 -prof -fprof-cafs'])
 test('T5889', [only_ways(['normal']), req_profiling, extra_files(['T5889/A.hs', 'T5889/B.hs'])], multimod_compile, ['A B', '-O -prof -fno-prof-count-entries -v0'])
 test('T12790', [only_ways(['normal']), req_profiling], compile, ['-O -prof'])
-test('T14931', [only_ways(['normal']), req_profiling], run_command, ['$MAKE -s --no-print-directory T14931'])
+test('T14931', [only_ways(['normal']), req_profiling], makefile_test, ['T14931'])
 test('T15108', [only_ways(['normal']), req_profiling], compile, ['-O -prof -fprof-auto'])
diff --git a/testsuite/tests/profiling/should_run/all.T b/testsuite/tests/profiling/should_run/all.T
index 9bca86b274531ffd9b73918396c692a05e8c4e7b..f5f696ea6adc6bccbc2c1acbf92a28f42fb73f83 100644
--- a/testsuite/tests/profiling/should_run/all.T
+++ b/testsuite/tests/profiling/should_run/all.T
@@ -6,8 +6,7 @@ test('heapprof002',
       extra_run_opts('7')],
      compile_and_run, [''])
 
-test('T11489', [req_profiling], run_command,
-     ['$MAKE -s --no-print-directory T11489'])
+test('T11489', [req_profiling], makefile_test, ['T11489'])
 
 # Below this line, run tests only with profiling ways.
 setTestOpts(req_profiling)
@@ -144,9 +143,8 @@ test('toplevel_scc_1',
 
 test('T12962', [], compile_and_run, [''])
 
-test('T14257', [], run_command, ['$MAKE -s --no-print-directory T14257'])
+test('T14257', [], makefile_test, ['T14257'])
 
 test('T15897',
      [extra_ways(['profasm']), only_ways(['profasm']), run_timeout_multiplier(2)],
-     run_command,
-     ['$MAKE -s --no-print-directory T15897'])
+     makefile_test, ['T15897'])
diff --git a/testsuite/tests/quasiquotation/all.T b/testsuite/tests/quasiquotation/all.T
index a10b8e444611b143d6ac0de4bd597fa1113543d8..96471f50fcaad4aa9e8aa37ed335084b223636ea 100644
--- a/testsuite/tests/quasiquotation/all.T
+++ b/testsuite/tests/quasiquotation/all.T
@@ -1,6 +1,5 @@
 test('T3953', req_interp, compile_fail, [''])
-test('T4150', [expect_broken(4150)], run_command,
-     ['$MAKE -s --no-print-directory T4150'])
+test('T4150', [expect_broken(4150)], makefile_test, ['T4150'])
 test('T5204', req_interp, compile_fail, [''])
 test('T7918',
      [req_interp, extra_run_opts('"' + config.libdir + '"'),
@@ -8,5 +7,4 @@ test('T7918',
      compile_and_run, ['-package ghc ' + config.ghc_th_way_flags])
 test('T14028',
      [req_interp, only_ways(config.ghc_th_way)],
-     run_command,
-     ['$MAKE -s --no-print-directory T14028'])
+     makefile_test, ['T14028'])
diff --git a/testsuite/tests/rename/prog006/all.T b/testsuite/tests/rename/prog006/all.T
index e119232e0b5b4963435719e77dc0178e7b1bcbcc..3a956d702a8b25d0c9f488305a6fc60e8bc19159 100644
--- a/testsuite/tests/rename/prog006/all.T
+++ b/testsuite/tests/rename/prog006/all.T
@@ -1,2 +1 @@
-test('rn.prog006', [extra_files(['A.hs', 'B/', 'Main.hs', 'pwd.hs'])], run_command,
-     ['$MAKE -s --no-print-directory rn.prog006'])
+test('rn.prog006', [extra_files(['A.hs', 'B/', 'Main.hs', 'pwd.hs'])], makefile_test, [])
diff --git a/testsuite/tests/rename/should_compile/all.T b/testsuite/tests/rename/should_compile/all.T
index a7c8da46710d942e7d95abe89d6e78c4f7ee7baf..0c60360e17e8e6c386838bd0323c89facc26b9d3 100644
--- a/testsuite/tests/rename/should_compile/all.T
+++ b/testsuite/tests/rename/should_compile/all.T
@@ -99,17 +99,16 @@ test('timing001', normal, compile, [''])
 test('timing002', normal, compile, [''])
 test('timing003', normal, compile, [''])
 
-test('T1792_imports', [], run_command,
-     ['$MAKE -s --no-print-directory T1792_imports'])
+test('T1792_imports', [], makefile_test, ['T1792_imports'])
 
-test('T3823', [], run_command, ['$MAKE -s --no-print-directory T3823'])
+test('T3823', [], makefile_test, ['T3823'])
 
-test('T4003', [], run_command, ['$MAKE -s --no-print-directory T4003'])
+test('T4003', [], makefile_test, ['T4003'])
 test('T1789', normal, compile, [''])
 test('T1789_2', normal, compile, [''])
-test('T3449', [], run_command, ['$MAKE -s --no-print-directory T3449'])
-test('T4239', [], run_command, ['$MAKE -s --no-print-directory T4239'])
-test('T4240', [], run_command, ['$MAKE -s --no-print-directory T4240'])
+test('T3449', [], makefile_test, ['T3449'])
+test('T4239', [], makefile_test, ['T4239'])
+test('T4240', [], makefile_test, ['T4240'])
 
 test('T4489', normal, compile, [''])
 test('T4478', normal, compile, [''])
@@ -138,8 +137,8 @@ test('T7336', expect_broken(7336), compile, ['-Wall'])
 
 test('T2435', normal, multimod_compile, ['T2435','-v0'])
 test('T7672', normal, multimod_compile, ['T7672','-v0'])
-test('T7963', [], run_command, ['$MAKE -s --no-print-directory T7963'])
-test('T7969', [], run_command, ['$MAKE -s --no-print-directory T7969'])
+test('T7963', [], makefile_test, ['T7963'])
+test('T7969', [], makefile_test, ['T7969'])
 test('T9127', normal, compile, [''])
 test('T4426', normal, compile_fail, [''])
 test('T9778', normal, compile, ['-fwarn-unticked-promoted-constructors'])
@@ -162,7 +161,7 @@ test('T14487', [], multimod_compile, ['T14487', '-v0'])
 test('T14747', [], multimod_compile, ['T14747', '-v0'])
 test('T15149', [], multimod_compile, ['T15149', '-v0'])
 test('T13064', normal, compile, [''])
-test('T15994', [], run_command, ['$MAKE -s --no-print-directory T15994'])
+test('T15994', [], makefile_test, ['T15994'])
 test('T15798a', normal, compile, [''])
 test('T15798b', normal, compile, [''])
 test('T15798c', normal, compile, [''])
diff --git a/testsuite/tests/rename/should_fail/all.T b/testsuite/tests/rename/should_fail/all.T
index 03ee63b449b90c17a01c6bdcc13da37e87863d6a..ce8c5c9a1315fcff8ede3fe965e5504016788845 100644
--- a/testsuite/tests/rename/should_fail/all.T
+++ b/testsuite/tests/rename/should_fail/all.T
@@ -110,8 +110,7 @@ test('T9815', normal, compile_fail, [''])
 
 test('T9032',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T9032'])
+     makefile_test, [])
 test('T10618', normal, compile_fail, [''])
 test('T10668', normal, compile_fail, [''])
 test('T5001b', normal, compile_fail, [''])
diff --git a/testsuite/tests/roles/should_fail/all.T b/testsuite/tests/roles/should_fail/all.T
index 8e7d91b67f20990b66a201854b8c358f6fa8882b..eba86d4e03c02ece9ce22a8b20503b1904b7d952 100644
--- a/testsuite/tests/roles/should_fail/all.T
+++ b/testsuite/tests/roles/should_fail/all.T
@@ -4,7 +4,7 @@ test('Roles7', normal, compile_fail, [''])
 test('Roles8', normal, compile_fail, [''])
 test('Roles10', normal, compile_fail, [''])
 test('Roles11', normal, compile_fail, [''])
-test('Roles12', [], run_command, ['$MAKE --no-print-directory -s Roles12'])
+test('Roles12', [], makefile_test, [])
 test('T8773', normal, compile_fail, [''])
-test('T9204', [], run_command, ['$MAKE --no-print-directory -s T9204'])
+test('T9204', [], makefile_test, [])
 test('RolesIArray', normal, compile_fail, [''])
diff --git a/testsuite/tests/rts/T10672/all.T b/testsuite/tests/rts/T10672/all.T
index c24ded25b4b7043e592d02cbe843858c5bed1f21..1e04f1ba3fdd9627714203ae932d3f5efc9a75f4 100644
--- a/testsuite/tests/rts/T10672/all.T
+++ b/testsuite/tests/rts/T10672/all.T
@@ -1,9 +1,9 @@
 test('T10672_x64',
      [extra_files(['Main.hs', 'Printf.hs', 'cxxy.cpp']),
       [unless(opsys('mingw32'), skip), unless(arch('x86_64'), skip)]],
-     run_command, ['$MAKE -s --no-print-directory T10672_x64'])
+     makefile_test, ['T10672_x64'])
 
 test('T10672_x86',
      [extra_files(['Main.hs', 'Printf.hs', 'cxxy.cpp']),
       [unless(opsys('mingw32'), skip), unless(arch('i386'), skip)]],
-     run_command, ['$MAKE -s --no-print-directory T10672_x86'])
+     makefile_test, ['T10672_x86'])
diff --git a/testsuite/tests/rts/T11223/all.T b/testsuite/tests/rts/T11223/all.T
index 6656e7fa34041ef472ced30f984aec1919490720..1fc09e3cfd17fc9b90716a14b33cb3f9a2855291 100644
--- a/testsuite/tests/rts/T11223/all.T
+++ b/testsuite/tests/rts/T11223/all.T
@@ -15,59 +15,50 @@ def normalise_duplicate_errmsg( msg ):
 test('T11223_simple_link',
      [extra_files(['foo.c', 'foo.hs']),
       when(ghc_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_simple_link'])
+     makefile_test, ['t_11223_simple_link'])
 
 test('T11223_simple_link_lib',
      [extra_files(['foo.c', 'foo.hs']),
       when(ghc_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_simple_link_lib'])
+     makefile_test, ['t_11223_simple_link_lib'])
 
 # I'm ignoring the output since for this particular invocation normalise_errmsg
 # isn't being called and I can't figure out why not.
 test('T11223_simple_duplicate',
      [extra_files(['bar.c', 'foo.c', 'foo.hs']),
       when(ghc_dynamic(), skip), ignore_stderr, ignore_stdout, exit_code(2), normalise_errmsg_fun(normalise_duplicate_errmsg)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_simple_duplicate'])
+     makefile_test, ['t_11223_simple_duplicate'])
 
 test('T11223_simple_duplicate_lib',
      [extra_files(['bar.c', 'foo.c', 'foo.hs']),
       when(platform('i386-unknown-mingw32'), expect_broken(13515)),
       when(ghc_dynamic(), skip), normalise_errmsg_fun(normalise_duplicate_errmsg)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_simple_duplicate_lib'])
+     makefile_test, ['t_11223_simple_duplicate_lib'])
 
 test('T11223_simple_unused_duplicate_lib',
      [extra_files(['bar.c', 'foo.c', 'foo.hs']),
       when(ghc_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_simple_unused_duplicate_lib'])
+     makefile_test, ['t_11223_simple_unused_duplicate_lib'])
 
 test('T11223_link_order_a_b_succeed',
      [extra_files(['bar.c', 'foo.c', 'foo2.hs']),
       when(ghc_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_link_order_a_b_succeed'])
+     makefile_test, ['t_11223_link_order_a_b_succeed'])
 
 test('T11223_link_order_b_a_succeed',
      [extra_files(['bar.c', 'foo.c', 'foo2.hs']),
       when(ghc_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_link_order_b_a_succeed'])
+     makefile_test, ['t_11223_link_order_b_a_succeed'])
 
 test('T11223_link_order_a_b_2_fail',
      [extra_files(['bar.c', 'foo.c', 'foo3.hs']),
       when(ghc_dynamic(), skip), normalise_errmsg_fun(normalise_duplicate_errmsg)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_link_order_a_b_2_fail'])
+     makefile_test, ['t_11223_link_order_a_b_2_fail'])
 
 test('T11223_link_order_b_a_2_succeed',
      [extra_files(['bar.c', 'foo.c', 'foo3.hs']),
       when(ghc_dynamic(), skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_link_order_b_a_2_succeed'])
+     makefile_test, ['t_11223_link_order_b_a_2_succeed'])
 
 # Weak Symbols are not currently implemented. So Disable all the tests
 # See Note [weak-symbols-support] in Linker.c
@@ -75,35 +66,29 @@ test('T11223_link_order_b_a_2_succeed',
 test('T11223_weak_only_link_fail',
      [extra_files(['power.c', 'power.hs']),
       when(ghc_dynamic(), skip), expect_broken(11817)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_weak_only_link_fail'])
+     makefile_test, ['t_11223_weak_only_link_fail'])
 
 test('T11223_weak_only_link_succeed',
      [extra_files(['power3.hs', 'power_slow.c']),
       when(ghc_dynamic(), skip), expect_broken(11817)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_weak_only_link_succeed'])
+     makefile_test, ['t_11223_weak_only_link_succeed'])
 
 test('T11223_weak_both_link_order_a_b_succeed',
      [extra_files(['power.c', 'power3.hs', 'power_slow.c']),
       when(ghc_dynamic(), skip), expect_broken(11817)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_weak_both_link_order_a_b_succeed'])
+     makefile_test, ['t_11223_weak_both_link_order_a_b_succeed'])
 
 test('T11223_weak_both_link_order_b_a_succeed',
      [extra_files(['power.c', 'power3.hs', 'power_slow.c']),
       when(ghc_dynamic(), skip), expect_broken(11817)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_weak_both_link_order_b_a_succeed'])
+     makefile_test, ['t_11223_weak_both_link_order_b_a_succeed'])
 
 test('T11223_weak_single_link_order_a_b_succeed',
      [extra_files(['power.c', 'power3.hs', 'power_slow.c']),
       when(ghc_dynamic(), skip), expect_broken(11817)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_weak_single_link_order_a_b_succeed'])
+     makefile_test, ['t_11223_weak_single_link_order_a_b_succeed'])
 
 test('T11223_weak_single_link_order_b_a_succeed',
      [extra_files(['power.c', 'power3.hs', 'power_slow.c']),
       when(ghc_dynamic(), skip), expect_broken(11817)],
-     run_command,
-     ['$MAKE -s --no-print-directory t_11223_weak_single_link_order_b_a_succeed'])
+     makefile_test, ['t_11223_weak_single_link_order_b_a_succeed'])
diff --git a/testsuite/tests/rts/T12031/all.T b/testsuite/tests/rts/T12031/all.T
index abff4472e4ee774473bcba9bb961bae46b9e2071..bddcaa30c6e1505279595011054851e426e369d1 100644
--- a/testsuite/tests/rts/T12031/all.T
+++ b/testsuite/tests/rts/T12031/all.T
@@ -1,4 +1,4 @@
 test('T12031',
      [extra_files(['bar.c', 'baz.c', 'ExternBug.hs', 'foo.h']),
       unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory T12031'])
+     makefile_test, ['T12031'])
diff --git a/testsuite/tests/rts/T12771/all.T b/testsuite/tests/rts/T12771/all.T
index f38eda25e0b565a6c159e62b17cd3f7b129aa507..55ada90cb3128cc15a065b732fab291fac027fe1 100644
--- a/testsuite/tests/rts/T12771/all.T
+++ b/testsuite/tests/rts/T12771/all.T
@@ -1,4 +1,4 @@
 test('T12771',
      [extra_files(['foo.c', 'main.hs', 'foo_dll.c']),
       unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory T12771'])
+     makefile_test, ['T12771'])
diff --git a/testsuite/tests/rts/T13082/all.T b/testsuite/tests/rts/T13082/all.T
index 9580bc40b8ea840cb5e23e861c1fef78c3fa245a..82191270516b01a75a42e740c429b89a49f15926 100644
--- a/testsuite/tests/rts/T13082/all.T
+++ b/testsuite/tests/rts/T13082/all.T
@@ -17,8 +17,8 @@ def normalise_search_dirs (str):
 test('T13082_good',
      [extra_files(['foo.c', 'main.hs', 'foo_dll.c']),
       unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory T13082_good'])
+     makefile_test, ['T13082_good'])
 
 test('T13082_fail', [extra_files(['main.hs']), unless(opsys('mingw32'), skip),
                      normalise_errmsg_fun(normalise_search_dirs)],
-     run_command, ['$MAKE -s --no-print-directory T13082_fail'])
+     makefile_test, ['T13082_fail'])
diff --git a/testsuite/tests/rts/T14611/all.T b/testsuite/tests/rts/T14611/all.T
index 1387e6752d4a0ab591f4b8218d1d421c2b902aa8..ef7873ce164b146f55730378d53ba9cc8f542359 100644
--- a/testsuite/tests/rts/T14611/all.T
+++ b/testsuite/tests/rts/T14611/all.T
@@ -1,4 +1,4 @@
 test('T14611',
      [extra_files(['foo.c', 'main.hs', 'foo_dll.c']),
       unless(opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory T14611'])
+     makefile_test, ['T14611'])
diff --git a/testsuite/tests/rts/T15261/all.T b/testsuite/tests/rts/T15261/all.T
index 5bc6977c267f208cfb51876325b96b85bdaa889e..402764ddb794d661313a9677549979f4d9e889d9 100644
--- a/testsuite/tests/rts/T15261/all.T
+++ b/testsuite/tests/rts/T15261/all.T
@@ -1,2 +1,2 @@
-test('T15261a', normal, run_command, ['$MAKE -s --no-print-directory T15261a'])
-test('T15261b', normal, run_command, ['$MAKE -s --no-print-directory T15261b'])
+test('T15261a', normal, makefile_test, ['T15261a'])
+test('T15261b', normal, makefile_test, ['T15261b'])
diff --git a/testsuite/tests/rts/T15894/all.T b/testsuite/tests/rts/T15894/all.T
index 07733669a4d7a8cfaea6df8d6f61e95bc098150f..a2c207979ef6afbb44c4109239d233eb2e0bee5a 100644
--- a/testsuite/tests/rts/T15894/all.T
+++ b/testsuite/tests/rts/T15894/all.T
@@ -1,3 +1,3 @@
 test('T15894',
      [extra_files(['copysign.c', 'main.hs']), when(ghc_dynamic(), skip)],
-     run_command, ['$MAKE -s --no-print-directory T15894'])
+     makefile_test, ['T15894'])
diff --git a/testsuite/tests/rts/T8308/all.T b/testsuite/tests/rts/T8308/all.T
index 094140f1d2316e19de9e888d11b560f139e5bc47..cbc86a51cb298779d719e2c34917f85fecc0a4dd 100644
--- a/testsuite/tests/rts/T8308/all.T
+++ b/testsuite/tests/rts/T8308/all.T
@@ -1,2 +1 @@
-test('T8308', normal,
-     run_command, ['$MAKE -s --no-print-directory T8308'])
+test('T8308', normal, makefile_test, ['T8308'])
diff --git a/testsuite/tests/rts/all.T b/testsuite/tests/rts/all.T
index ca8177c526df0d5d9ac38cbe5497f9e78889ad55..43c07641b4321df3d483b3c78d6015fafbed836d 100644
--- a/testsuite/tests/rts/all.T
+++ b/testsuite/tests/rts/all.T
@@ -64,8 +64,8 @@ test('divbyzero',
      compile_and_run, ['-with-rtsopts="--generate-stack-traces=no"'])
 
 test('outofmem', when(opsys('darwin'), skip),
-                 run_command, ['$MAKE -s --no-print-directory outofmem'])
-test('outofmem2', normal, run_command, ['$MAKE -s --no-print-directory outofmem2'])
+                 makefile_test, ['outofmem'])
+test('outofmem2', normal, makefile_test, ['outofmem2'])
 
 test('T2047', [ignore_stdout, extra_run_opts('+RTS -c -RTS')],
               compile_and_run, ['-package containers'])
@@ -145,15 +145,15 @@ test('traceBinaryEvent', [ omit_ways(['dyn', 'ghci'] + prof_ways),
 test('EventlogOutput1',
      [ extra_files(["EventlogOutput.hs"]),
        omit_ways(['dyn', 'ghci'] + prof_ways) ],
-     run_command, ['$MAKE -s --no-print-directory EventlogOutput1'])
+     makefile_test, ['EventlogOutput1'])
 
 # Test that -ol flag defaults to <program>.eventlog
 test('EventlogOutput2',
      [ extra_files(["EventlogOutput.hs"]),
        omit_ways(['dyn', 'ghci'] + prof_ways) ],
-     run_command, ['$MAKE -s --no-print-directory EventlogOutput2'])
+     makefile_test, ['EventlogOutput2'])
 
-test('T4059', [], run_command, ['$MAKE -s --no-print-directory T4059'])
+test('T4059', [], makefile_test, ['T4059'])
 
 # Test for #4274
 test('exec_signals',
@@ -164,7 +164,7 @@ test('exec_signals',
 
 test('return_mem_to_os', normal, compile_and_run, [''])
 
-test('T4850', when(opsys('mingw32'), expect_broken(4850)), run_command, ['$MAKE -s --no-print-directory T4850'])
+test('T4850', when(opsys('mingw32'), expect_broken(4850)), makefile_test, ['T4850'])
 
 def config_T5250(name, opts):
     if not (config.arch in ['i386','x86_64']):
@@ -180,7 +180,7 @@ test('T5250', [extra_files(['spalign.c']),
                 omit_ways(['ghci']) ],
               compile_and_run, ['spalign.c'])
 
-test('T5423', [], run_command, ['$MAKE -s --no-print-directory T5423'])
+test('T5423', [], makefile_test, ['T5423'])
 
 # Workaround bug #8458: old dlopen opens sections in the wrong order,
 # so we just accept both orders.
@@ -208,22 +208,22 @@ def checkDynAsm(actual_file, normaliser):
 test('T5435_v_asm_a', [extra_files(['T5435.hs', 'T5435_asm.c']),
                      when(arch('powerpc64') or arch('powerpc64le'),
                           expect_broken(11259))],
-     run_command, ['$MAKE -s --no-print-directory T5435_v_asm_a'])
+     makefile_test, ['T5435_v_asm_a'])
 # this one just needs to run on linux, as darwin/mingw32 are covered
 # by the _a test already.
 test('T5435_v_asm_b', [extra_files(['T5435.hs', 'T5435_asm.c']),
                       when(arch('powerpc64') or arch('powerpc64le'),
                           expect_broken(11259)),
 		      when(opsys('darwin') or opsys('mingw32'), skip)],
-     run_command, ['$MAKE -s --no-print-directory T5435_v_asm_b'])
+     makefile_test, ['T5435_v_asm_b'])
 test('T5435_v_gcc', [extra_files(['T5435.hs', 'T5435_gcc.c']),
                      when(arch('powerpc64') or arch('powerpc64le'),
                           expect_broken(11259))],
-     run_command, ['$MAKE -s --no-print-directory T5435_v_gcc'])
+     makefile_test, ['T5435_v_gcc'])
 test('T5435_dyn_asm', [extra_files(['T5435.hs', 'T5435_asm.c']),
                        check_stdout(checkDynAsm)],
-     run_command, ['$MAKE -s --no-print-directory T5435_dyn_asm'])
-test('T5435_dyn_gcc', extra_files(['T5435.hs', 'T5435_gcc.c']) , run_command, ['$MAKE -s --no-print-directory T5435_dyn_gcc'])
+     makefile_test, ['T5435_dyn_asm'])
+test('T5435_dyn_gcc', extra_files(['T5435.hs', 'T5435_gcc.c']) , makefile_test, ['T5435_dyn_gcc'])
 
 test('T5993', extra_run_opts('+RTS -k8 -RTS'), compile_and_run, [''])
 
@@ -235,7 +235,7 @@ test('T6006', [ omit_ways(prof_ways + ['ghci']),
                  # needs it.
                compile_and_run, ['T6006_c.c -no-hs-main'])
 
-test('T7037', [], run_command, ['$MAKE -s --no-print-directory T7037'])
+test('T7037', [], makefile_test, ['T7037'])
 
 test('T7087', exit_code(1), compile_and_run, [''])
 test('T7160', normal, compile_and_run, [''])
@@ -277,7 +277,7 @@ test('T8035', normal, compile_and_run, [''])
 test('linker_unload',
      [extra_files(['LinkerUnload.hs', 'Test.hs']),
       when(arch('powerpc64') or arch('powerpc64le'), expect_broken(11259))],
-     run_command, ['$MAKE -s --no-print-directory linker_unload'])
+     makefile_test, ['linker_unload'])
 
 test('T8209', [ req_smp, only_ways(threaded_ways), ignore_stdout ],
               compile_and_run, [''])
@@ -328,16 +328,13 @@ test('overflow2', [ exit_code(251) ], compile_and_run, [''])
 test('overflow3', [ exit_code(251) ], compile_and_run, [''])
 
 test('linker_error1', [extra_files(['linker_error.c']),
-                       ignore_stderr], run_command,
-     ['$MAKE -s --no-print-directory linker_error1'])
+                       ignore_stderr], makefile_test, ['linker_error1'])
 
 test('linker_error2', [extra_files(['linker_error.c']),
-                       ignore_stderr], run_command,
-     ['$MAKE -s --no-print-directory linker_error2'])
+                       ignore_stderr], makefile_test, ['linker_error2'])
 
 test('linker_error3', [extra_files(['linker_error.c']),
-                       ignore_stderr], run_command,
-     ['$MAKE -s --no-print-directory linker_error3'])
+                       ignore_stderr], makefile_test, ['linker_error3'])
 
 def grep_stderr(pattern):
     def wrapper(cmd, pattern=pattern):
@@ -387,14 +384,12 @@ test('T10904', [ omit_ways(['ghci']), extra_run_opts('20000') ],
 test('T10728', [extra_run_opts('+RTS -maxN3 -RTS'), only_ways(['threaded2'])],
                compile_and_run, [''])
 
-test('T9405', [when(msys(), expect_broken(12714))], run_command,
-     ['$MAKE -s --no-print-directory T9405'])
+test('T9405', [when(msys(), expect_broken(12714))], makefile_test, ['T9405'])
 
 test('T11788', when(ghc_dynamic(), skip),
-              run_command, ['$MAKE -s --no-print-directory T11788'])
+              makefile_test, ['T11788'])
 
-test('T10296a', [req_smp], run_command,
-     ['$MAKE -s --no-print-directory T10296a'])
+test('T10296a', [req_smp], makefile_test, ['T10296a'])
 
 test('T10296b', [only_ways('threaded2')], compile_and_run, [''])
 
@@ -403,10 +398,10 @@ test('numa001', [ extra_run_opts('8'), unless(unregisterised(), extra_ways(['deb
 
 test('T12497', [ unless(opsys('mingw32'), skip)
                ],
-               run_command, ['$MAKE -s --no-print-directory T12497'])
+               makefile_test, ['T12497'])
 
 test('T13617', [ unless(opsys('mingw32'), skip)],
-               run_command, ['$MAKE -s --no-print-directory T13617'])
+               makefile_test, ['T13617'])
 
 # This test sometimes produces out of sequence samples in the profasm way, but
 # not reliably, so we just skip it. See ticket #15065.
@@ -421,8 +416,7 @@ test('T13894', normal, compile_and_run, [''])
 # this test fails with the profasm way on some machines but not others,
 # so we just skip it.
 test('T14497', [omit_ways(['profasm']), multi_cpu_race], compile_and_run, ['-O'])
-test('T14695', [normal, ignore_stderr]
-             , run_command, ['$MAKE -s --no-print-directory T14695'])
+test('T14695', [normal, ignore_stderr], makefile_test, ['T14695'])
 test('T14702', [ ignore_stdout
                , when(unregisterised(), skip)
                , only_ways(['threaded1', 'threaded2'])
@@ -431,8 +425,7 @@ test('T14702', [ ignore_stdout
                , compile_and_run, [''])
 
 test('T14900', normal, compile_and_run, ['-package ghc-compact'])
-test('InternalCounters', normal, run_command,
-  ['$MAKE -s --no-print-directory InternalCounters'])
+test('InternalCounters', normal, makefile_test, ['InternalCounters'])
 test('alloccounter1', normal, compile_and_run,
   [
     # avoid allocating stack chunks, which counts as
@@ -461,8 +454,7 @@ test('keep-cafs-fail',
     filter_stdout_lines('Evaluated a CAF|exit.*'),
     ignore_stderr, # on OS X the shell emits an "Abort trap" message to stderr
   ],
-  run_command,
-  ['$MAKE -s --no-print-directory KeepCafsFail'])
+  makefile_test, ['KeepCafsFail'])
 
 # Test the -fkeep-cafs flag
 test('keep-cafs',
@@ -472,6 +464,5 @@ test('keep-cafs',
     when(platform('powerpc64le-unknown-linux'), expect_broken(11261)),
     when(opsys('freebsd'), expect_broken(16035)),
   ],
-  run_command,
-  ['$MAKE -s --no-print-directory KeepCafs'])
+  makefile_test, ['KeepCafs'])
 
diff --git a/testsuite/tests/runghc/all.T b/testsuite/tests/runghc/all.T
index 01337bca423e17aa2e51fe818761e3a6fde9742d..1b1b9eac23b3e548efbf1f0cee655da7de978f78 100644
--- a/testsuite/tests/runghc/all.T
+++ b/testsuite/tests/runghc/all.T
@@ -1,11 +1,8 @@
-test('T7859', req_interp, run_command,
-     ['$MAKE --no-print-directory -s T7859'])
+test('T7859', req_interp, makefile_test, [])
 
-test('T8601', req_interp, run_command,
-     ['$MAKE --no-print-directory -s T8601'])
+test('T8601', req_interp, makefile_test, [])
 
-test('T11247', [req_interp, expect_broken(11247)], run_command,
-     ['$MAKE --no-print-directory -s T11247'])
+test('T11247', [req_interp, expect_broken(11247)], makefile_test, [])
 
 test('T6132', [when(opsys('darwin'), expect_broken(6132))], compile, [''])
 
@@ -13,5 +10,4 @@ test('T-signals-child',
      [ when(opsys('mingw32'), skip), req_interp
      , only_ways(['threaded1', 'threaded2'])
      ],
-     run_command,
-     ['$MAKE --no-print-directory -s T-signals-child'])
+     makefile_test, [])
diff --git a/testsuite/tests/safeHaskell/safeLanguage/all.T b/testsuite/tests/safeHaskell/safeLanguage/all.T
index 2807f738a8c08b815c1ba02ec42617cf300b0567..dc38031b2899105a78d16524db0ebbd7d585177f 100644
--- a/testsuite/tests/safeHaskell/safeLanguage/all.T
+++ b/testsuite/tests/safeHaskell/safeLanguage/all.T
@@ -35,7 +35,5 @@ test('SafeLang18', normal, compile, [''])
 
 # Test building a package, that trust values are set correctly
 # and can be changed correctly
-#test('SafeRecomp01',
-#		normal,
-#      run_command, ['$MAKE -s --no-print-directory safeRecomp01'])
+#test('SafeRecomp01', normal, makefile_test, [])
 
diff --git a/testsuite/tests/showIface/all.T b/testsuite/tests/showIface/all.T
index df5d5cd9ecd61f9f8b9caf02674a928044539a4c..34550f696bbe8e096a3d5e9af03b3ab58dc9f399 100644
--- a/testsuite/tests/showIface/all.T
+++ b/testsuite/tests/showIface/all.T
@@ -1,9 +1,7 @@
-test('Orphans', normal, run_command, ['$MAKE -s --no-print-directory Orphans'])
+test('Orphans', normal, makefile_test, ['Orphans'])
 test('DocsInHiFile0',
      extra_files(['DocsInHiFile.hs']),
-     run_command,
-     ['$MAKE -s --no-print-directory DocsInHiFile0'])
+     makefile_test, ['DocsInHiFile0'])
 test('DocsInHiFile1',
      extra_files(['DocsInHiFile.hs']),
-     run_command,
-     ['$MAKE -s --no-print-directory DocsInHiFile1'])
+     makefile_test, ['DocsInHiFile1'])
diff --git a/testsuite/tests/simplCore/should_compile/T16038/test.T b/testsuite/tests/simplCore/should_compile/T16038/test.T
index be525b25b096a4e8404003dfbd64bbbbc6d44f54..f51b64d441e99c609a7fad6ef220ffeb150dda1c 100644
--- a/testsuite/tests/simplCore/should_compile/T16038/test.T
+++ b/testsuite/tests/simplCore/should_compile/T16038/test.T
@@ -1,4 +1,3 @@
 test('T16038',
      [extra_files(['A.hs', 'A.hs-boot', 'B.hs'])],
-     run_command,
-     ['$MAKE -s --no-print-directory T16038'])
+     makefile_test, [])
diff --git a/testsuite/tests/simplCore/should_compile/all.T b/testsuite/tests/simplCore/should_compile/all.T
index 1f6ef0059fa025e7ace5cf7f6ef33d6480d8782f..06b5e4844730be01d20288df8ed6f5e8eee368d7 100644
--- a/testsuite/tests/simplCore/should_compile/all.T
+++ b/testsuite/tests/simplCore/should_compile/all.T
@@ -45,8 +45,7 @@ test('T1647', normal, compile, ['-fdicts-strict -dcore-lint'])
 
 test('T3234',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T3234'])
+     makefile_test, ['T3234'])
 
 test('T3717', only_ways(['optasm']),
               compile,
@@ -63,35 +62,32 @@ test('T4930', only_ways(['optasm']),
               compile,
               ['-O -ddump-simpl -dsuppress-uniques'])
 
-test('T3055', [], run_command, ['$MAKE -s --no-print-directory T3055'])
+test('T3055', [], makefile_test, ['T3055'])
 
 test('T4306',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T4306'])
+     makefile_test, ['T4306'])
 
 test('T4201',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T4201'])
+     makefile_test, ['T4201'])
 
 test('T3772',
 #      only_ways(['optasm']),
      extra_clean(['T3772_A.hi', 'T3772_A.o']),
-     run_command, ['$MAKE -s --no-print-directory T3772'])
+     makefile_test, ['T3772'])
 
 test('EvalTest',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory EvalTest'])
+     makefile_test, ['EvalTest'])
 
 test('T3831', normal, compile, [''])
 test('T4345', normal, compile, [''])
 test('T4398', normal, compile, ['-dsuppress-uniques'])
 
-test('T4903', [], run_command, ['$MAKE -s --no-print-directory T4903'])
+test('T4903', [], makefile_test, ['T4903'])
 
-test('T4918', [], run_command, ['$MAKE -s --no-print-directory T4918'])
+test('T4918', [], makefile_test, ['T4918'])
 
 # This test flips too and fro about whether it passes
 # I'm not sure why it is so delicate, but it greps the
@@ -99,18 +95,15 @@ test('T4918', [], run_command, ['$MAKE -s --no-print-directory T4918'])
 # be very stable
 test('T4945',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T4945'])
+     makefile_test, ['T4945'])
 
 test('T4957',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T4957'])
+     makefile_test, ['T4957'])
 
 test('T5168',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T5168'])
+     makefile_test, ['T5168'])
 
 test('T5329', normal, compile, [''])
 test('T5303', normal, compile, [''])   # Coercion-optimisation test
@@ -118,32 +111,29 @@ test('T5342', normal, compile, [''])   # Lint error with -prof
 test('T5359a', normal, compile, [''])  # Lint error with -O (OccurAnal)
 test('T5359b', normal, compile, [''])  # Lint error with -O (OccurAnal)
 test('T5458', normal, compile, [''])
-test('simpl021', [extra_files(['Simpl021A.hs', 'Simpl021B.hs'])], run_command, ['$MAKE -s --no-print-directory simpl021'])
-test('T5327', normal, run_command, ['$MAKE -s --no-print-directory T5327'])
-test('T5615', normal, run_command, ['$MAKE -s --no-print-directory T5615'])
-test('T5623', normal, run_command, ['$MAKE -s --no-print-directory T5623'])
-test('T13155', normal, run_command, ['$MAKE -s --no-print-directory T13155'])
+test('simpl021', [extra_files(['Simpl021A.hs', 'Simpl021B.hs'])], makefile_test, ['simpl021'])
+test('T5327', normal, makefile_test, ['T5327'])
+test('T5615', normal, makefile_test, ['T5615'])
+test('T5623', normal, makefile_test, ['T5623'])
+test('T13155', normal, makefile_test, ['T13155'])
 test('T5658b',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T5658b'])
+     makefile_test, ['T5658b'])
 test('T5776',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T5776'])
-test('T4138', [], run_command, ['$MAKE -s --no-print-directory T4138'])
+     makefile_test, ['T5776'])
+test('T4138', [], makefile_test, ['T4138'])
 test('T7088', normal, compile, [''])
 test('T6082-RULE', normal, compile, [''])
-test('T7165', [], run_command, ['$MAKE -s --no-print-directory T7165'])
+test('T7165', [], makefile_test, ['T7165'])
 test('T7287', normal, compile, [''])
 test('T7360', only_ways(['optasm']), compile, ['-ddump-simpl -dsuppress-uniques'])
 test('T5366',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T5366'])
-test('T7796', [], run_command, ['$MAKE -s --no-print-directory T7796'])
+     makefile_test, ['T5366'])
+test('T7796', [], makefile_test, ['T7796'])
 test('T5550', omit_ways(prof_ways), compile, [''])
-test('T7865', normal, run_command, ['$MAKE -s --no-print-directory T7865'])
+test('T7865', normal, makefile_test, ['T7865'])
 test('T7785', only_ways(['optasm']), compile, ['-ddump-rules'])
 test('T7702',
      [extra_files(['T7702plugin']),
@@ -171,27 +161,23 @@ test('T7995',
      # RULE doesn't seem to fire unless optimizations are turned on.
      # This seems reasonable, so I've required it for the test. -- EZY 20130720
      only_ways(['optasm']),
-     run_command,
-     ['$MAKE -s --no-print-directory T7995'])
+     makefile_test, ['T7995'])
 
 test('T8196', normal, compile, [''])
 test('T8221b', normal, compile, [''])
-test('T8221', [], run_command, ['$MAKE -s --no-print-directory T8221'])
-test('T8274', normal, run_command, ['$MAKE -s --no-print-directory T8274'])
+test('T8221', [], makefile_test, ['T8221'])
+test('T8274', normal, makefile_test, ['T8274'])
 test('T8329', only_ways(['optasm']), multimod_compile, ['T8329','-v0 -O'])
 test('T5996',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T5996'])
+     makefile_test, ['T5996'])
 test('T8537', normal, compile, [''])
 test('T8832',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T8832 T8832_WORDSIZE_OPTS=' +
+     run_command, ['$MAKE -s --no-print-directory T8832 T8832_WORDSIZE_OPTS=' +
       ('-DT8832_WORDSIZE_64' if wordsize(64) else '')])
 test('T8848', normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T8848'])
+     makefile_test, ['T8848'])
 test('T8848a', only_ways(['optasm']), compile, ['-ddump-rules'])
 test('T8331', only_ways(['optasm']), compile, ['-ddump-rules'])
 test('T6056', only_ways(['optasm']), multimod_compile, ['T6056', '-v0 -ddump-rule-firings'])
@@ -209,21 +195,18 @@ test('T10627', only_ways(['optasm']), compile, [''])
 test('T10181', [only_ways(['optasm'])], compile, [''])
 test('T10083',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T10083'])
+     makefile_test, ['T10083'])
 test('T10689', normal, compile, [''])
 test('T11155',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T11155'])
+     makefile_test, ['T11155'])
 test('T11232', normal, compile, ['-O2'])
 test('T11562', normal, compile, ['-O2'])
 test('T11742', normal, compile, ['-O2'])
 test('T11644', normal, compile, ['-O2'])
 test('T3990',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T3990'])
+     makefile_test, ['T3990'])
 
 test('T12076', [], multimod_compile, ['T12076', '-v0'])
 test('T12076lit', normal, compile, ['-O'])
@@ -235,49 +218,41 @@ test('par01', only_ways(['optasm']), compile, ['-ddump-prep -dsuppress-uniques -
 test('T12776', normal, compile, ['-O2'])
 test('T9509',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T9509'])
+     makefile_test, ['T9509'])
 test('T12603',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T12603'])
-test('T12877', normal, run_command, ['$MAKE -s --no-print-directory T12877'])
+     makefile_test, ['T12603'])
+test('T12877', normal, makefile_test, ['T12877'])
 test('T13027', normal, compile, [''])
 test('T13025',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T13025'])
+     makefile_test, ['T13025'])
 test('T13143', only_ways(['optasm']), compile, ['-O -ddump-simpl -dsuppress-uniques'])
-test('T13156', normal, run_command, ['$MAKE -s --no-print-directory T13156'])
+test('T13156', normal, makefile_test, ['T13156'])
 test('T11444', normal, compile, [''])
 test('str-rules',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory str-rules'])
+     makefile_test, ['str-rules'])
 test('T13170', only_ways(['optasm']), compile, ['-dcore-lint'])
 test('T13317',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T13317'])
-test('T13340', normal, run_command, ['$MAKE -s --no-print-directory T13340'])
+     makefile_test, ['T13317'])
+test('T13340', normal, makefile_test, ['T13340'])
 test('T13338', only_ways(['optasm']), compile, ['-dcore-lint'])
-test('T13367', normal, run_command, ['$MAKE -s --no-print-directory T13367'])
+test('T13367', normal, makefile_test, ['T13367'])
 test('T13417', normal, compile, ['-O'])
 test('T13413', normal, compile, [''])
 test('T13410', normal, compile, ['-O2'])
 test('T13468',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T13468'])
+     makefile_test, ['T13468'])
 test('T13543', only_ways(['optasm']), compile, ['-ddump-str-signatures'])
 test('T11272',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T11272'])
+     makefile_test, ['T11272'])
 test('T12600',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T12600'])
+     makefile_test, ['T12600'])
 test('T13658',
      [when((arch('powerpc64') or arch('powerpc64le')), expect_broken(11261))],
      compile, ['-dcore-lint'])
@@ -297,8 +272,7 @@ test('T14186', [ only_ways(['optasm']), check_errmsg(r'bar = foo') ], compile, [
 
 test('T14140',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T14140'])
+     makefile_test, ['T14140'])
 
 test('T14272', normal, compile, [''])
 test('T14270a', normal, compile, [''])
@@ -311,8 +285,7 @@ test('T14650', normal, compile, ['-O2'])
 test('T14959', normal, compile, ['-O'])
 test('T14978',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T14978'])
+     makefile_test, ['T14978'])
 test('T15002', [ req_profiling ], compile, ['-O -fprof-auto -prof'])
 test('T15005', normal, compile, ['-O'])
 # we omit profiling because it affects the optimiser and makes the test fail
@@ -324,6 +297,5 @@ test('T15453', normal, compile, ['-dcore-lint -O1'])
 test('T15445', normal, multimod_compile, ['T15445', '-v0 -O -ddump-rule-firings'])
 test('T15631',
      normal,
-     run_command,
-     ['$MAKE -s --no-print-directory T15631'])
+     makefile_test, ['T15631'])
 test('T15673', normal, compile, ['-O'])
diff --git a/testsuite/tests/stranal/should_compile/all.T b/testsuite/tests/stranal/should_compile/all.T
index 38c15f2b30e88dd20b5ccb54eed63880e637228a..c94065b2e4035a2d9f468959184606fc1a5e0428 100644
--- a/testsuite/tests/stranal/should_compile/all.T
+++ b/testsuite/tests/stranal/should_compile/all.T
@@ -36,8 +36,7 @@ test('T9208', when(compiler_debugged(), expect_broken(9208)), compile, [''])
 test('T10694', [ grep_errmsg(r'Str=') ],   compile, ['-dppr-cols=200 -ddump-simpl'])
 test('T11770', [ check_errmsg('OneShot') ], compile, ['-ddump-simpl'])
 
-test('T13031', normal, run_command,
-         ['$MAKE -s --no-print-directory T13031'])
+test('T13031', normal, makefile_test, [])
 
 test('T13077', normal, compile, [''])
 test('T13077a', normal, compile, [''])
@@ -48,4 +47,4 @@ test('T13077a', normal, compile, [''])
 #   don't mention MutVar# and Array# anymore.
 test('T15627',  [ grep_errmsg(r'(wmutVar|warray).*Int#') ], compile, ['-dppr-cols=200 -ddump-simpl'])
 
-test('T16029', normal, run_command, ['$MAKE -s --no-print-directory T16029'])
+test('T16029', normal, makefile_test, [])
diff --git a/testsuite/tests/stranal/should_run/all.T b/testsuite/tests/stranal/should_run/all.T
index 4599c9e7d2e986c98de9163b257c2f8f3fcc45a0..f33adac932f35a909243c6c64b723e954c038a34 100644
--- a/testsuite/tests/stranal/should_run/all.T
+++ b/testsuite/tests/stranal/should_run/all.T
@@ -1,6 +1,6 @@
 # Run this always as we compile the test with -O0 and -O1 and check that the
 # output is correct and the same in both cases.
-test('T16197', normal, run_command, ['$MAKE -s --no-print-directory T16197'])
+test('T16197', normal, makefile_test, [])
 
 # Run the rest only in optasm way (which implies -O), we're testing the
 # strictness analyser here
diff --git a/testsuite/tests/th/T2014/all.T b/testsuite/tests/th/T2014/all.T
index eba0f6f9035c4cf8d94526f7ab3048bb7436b27b..c74e4c1619b8560d9dbd155d5947e877ea0ff970 100644
--- a/testsuite/tests/th/T2014/all.T
+++ b/testsuite/tests/th/T2014/all.T
@@ -1,3 +1,3 @@
 test('T2014', [extra_files(['A.hs', 'A.hs-boot', 'B.hs', 'C.hs']),
-               req_interp], run_command,
-     ['$MAKE -s --no-print-directory T2014'])
+               req_interp],
+     makefile_test, ['T2014'])
diff --git a/testsuite/tests/th/TH_linker/all.T b/testsuite/tests/th/TH_linker/all.T
index a0e6d565f08ef3f44935cd9d0e37606cd375c440..c6657124d6e634a8bc45e32ee0b30153b5ab16dd 100644
--- a/testsuite/tests/th/TH_linker/all.T
+++ b/testsuite/tests/th/TH_linker/all.T
@@ -2,5 +2,4 @@ test('path_with_commas',
      [extra_files(['test.pkg', 'Main.hs', 'Dummy.hs']),
       ignore_stderr,
       unless(have_dynamic(),skip)],
-     run_command,
-     ['$MAKE -s --no-print-directory path_with_commas'])
+     makefile_test, ['path_with_commas'])
diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T
index b93673c138f00fff1745d9d6ce691a7bc34bdef3..59123fae495d807c799b2f5db2eea3dbad8e4c34 100644
--- a/testsuite/tests/th/all.T
+++ b/testsuite/tests/th/all.T
@@ -51,10 +51,10 @@ test('TH_NestedSplices', [], multimod_compile,
 test('TH_spliceE5_prof',
      [req_profiling, only_ways(['normal']),
       when(ghc_dynamic(), expect_broken(11495))],
-     run_command, ['$MAKE -s --no-print-directory TH_spliceE5_prof'])
+     makefile_test, ['TH_spliceE5_prof'])
 
 test('TH_spliceE5_prof_ext', [req_profiling, only_ways(['normal'])],
-     run_command, ['$MAKE -s --no-print-directory TH_spliceE5_prof_ext'])
+     makefile_test, ['TH_spliceE5_prof_ext'])
 
 test('TH_spliceD1', [], multimod_compile_fail,
      ['TH_spliceD1', '-v0 ' + config.ghc_th_way_flags])
@@ -134,8 +134,7 @@ test('T2713', normal, compile_fail, ['-v0'])
 test('T2674', normal, compile_fail, ['-v0'])
 test('TH_emptycase', normal, compile, ['-v0'])
 
-test('T2386', [only_ways(['normal'])], run_command,
-     ['$MAKE -s --no-print-directory T2386'])
+test('T2386', [only_ways(['normal'])], makefile_test, ['T2386'])
 
 test('T2685', [], multimod_compile, ['T2685', '-v0 ' + config.ghc_th_way_flags])
 
@@ -198,8 +197,7 @@ test('T5452', normal, compile, ['-v0'])
 test('T5434', [], multimod_compile,
      ['T5434', '-v0 -Wall ' + config.ghc_th_way_flags])
 test('T5508', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
-test('TH_Depends', [only_ways(['normal'])], run_command,
-     ['$MAKE -s --no-print-directory TH_Depends'])
+test('TH_Depends', [only_ways(['normal'])], makefile_test, ['TH_Depends'])
 test('T5597', [], multimod_compile, ['T5597', '-v0 ' + config.ghc_th_way_flags])
 test('T5665', [], multimod_compile, ['T5665', '-v0 ' + config.ghc_th_way_flags])
 test('T5700', [], multimod_compile,
@@ -239,8 +237,7 @@ test('T7276a', [ only_ways(['ghci']), combined_output ],
 test('TH_TyInstWhere1', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
 test('TH_TyInstWhere2', normal, compile, ['-v0'])
 
-test('T7445', [only_ways(['normal'])], run_command,
-     ['$MAKE -s --no-print-directory T7445'])
+test('T7445', [only_ways(['normal'])], makefile_test, ['T7445'])
 test('T7532', [], multimod_compile, ['T7532', '-v0 ' + config.ghc_th_way_flags])
 test('T2222', normal, compile, ['-v0'])
 test('T1849', only_ways(['ghci']), ghci_script, ['T1849.script'])
@@ -265,8 +262,7 @@ test('T8186', normal, compile_and_run, ['-v0'])
 
 test('T8333',
      only_ways(['normal']),
-     run_command,
-     ['$MAKE -s --no-print-directory T8333'])
+     makefile_test, ['T8333'])
 
 test('T4124', normal, compile, ['-v0'])
 test('T4128', normal, compile, ['-v0'])
@@ -307,9 +303,7 @@ test('T7484', normal, compile_fail, ['-v0'])
 test('T1476', normal, compile, ['-v0'])
 test('T1476b', normal, compile, ['-v0'])
 test('T8031', normal, compile, ['-v0'])
-test('T8624', only_ways(['normal']),
-              run_command,
-              ['$MAKE -s --no-print-directory T8624'])
+test('T8624', only_ways(['normal']), makefile_test, ['T8624'])
 test('TH_Lift', normal, compile, ['-v0'])
 test('T10047', only_ways(['ghci']), ghci_script, ['T10047.script'])
 test('T10019', only_ways(['ghci']), ghci_script, ['T10019.script'])
diff --git a/testsuite/tests/typecheck/T13168/all.T b/testsuite/tests/typecheck/T13168/all.T
index 2ca1d0b18665213e86a82f84539cfc87e50373a1..1ad10d4f1c7ca5fd2681a9f500bbcd73731ed8e9 100644
--- a/testsuite/tests/typecheck/T13168/all.T
+++ b/testsuite/tests/typecheck/T13168/all.T
@@ -1,5 +1,4 @@
 test('T13168',
      [extra_files(['package1', 'package2', 'Setup.hs']),
       when(opsys('mingw32'), expect_broken(14276))],
-     run_command,
-     ['$MAKE -s --no-print-directory T13168'])
+     makefile_test, [])
diff --git a/testsuite/tests/typecheck/bug1465/all.T b/testsuite/tests/typecheck/bug1465/all.T
index 2c23966c0408ed837ac07b3f17911f19a8cad22b..eef85925c6309065a5f69a9fe989aa72ffb9b5c3 100644
--- a/testsuite/tests/typecheck/bug1465/all.T
+++ b/testsuite/tests/typecheck/bug1465/all.T
@@ -1 +1 @@
-test('bug1465', [extra_files(['B1.hs', 'B2.hs', 'C.hs', 'v1/', 'v2/'])], run_command, ['$MAKE -s --no-print-directory bug1465'])
+test('bug1465', [extra_files(['B1.hs', 'B2.hs', 'C.hs', 'v1/', 'v2/'])], makefile_test, [])
diff --git a/testsuite/tests/typecheck/should_compile/all.T b/testsuite/tests/typecheck/should_compile/all.T
index b032121ad739c593a565abe87085fbeaf972fcca..5146dbc00ea8427e02122178bba0fdd7028880dc 100644
--- a/testsuite/tests/typecheck/should_compile/all.T
+++ b/testsuite/tests/typecheck/should_compile/all.T
@@ -171,13 +171,13 @@ test('tc167', normal, compile, [''])
 test('tc168', normal, compile_fail, [''])
 test('tc169', normal, compile, [''])
 
-test('tc170', [extra_files(['Tc170_Aux.hs'])], run_command, ['$MAKE -s --no-print-directory tc170'])
+test('tc170', [extra_files(['Tc170_Aux.hs'])], makefile_test, [])
 
 test('tc171', normal, compile, [''])
 test('tc172', normal, compile, [''])
 
 # The point about this test is that it compiles Tc173a and Tc173b *separately*
-test('tc173', [extra_files(['Tc173a.hs', 'Tc173b.hs'])], run_command, ['$MAKE -s --no-print-directory tc173'])
+test('tc173', [extra_files(['Tc173a.hs', 'Tc173b.hs'])], makefile_test, [])
 
 test('tc174', normal, compile, [''])
 test('tc175', normal, compile, [''])
@@ -255,7 +255,7 @@ test('tc241', normal, compile, [''])
 test('tc242', normal, compile, [''])
 test('tc243', normal, compile, [''])
 test('tc244', normal, compile, [''])
-test('tc245', [extra_files(['Tc245_A.hs'])], run_command, ['$MAKE -s --no-print-directory tc245'])
+test('tc245', [extra_files(['Tc245_A.hs'])], makefile_test, [])
 test('tc246', normal, compile, [''])
 test('tc247', normal, compile, [''])
 test('tc248', normal, compile, [''])
@@ -295,7 +295,7 @@ test('T3955', normal, compile, [''])
 test('PolyRec', normal, compile, [''])
 test('twins', normal, compile, [''])
 
-test('T2412', [], run_command, ['$MAKE --no-print-directory -s T2412'])
+test('T2412', [], makefile_test, [])
 
 test('T2846', normal, compile, [''])
 test('T4284', normal, compile, [''])
@@ -338,12 +338,12 @@ test('tc261', normal, compile, [''])
 test('tc262', normal, compile, [''])
 test('tc263', [extra_files(['Tc263_Help.hs'])], multimod_compile, ['tc263', '-v0'])
 test('tc265', normal, compile, [''])
-test('tc266', [extra_files(['Tc266.hs', 'Tc266a.hs', 'Tc266.hs-boot'])], run_command, ['$MAKE -s --no-print-directory tc266'])
-test('Tc267', [extra_files(['Tc267a.hs', 'Tc267b.hs', 'Tc267a.hs-boot', 'Tc267b.hs-boot'])], run_command, ['$MAKE -s --no-print-directory Tc267'])
+test('tc266', [extra_files(['Tc266.hs', 'Tc266a.hs', 'Tc266.hs-boot'])], makefile_test, [])
+test('Tc267', [extra_files(['Tc267a.hs', 'Tc267b.hs', 'Tc267a.hs-boot', 'Tc267b.hs-boot'])], makefile_test, [])
 test('tc268', normal, compile, [''])
 test('tc269', normal, compile, [''])
 test('tc270', normal, compile, [''])
-test('Tc271', [extra_files(['Tc271a.hs', 'Tc271.hs', 'Tc271.hs-boot'])], run_command, ['$MAKE -s --no-print-directory Tc271'])
+test('Tc271', [extra_files(['Tc271a.hs', 'Tc271.hs', 'Tc271.hs-boot'])], makefile_test, [])
 
 test('GivenOverlapping', normal, compile, [''])
 test('GivenTypeSynonym', normal, compile, [''])
@@ -362,8 +362,7 @@ test('T5676', normal, compile, [''])
 test('T4310', normal, compile, [''])
 test('T3108', normal, compile, [''])
 
-test('T5792',normal,run_command,
-     ['$MAKE -s --no-print-directory T5792'])
+test('T5792',normal, makefile_test, [])
 
 test('PolytypeDecomp', normal, compile, [''])
 test('T6011', normal, compile, [''])
@@ -375,8 +374,7 @@ test('T6134', normal, compile, [''])
 test('T6018', [], multimod_compile, ['T6018', ''])
 test('TcLambdaCase', [], compile, [''])
 test('T7147', normal, compile, [''])
-test('T7171',normal,run_command,
-     ['$MAKE -s --no-print-directory T7171'])
+test('T7171',normal, makefile_test, [])
 test('T7173', normal, compile, [''])
 test('T7196', normal, compile, [''])
 test('T7050', normal, compile, ['-O'])
@@ -574,7 +572,7 @@ test('T13526', normal, compile, [''])
 test('T13594', normal, compile_fail, [''])
 test('T13603', normal, compile, [''])
 test('T13333', normal, compile, [''])
-test('T13585', [extra_files(['T13585.hs', 'T13585a.hs', 'T13585b.hs'])], run_command, ['$MAKE -s --no-print-directory T13585'])
+test('T13585', [extra_files(['T13585.hs', 'T13585a.hs', 'T13585b.hs'])], makefile_test, [])
 test('T13651', normal, compile_fail, [''])
 test('T13651a', normal, compile, [''])
 test('T13680', normal, compile, [''])
@@ -598,7 +596,7 @@ test('T14363', normal, compile, [''])
 test('T14363a', normal, compile, [''])
 test('T7169', normal, compile, [''])
 test('T14396', [extra_files(['T14396.hs', 'T14396.hs-boot', 'T14396a.hs', 'T14396b.hs', 'T14396f.hs'])], multimod_compile, ['T14396', '-v0'])
-test('T14434', [], run_command, ['$MAKE -s --no-print-directory T14434'])
+test('T14434', [], makefile_test, [])
 test('MissingExportList01', normal, compile, [''])
 test('MissingExportList02', normal, compile, [''])
 test('T14451', normal, compile, [''])
@@ -612,11 +610,10 @@ test('T13032', omit_ways(['hpc', 'profasm']), compile, [''])
 test('T14273', normal, compile, ['-fdefer-type-errors -fno-max-valid-hole-fits'])
 test('T14366', normal, compile, [''])
 test('T14732', normal, compile, [''])
-test('T14774', [], run_command, ['$MAKE -s --no-print-directory T14774'])
+test('T14774', [], makefile_test, [])
 test('T14763', normal, compile, [''])
 test('T14811', normal, compile, [''])
-test('T14934', [extra_files(['T14934.hs', 'T14934a.hs'])], run_command,
-               ['$MAKE -s --no-print-directory T14934'])
+test('T14934', [extra_files(['T14934.hs', 'T14934a.hs'])], makefile_test, [])
 test('T13643', normal, compile, [''])
 test('SplitWD', normal, compile, [''])
 # we omit profasm because it fails with:
diff --git a/testsuite/tests/typecheck/should_fail/all.T b/testsuite/tests/typecheck/should_fail/all.T
index 9bd518f10cfb92fc218c41ea002c705e2e41cc15..2b8561909fafcc64db39043175e9eba2ca3a2d83 100644
--- a/testsuite/tests/typecheck/should_fail/all.T
+++ b/testsuite/tests/typecheck/should_fail/all.T
@@ -450,7 +450,7 @@ test('T13611', expect_broken(13611), compile_fail, [''])
 test('T13320', normal, compile_fail, [''])
 test('T13640', normal, compile_fail, [''])
 test('T13677', normal, compile_fail, [''])
-test('T13821A', expect_broken(13821), run_command, ['$MAKE -s --no-print-directory T13821A'])
+test('T13821A', expect_broken(13821), makefile_test, ['T13821A'])
 test('T13821B', expect_broken(13821), backpack_typecheck_fail, [''])
 test('T13983', normal, compile_fail, [''])
 test('T13530', normal, compile_fail, [''])
diff --git a/testsuite/tests/unboxedsums/all.T b/testsuite/tests/unboxedsums/all.T
index 45723cb4f080c6aef51e25c960fcd76b28f863d2..b4007354645a752850acd4a580c9d3646dae955e 100644
--- a/testsuite/tests/unboxedsums/all.T
+++ b/testsuite/tests/unboxedsums/all.T
@@ -28,8 +28,7 @@ test('T12711', only_ways(['ghci']), ghci_script, ['T12711.script'])
 # test('sum_api_annots',
 #      [only_ways(['normal']),
 #       extra_files([ "unboxedsums" + str(i) + ".hs" for i in range(1, 12) ])],
-#      run_command,
-#      ['$MAKE -s --no-print-directory sum_api_annots'])
+#      makefile_test, [])
 
 test('UbxSumLevPoly', normal, compile, [''])
 test('T14051', normal, multi_compile, ['T14051.hs', [('T14051a.hs', '')], '-O2 -v0'])
diff --git a/testsuite/tests/utils/should_run/all.T b/testsuite/tests/utils/should_run/all.T
index f59c6b249c420cdb6c18fb99d4c51229b3a0bdf2..8817118601cb1b4d85aafb8f41a35a78414317dc 100644
--- a/testsuite/tests/utils/should_run/all.T
+++ b/testsuite/tests/utils/should_run/all.T
@@ -6,4 +6,4 @@ test('T14854',
      compile_and_run,
      ['-package ghc'])
 
-test('T15953', [ignore_stdout], run_command, ['$MAKE --no-print-directory -s T15953'])
+test('T15953', [ignore_stdout], makefile_test, [])