git.iko.soy/typeable/cabal2nix
on master help sign in
Remove the name mangling logic that maps Haskell package names to Nix
5f97ba5Peter Simons
src/Cabal2Nix/Name.hs+11−7
@@ -1,11 +1,15 @@
1−module Cabal2Nix.Name ( toNixName, libNixName, buildToolNixName ) where
1+module Cabal2Nix.Name ( toNixName, toNixName', libNixName, buildToolNixName ) where
2
2
3import Data.Char
3import Data.Char
4
4
5-- | Map Cabal names to Nix attribute names.
5-- | Map Cabal names to Nix attribute names.
6toNixName :: String -> String
6toNixName :: String -> String
7+toNixName = id
8+
9+-- | The old mapping function. This may be useful to generate a compatibility layer.
10+toNixName' :: String -> String
7−toNixName [] = error "toNixName: empty string is not a valid argument"
11+toNixName' [] = error "toNixName: empty string is not a valid argument"
8−toNixName name = f name
12+toNixName' name = f name
9 where
13 where
10 f [] = []
14 f [] = []
11 f ('-':c:cs) | c `notElem` "-" = toUpper c : f cs
15 f ('-':c:cs) | c `notElem` "-" = toUpper c : f cs
@@ -124,8 +128,8 @@ libNixName x = return x
124
128
125-- | Map build tool names to Nix attribute names.
129-- | Map build tool names to Nix attribute names.
126buildToolNixName :: String -> [String]
130buildToolNixName :: String -> [String]
127−buildToolNixName "cabal" = return "cabalInstall"
131+buildToolNixName "cabal" = return "cabal-install"
128−buildToolNixName "gtk2hsC2hs" = return "gtk2hsBuildtools"
132+buildToolNixName "gtk2hsC2hs" = return "gtk2hs-buildtools"
129−buildToolNixName "gtk2hsHookGenerator" = return "gtk2hsBuildtools"
133+buildToolNixName "gtk2hsHookGenerator" = return "gtk2hs-buildtools"
130−buildToolNixName "gtk2hsTypeGen" = return "gtk2hsBuildtools"
134+buildToolNixName "gtk2hsTypeGen" = return "gtk2hs-buildtools"
131buildToolNixName x = return (toNixName x)
135buildToolNixName x = return (toNixName x)
src/Distribution/NixOS/Derivation/Cabal.hs+6−6
@@ -87,8 +87,8 @@ deepseqFlagAssignment ((FlagName n, v):as) b = n `deepseq` v `deepseq` as `deeps
87
87
88renderDerivation :: Derivation -> Doc
88renderDerivation :: Derivation -> Doc
89renderDerivation deriv =
89renderDerivation deriv =
90− funargs (map text ("buildCabal":inputs)) $$ vcat
90+ funargs (map text ("mkDerivation":inputs)) $$ vcat
91− [ text "buildCabal" <+> lbrace
91+ [ text "mkDerivation" <+> lbrace
92 , nest 2 $ vcat
92 , nest 2 $ vcat
93 [ attr "pname" $ string (pname deriv)
93 [ attr "pname" $ string (pname deriv)
94 , attr "version" $ doubleQuotes (disp (version deriv))
94 , attr "version" $ doubleQuotes (disp (version deriv))
@@ -100,20 +100,20 @@ renderDerivation deriv =
100 , listattr "buildTools" empty (buildTools deriv)
100 , listattr "buildTools" empty (buildTools deriv)
101 , listattr "extraLibraries" empty (extraLibs deriv)
101 , listattr "extraLibraries" empty (extraLibs deriv)
102 , listattr "pkgconfigDepends" empty (pkgConfDeps deriv)
102 , listattr "pkgconfigDepends" empty (pkgConfDeps deriv)
103− , onlyIf renderedFlags $ attr "configureFlags" $ doubleQuotes (sep renderedFlags)
103+ , onlyIf (not (null renderedFlags)) $ attr "configureFlags" $ doubleQuotes (sep renderedFlags)
104 , boolattr "enableSplitObjs" (not (enableSplitObjs deriv)) (enableSplitObjs deriv)
104 , boolattr "enableSplitObjs" (not (enableSplitObjs deriv)) (enableSplitObjs deriv)
105 , boolattr "noHaddock" (not (runHaddock deriv)) (not (runHaddock deriv))
105 , boolattr "noHaddock" (not (runHaddock deriv)) (not (runHaddock deriv))
106 , boolattr "jailbreak" (jailbreak deriv) (jailbreak deriv)
106 , boolattr "jailbreak" (jailbreak deriv) (jailbreak deriv)
107 , boolattr "doCheck" (not (doCheck deriv)) (doCheck deriv)
107 , boolattr "doCheck" (not (doCheck deriv)) (doCheck deriv)
108− , onlyIf (testTarget deriv) $ attr "testTarget" $ string (testTarget deriv)
108+ , onlyIf (not (null (testTarget deriv))) $ attr "testTarget" $ string (testTarget deriv)
109 , boolattr "hyperlinkSource" (not (hyperlinkSource deriv)) (hyperlinkSource deriv)
109 , boolattr "hyperlinkSource" (not (hyperlinkSource deriv)) (hyperlinkSource deriv)
110− , onlyIf (phaseOverrides deriv) $ vcat ((map text . lines) (phaseOverrides deriv))
110+ , onlyIf (not (null (phaseOverrides deriv))) $ vcat ((map text . lines) (phaseOverrides deriv))
111 , disp (metaSection deriv)
111 , disp (metaSection deriv)
112 ]
112 ]
113 , rbrace
113 , rbrace
114 ]
114 ]
115 where
115 where
116− inputs = nub $ sortBy (compare `on` map toLower) $ filter (/="cabal") $ filter (not . isPrefixOf "stdenv.") $
116+ inputs = nub $ sortBy (compare `on` map toLower) $ filter (not . isPrefixOf "stdenv.") $
117 buildDepends deriv ++ testDepends deriv ++ buildTools deriv ++ extraLibs deriv ++ pkgConfDeps deriv ++ extraFunctionArgs deriv
117 buildDepends deriv ++ testDepends deriv ++ buildTools deriv ++ extraLibs deriv ++ pkgConfDeps deriv ++ extraFunctionArgs deriv
118 ++ ["fetch" ++ derivKind (src deriv) | derivKind (src deriv) /= "" && not isHackagePackage]
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 ]
119 renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text f | (FlagName f, enable) <- cabalFlags deriv ]
src/Distribution/NixOS/Derivation/Meta.hs+8−12
@@ -61,18 +61,14 @@ instance NFData Meta where
61
61
62renderMeta :: Meta -> Doc
62renderMeta :: Meta -> Doc
63renderMeta meta = vcat
63renderMeta meta = vcat
64− [ text "meta" <+> equals <+> lbrace
65− , nest 2 $ vcat
66− [ onlyIf (homepage meta) $ attr "homepage" $ string (homepage meta)
64+ [ onlyIf (not (null (homepage meta))) $ attr "homepage" $ string (homepage meta)
67− , onlyIf (description meta) $ attr "description" $ string (description meta)
65+ , onlyIf (not (null (description meta))) $ attr "description" $ string (description meta)
68− , attr "license" $ disp (license meta)
66+ , attr "license" $ disp (license meta)
69− , onlyIf (platforms meta) $ sep
67+ , onlyIf (not (null (platforms meta)) && platforms meta /= ["ghc.meta.platforms"]) $ sep
70− [ text "platforms" <+> equals, renderPlatformList (platforms meta) ]
68+ [ text "platforms" <+> equals, renderPlatformList (platforms meta) ]
71− , onlyIf (hydraPlatforms meta) $ sep
69+ , onlyIf (not (null (hydraPlatforms meta))) $ sep
72− [ text "hydraPlatforms" <+> equals, renderPlatformList (hydraPlatforms meta) ]
70+ [ text "hydraPlatforms" <+> equals, renderPlatformList (hydraPlatforms meta) ]
73− , listattr "maintainers" (text "with self.stdenv.lib.maintainers;") (maintainers meta)
71+ , listattr "maintainers" (text "with self.stdenv.lib.maintainers;") (maintainers meta)
74− ]
75− , rbrace <> semi
76 ]
72 ]
77
73
78renderPlatformList :: [String] -> Doc
74renderPlatformList :: [String] -> Doc
src/Distribution/NixOS/PrettyPrinting.hs+3−3
@@ -25,14 +25,14 @@ import Text.PrettyPrint
25attr :: String -> Doc -> Doc
25attr :: String -> Doc -> Doc
26attr n v = text n <+> equals <+> v <> semi
26attr n v = text n <+> equals <+> v <> semi
27
27
28−onlyIf :: [a] -> Doc -> Doc
28+onlyIf :: Bool -> Doc -> Doc
29−onlyIf p d = if not (null p) then d else empty
29+onlyIf b d = if b then d else empty
30
30
31boolattr :: String -> Bool -> Bool -> Doc
31boolattr :: String -> Bool -> Bool -> Doc
32boolattr n p v = if p then attr n (bool v) else empty
32boolattr n p v = if p then attr n (bool v) else empty
33
33
34listattr :: String -> Doc -> [String] -> Doc
34listattr :: String -> Doc -> [String] -> Doc
35−listattr n prefix vs = onlyIf vs $
35+listattr n prefix vs = onlyIf (not (null vs)) $
36 sep [ text n <+> equals <+> prefix <+> lbrack,
36 sep [ text n <+> equals <+> prefix <+> lbrack,
37 nest 2 $ fsep $ map text vs,
37 nest 2 $ fsep $ map text vs,
38 rbrack <> semi
38 rbrack <> semi
src/hackage2nix.hs+11−6
@@ -22,19 +22,24 @@ main :: IO ()
22main = readHackage >>= runParIO . generatePackageSet
22main = readHackage >>= runParIO . generatePackageSet
23
23
24nixAttr :: String -> Version -> String
24nixAttr :: String -> Version -> String
25−nixAttr name _ = show $ toNixName name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
25+nixAttr name ver = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
26
26
27generatePackageSet :: Hackage -> ParIO ()
27generatePackageSet :: Hackage -> ParIO ()
28−generatePackageSet db' = do
28+generatePackageSet db = do
29− let db = foldr Map.delete db' ["smtLib", "testPkg"]
30 pkgs <- parMapM generatePackage (Map.toList db)
29 pkgs <- parMapM generatePackage (Map.toList db)
31 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
30 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
32 liftIO $ putStrLn ""
31 liftIO $ putStrLn ""
33− liftIO $ putStrLn "{ stdenv, ghc, pkgs, definePackage }:"
32+ liftIO $ putStrLn "{ pkgs, stdenv, callPackage }:"
33+ liftIO $ putStrLn ""
34+ liftIO $ putStrLn "self: {"
34 liftIO $ putStrLn ""
35 liftIO $ putStrLn ""
35− liftIO $ putStrLn "{"
36 forM_ pkgs $ \(name, version, nixExpr) -> do
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
37− liftIO $ print $ nest 2 $ hang (text (nixAttr name version) <+> equals <+> text "definePackage {}") 2 (parens (disp nixExpr)) <> semi
42+ liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp nixExpr)) <+> (text "{}" <> semi)
38 liftIO $ putStrLn ""
43 liftIO $ putStrLn ""
39 liftIO $ putStrLn "}"
44 liftIO $ putStrLn "}"
40
45