@@ -0,0 +1,81 @@
1+module Main ( main ) where
2+
3+import System.Environment
4+import Distribution.PackageDescription.Parse
5+import Distribution.Verbosity ( silent )
6+import Distribution.PackageDescription
7+import Distribution.Package
8+import Distribution.License
9+import Data.Version
10+import Data.List
11+
12+data Pkg = Pkg String [Int] String String String License [CondTree ConfVar [Dependency] ()] [String]
13+
14+instance Show Pkg where
15+ show (Pkg name ver sha256 url desc lic deps libs) =
16+ " " ++ attrib ++ " = callPackage ({cabal," ++ depArgs ++"}: cabal.mkDerivation (self : {\n"
17+ ++ " pname = " ++ show name ++ ";\n"
18+ ++ " version = \"" ++ showVer ++ "\";\n"
19+ ++ " sha256 = " ++ show sha256 ++ ";\n"
20+ ++ " propagatedBuildInputs = [" ++ depList ++ "];\n"
21+ ++ " meta = {\n"
22+ ++ " homepage = \"" ++ url ++ "\";\n"
23+ ++ " description = " ++ show desc ++ ";\n"
24+ ++ " license = " ++ showLic lic ++ ";\n"
25+ ++ " platforms = self.stdenv.lib.platforms.haskellPlatforms;\n"
26+ ++ " maintainers = [ self.stdenv.lib.maintainers.simons ];\n"
27+ ++ " };\n"
28+ ++ " })) {};\n"
29+ where
30+ attrib = concat (intersperse "_" (nixName name : (map show ver)))
31+ showVer = concat (intersperse "." (map show ver))
32+ depList = concat (intersperse " " pkgDeps)
33+ depArgs = concat (intersperse "," pkgDeps)
34+ pkgDeps :: [String]
35+ pkgDeps = map nixName $
36+ nub $ sort $
37+ libs ++ [ n | dep <- deps, Dependency (PackageName n) _ <- condTreeConstraints dep
38+ , n `notElem` ["base","containers"]
39+ ]
40+ showLic (GPL Nothing) = show "GPL"
41+ showLic (GPL (Just (Version [2] []))) = "self.stdenv.lib.licenses.gpl2"
42+ showLic (GPL (Just (Version [3] []))) = "self.stdenv.lib.licenses.gpl3"
43+ showLic (LGPL Nothing) = show "LGPL"
44+ showLic (LGPL (Just (Version [2,1] []))) = "self.stdenv.lib.licenses.lgpl21"
45+ showLic (LGPL (Just (Version [3] []))) = "self.stdenv.lib.licenses.lgpl3"
46+ showLic BSD3 = "self.stdenv.lib.licenses.bsd3"
47+ showLic BSD4 = "self.stdenv.lib.licenses.bsd4"
48+ showLic MIT = "self.stdenv.lib.licenses.mit"
49+ showLic PublicDomain = "self.stdenv.lib.licenses.publicDomain"
50+ showLic AllRightsReserved = "unknown"
51+ showLic OtherLicense = "unknown"
52+ showLic l = error $ "unknown license: " ++ show l
53+
54+ nixName = map (\c -> if c == '-' then '_' else c)
55+
56+readPackage :: FilePath -> String -> IO Pkg
57+readPackage cabalFile sha256 = do
58+ cabal <- readPackageDescription silent cabalFile
59+ let pkg = packageDescription cabal
60+ PackageName pkgname = pkgName (package pkg)
61+ pkgver = versionBranch (pkgVersion (package pkg))
62+ lic = license pkg
63+ url = homepage pkg
64+ desc = synopsis pkg
65+ -- globalDeps = buildDepends pkg
66+ libDeps = maybe [] (\x -> [x]) (condLibrary cabal)
67+ exeDeps = [ tree | (_,tree) <- condExecutables cabal ]
68+ libs = concat [ extraLibs (libBuildInfo (condTreeData x)) | x <- libDeps ]
69+ libs' = concat [ extraLibs (buildInfo (condTreeData x)) | x <- exeDeps ]
70+ return (Pkg pkgname pkgver sha256 url desc lic (map simplify libDeps ++ map simplify exeDeps) (libs++libs'))
71+
72+simplify :: CondTree ConfVar [Dependency] a -> CondTree ConfVar [Dependency] ()
73+simplify (CondNode _ deps nodes) = CondNode () deps (map simp nodes)
74+ where
75+ simp (cond,tree,mtree) = (cond, simplify tree, maybe Nothing (Just . simplify) mtree)
76+
77+main :: IO ()
78+main = do
79+ cabalFile:sha256:[] <- getArgs
80+ pkg <- readPackage cabalFile sha256
81+ putStr (show pkg)