@@ -1,14 +1,29 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE RankNTypes #-}
3+{-# LANGUAGE TemplateHaskell #-}
3module Distribution.Nixpkgs.Haskell.Stack.PrettyPrinting where
5module Distribution.Nixpkgs.Haskell.Stack.PrettyPrinting where
5−import Control.Lens
7+import Control.Lens
10+import Distribution.Nixpkgs.Haskell.Derivation
11+import Distribution.Nixpkgs.Haskell.Packages.PrettyPrinting as PP
6−import Distribution.Package
12+import Distribution.Package
7−import Distribution.Text
13+import Distribution.Text
8−import Distribution.Nixpkgs.Haskell.Derivation
14+import qualified Language.Nix.FilePath as Nix
9−import Distribution.Nixpkgs.Haskell.Packages.PrettyPrinting as PP
10−import Language.Nix.PrettyPrinting as PP
15+import Language.Nix.PrettyPrinting as PP
17+data OverrideConfig = OverrideConfig
19+ , _ocStackagePackages :: Maybe FilePath
20+ , _ocStackageConfig :: Maybe FilePath
23+makeLenses ''OverrideConfig
25+hasField :: Lens' OverrideConfig (Maybe a) -> OverrideConfig -> Bool
26+hasField p = views p isJust
13overridePackages :: [Derivation] -> Doc
28overridePackages :: [Derivation] -> Doc
14overridePackages deps = PP.packageSetConfig . PP.cat $ callPackage <$> deps
29overridePackages deps = PP.packageSetConfig . PP.cat $ callPackage <$> deps
@@ -18,24 +33,52 @@ overridePackages deps = PP.packageSetConfig . PP.cat $ callPackage <$> deps
18 (drvNameString drv <> " = callPackage") 2
33 (drvNameString drv <> " = callPackage") 2
19 (PP.parens (PP.pPrint drv) <+> "{};")
34 (PP.parens (PP.pPrint drv) <+> "{};")
21−overrideHaskellPackages :: Doc -> [Derivation] -> Doc
36+importStackagePackages :: FilePath -> Doc
37+importStackagePackages path = hsep
38+ [ funarg "self", "import", disp (fromString path :: Nix.FilePath), "{"
39+ , "inherit pkgs stdenv;"
40+ , "inherit (self) callPackage;"
44+importStackageConfig :: FilePath -> Doc
45+importStackageConfig path = hsep
46+ [ "import", disp (fromString path :: Nix.FilePath), "{"
51+callStackageConfig :: FilePath -> Doc
52+callStackageConfig path = hsep
53+ [ "callPackage", disp (fromString path :: Nix.FilePath), "{}"]
55+overrideHaskellPackages :: OverrideConfig -> [Derivation] -> Doc
22−overrideHaskellPackages ghc packages = vcat
56+overrideHaskellPackages oc packages = vcat
23 [ funargs ["nixpkgs ? import <nixpkgs> {}"]
57 [ funargs ["nixpkgs ? import <nixpkgs> {}"]
25 , "with nixpkgs;"
59 , "with nixpkgs;"
61+ , nest 2 "inherit (stdenv.lib) extends;"
62+ , nest 2 . vcat $ catMaybes
63+ [ attr "stackagePackages" . importStackagePackages <$> oc ^. ocStackagePackages
64+ , attr "stackageConfig" . callStackageConfig <$> oc ^. ocStackageConfig ]
27 , nest 2 $ vcat
65 , nest 2 $ vcat
28− [ "packageSetConfig ="
66+ [ "stackPackages ="
29 , nest 2 $ overridePackages packages <> semi
67 , nest 2 $ overridePackages packages <> semi
31− , "pkgOverrides = self: packageSetConfig {"
69+ , "pkgOverrides = self: stackPackages {"
32 , nest 2 "inherit pkgs stdenv;"
70 , nest 2 "inherit pkgs stdenv;"
33 , nest 2 "inherit (self) callPackage;"
71 , nest 2 "inherit (self) callPackage;"
37− , "in pkgs.haskell.packages." <> ghc <> ".override {"
75+ , "in callPackage <nixpkgs/pkgs/development/haskell-modules> {"
38 , nest 2 $ vcat
76 , nest 2 $ vcat
77+ [ attr "ghc" ("pkgs.haskell.compiler." <> ghc)
78+ , onlyIf (hasField ocStackageConfig oc && hasField ocStackagePackages oc)
79+ $ attr "compilerConfig" "self: extends stackageConfig (stackagePackages self)"
39− [ "overrides = self: pkgOverrides self;"]
80+ , attr "overrides" "self: pkgOverrides self"]
84+ ghc = oc ^. ocGhc . to text