@@ -15,61 +15,8 @@ import Distribution.Nixpkgs.Haskell.Derivation
1515import Distribution.Nixpkgs.Haskell.FromCabal as FromCabal
1616import Distribution.Nixpkgs.Haskell.PackageSourceSpec as PackageSourceSpec
1717import Language.Nix
18−import Language.Nix.PrettyPrinting
1918import Stack.Config
2019
21−data OverrideConfig = OverrideConfig
22− { stackageCompilerConfig :: FilePath
23− -- ^ Nixpkgs compiler config for Stackage packages set
24− , stackagePackagesConfig :: FilePath
25− -- ^ Nixpkgs packages config for Stackage packages set
26− , haskellPackagesOverride :: Identifier
27− -- ^ 'pkgs.haskell.packages.<compiler>' to override
28− }
29−
30−overrideConfigFixture :: OverrideConfig
31−overrideConfigFixture = OverrideConfig
32− { stackageCompilerConfig = "./haskell-modules/configuration-6_30.nix"
33− , stackagePackagesConfig = "./haskell-modules/packages-6_30.nix"
34− , haskellPackagesOverride = "ghc7103" }
35−
36−stackageCompilerConfigFun :: FilePath -> Doc
37−stackageCompilerConfigFun p =
38− funargs [text "superPkgs"] $$ "import" <+> string p
39− <+> lbrace
40− <+> text "inherit (superPkgs) pkgs;"
41− <+> rbrace
42−
43−nixLet :: [Doc] -> Doc
44−nixLet ls = vcat
45− [ text "let"
46− , nest 2 $ vcat ls
47− ]
48−
49−nixpkgsOverride :: OverrideConfig -> Doc
50−nixpkgsOverride OverrideConfig {..} = vcat
51− [ text "{ nixpkgs ? import <nixpkgs> {}, compiler ? \"default\" }: "
52− , text ""
53− , nixLet
54− [ text "inherit (nixpkgs.stdenv.lib) extends;"
55− , attr "stackageCompilerConfig" $ stackageCompilerConfigFun stackageCompilerConfig
56− , attr "stackagePackagesConfig" $ stackageCompilerConfigFun stackagePackagesConfig
57− , text "packageOverrides = super: let self = super.pkgs; in"
58− , text "{"
59− , text " pkgs = super.pkgs // {"
60− , text " haskell = super.pkgs.haskell // {"
61− , text " packages = super.pkgs.haskell.packages // {"
62− , text " \"${compiler}\" = super.pkgs.haskell.packages." <> disp haskellPackagesOverride <> ".override {};"
63− , text " };"
64− , text " };"
65− , text " };"
66− , text "};"
67− , text "in packageOverrides nixpkgs"
68− ]
69− ]
70−
71−-- TODO: maybe move to module Stack.Derivation
72−
7320newtype HackageDb = HackageDb { fromHackageDB :: T.Text }
7421 deriving (Eq, Ord, Show)
7522
@@ -78,6 +25,25 @@ makePrisms ''HackageDb
7825unHackageDb :: HackageDb -> String
7926unHackageDb = T.unpack . fromHackageDB
8027
28+data PackageConfig = PackageConfig
29+ { _pcHaskellResolver :: HaskellResolver
30+ , _pcNixpkgsResolver :: NixpkgsResolver
31+ , _pcTargetPlatform :: Platform
32+ , _pcTargetCompiler :: CompilerInfo
33+ , _pcFlagAssignment :: FlagAssignment
34+ }
35+
36+makeLenses ''PackageConfig
37+
38+mkPackageConfig :: Platform -> CompilerId -> FlagAssignment -> PackageConfig
39+mkPackageConfig platform compilerId flagAssignment = PackageConfig
40+ { _pcHaskellResolver = const True
41+ , _pcNixpkgsResolver = \i -> Just (binding # (i, path # [i]))
42+ , _pcTargetPlatform = platform
43+ , _pcTargetCompiler = unknownCompilerInfo compilerId NoAbiTag
44+ , _pcFlagAssignment = flagAssignment
45+ }
46+
8147-- Thin wrapper around private stack2nix 'PackageSourceSpec.fromDB' method.
8248getStackPackageFromDb
8349 :: Maybe HackageDb
@@ -104,21 +70,25 @@ stackLocationToSource = \case
10470 , sourceHash = UnknownHash }
10571
10672packageDerivation
107− :: Maybe HackageDb
108− -> System.Platform
109− -> Compiler.CompilerId
110− -> PackageDescription.FlagAssignment
73+ :: PackageConfig
74+ -> Maybe HackageDb
11175 -> StackPackage
11276 -> IO Derivation
113−packageDerivation optHackageDb optPlatform optCompilerId optFlagAssignment sed = do
114− pkg <- getStackPackageFromDb optHackageDb sed
115− pure
116− $ FromCabal.fromGenericPackageDescription
117− (const True)
118− (\i -> Just (binding # (i, path # [i])))
119− optPlatform
120− (unknownCompilerInfo optCompilerId NoAbiTag)
121− optFlagAssignment
122− []
123− (pkgCabal pkg)
77+packageDerivation conf optHackageDb stackPackage = do
78+ pkg <- getStackPackageFromDb optHackageDb stackPackage
79+ pure $ genericPackageDerivation conf pkg
12480 & src .~ pkgSource pkg
81+
82+genericPackageDerivation
83+ :: PackageConfig
84+ -> Package
85+ -> Derivation
86+genericPackageDerivation conf pkg =
87+ FromCabal.fromGenericPackageDescription
88+ (conf ^. pcHaskellResolver)
89+ (conf ^. pcNixpkgsResolver)
90+ (conf ^. pcTargetPlatform)
91+ (conf ^. pcTargetCompiler)
92+ (conf ^. pcFlagAssignment)
93+ []
94+ (pkgCabal pkg)