@@ -1,3 +1,4 @@
1+{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE RecordWildCards #-}
2{-# LANGUAGE RecordWildCards #-}
3module Main ( main ) where
4module Main ( main ) where
@@ -8,7 +9,6 @@ import Cabal2Nix.HackageGit ( readHackage, Hackage )
8import Cabal2Nix.Package
9import Cabal2Nix.Package
9import Cabal2Nix.Version
10import Cabal2Nix.Version
10import Control.Arrow ( second )
11import Control.Arrow ( second )
12import Control.Monad
12import Control.Monad
13import Control.Monad.Par.Combinator
13import Control.Monad.Par.Combinator
14import Control.Monad.Par.IO
14import Control.Monad.Par.IO
@@ -33,7 +33,9 @@ import Distribution.PackageDescription.Configuration
33import Distribution.System
33import Distribution.System
34import Distribution.Text
34import Distribution.Text
35import Distribution.Version
35import Distribution.Version
36import Language.Nix.Identifier
37import Language.Nix.Identifier
38+import Language.Nix.Path
37import Options.Applicative
39import Options.Applicative
38import System.FilePath
40import System.FilePath
@@ -115,7 +117,7 @@ main = do
115 Options {..} <- execParser pinfo
117 Options {..} <- execParser pinfo
117 hackage <- readHackage hackageRepository
119 hackage <- readHackage hackageRepository
118− nixpkgs <- readNixpkgPackageMap nixpkgsRepository
120+ nixpkgs <- readNixpkgPackageMap nixpkgsRepository (Just (create path ["pkgs"]))
119 preferredVersions <- readPreferredVersions (hackageRepository </> "preferred-versions")
121 preferredVersions <- readPreferredVersions (hackageRepository </> "preferred-versions")
120 let fixup = Map.delete "acme-everything" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
122 let fixup = Map.delete "acme-everything" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
121 . Map.delete "som" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
123 . Map.delete "som" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
@@ -161,8 +163,8 @@ generatePackageSet config hackage nixpkgs = do
161 , extraPackageSet
163 , extraPackageSet
164− knownAttributesSet :: Set String
166+ knownIdentifierSet :: Set Identifier
165− knownAttributesSet = Set.union (Map.keysSet hackage) (Map.keysSet corePackageSet)
167+ knownIdentifierSet = Set.map (create ident) (Set.union (Map.keysSet hackage) (Map.keysSet corePackageSet))
167 resolver :: Dependency -> Bool
169 resolver :: Dependency -> Bool
168 resolver (Dependency (PackageName name) vrange)
170 resolver (Dependency (PackageName name) vrange)
@@ -182,33 +184,34 @@ generatePackageSet config hackage nixpkgs = do
182 descr = hackage Map.! name Map.! pkgversion
184 descr = hackage Map.! name Map.! pkgversion
183 (missingDeps, _, drv') = cabal2nix resolver descr
185 (missingDeps, _, drv') = cabal2nix resolver descr
185− haskellDependencies :: Set String
187+ haskellDependencies :: Set Identifier
186− haskellDependencies = Set.map (view ident) $ mconcat [ drv'^.x.haskell | x <- [libraryDepends,executableDepends,testDepends] ]
188+ haskellDependencies = Set.unions [ drv'^.x.haskell | x <- [libraryDepends,executableDepends,testDepends] ]
188− systemDependencies :: Set String
190+ systemDependencies :: Set Identifier
189− systemDependencies = Set.map (view ident) $ mconcat [ drv'^.x.y | x <- [libraryDepends,executableDepends,testDepends], y <- [system,pkgconfig] ]
191+ systemDependencies = Set.unions [ drv'^.x.y | x <- [libraryDepends,executableDepends,testDepends], y <- [system,pkgconfig] ]
191− haskellOrSystemDependencies :: Set String
193+ haskellOrSystemDependencies :: Set Identifier
192− haskellOrSystemDependencies = Set.map (view ident) $ mconcat [ drv'^.x.tool | x <- [libraryDepends,executableDepends,testDepends] ]
194+ haskellOrSystemDependencies = Set.unions [ drv'^.x.tool | x <- [libraryDepends,executableDepends,testDepends] ]
194− missing :: Set String
196+ missing :: Set Identifier
195− missing = Set.filter (`Set.notMember` knownAttributesSet) haskellDependencies
197+ missing = Set.filter (`Set.notMember` knownIdentifierSet) haskellDependencies
197− buildInputs :: Map Attribute (Maybe Path)
199+ buildInputs :: Map Identifier (Maybe Path)
198 buildInputs = Map.unions
200 buildInputs = Map.unions
199 [ Map.fromList [ (n, Nothing) | n <- Set.toList missing ]
201 [ Map.fromList [ (n, Nothing) | n <- Set.toList missing ]
200− , Map.fromList [ (n, resolveNixpkgsAttribute nixpkgs n) | n <- Set.toAscList systemDependencies ]
202+ , Map.fromList [ (n, resolveNixpkgsIdentifier nixpkgs n) | n <- Set.toAscList systemDependencies ]
201− , Map.fromList [ (n, resolveHackageThenNixpkgsAttribute nixpkgs hackage n) | n <- Set.toAscList haskellOrSystemDependencies ]
203+ , Map.fromList [ (n, resolveHackageThenNixpkgsIdentifier nixpkgs hackage n) | n <- Set.toAscList haskellOrSystemDependencies ]
204 systemOverrides :: Doc
206 systemOverrides :: Doc
205 systemOverrides = fsep (map (uncurry formatOverride) (Map.toAscList buildInputs))
207 systemOverrides = fsep (map (uncurry formatOverride) (Map.toAscList buildInputs))
207− formatOverride :: Attribute -> Maybe Path -> Doc
209+ formatOverride :: Identifier -> Maybe Path -> Doc
208− formatOverride n Nothing = space <> text n <> text " = null;" -- missing attribute
210+ formatOverride n Nothing = space <> pPrint n <> text " = null;" -- missing dependency
209− formatOverride n (Just []) = (text " inherit" <+> text n) <> semi
211+ formatOverride n (Just p) = case view path p of
212+ [] -> error ("internal error: " ++ show n ++ "resolved to empty path!")
210− formatOverride _ (Just ["self"]) = mempty -- callPackage finds this package already
213+ ["self"] -> mempty -- callPackage finds this package automatically
211− formatOverride n (Just p) = (text " inherit" <+> parens (text (intercalate "." p)) <+> text n) <> semi
214+ _ -> (text " inherit" <+> parens (pPrint p) <+> pPrint n) <> semi
213 overrides :: Doc
216 overrides :: Doc
214 overrides = systemOverrides
217 overrides = systemOverrides
@@ -235,24 +238,24 @@ generatePackageSet config hackage nixpkgs = do
235 liftIO $ mapM_ (\pkg -> putStrLn pkg >> putStrLn "") pkgs
238 liftIO $ mapM_ (\pkg -> putStrLn pkg >> putStrLn "") pkgs
236 liftIO $ putStrLn "}"
239 liftIO $ putStrLn "}"
238−resolveHackageThenNixpkgsAttribute :: Nixpkgs -> Hackage -> Attribute -> Maybe Path
241+resolveHackageThenNixpkgsIdentifier :: Nixpkgs -> Hackage -> Identifier -> Maybe Path
239−resolveHackageThenNixpkgsAttribute nixpkgs hackage name
242+resolveHackageThenNixpkgsIdentifier nixpkgs hackage name
240− | Just _ <- Map.lookup name hackage = Just ["self"]
243+ | Just _ <- Map.lookup (view ident name) hackage = Just (create path ["self"])
241− | p@(Just _) <- resolveNixpkgsAttribute nixpkgs name = p
244+ | p@(Just _) <- resolveNixpkgsIdentifier nixpkgs name = p
242 | otherwise = Nothing
245 | otherwise = Nothing
244−resolveNixpkgsAttribute :: Nixpkgs -> Attribute -> Maybe Path
247+resolveNixpkgsIdentifier :: Nixpkgs -> Identifier -> Maybe Path
245−resolveNixpkgsAttribute nixpkgs name
248+resolveNixpkgsIdentifier nixpkgs name
246− | name `elem` ["clang","lldb","llvm"] = Just ["self","llvmPackages"]
249+ | name `elem` ["clang","lldb","llvm"] = Just (create path ["self","llvmPackages"])
247 | Just paths <- Map.lookup name nixpkgs = getShortestPath (Set.toList (paths `Set.intersection` goodScopes))
250 | Just paths <- Map.lookup name nixpkgs = getShortestPath (Set.toList (paths `Set.intersection` goodScopes))
248 | otherwise = Nothing
251 | otherwise = Nothing
250− goodScopes :: Set Path
251− goodScopes = Set.fromList [[], ["xlibs"], ["gnome"], ["gnome3"], ["kde4"]]
253+goodScopes :: Set Path
254+goodScopes = Set.fromList ((map (create path . ("pkgs":))) [[], ["xlibs"], ["gnome"], ["gnome3"], ["kde4"]])
253− getShortestPath :: [Path] -> Maybe Path
256+getShortestPath :: [Path] -> Maybe Path
254− getShortestPath [] = Nothing
257+getShortestPath [] = Nothing
255− getShortestPath ps = Just ("pkgs" : minimumBy (on compare length) ps)
258+getShortestPath ps = Just (minimumBy (on compare (view (path . to length))) ps)
257cabal2nix :: (Dependency -> Bool) -> GenericPackageDescription -> ([Dependency], FlagAssignment, Derivation)
260cabal2nix :: (Dependency -> Bool) -> GenericPackageDescription -> ([Dependency], FlagAssignment, Derivation)
258cabal2nix resolver cabal = (missingDeps, flags, drv)
261cabal2nix resolver cabal = (missingDeps, flags, drv)
@@ -284,8 +287,7 @@ cabal2nix resolver cabal = (missingDeps, flags, drv)
284 enableTest t = t { testEnabled = True }
287 enableTest t = t { testEnabled = True }
286readPreferredVersions :: FilePath -> IO [Constraint]
289readPreferredVersions :: FilePath -> IO [Constraint]
287−readPreferredVersions path = mapMaybe parsePreferredVersionsLine . lines <$> readFile path
290+readPreferredVersions p = mapMaybe parsePreferredVersionsLine . lines <$> readFile p
290parsePreferredVersionsLine :: String -> Maybe Constraint
292parsePreferredVersionsLine :: String -> Maybe Constraint
291parsePreferredVersionsLine ('-':'-':_) = Nothing
293parsePreferredVersionsLine ('-':'-':_) = Nothing