doc/haskell: don't use lib.recursiveUpdate in overlays

`lib.recursiveUpdate` indiscriminately recurses into all attribute sets,
also into derivations. This means that it is possible that evaluating a
derivation in the final haskell package set can cause something in
`prev.haskell` to be forced by `recursiveUpdate`, potentially causing an
evaluation error that should not happen.

It can be fixed using a well-crafted predicate for
`lib.recursiveUpdateUntil`, but most robust is just explicitly writing
out the desired merging manually.
This commit is contained in:
sternenseemann
2024-01-31 19:14:24 +01:00
parent 82ee069492
commit 571a07d774

View File

@@ -1229,12 +1229,14 @@ in
in in
{ {
haskell = lib.recursiveUpdate prev.haskell { haskell = prev.haskell // {
compiler.${ghcName} = prev.haskell.compiler.${ghcName}.override { compiler = prev.haskell.compiler // {
${ghcName} = prev.haskell.compiler.${ghcName}.override {
# Unfortunately, the GHC setting is named differently for historical reasons # Unfortunately, the GHC setting is named differently for historical reasons
enableProfiledLibs = enableProfiling; enableProfiledLibs = enableProfiling;
}; };
}; };
};
}) })
(final: prev: (final: prev:
@@ -1244,8 +1246,9 @@ in
in in
{ {
haskell = lib.recursiveUpdate prev.haskell { haskell = prev.haskell // {
packages.${ghcName} = prev.haskell.packages.${ghcName}.override { packages = prev.haskell.packages // {
${ghcName} = prev.haskell.packages.${ghcName}.override {
overrides = hfinal: hprev: { overrides = hfinal: hprev: {
mkDerivation = args: hprev.mkDerivation (args // { mkDerivation = args: hprev.mkDerivation (args // {
# Since we are forcing our ideas upon mkDerivation, this change will # Since we are forcing our ideas upon mkDerivation, this change will
@@ -1272,6 +1275,7 @@ in
}; };
}; };
}; };
};
}) })
] ]
``` ```