git.iko.soy/typeable/cabal2nix
on master help sign in
Split off some modules.
commitfb4cc0fa737ac1737c7ba238b3645abd3f41a919 authorAndres Loeh <mail@andres-loeh.de> dateSat 6 Aug 2011, 12:55 (15 years ago) parentfa51c69
4 files changed+88−60
src/Cabal2Nix.hs+1−60 src/Cabal2Nix/License.hs+21 src/Cabal2Nix/Name.hs+13 src/Cabal2Nix/Package.hs+53
src/Cabal2Nix.hs+1−60
@@ -12,72 +12,13 @@ import System.Exit
1212import Distribution.PackageDescription.Parse
1313import Distribution.PackageDescription
1414import Distribution.Package
15−import Distribution.License
1615import Data.Version
1716import Data.List
1817import Control.Monad
19−import Data.Char
2018import Network.HTTP
2119import System.Process
2220
23−type PkgName = String
24−type PkgVersion = [Int]
25−type PkgSHA256 = String
26−type PkgURL = String
27−type PkgDescription = String
28−type PkgLicense = License
29−type PkgDependencies = [CondTree ConfVar [Dependency] ()]
30−type PkgExtraLibs = [String]
31−
32−data Pkg = Pkg PkgName PkgVersion PkgSHA256 PkgURL PkgDescription PkgLicense PkgDependencies PkgExtraLibs
33− deriving (Show)
34−
35−toNixName :: String -> String
36−toNixName [] = error "toNixName: empty string is not a valid argument"
37−toNixName "Cabal" = "cabal"
38−toNixName name = f name
39− where
40− f [] = []
41− f ('-':c:cs) | c `notElem` "-" = toUpper c : f cs
42− f ('-':_) = error ("unexpected package name " ++ show name)
43− f (c:cs) = c : f cs
44−
45−toNix :: Pkg -> String
46−toNix (Pkg name ver sha256 url desc lic deps libs) =
47− "{" ++ exprArgs ++"}:\n\n"
48− ++ "cabal.mkDerivation (self : {\n"
49− ++ " pname = " ++ show name ++ ";\n"
50− ++ " version = \"" ++ showVer ++ "\";\n"
51− ++ " sha256 = " ++ show sha256 ++ ";\n"
52− ++ " propagatedBuildInputs = [" ++ depList ++ "];\n"
53− ++ " meta = {\n"
54− ++ " homepage = \"" ++ url ++ "\";\n"
55− ++ " description = " ++ show desc ++ ";\n"
56− ++ " license = " ++ showLic lic ++ ";\n"
57− ++ " };\n"
58− ++ "})\n"
59− where
60− exprArgs = concat (intersperse "," ("cabal":pkgDeps))
61− showVer = concat (intersperse "." (map show ver))
62− depList = concat (intersperse " " pkgDeps)
63− pkgDeps :: [String]
64− pkgDeps = filter (/="cabal") $ nub $ sort $ map toNixName $
65− libs ++ [ n | dep <- deps, Dependency (PackageName n) _ <- condTreeConstraints dep
66− , n `notElem` ["base","containers"]
67− ]
68− showLic (GPL Nothing) = show "GPL"
69− showLic (GPL (Just (Version [2] []))) = "self.stdenv.lib.licenses.gpl2"
70− showLic (GPL (Just (Version [3] []))) = "self.stdenv.lib.licenses.gpl3"
71− showLic (LGPL Nothing) = show "LGPL"
72− showLic (LGPL (Just (Version [2,1] []))) = "self.stdenv.lib.licenses.lgpl21"
73− showLic (LGPL (Just (Version [3] []))) = "self.stdenv.lib.licenses.lgpl3"
74− showLic BSD3 = "self.stdenv.lib.licenses.bsd3"
75− showLic BSD4 = "self.stdenv.lib.licenses.bsd4"
76− showLic MIT = "self.stdenv.lib.licenses.mit"
77− showLic PublicDomain = "self.stdenv.lib.licenses.publicDomain"
78− showLic AllRightsReserved = "unknown"
79− showLic OtherLicense = "unknown"
80− showLic l = error $ "unknown license: " ++ show l
21+import Cabal2Nix.Package
8122
8223cabal2nix :: GenericPackageDescription -> PkgSHA256 -> Pkg
8324cabal2nix cabal sha256 = Pkg pkgname pkgver sha256 url desc lic (map simplify libDeps ++ map simplify exeDeps) (libs++libs')
src/Cabal2Nix/License.hsnew file+21
@@ -0,0 +1,21 @@
1+module Cabal2Nix.License
2+ (module Cabal2Nix.License, module Distribution.License)
3+ where
4+
5+import Distribution.License
6+import Distribution.Version
7+
8+showLic :: License -> String
9+showLic (GPL Nothing) = show "GPL"
10+showLic (GPL (Just (Version [2] []))) = "self.stdenv.lib.licenses.gpl2"
11+showLic (GPL (Just (Version [3] []))) = "self.stdenv.lib.licenses.gpl3"
12+showLic (LGPL Nothing) = show "LGPL"
13+showLic (LGPL (Just (Version [2,1] []))) = "self.stdenv.lib.licenses.lgpl21"
14+showLic (LGPL (Just (Version [3] []))) = "self.stdenv.lib.licenses.lgpl3"
15+showLic BSD3 = "self.stdenv.lib.licenses.bsd3"
16+showLic BSD4 = "self.stdenv.lib.licenses.bsd4"
17+showLic MIT = "self.stdenv.lib.licenses.mit"
18+showLic PublicDomain = "self.stdenv.lib.licenses.publicDomain"
19+showLic AllRightsReserved = "unknown"
20+showLic OtherLicense = "unknown"
21+showLic l = error $ "unknown license: " ++ show l
src/Cabal2Nix/Name.hsnew file+13
@@ -0,0 +1,13 @@
1+module Cabal2Nix.Name where
2+
3+import Data.Char
4+
5+toNixName :: String -> String
6+toNixName [] = error "toNixName: empty string is not a valid argument"
7+toNixName "Cabal" = "cabal"
8+toNixName name = f name
9+ where
10+ f [] = []
11+ f ('-':c:cs) | c `notElem` "-" = toUpper c : f cs
12+ f ('-':_) = error ("unexpected package name " ++ show name)
13+ f (c:cs) = c : f cs
src/Cabal2Nix/Package.hsnew file+53
@@ -0,0 +1,53 @@
1+module Cabal2Nix.Package where
2+
3+import Data.List
4+
5+import Distribution.Package
6+import Distribution.PackageDescription
7+
8+import Cabal2Nix.License
9+import Cabal2Nix.Name
10+
11+type PkgName = String
12+type PkgVersion = [Int]
13+type PkgSHA256 = String
14+type PkgURL = String
15+type PkgDescription = String
16+type PkgLicense = License
17+type PkgDependencies = [CondTree ConfVar [Dependency] ()]
18+type PkgExtraLibs = [String]
19+
20+data Pkg = Pkg PkgName
21+ PkgVersion
22+ PkgSHA256
23+ PkgURL
24+ PkgDescription
25+ PkgLicense
26+ PkgDependencies
27+ PkgExtraLibs
28+ deriving (Show)
29+
30+toNix :: Pkg -> String
31+toNix (Pkg name ver sha256 url desc lic deps libs) =
32+ "{" ++ exprArgs ++"}:\n\n"
33+ ++ "cabal.mkDerivation (self : {\n"
34+ ++ " pname = " ++ show name ++ ";\n"
35+ ++ " version = \"" ++ showVer ++ "\";\n"
36+ ++ " sha256 = " ++ show sha256 ++ ";\n"
37+ ++ " propagatedBuildInputs = [" ++ depList ++ "];\n"
38+ ++ " meta = {\n"
39+ ++ " homepage = \"" ++ url ++ "\";\n"
40+ ++ " description = " ++ show desc ++ ";\n"
41+ ++ " license = " ++ showLic lic ++ ";\n"
42+ ++ " };\n"
43+ ++ "})\n"
44+ where
45+ exprArgs = concat (intersperse "," ("cabal":pkgDeps))
46+ showVer = concat (intersperse "." (map show ver))
47+ depList = concat (intersperse " " pkgDeps)
48+ pkgDeps :: [String]
49+ pkgDeps = filter (/="cabal") $ nub $ sort $ map toNixName $
50+ libs ++ [ n | dep <- deps, Dependency (PackageName n) _ <- condTreeConstraints dep
51+ , n `notElem` ["base","containers"]
52+ ]
53+