git.iko.soy/typeable/cabal2nix
on 3faffc2 help sign in
typeable/cabal2nix/src/hackage2nix.hs
51 lines 2.3 kB history raw
1-- Run: cabal build -j hackage2nix && dist/build/hackage2nix/hackage2nix >hackage-packages.nix
3module Main ( main ) where
5import Cabal2Nix.Generate
6import Cabal2Nix.Name
7import Cabal2Nix.Package
8import Control.Monad
9import Control.Monad.Par.Combinator
10import Control.Monad.Par.IO
11import Control.Monad.Trans
12import Data.Map ( Map )
13import qualified Data.Map as Map
14import Data.Monoid
15import qualified Data.Set as Set
16import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
17import Distribution.NixOS.Derivation.Cabal
18import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
19import Distribution.Text
21main :: IO ()
22main = readHackage >>= runParIO . generatePackageSet
24nixAttr :: String -> Version -> String
25nixAttr name ver = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
27generatePackageSet :: Hackage -> ParIO ()
28generatePackageSet db = do
29 pkgs <- parMapM generatePackage (Map.toList db)
30 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
31 liftIO $ putStrLn ""
32 liftIO $ putStrLn "{ pkgs, stdenv, callPackage }:"
33 liftIO $ putStrLn ""
34 liftIO $ putStrLn "self: {"
35 liftIO $ putStrLn ""
36 forM_ pkgs $ \(name, version, nixExpr) -> do
37 -- when (name /= toNixName' name) $
38 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
39 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
40 -- when (name /= toNixName' name) $
41 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
42 liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp nixExpr)) <+> (text "{}" <> semi)
43 liftIO $ putStrLn ""
44 liftIO $ putStrLn "}"
46generatePackage :: (String, Map Version GenericPackageDescription) -> ParIO (String,Version,Derivation)
47generatePackage (name, versions) = do
48 let latestVersion = Set.findMax (Map.keysSet versions)
49 pkgDescription = (Map.!) versions latestVersion
50 srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
51 return (name, latestVersion, (cabal2nix pkgDescription) { src = srcSpec })