git.iko.soy/typeable/cabal2nix
on master help sign in
hackage2nix.hs: parallelize the generation process
commit2ba78e3bc6fb238a2ed799801b2c521d4f1c24dd authorPeter Simons <simons@cryp.to> dateSun 7 Dec 2014, 16:17 (12 years ago) parentb141e99
2 files changed+14−9
cabal2nix.cabal+2−2 src/hackage2nix.hs+12−7
cabal2nix.cabal+2−2
@@ -105,8 +105,8 @@ Executable hackage2nix
105105 hs-source-dirs: src
106106 Build-Depends: base >= 3 && < 5, regex-posix, pretty, Cabal >= 1.16,
107107 mtl, containers, directory, filepath, hackage-db, optparse-applicative >= 0.10,
108− IfElse, transformers, process
109− Ghc-Options: -O -threaded -rtsopts -with-rtsopts=-N
108+ IfElse, transformers, process, monad-par, monad-par-extras, deepseq
109+ Ghc-Options: -Wall -threaded -rtsopts -with-rtsopts=-N
110110 Extensions: PatternGuards, RecordWildCards, CPP
111111 other-modules: Cabal2Nix.CorePackages
112112 Cabal2Nix.Flags
src/hackage2nix.hs+12−7
@@ -6,6 +6,8 @@ import Cabal2Nix.Generate
66import Cabal2Nix.Name
77import Cabal2Nix.Package
88import Control.Monad.IfElse
9+import Control.Monad.Par.Combinator
10+import Control.Monad.Par.IO
911import Control.Monad.Reader
1012import Control.Monad.State.Strict hiding ( State )
1113import qualified Data.Map as Map
@@ -74,10 +76,13 @@ nixAttr name ver = toNixName name ++ "_" ++ [ if c == '.' then '_' else c | c <-
7476buildPackageSet :: Compile ()
7577buildPackageSet = do
7678 db <- asks _hackage
77− forM_ (Map.toList db) $ \(name, versions) -> do
78− let latestVersion = Set.findMax (Map.keysSet versions)
79− pkgDescription = (Map.!) versions latestVersion
80− srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
81− let nixExpr = (cabal2nix pkgDescription) { src = srcSpec }
82− liftIO $ print $ hang (text (nixAttr name latestVersion) <+> equals) 2 (disp nixExpr) <> semi
83− fail "yo"
79+ pkgs <- liftIO $ runParIO $ parMapM generatePackage (Map.toList db)
80+ forM_ pkgs $ \(name, version, nixExpr) ->
81+ liftIO $ print $ hang (text (nixAttr name version) <+> equals) 2 (disp nixExpr) <> semi
82+
83+generatePackage :: (String, Map Version GenericPackageDescription) -> ParIO (String,Version,Derivation)
84+generatePackage (name, versions) = do
85+ let latestVersion = Set.findMax (Map.keysSet versions)
86+ pkgDescription = (Map.!) versions latestVersion
87+ srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
88+ return (name, latestVersion, (cabal2nix pkgDescription) { src = srcSpec })