-
-
Notifications
You must be signed in to change notification settings - Fork 35
Description
On master (88f1e2d) when setting useArchiveFilesForTemplateHaskell = true two versions of GHC are being depended on. Picking an arbitrary package (in this case vector):
nix-repl> pkgs = (import ./survey/default.nix { useArchiveFilesForTemplateHaskell = true; })
nix-repl> pkgs.haskellPackages.vector
«derivation /nix/store/v6hbyn8a5nydw81a9vjabr4qxfj093mr-vector-0.12.3.1.drv»
nix-repl> pkgs = (import ./survey/default.nix { })
nix-repl> pkgs.haskellPackages.vector
«derivation /nix/store/ggxx6mgws1vn22l668dsnpl76yx635ri-vector-0.12.3.1.drv»
Using nix-tree to inspect the derivations we find that the first derivation /nix/store/v6hbyn8a5nydw81a9vjabr4qxfj093mr-vector-0.12.3.1.drv depends on two different GHC derivations:
a. /nix/store/6yvclb4xwmkwg632nmm2mdcaw94vfj7k-ghc-musl-9.2.7.drv — Immediate Parents (41)
b. /nix/store/pd3h7k2f9p9290dhfch2wnwkp9714xgk-ghc-musl-9.2.7.drv — Immediate Parents (4): jailbreak-cabal-1.4.drv, hscolour-1.24.4.drv, Cabal-syntax-3.6.0.0.drv, hscolour-1.24.4.drv
While the second derivation /nix/store/ggxx6mgws1vn22l668dsnpl76yx635ri-vector-0.12.3.1.drv only depends on a.
Diffing the derivations for a and b, the only meaningful difference is in the preConfigure step:
- DYNAMIC_GHC_PROGRAMS = YES
+ DYNAMIC_GHC_PROGRAMS = NO
+ GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
+ GhcRtsHcOpts += -fPIC -fexternal-dynamic-refsSome observations/thoughts:
-
These are options changed by
enableRelocatedStaticLibsandenableSharedattributes in the GHC derivation, which is set byuseArchiveFilesForTemplateHaskell. -
The immediate parents suggest this is the GHC in
buildHaskellPackages, as these parents match things set up inmkDerivationImpl. -
We already override
buildHaskellPackagesto replace GHC (to avoid depending on 2 versions).static-haskell-nix/survey/default.nix
Lines 1586 to 1596 in 88f1e2d
# To override GHC, we need to override both `ghc` and the one in # `buildHaskellPackages` because otherwise this code in `geneic-builder.nix` # will make our package depend on 2 different GHCs: # nativeGhc = buildHaskellPackages.ghc; # depsBuildBuild = [ nativeGhc ] ... # nativeBuildInputs = [ ghc removeReferencesTo ] ... # ghc = fixGhc old.ghc; buildHaskellPackages = old.buildHaskellPackages.override (oldBuildHaskellPackages: { ghc = fixGhc oldBuildHaskellPackages.ghc; }); -
The GHC overrides are made by a
fixGhcfunction, which is applied to bothghcand theghcinbuildHaskellPackages, so I'm not sure why it isn't working the same in both places? -
buildHaskellPackages.ghcdoes have the right derivation 🤔nix-repl> pkgs.haskellPackages.buildHaskellPackages.ghc «derivation /nix/store/6yvclb4xwmkwg632nmm2mdcaw94vfj7k-ghc-musl-9.2.7.drv» nix-repl> pkgs.haskellPackages.ghc «derivation /nix/store/6yvclb4xwmkwg632nmm2mdcaw94vfj7k-ghc-musl-9.2.7.drv»