316 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# Haskell / GHC infrastructure in Nixpkgs
 | 
						||
#
 | 
						||
# In this file, we
 | 
						||
#
 | 
						||
#    * define sets of default package versions for each GHC compiler version,
 | 
						||
#    * associate GHC versions with bootstrap compiler versions and package defaults.
 | 
						||
#
 | 
						||
# The actual Haskell packages are composed in haskell-packages.nix. There is
 | 
						||
# more documentation in there.
 | 
						||
 | 
						||
{ makeOverridable, lowPrio, hiPrio, stdenv, pkgs, newScope, config, callPackage } : rec {
 | 
						||
 | 
						||
  # haskell-packages.nix provides the latest possible version of every package,
 | 
						||
  # and this file overrides those version choices per compiler when appropriate.
 | 
						||
  # Older compilers inherit the overrides from newer ones.
 | 
						||
 | 
						||
  ghcHEADPrefs = self : super : super // {
 | 
						||
    cabalInstall_1_20_0_6 = super.cabalInstall_1_20_0_6.override { Cabal = null; };
 | 
						||
    mtl = self.mtl_2_2_1;
 | 
						||
    ghcjsBase = null;
 | 
						||
    ghcjsDom = with self; super.ghcjsDom.override {
 | 
						||
      cabal = self.cabal.override {
 | 
						||
        extension = self: super: {
 | 
						||
          configureFlags = [ "-f-ghcjs" "-fwebkit" "-f-gtk3" ];
 | 
						||
          buildDepends = [ mtl glib transformers gtk webkit ];
 | 
						||
        };
 | 
						||
      };
 | 
						||
    };
 | 
						||
  };
 | 
						||
 | 
						||
  ghc784Prefs = self : super : ghcHEADPrefs self super // {
 | 
						||
    cabalInstall_1_20_0_6 = super.cabalInstall_1_20_0_6.override { Cabal = self.Cabal_1_20_0_3; };
 | 
						||
    codex = super.codex.override { hackageDb = super.hackageDb.override { Cabal = self.Cabal_1_20_0_3; }; };
 | 
						||
    jailbreakCabal = super.jailbreakCabal.override { Cabal = self.Cabal_1_20_0_3; };
 | 
						||
    MonadRandom = self.MonadRandom_0_2_0_1; # newer versions require transformers >= 0.4.x
 | 
						||
    mtl = self.mtl_2_1_3_1;
 | 
						||
    xhtml = null;
 | 
						||
    transformersCompat = super.transformersCompat.override { cabal = self.cabal.override {
 | 
						||
      extension = self: super: { configureFlags = "-fthree " + super.configureFlags or ""; };
 | 
						||
    }; };
 | 
						||
  };
 | 
						||
 | 
						||
  ghc763Prefs = self : super : ghc784Prefs self super // {
 | 
						||
    Cabal_1_22_0_0 = super.Cabal_1_22_0_0.override {
 | 
						||
      binary = self.binary_0_7_2_2.override { cabal = self.cabal.override { extension = self: super: { doCheck = false; }; }; };
 | 
						||
    };
 | 
						||
    aeson = self.aeson_0_7_0_4;
 | 
						||
    ariadne = super.ariadne.override {
 | 
						||
      haskellNames = self.haskellNames.override {
 | 
						||
        haskellPackages = self.haskellPackages.override { Cabal = self.Cabal_1_18_1_3; };
 | 
						||
      };
 | 
						||
    };
 | 
						||
    attoparsec = self.attoparsec_0_11_3_1;
 | 
						||
    binaryConduit = super.binaryConduit.override { binary = self.binary_0_7_2_2; };
 | 
						||
    bson = super.bson.override { dataBinaryIeee754 = self.dataBinaryIeee754.override { binary = self.binary_0_7_2_2; }; };
 | 
						||
    cabal2nix = super.cabal2nix.override { hackageDb = super.hackageDb.override { Cabal = self.Cabal_1_18_1_3; }; };
 | 
						||
    cabalInstall_1_16_0_2 = super.cabalInstall_1_16_0_2.override {
 | 
						||
      HTTP = self.HTTP.override { network = self.network_2_5_0_0; };
 | 
						||
      network = self.network_2_5_0_0;
 | 
						||
    };
 | 
						||
    criterion = super.criterion.override {
 | 
						||
      statistics = self.statistics.override {
 | 
						||
        vectorBinaryInstances = self.vectorBinaryInstances.override { binary = self.binary_0_7_2_2; };
 | 
						||
      };
 | 
						||
    };
 | 
						||
    entropy = super.entropy.override { cabal = self.cabal.override { Cabal = self.Cabal_1_18_1_3; }; };
 | 
						||
    gloss = null;                       # requires base >= 4.7
 | 
						||
    modularArithmetic = null;           # requires base >= 4.7
 | 
						||
    pipesBinary = super.pipesBinary.override { binary = self.binary_0_7_2_2; };
 | 
						||
    rank1dynamic = super.rank1dynamic.override { binary = self.binary_0_7_2_2; };
 | 
						||
    distributedStatic = super.distributedStatic.override { binary = self.binary_0_7_2_2; };
 | 
						||
    networkTransport = super.networkTransport.override { binary = self.binary_0_7_2_2; };
 | 
						||
    distributedProcess = super.distributedProcess.override { binary = self.binary_0_7_2_2; };
 | 
						||
    scientific = self.scientific_0_2_0_2;
 | 
						||
    singletons = null;                  # requires base >= 4.7
 | 
						||
    transformers = self.transformers_0_3_0_0; # core packagen in ghc > 7.6.x
 | 
						||
    zipArchive = super.zipArchive_0_2_2_1;    # works without binary 0.7.x
 | 
						||
  };
 | 
						||
 | 
						||
  ghc742Prefs = self : super : ghc763Prefs self super // {
 | 
						||
    aeson = self.aeson_0_7_0_4.override { blazeBuilder = self.blazeBuilder; };
 | 
						||
    extensibleExceptions = null;        # core package in ghc <= 7.4.x
 | 
						||
    hackageDb = super.hackageDb.override { Cabal = self.Cabal_1_16_0_3; };
 | 
						||
    haskeline = super.haskeline.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    primitive = self.primitive_0_5_3_0; # later versions don't compile
 | 
						||
    random = self.random_1_0_1_1;       # requires base >= 4.6.x
 | 
						||
  };
 | 
						||
 | 
						||
  ghc722Prefs = self : super : ghc742Prefs self super // {
 | 
						||
    cabalInstall = self.cabalInstall_1_20_0_6;
 | 
						||
    caseInsensitive = self.caseInsensitive_1_0_0_1;
 | 
						||
    deepseq = self.deepseq_1_3_0_2;
 | 
						||
    DrIFT = null;                       # doesn't compile with old GHC versions
 | 
						||
    syb = self.syb_0_4_0;
 | 
						||
  };
 | 
						||
 | 
						||
  ghc704Prefs = self : super : ghc722Prefs self super // {
 | 
						||
    binary = self.binary_0_7_2_2;       # core package in ghc >= 7.2.2
 | 
						||
    caseInsensitive = super.caseInsensitive; # undo the override from ghc 7.2.2
 | 
						||
    HsSyck = self.HsSyck_0_51;
 | 
						||
    random = null;                      # core package in ghc <= 7.0.x
 | 
						||
  };
 | 
						||
 | 
						||
  ghc6123Prefs = self : super : ghc704Prefs self super // {
 | 
						||
    alex = self.alex_3_1_3;
 | 
						||
    async = self.async_2_0_1_4;
 | 
						||
    attoparsec = self.attoparsec_0_10_4_0;
 | 
						||
    cabalInstall = self.cabalInstall_1_16_0_2;
 | 
						||
    cgi = self.cgi_3001_1_7_5;
 | 
						||
    deepseq = self.deepseq_1_2_0_1;
 | 
						||
    dlist = super.dlist.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    exceptions = null;                  # none of our versions compile
 | 
						||
    jailbreakCabal = super.jailbreakCabal.override { Cabal = self.Cabal_1_16_0_3; };
 | 
						||
    logict = super.logict.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    monadPar = self.monadPar_0_1_0_3;
 | 
						||
    nats = null;                        # none of our versions compile
 | 
						||
    networkUri = super.networkUri.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    parallel = self.parallel_3_2_0_3;
 | 
						||
    primitive = self.primitive_0_5_0_1;
 | 
						||
    reflection = super.reflection.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    scientific = null;                  # none of our versions compile
 | 
						||
    split = self.split_0_1_4_3;
 | 
						||
    stm = self.stm_2_4_2;
 | 
						||
    syb = null;                         # core package in ghc < 7
 | 
						||
    tagged = super.tagged.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    temporary = null;                   # none of our versions compile
 | 
						||
    vector = super.vector_0_10_9_3;
 | 
						||
    vectorAlgorithms = super.vectorAlgorithms.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
  };
 | 
						||
 | 
						||
  ghc6104Prefs = self : super : ghc6123Prefs self super // {
 | 
						||
    alex = self.alex_2_3_5.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    async = null;                       # none of our versions compile
 | 
						||
    attoparsec = null;                  # none of our versions compile
 | 
						||
    binary = super.binary_0_7_2_2.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    cabalInstall_1_16_0_2 = super.cabalInstall_1_16_0_2;
 | 
						||
    caseInsensitive = super.caseInsensitive.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    happy = super.happy.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    hashable = super.hashable.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    hashtables = super.hashtables.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    hsyslog = super.hsyslog.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    HTTP = super.HTTP.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    HUnit = super.HUnit.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    network = super.network_2_2_1_7.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    parsec = super.parsec.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    QuickCheck = super.QuickCheck.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    stm = self.stm_2_4_2.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    systemFilepath = super.systemFilepath.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    systemFileio = super.systemFileio.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    tar = super.tar.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    text = self.text_0_11_2_3.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    tfRandom = null;                    # does not compile
 | 
						||
    time = self.time_1_1_2_4.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
    zlib = super.zlib.override { cabal = self.cabal.override { Cabal = self.Cabal_1_16_0_3; }; };
 | 
						||
 };
 | 
						||
 | 
						||
  # Abstraction for Haskell packages collections
 | 
						||
  packagesFun = makeOverridable
 | 
						||
   ({ ghc
 | 
						||
    , prefFun
 | 
						||
    , extension ? (self : super : {})
 | 
						||
    , profExplicit ? false, profDefault ? false
 | 
						||
    , modifyPrio ? lowPrio
 | 
						||
    } :
 | 
						||
    let haskellPackagesClass = import ./haskell-packages.nix {
 | 
						||
          inherit pkgs newScope ghc modifyPrio;
 | 
						||
          enableLibraryProfiling =
 | 
						||
            if profExplicit then profDefault
 | 
						||
                            else config.cabal.libraryProfiling or profDefault;
 | 
						||
        };
 | 
						||
        haskellPackagesPrefsClass = self : let super = haskellPackagesClass self; in super // prefFun self super;
 | 
						||
        haskellPackagesExtensionClass = self : let super = haskellPackagesPrefsClass self; in super // extension self super;
 | 
						||
        haskellPackages = haskellPackagesExtensionClass haskellPackages;
 | 
						||
    in haskellPackages);
 | 
						||
 | 
						||
  defaultVersionPrioFun =
 | 
						||
    profDefault :
 | 
						||
    if config.cabal.libraryProfiling or false == profDefault
 | 
						||
      then (x : x)
 | 
						||
      else lowPrio;
 | 
						||
 | 
						||
  packages = args : let r = packagesFun args;
 | 
						||
                    in  r // { lowPrio     = r.override { modifyPrio   = lowPrio; };
 | 
						||
                               highPrio    = r.override { modifyPrio   = hiPrio; };
 | 
						||
                               noProfiling = r.override { profDefault  = false;
 | 
						||
                                                          profExplicit = true;
 | 
						||
                                                          modifyPrio   = defaultVersionPrioFun false; };
 | 
						||
                               profiling   = r.override { profDefault  = true;
 | 
						||
                                                          profExplicit = true;
 | 
						||
                                                          modifyPrio   = defaultVersionPrioFun true; };
 | 
						||
                             };
 | 
						||
 | 
						||
  # Compiler configurations
 | 
						||
  #
 | 
						||
  # Here, we associate compiler versions with bootstrap compiler versions and
 | 
						||
  # preference functions.
 | 
						||
 | 
						||
  packages_ghc784 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc784;
 | 
						||
               prefFun = ghc784Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
  packages_ghcjs =
 | 
						||
    packages {
 | 
						||
      ghc = pkgs.haskell-ng.compiler.ghc784;
 | 
						||
      prefFun = self : super : super // {
 | 
						||
        ghc = let parent = packages_ghc784; in
 | 
						||
          callPackage ../development/compilers/ghcjs/wrapper.nix {
 | 
						||
            ghc = parent.ghcjs // { inherit parent; };
 | 
						||
          };
 | 
						||
        cabal = self.cabalJs;
 | 
						||
        buildLocalCabalWithArgs = args: super.buildLocalCabalWithArgs (args // {
 | 
						||
          nativePkgs = packages_ghc784;
 | 
						||
        });
 | 
						||
        ghcjsDom = with self; super.ghcjsDom.override {
 | 
						||
          cabal = self.cabal.override {
 | 
						||
            extension = self: super: {
 | 
						||
              configureFlags = [ ];
 | 
						||
              buildDepends = [ mtl ghcjsBase ];
 | 
						||
            };
 | 
						||
          };
 | 
						||
        };
 | 
						||
        # This is the list of packages that are built into a booted ghcjs installation
 | 
						||
        # It can be generated with the command:
 | 
						||
        # nix-shell '<nixpkgs>' -A pkgs.haskellPackages_ghcjs.ghc --command "ghcjs-pkg list | sed -n 's/^    \(.*\)-\([0-9.]*\)$/\1_\2/ p' | sed 's/\./_/g' | sed 's/-\(.\)/\U\1/' | sed 's/^\([^_]*\)\(.*\)$/\1 = null;/'"
 | 
						||
        Cabal = null;
 | 
						||
        aeson = null;
 | 
						||
        array = null;
 | 
						||
        async = null;
 | 
						||
        attoparsec = null;
 | 
						||
        base = null;
 | 
						||
        binary = null;
 | 
						||
        rts = null;
 | 
						||
        bytestring = null;
 | 
						||
        caseInsensitive = null;
 | 
						||
        containers = null;
 | 
						||
        deepseq = null;
 | 
						||
        directory = null;
 | 
						||
        dlist = null;
 | 
						||
        extensibleExceptions = null;
 | 
						||
        filepath = null;
 | 
						||
        ghcPrim = null;
 | 
						||
        ghcjsBase = null;
 | 
						||
        ghcjsPrim = null;
 | 
						||
        hashable = null;
 | 
						||
        integerGmp = null;
 | 
						||
        mtl = null;
 | 
						||
        oldLocale = null;
 | 
						||
        oldTime = null;
 | 
						||
        parallel = null;
 | 
						||
        pretty = null;
 | 
						||
        primitive = null;
 | 
						||
        process = null;
 | 
						||
        scientific = null;
 | 
						||
        stm = null;
 | 
						||
        syb = null;
 | 
						||
        templateHaskell = null;
 | 
						||
        text = null;
 | 
						||
        time = null;
 | 
						||
        transformers = null;
 | 
						||
        unix = null;
 | 
						||
        unorderedContainers = null;
 | 
						||
        vector = null;
 | 
						||
 | 
						||
        # GHCJS-specific workarounds
 | 
						||
        split = super.split.override {
 | 
						||
          cabal = self.cabal.override {
 | 
						||
            extension = self: super: {
 | 
						||
              doCheck = false; # Under ghcjs, the tests hang
 | 
						||
            };
 | 
						||
          };
 | 
						||
        };
 | 
						||
        dependentMap = super.dependentMap.override {
 | 
						||
          cabal = self.cabal.override {
 | 
						||
            extension = self: super: {
 | 
						||
              preConfigure = ''
 | 
						||
                sed -i 's/^.*ghc-options:.*$//' *.cabal
 | 
						||
              ''; # Without this, we get "target ‘base’ is not a module name or a source file"
 | 
						||
            };
 | 
						||
          };
 | 
						||
        };
 | 
						||
      };
 | 
						||
    };
 | 
						||
 | 
						||
  packages_ghc763 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc763;
 | 
						||
               prefFun = ghc763Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
  packages_ghc742 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc742;
 | 
						||
               prefFun = ghc742Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
  packages_ghc722 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc722;
 | 
						||
               prefFun = ghc722Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
  packages_ghc704 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc704;
 | 
						||
               prefFun = ghc704Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
  packages_ghc6123 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc6123;
 | 
						||
               prefFun = ghc6123Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
  packages_ghc6104 =
 | 
						||
    packages { ghc = pkgs.haskell-ng.compiler.ghc6104;
 | 
						||
               prefFun = ghc6104Prefs;
 | 
						||
             };
 | 
						||
 | 
						||
}
 |