git.iko.soy/typeable/cabal2nix
on master help sign in
ng.nix: add support for building all of Hackage
commit42e56b5d3cde59ba15dae3fa510feac4c966f60a authorPeter Simons <simons@cryp.to> dateMon 8 Dec 2014, 17:49 (12 years ago) parent9b8ee4a
7 files changed+176−80
doc/generic-builder.nix+54 doc/ng.nix+60−28 src/Cabal2Nix/License.hs+14−14 src/Cabal2Nix/Normalize.hs+2−2 src/Cabal2Nix/PostProcess.hs+21−20 src/Distribution/NixOS/Derivation/Cabal.hs+7−7 src/hackage2nix.hs+18−9
doc/generic-builder.nixnew file+54
@@ -0,0 +1,54 @@
1+{ stdenv, fetchurl, ghc }:
2+{ pname, version, sha256, buildDepends ? [], extraLibraries ? [], ... }:
3+
4+stdenv.mkDerivation {
5+ name = "${pname}-${version}";
6+
7+ src = fetchurl { url = "mirror://hackage/${pname}-${version}.tar.gz"; inherit sha256; };
8+
9+ nativeBuildInputs = extraLibraries;
10+ propagatedNativeBuildInputs = buildDepends;
11+
12+ configurePhase = ''
13+ export PATH="${ghc}/bin:$PATH"
14+ configureFlags="-v --prefix=$out --ghc-option=-j$NIX_BUILD_CORES $configureFlags"
15+ for p in ${stdenv.lib.concatStringsSep " " (stdenv.lib.closePropagation buildDepends)}; do
16+ if [ -d "$p/lib/ghc-${ghc.version}/package.conf.d" ]; then
17+ for db in "$p/lib/ghc-${ghc.version}/package.conf.d/"*".db"; do
18+ configureFlags+=" --package-db=$db"
19+ done
20+ continue
21+ fi
22+ done
23+ for p in $nativeBuildInputs; do
24+ if [ -d "$p/include" ]; then
25+ configureFlags+=" --extra-include-dirs=$p/include"
26+ fi
27+ for d in lib{,64}; do
28+ if [ -d "$p/$d" ]; then
29+ configureFlags+=" --extra-lib-dirs=$p/$d"
30+ fi
31+ done
32+ done
33+ ghc --make Setup
34+ echo configureFlags: $configureFlags
35+ ./Setup configure $configureFlags
36+ '';
37+
38+ buildPhase = "./Setup build && ./Setup haddock";
39+
40+ checkPhase = "./Setup check";
41+
42+ installPhase = ''
43+ ./Setup copy
44+ local confDir=$out/lib/ghc-${ghc.version}/package.conf.d
45+ local packageDb=$confDir/${pname}-${version}.db
46+ local pkgConf=$confDir/${pname}-${version}.conf
47+ mkdir -p $confDir
48+ ./Setup register --gen-pkg-config=$pkgConf
49+ if test -f $pkgConf; then
50+ echo '[]' > $packageDb
51+ GHC_PACKAGE_PATH=$packageDb ghc-pkg --global register $pkgConf --force
52+ fi
53+ '';
54+}
doc/ng.nix+60−28
@@ -1,52 +1,84 @@
11# Architecture of the cleaned-up Haskell packages set in Nixpkgs.
22
3−# run: rm -f /tmp/test ; nix-build -o /tmp/test ng.nix -A hsemail --show-trace && tree /tmp/test/
4−
53let
64
75 pkgs = import <nixpkgs> {};
86 lib = pkgs.lib;
97
10− inherit (pkgs) newScope;
8+ inherit (pkgs) newScope stdenv fetchurl;
9+ ghc = pkgs.haskellPackages.ghcPlain;
1110
1211 fix = f: let x = f x // { __unfix__ = f; }; in x;
1312
1413 extend = rattrs: f: self: let super = rattrs self; in super // f self super;
1514
15+ buildCabal = import ./generic-builder.nix { inherit stdenv ghc fetchurl; };
16+
1617 hpkgs = self:
1718 let
1819
19− _buildCabal = { name, buildInputs ? [], ... }: pkgs.stdenv.mkDerivation {
20− inherit name buildInputs;
21− phases = ["installPhase"];
22− installPhase = ''
23− install -D /dev/null $out/$name
24− for dir in $buildInputs $nativeBuildInputs $propagatedBuildInputs; do
25− cp --no-clobber "$dir/"* $out/
26− done
27− '';
28− };
20+ definePackage = args: pkg: newScope self pkg args;
2921
30− buildCabal = pkg: pkg; #{ name, buildInputs ? [], ... }: { inherit name buildInputs; };
22+ in
23+ import ../hackage-packages.nix { inherit stdenv ghc pkgs definePackage; } // {
3124
32− definePackage = pkg: overrides: buildCabal (newScope (fix (extend (self.__unfix__) overrides)) pkg {});
25+ inherit buildCabal;
3326
34− in
35− {
36− hsemail = definePackage ({ mtl, parsec } : { name = "hsemail-0"; buildInputs = [mtl parsec]; }) (self: super: {});
37− mtl1 = definePackage ({ transformers } : { name = "mtl-1"; buildInputs = [transformers]; }) (self: super: {});
38− mtl2 = definePackage ({ transformers } : { name = "mtl-2"; buildInputs = [transformers]; }) (self: super: {});
39− mtl3 = definePackage ({ transformers } : { name = "mtl-3"; buildInputs = [transformers]; }) (self: super: {});
40− mtl = self.mtl1;
41− parsec = definePackage ({ mtl } : { name = "parsec-0"; buildInputs = [mtl]; }) (self: super: {});
42− transformers = definePackage ({} : { name = "transformers-0"; }) (self: super: {});
43− };
27+ mtl21 = definePackage {}
28+ ({ buildCabal, transformers }:
29+ buildCabal {
30+ pname = "mtl";
31+ version = "2.1.3.1";
32+ sha256 = "1xpn2wjmqbh2cg1yssc6749xpgcqlrrg4iilwqgkcjgvaxlpdbvp";
33+ buildDepends = [ transformers ];
34+ meta = {
35+ homepage = "http://github.com/ekmett/mtl";
36+ description = "Monad classes, using functional dependencies";
37+ license = stdenv.lib.licenses.bsd3;
38+ platforms = ghc.meta.platforms;
39+ };
40+ });
41+
42+ };
4443
45− defaultConfiguration = self: super: { };
44+ defaultConfiguration = self: super: {
45+ mtl22 = super.mtl.override { transformers = super.transformers; };
46+ mtl = self.mtl21.override { transformers = null; };
47+ zlib = super.zlib.override { zlib = pkgs.zlib; };
48+ cabal2nix = super.cabal2nix.deepOverride { mtl = self.mtl22; };
4649
47− otherConfiguration = self: super: { };
50+ Cabal = null;
51+ array = null;
52+ base = null;
53+ binPackageDb = null;
54+ binary = null;
55+ bytestring = null;
56+ containers = null;
57+ deepseq = null;
58+ directory = null;
59+ filepath = null;
60+ ghc = null;
61+ ghcPrim = null;
62+ haskeline = null;
63+ haskell2010 = null;
64+ haskell98 = null;
65+ hoopl = null;
66+ hpc = null;
67+ integerGmp = null;
68+ oldLocale = null;
69+ oldTime = null;
70+ pretty = null;
71+ process = null;
72+ rts = null;
73+ templateHaskell = null;
74+ terminfo = null;
75+ time = null;
76+ transformers = null;
77+ unix = null;
78+ xhtml = null;
79+ };
4880
49− haskellPackages = fix (extend (extend hpkgs defaultConfiguration) otherConfiguration);
81+ haskellPackages = fix (extend hpkgs defaultConfiguration);
5082in
5183
5284 haskellPackages # .hsemail.deepOverride { mtl = haskellPackages.mtl2; }
src/Cabal2Nix/License.hs+14−14
@@ -6,22 +6,22 @@ import Data.Version
66
77fromCabalLicense :: Distribution.License.License -> Distribution.NixOS.Derivation.License.License
88fromCabalLicense (GPL Nothing) = Unknown (Just "GPL")
9−fromCabalLicense (GPL (Just (Version [2] []))) = Known "self.stdenv.lib.licenses.gpl2"
10−fromCabalLicense (GPL (Just (Version [3] []))) = Known "self.stdenv.lib.licenses.gpl3"
9+fromCabalLicense (GPL (Just (Version [2] []))) = Known "stdenv.lib.licenses.gpl2"
10+fromCabalLicense (GPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.gpl3"
1111fromCabalLicense (LGPL Nothing) = Unknown (Just "LGPL")
12−fromCabalLicense (LGPL (Just (Version [2,1] []))) = Known "self.stdenv.lib.licenses.lgpl21"
13−fromCabalLicense (LGPL (Just (Version [2] []))) = Known "self.stdenv.lib.licenses.lgpl2"
14−fromCabalLicense (LGPL (Just (Version [3] []))) = Known "self.stdenv.lib.licenses.gpl3"
12+fromCabalLicense (LGPL (Just (Version [2,1] []))) = Known "stdenv.lib.licenses.lgpl21"
13+fromCabalLicense (LGPL (Just (Version [2] []))) = Known "stdenv.lib.licenses.lgpl2"
14+fromCabalLicense (LGPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.gpl3"
1515fromCabalLicense (AGPL Nothing) = Unknown (Just "AGPL")
16−fromCabalLicense (AGPL (Just (Version [3] []))) = Known "self.stdenv.lib.licenses.agpl3"
17−fromCabalLicense (AGPL (Just (Version [3,0] []))) = Known "self.stdenv.lib.licenses.agpl3"
18−fromCabalLicense (UnknownLicense "BSD2") = Known "self.stdenv.lib.licenses.bsd2"
19−fromCabalLicense BSD3 = Known "self.stdenv.lib.licenses.bsd3"
16+fromCabalLicense (AGPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.agpl3"
17+fromCabalLicense (AGPL (Just (Version [3,0] []))) = Known "stdenv.lib.licenses.agpl3"
18+fromCabalLicense (UnknownLicense "BSD2") = Known "stdenv.lib.licenses.bsd2"
19+fromCabalLicense BSD3 = Known "stdenv.lib.licenses.bsd3"
2020fromCabalLicense BSD4 = Unknown (Just "BSD4")
21−fromCabalLicense MIT = Known "self.stdenv.lib.licenses.mit"
22−fromCabalLicense PublicDomain = Known "self.stdenv.lib.licenses.publicDomain"
23−fromCabalLicense AllRightsReserved = Known "self.stdenv.lib.licenses.unfree"
24−fromCabalLicense (Apache Nothing) = Known "self.stdenv.lib.licenses.asl20"
25−fromCabalLicense (Apache (Just (Version [2,0] []))) = Known "self.stdenv.lib.licenses.asl20"
21+fromCabalLicense MIT = Known "stdenv.lib.licenses.mit"
22+fromCabalLicense PublicDomain = Known "stdenv.lib.licenses.publicDomain"
23+fromCabalLicense AllRightsReserved = Known "stdenv.lib.licenses.unfree"
24+fromCabalLicense (Apache Nothing) = Known "stdenv.lib.licenses.asl20"
25+fromCabalLicense (Apache (Just (Version [2,0] []))) = Known "stdenv.lib.licenses.asl20"
2626fromCabalLicense OtherLicense = Unknown Nothing
2727fromCabalLicense l = error $ "Cabal2Nix.License.fromCabalLicense: unknown license " ++ show l
src/Cabal2Nix/Normalize.hs+2−2
@@ -65,6 +65,6 @@ normalizeMaintainers maints = normalizeList
6565 [ (m `regsubmatch` "^([^.].*\\.)?([^.]+)$") !! 1 | m <- maints ]
6666
6767normalizePlatforms :: [String] -> [String]
68−normalizePlatforms [] = ["self.ghc.meta.platforms"]
68+normalizePlatforms [] = ["ghc.meta.platforms"]
6969normalizePlatforms plats = normalizeList
70− [ if '.' `elem` p then p else "self.stdenv.lib.platforms." ++ p | p <- plats ]
70+ [ if '.' `elem` p then p else "stdenv.lib.platforms." ++ p | p <- plats ]
src/Cabal2Nix/PostProcess.hs+21−20
@@ -4,6 +4,7 @@ module Cabal2Nix.PostProcess ( postProcess ) where
44
55import Data.List
66import Distribution.NixOS.Derivation.Cabal
7+import Distribution.Text ( display )
78
89postProcess :: Derivation -> Derivation
910postProcess deriv@(MkDerivation {..})
@@ -23,7 +24,7 @@ postProcess deriv@(MkDerivation {..})
2324 = deriv { phaseOverrides = cabalInstallPostInstall }
2425 | pname == "cairo" = deriv { extraLibs = "pkgconfig":"libc":"cairo":"zlib":extraLibs }
2526 | pname == "cookie" = deriv { phaseOverrides = cookieDoCheckHook }
26− | pname == "cuda" = deriv { phaseOverrides = cudaConfigurePhase, extraLibs = "cudatoolkit":"nvidia_x11":"self.stdenv.cc":extraLibs }
27+ | pname == "cuda" = deriv { phaseOverrides = cudaConfigurePhase, extraLibs = "cudatoolkit":"nvidia_x11":"stdenv.cc":extraLibs }
2728 | pname == "darcs" = deriv { phaseOverrides = darcsInstallPostInstall }
2829 | pname == "dns" = deriv { testTarget = "spec" }
2930 | pname == "doctest" = deriv { runHaddock = True, phaseOverrides = doctestNoHaddock }
@@ -31,7 +32,7 @@ postProcess deriv@(MkDerivation {..})
3132 | pname == "epic" = deriv { extraLibs = "gmp":"boehmgc":extraLibs, buildTools = "happy":buildTools }
3233 | pname == "either" = deriv { runHaddock = True, phaseOverrides = eitherNoHaddock }
3334 | pname == "ghc-heap-view" = deriv { phaseOverrides = ghciPostInstall }
34− | pname == "ghc-mod" = deriv { phaseOverrides = ghcModPostInstall, buildTools = "emacs":"makeWrapper":buildTools }
35+ | pname == "ghc-mod" = deriv { phaseOverrides = ghcModPostInstall pname version, buildTools = "emacs":"makeWrapper":buildTools }
3536 | pname == "ghc-parser" = deriv { buildTools = "cpphs":"happy":buildTools, phaseOverrides = ghcParserPatchPhase }
3637 | pname == "ghc-paths" = deriv { phaseOverrides = ghcPathsPatches }
3738 | pname == "ghc-vis" = deriv { phaseOverrides = ghciPostInstall }
@@ -114,8 +115,8 @@ postProcess deriv@(MkDerivation {..})
114115 = deriv { runHaddock = True, phaseOverrides = transformersNoHaddock }
115116 | pname == "tz" = deriv { extraFunctionArgs = ["pkgs_tzdata"], phaseOverrides = "preConfigure = \"export TZDIR=${pkgs_tzdata}/share/zoneinfo\";" }
116117 | pname == "vacuum" = deriv { extraLibs = "ghcPaths":extraLibs }
117− | pname == "vector" = deriv { configureFlags = "${self.stdenv.lib.optionalString self.stdenv.isi686 \"--ghc-options=-msse2\"}":configureFlags }
118− | pname == "wxc" = deriv { extraLibs = "wxGTK":"mesa":"libX11":extraLibs, phaseOverrides = wxcPostInstall }
118+ | pname == "vector" = deriv { configureFlags = "${stdenv.lib.optionalString stdenv.isi686 \"--ghc-options=-msse2\"}":configureFlags }
119+ | pname == "wxc" = deriv { extraLibs = "wxGTK":"mesa":"libX11":extraLibs, phaseOverrides = wxcPostInstall version }
119120 | pname == "wxcore" = deriv { extraLibs = "wxGTK":"mesa":"libX11":extraLibs }
120121 | pname == "X11" && version >= Version [1,6] []
121122 = deriv { extraLibs = "libXinerama":"libXext":"libXrender":extraLibs }
@@ -135,7 +136,7 @@ cudaConfigurePhase = unlines
135136 , "# library. GHC's linker fails if the wrong version is found first."
136137 , "# We solve this by eliminating lib64 from the path on 32-bit"
137138 , "# platforms and putting lib64 first on 64-bit platforms."
138− , "libPaths = if self.stdenv.is64bit then \"lib64 lib\" else \"lib\";"
139+ , "libPaths = if stdenv.is64bit then \"lib64 lib\" else \"lib\";"
139140 , "configurePhase = ''"
140141 , " for i in Setup.hs Setup.lhs; do"
141142 , " test -f $i && ghc --make $i"
@@ -154,9 +155,9 @@ cudaConfigurePhase = unlines
154155 , "'';"
155156 ]
156157
157−ghcModPostInstall :: String
158−ghcModPostInstall = unlines
159− [ "configureFlags = \"--datasubdir=${self.pname}-${self.version}\";"
158+ghcModPostInstall :: String -> Version -> String
159+ghcModPostInstall pname version = unlines
160+ [ "configureFlags = \"--datasubdir=" ++ pname ++ "-" ++ display version ++ "\";"
160161 , "postInstall = ''"
161162 , " cd $out/share/$pname-$version"
162163 , " make"
@@ -165,16 +166,16 @@ ghcModPostInstall = unlines
165166 , " ensureDir \"$out/share/emacs\""
166167 , " mv $pname-$version emacs/site-lisp"
167168 , " wrapProgram $out/bin/ghc-mod --add-flags \\"
168− , " \"\\$(${self.ghc.GHCGetPackages} ${self.ghc.version} \\\"\\$(dirname \\$0)\\\" \\\"-g -package-db -g\\\")\""
169+ , " \"\\$(${ghc.GHCGetPackages} ${ghc.version} \\\"\\$(dirname \\$0)\\\" \\\"-g -package-db -g\\\")\""
169170 , " wrapProgram $out/bin/ghc-modi --add-flags \\"
170− , " \"\\$(${self.ghc.GHCGetPackages} ${self.ghc.version} \\\"\\$(dirname \\$0)\\\" \\\"-g -package-db -g\\\")\""
171+ , " \"\\$(${ghc.GHCGetPackages} ${ghc.version} \\\"\\$(dirname \\$0)\\\" \\\"-g -package-db -g\\\")\""
171172 , "'';"
172173 ]
173174
174−wxcPostInstall :: String
175−wxcPostInstall = unlines
175+wxcPostInstall :: Version -> String
176+wxcPostInstall version = unlines
176177 [ "postInstall = ''"
177− , " cp -v dist/build/libwxc.so.${self.version} $out/lib/libwxc.so"
178+ , " cp -v dist/build/libwxc.so." ++ display version ++ " $out/lib/libwxc.so"
178179 , "'';"
179180 ]
180181
@@ -214,7 +215,7 @@ xmonadPostInstall = unlines
214215 ]
215216
216217yiFixHaddock :: String
217−yiFixHaddock = "noHaddock = self.stdenv.lib.versionOlder self.ghc.version \"7.8\";"
218+yiFixHaddock = "noHaddock = stdenv.lib.versionOlder ghc.version \"7.8\";"
218219
219220gitAnnexOverrides :: String
220221gitAnnexOverrides = unlines
@@ -258,20 +259,20 @@ ncursesPatchPhase :: String
258259ncursesPatchPhase = "patchPhase = \"find . -type f -exec sed -i -e 's|ncursesw/||' {} \\\\;\";"
259260
260261doctestNoHaddock, markdownUnlitNoHaddock :: String
261−markdownUnlitNoHaddock = "noHaddock = self.stdenv.lib.versionOlder self.ghc.version \"7.4\";"
262+markdownUnlitNoHaddock = "noHaddock = stdenv.lib.versionOlder ghc.version \"7.4\";"
262263doctestNoHaddock = markdownUnlitNoHaddock
263264
264265cabal2nixDoCheckHook :: String
265−cabal2nixDoCheckHook = "doCheck = self.stdenv.lib.versionOlder \"7.8\" self.ghc.version;"
266+cabal2nixDoCheckHook = "doCheck = stdenv.lib.versionOlder \"7.8\" ghc.version;"
266267
267268cookieDoCheckHook :: String
268−cookieDoCheckHook = "doCheck = self.stdenv.lib.versionOlder \"7.8\" self.ghc.version;"
269+cookieDoCheckHook = "doCheck = stdenv.lib.versionOlder \"7.8\" ghc.version;"
269270
270271eitherNoHaddock :: String
271−eitherNoHaddock = "noHaddock = self.stdenv.lib.versionOlder self.ghc.version \"7.6\";"
272+eitherNoHaddock = "noHaddock = stdenv.lib.versionOlder ghc.version \"7.6\";"
272273
273274httpNoHaddock, quickCheckNoHaddock, tarNoHaddock, transformersNoHaddock, hsyslogNoHaddock :: String
274−httpNoHaddock = "noHaddock = self.stdenv.lib.versionOlder self.ghc.version \"6.11\";"
275+httpNoHaddock = "noHaddock = stdenv.lib.versionOlder ghc.version \"6.11\";"
275276quickCheckNoHaddock = httpNoHaddock
276277tarNoHaddock = httpNoHaddock
277278transformersNoHaddock = httpNoHaddock
@@ -308,7 +309,7 @@ mimeMailConfigureFlags = unlines
308309 ]
309310
310311sybDoCheck, splitDoCheck :: String
311−sybDoCheck = "doCheck = self.stdenv.lib.versionOlder self.ghc.version \"7.9\";"
312+sybDoCheck = "doCheck = stdenv.lib.versionOlder ghc.version \"7.9\";"
312313splitDoCheck = sybDoCheck
313314
314315haddockPreCheck :: String
src/Distribution/NixOS/Derivation/Cabal.hs+7−7
@@ -87,8 +87,8 @@ deepseqFlagAssignment ((FlagName n, v):as) b = n `deepseq` v `deepseq` as `deeps
8787
8888renderDerivation :: Derivation -> Doc
8989renderDerivation deriv =
90− funargs (map text inputs) $$ vcat
91− [ lbrace
90+ funargs (map text ("buildCabal":inputs)) $$ vcat
91+ [ text "buildCabal" <+> lbrace
9292 , nest 2 $ vcat
9393 [ attr "pname" $ string (pname deriv)
9494 , attr "version" $ doubleQuotes (disp (version deriv))
@@ -113,11 +113,11 @@ renderDerivation deriv =
113113 , rbrace
114114 ]
115115 where
116− inputs = nub $ sortBy (compare `on` map toLower) $ filter (/="cabal") $ filter (not . isPrefixOf "self.") $
117− buildDepends deriv ++ testDepends deriv ++ buildTools deriv ++ extraLibs deriv ++ pkgConfDeps deriv ++ extraFunctionArgs deriv
118− ++ ["fetch" ++ derivKind (src deriv) | derivKind (src deriv) /= "" && not isHackagePackage]
119− renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text f | (FlagName f, enable) <- cabalFlags deriv ]
120− ++ map text (configureFlags deriv)
116+ inputs = nub $ sortBy (compare `on` map toLower) $ filter (/="cabal") $ filter (not . isPrefixOf "stdenv.") $
117+ buildDepends deriv ++ testDepends deriv ++ buildTools deriv ++ extraLibs deriv ++ pkgConfDeps deriv ++ extraFunctionArgs deriv
118+ ++ ["fetch" ++ derivKind (src deriv) | derivKind (src deriv) /= "" && not isHackagePackage]
119+ renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text f | (FlagName f, enable) <- cabalFlags deriv ]
120+ ++ map text (configureFlags deriv)
121121 isHackagePackage = "mirror://hackage/" `isPrefixOf` derivUrl (src deriv)
122122 sourceAttr (DerivationSource{..})
123123 | isHackagePackage = attr "sha256" $ string derivHash
src/hackage2nix.hs+18−9
@@ -1,5 +1,7 @@
11{-# LANGUAGE Rank2Types #-}
22
3+-- Run: cabal build -j hackage2nix && dist/build/hackage2nix/hackage2nix >hackage-packages.nix
4+
35module Main ( main ) where
46
57import Cabal2Nix.Generate
@@ -13,13 +15,15 @@ import Control.Monad.State.Strict hiding ( State )
1315import qualified Data.Map as Map
1416import Data.Monoid
1517import qualified Data.Set as Set
16−import Distribution.Hackage.DB
18+import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
1719import Distribution.NixOS.Derivation.Cabal
1820import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
1921import Distribution.Text
2022import Options.Applicative
2123import System.IO
2224
25+type Map = Map.Map
26+
2327data Options = Options
2428 { verbose :: Bool
2529 }
@@ -31,7 +35,7 @@ data Config = Config
3135 }
3236 deriving (Show)
3337
34−type Compile a = MonadIO m => StateT () (ReaderT Config m) a
38+type Compile a = (Functor m, MonadIO m) => StateT () (ReaderT Config m) a
3539
3640yell :: String -> Compile ()
3741yell = liftIO . hPutStrLn stderr
@@ -41,7 +45,7 @@ msgInfo = whenM (asks _verbose) . yell . showString "INFO: "
4145msgNote = yell . showString "NOTE: "
4246msgWarn = yell . showString "WARN: "
4347
44−runCompiler :: MonadIO m => Compile a -> Options -> m a
48+runCompiler :: (Functor m, MonadIO m) => Compile a -> Options -> m a
4549runCompiler f opts = do
4650 db <- liftIO readHackage
4751 let cfg = Config
@@ -71,16 +75,21 @@ main = execParser mainOptions >>= runCompiler buildPackageSet
7175 )
7276
7377nixAttr :: String -> Version -> String
74−nixAttr name ver = toNixName name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
78+nixAttr name ver = show $ toNixName name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
7579
7680buildPackageSet :: Compile ()
7781buildPackageSet = do
78− db <- asks _hackage
82+ db <- fmap (\db -> foldr Map.delete db ["smtLib", "testPkg"]) (asks _hackage)
7983 pkgs <- liftIO $ runParIO $ parMapM generatePackage (Map.toList db)
80− forM_ pkgs $ \(name, version, nixExpr) ->
81− liftIO $ print $ hang (text (nixAttr name version) <+> equals <+> text "definePackage") 2 (parens (disp nixExpr))
82− <> text " (self: super: {})"
83− <> semi
84+ liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
85+ liftIO $ putStrLn ""
86+ liftIO $ putStrLn "{ stdenv, ghc, pkgs, definePackage }:"
87+ liftIO $ putStrLn ""
88+ liftIO $ putStrLn "{"
89+ forM_ pkgs $ \(name, version, nixExpr) -> do
90+ liftIO $ print $ nest 2 $ hang (text (nixAttr name version) <+> equals <+> text "definePackage {}") 2 (parens (disp nixExpr)) <> semi
91+ liftIO $ putStrLn ""
92+ liftIO $ putStrLn "}"
8493
8594generatePackage :: (String, Map Version GenericPackageDescription) -> ParIO (String,Version,Derivation)
8695generatePackage (name, versions) = do