Skip to content

Two versions of GHC depended on when useArchiveFilesForTemplateHaskell is true #122

@jonathanlking

Description

@jonathanlking

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-refs

Some observations/thoughts:

  1. These are options changed by enableRelocatedStaticLibs and enableShared attributes in the GHC derivation, which is set by useArchiveFilesForTemplateHaskell.

  2. The immediate parents suggest this is the GHC in buildHaskellPackages, as these parents match things set up in mkDerivationImpl.

  3. We already override buildHaskellPackages to replace GHC (to avoid depending on 2 versions)

    # 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;
    });
    .

  4. The GHC overrides are made by a fixGhc function, which is applied to both ghc and the ghc in buildHaskellPackages, so I'm not sure why it isn't working the same in both places?

  5. buildHaskellPackages.ghc does 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»
    

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions