From 25977ab542a30df4ae71d9699d015bcdd1ab7cfb Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Wed, 5 May 2021 14:02:37 +0100 Subject: Driver Rework Patch This patch comprises of four different but closely related ideas. The net result is fixing a large number of open issues with the driver whilst making it simpler to understand. 1. Use the hash of the source file to determine whether the source file has changed or not. This makes the recompilation checking more robust to modern build systems which are liable to copy files around changing their modification times. 2. Remove the concept of a "stable module", a stable module was one where the object file was older than the source file, and all transitive dependencies were also stable. Now we don't rely on the modification time of the source file, the notion of stability is moot. 3. Fix TH/plugin recompilation after the removal of stable modules. The TH recompilation check used to rely on stable modules. Now there is a uniform and simple way, we directly track the linkables which were loaded into the interpreter whilst compiling a module. This is an over-approximation but more robust wrt package dependencies changing. 4. Fix recompilation checking for dynamic object files. Now we actually check if the dynamic object file exists when compiling with -dynamic-too Fixes #19774 #19771 #19758 #17434 #11556 #9121 #8211 #16495 #7277 #16093 --- testsuite/tests/driver/recomp16885/M.hs | 2 ++ testsuite/tests/driver/recomp16885/M1.hs | 4 ++++ testsuite/tests/driver/recomp16885/M2A.hs | 1 + testsuite/tests/driver/recomp16885/M2B.hs | 2 ++ testsuite/tests/driver/recomp16885/M3.hs | 1 + testsuite/tests/driver/recomp16885/Makefile | 12 ++++++++++++ testsuite/tests/driver/recomp16885/all.T | 3 +++ testsuite/tests/driver/recomp16885/recomp16885.stdout | 5 +++++ 8 files changed, 30 insertions(+) create mode 100644 testsuite/tests/driver/recomp16885/M.hs create mode 100644 testsuite/tests/driver/recomp16885/M1.hs create mode 100644 testsuite/tests/driver/recomp16885/M2A.hs create mode 100644 testsuite/tests/driver/recomp16885/M2B.hs create mode 100644 testsuite/tests/driver/recomp16885/M3.hs create mode 100644 testsuite/tests/driver/recomp16885/Makefile create mode 100644 testsuite/tests/driver/recomp16885/all.T create mode 100644 testsuite/tests/driver/recomp16885/recomp16885.stdout (limited to 'testsuite/tests/driver/recomp16885') diff --git a/testsuite/tests/driver/recomp16885/M.hs b/testsuite/tests/driver/recomp16885/M.hs new file mode 100644 index 0000000000..180dff6a79 --- /dev/null +++ b/testsuite/tests/driver/recomp16885/M.hs @@ -0,0 +1,2 @@ +module M where +import M1 diff --git a/testsuite/tests/driver/recomp16885/M1.hs b/testsuite/tests/driver/recomp16885/M1.hs new file mode 100644 index 0000000000..f9c1cb5a46 --- /dev/null +++ b/testsuite/tests/driver/recomp16885/M1.hs @@ -0,0 +1,4 @@ +module M1 where + +import M2 + diff --git a/testsuite/tests/driver/recomp16885/M2A.hs b/testsuite/tests/driver/recomp16885/M2A.hs new file mode 100644 index 0000000000..a99090730d --- /dev/null +++ b/testsuite/tests/driver/recomp16885/M2A.hs @@ -0,0 +1 @@ +module M2 where diff --git a/testsuite/tests/driver/recomp16885/M2B.hs b/testsuite/tests/driver/recomp16885/M2B.hs new file mode 100644 index 0000000000..bdd17a4922 --- /dev/null +++ b/testsuite/tests/driver/recomp16885/M2B.hs @@ -0,0 +1,2 @@ +module M2 where +import M3 diff --git a/testsuite/tests/driver/recomp16885/M3.hs b/testsuite/tests/driver/recomp16885/M3.hs new file mode 100644 index 0000000000..44866309ad --- /dev/null +++ b/testsuite/tests/driver/recomp16885/M3.hs @@ -0,0 +1 @@ +module M3 where diff --git a/testsuite/tests/driver/recomp16885/Makefile b/testsuite/tests/driver/recomp16885/Makefile new file mode 100644 index 0000000000..baa2c9e6c7 --- /dev/null +++ b/testsuite/tests/driver/recomp16885/Makefile @@ -0,0 +1,12 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +# Recompilation tests + +recomp16885: + cp M2A.hs M2.hs + '$(TEST_HC)' $(TEST_HC_OPTS) --make M.hs + sleep 1 + cp M2B.hs M2.hs + -'$(TEST_HC)' $(TEST_HC_OPTS) --make M.hs diff --git a/testsuite/tests/driver/recomp16885/all.T b/testsuite/tests/driver/recomp16885/all.T new file mode 100644 index 0000000000..b9821f9b42 --- /dev/null +++ b/testsuite/tests/driver/recomp16885/all.T @@ -0,0 +1,3 @@ +test('recomp16885', [extra_files(['M2A.hs', 'M.hs', 'M1.hs', 'M2B.hs', 'M3.hs']), + when(fast(), skip)], + makefile_test, []) diff --git a/testsuite/tests/driver/recomp16885/recomp16885.stdout b/testsuite/tests/driver/recomp16885/recomp16885.stdout new file mode 100644 index 0000000000..506b99c6ac --- /dev/null +++ b/testsuite/tests/driver/recomp16885/recomp16885.stdout @@ -0,0 +1,5 @@ +[1 of 3] Compiling M2 ( M2.hs, M2.o ) +[2 of 3] Compiling M1 ( M1.hs, M1.o ) +[3 of 3] Compiling M ( M.hs, M.o ) +[1 of 4] Compiling M3 ( M3.hs, M3.o ) +[2 of 4] Compiling M2 ( M2.hs, M2.o ) [Source file changed] -- cgit v1.2.1