Skip to content

Commit c7ffb3a

Browse files
committed
Add setup-depends to Cabal2Nix output
1 parent 914a77e commit c7ffb3a

File tree

1 file changed

+58
-41
lines changed

1 file changed

+58
-41
lines changed

lib/Cabal2Nix.hs

Lines changed: 58 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Distribution.Pretty (pretty)
1111
import Data.Char (toUpper)
1212
import System.FilePath
1313
import Data.ByteString (ByteString)
14+
import Data.Maybe (catMaybes)
1415

1516
import Distribution.Types.CondTree
1617
import Distribution.Types.Library
@@ -23,16 +24,17 @@ import Distribution.Types.PkgconfigDependency
2324
import Distribution.Types.PkgconfigName
2425
import Distribution.Types.VersionRange
2526
import Distribution.Compiler
26-
import Distribution.Types.PackageName (PackageName)
27-
import Distribution.Simple.BuildToolDepends (getAllToolDependencies)
27+
import Distribution.Types.PackageName (PackageName, mkPackageName)
28+
import Distribution.Simple.BuildToolDepends (desugarBuildTool)
2829

29-
import Data.String (fromString)
30+
import Data.String (fromString, IsString)
3031

3132
-- import Distribution.Types.GenericPackageDescription
3233
-- import Distribution.Types.PackageDescription
3334
import Distribution.Types.PackageId
3435
--import Distribution.Types.Condition
3536
import Distribution.Types.UnqualComponentName
37+
import Data.List.NonEmpty (NonEmpty(..))
3638
import Nix.Expr
3739
import Data.Fix(Fix(..))
3840
import Data.Text (Text)
@@ -44,7 +46,7 @@ data Src
4446
| Git String String (Maybe String) (Maybe String)
4547
deriving Show
4648

47-
pkgs, hsPkgs, flags :: Text
49+
pkgs, hsPkgs, pkgconfPkgs, flags :: Text
4850
pkgs = "pkgs"
4951
hsPkgs = "hsPkgs"
5052
pkgconfPkgs = "pkgconfPkgs"
@@ -76,11 +78,11 @@ genExtra Hpack = mkNonRecSet [ "cabal-generator" $= mkStr "hpack" ]
7678

7779
cabal2nix :: Maybe Src -> CabalFile -> IO NExpr
7880
cabal2nix src = \case
79-
(OnDisk path) -> fmap (gpd2nix src Nothing)
80-
$ readGenericPackageDescription normal path
81-
(InMemory gen _ body) -> fmap (gpd2nix src (genExtra <$> gen))
82-
$ case (runParseResult (parseGenericPackageDescription body)) of
83-
(_, Left (_, err)) -> (error ("Failed to parse in-memory cabal file: " ++ show err))
81+
(OnDisk path) -> gpd2nix src Nothing
82+
<$> readGenericPackageDescription normal path
83+
(InMemory gen _ body) -> gpd2nix src (genExtra <$> gen)
84+
<$> case runParseResult (parseGenericPackageDescription body) of
85+
(_, Left (_, err)) -> error ("Failed to parse in-memory cabal file: " ++ show err)
8486
(_, Right desc) -> pure desc
8587

8688
gpd2nix :: Maybe Src -> Maybe NExpr -> GenericPackageDescription -> NExpr
@@ -118,7 +120,7 @@ shakeTree :: (Foldable t, Foldable f) => CondTree v (t c) (f a) -> Maybe (CondTr
118120
shakeTree (CondNode d c bs) = case (null d, null bs') of
119121
(True, True) -> Nothing
120122
_ -> Just (CondNode d c bs')
121-
where bs' = [b | Just b <- shakeBranch <$> bs ]
123+
where bs' = catMaybes (shakeBranch <$> bs)
122124

123125
shakeBranch :: (Foldable t, Foldable f) => CondBranch v (t c) (f a) -> Maybe (CondBranch v (t c) (f a))
124126
shakeBranch (CondBranch c t f) = case (shakeTree t, f >>= shakeTree) of
@@ -129,7 +131,7 @@ shakeBranch (CondBranch c t f) = case (shakeTree t, f >>= shakeTree) of
129131
--- String helper
130132
transformFst :: (Char -> Char) -> String -> String
131133
transformFst _ [] = []
132-
transformFst f (x:xs) = (f x):xs
134+
transformFst f (x:xs) = f x : xs
133135
capitalize :: String -> String
134136
capitalize = transformFst toUpper
135137

@@ -165,21 +167,23 @@ instance ToNixExpr PackageIdentifier where
165167
, "version" $= mkStr (fromString (show (disp (pkgVersion ident))))]
166168

167169
instance ToNixExpr PackageDescription where
168-
toNix pd = mkNonRecSet [ "specVersion" $= mkStr (fromString (show (disp (specVersion pd))))
169-
, "identifier" $= toNix (package pd)
170-
, "license" $= mkStr (fromString (show (pretty (license pd))))
170+
toNix pd = mkNonRecSet $ [ "specVersion" $= mkStr (fromString (show (disp (specVersion pd))))
171+
, "identifier" $= toNix (package pd)
172+
, "license" $= mkStr (fromString (show (pretty (license pd))))
171173

172-
, "copyright" $= mkStr (fromString (copyright pd))
173-
, "maintainer" $= mkStr (fromString (maintainer pd))
174-
, "author" $= mkStr (fromString (author pd))
174+
, "copyright" $= mkStr (fromString (copyright pd))
175+
, "maintainer" $= mkStr (fromString (maintainer pd))
176+
, "author" $= mkStr (fromString (author pd))
175177

176-
, "homepage" $= mkStr (fromString (homepage pd))
177-
, "url" $= mkStr (fromString (pkgUrl pd))
178+
, "homepage" $= mkStr (fromString (homepage pd))
179+
, "url" $= mkStr (fromString (pkgUrl pd))
178180

179-
, "synopsis" $= mkStr (fromString (synopsis pd))
180-
, "description" $= mkStr (fromString (description pd))
181+
, "synopsis" $= mkStr (fromString (synopsis pd))
182+
, "description" $= mkStr (fromString (description pd))
181183

182-
, "buildType" $= mkStr (fromString (show (pretty (buildType pd)))) ]
184+
, "buildType" $= mkStr (fromString (show (pretty (buildType pd))))
185+
] ++
186+
[ "setup-depends" $= toNix (BuildToolDependency . depPkgName <$> deps) | Just deps <- [setupDepends <$> setupBuildInfo pd ]]
183187

184188
newtype SysDependency = SysDependency { unSysDependency :: String } deriving (Show, Eq, Ord)
185189
newtype BuildToolDependency = BuildToolDependency { unBuildToolDependency :: PackageName } deriving (Show, Eq, Ord)
@@ -188,10 +192,11 @@ mkSysDep :: String -> SysDependency
188192
mkSysDep = SysDependency
189193

190194
instance ToNixExpr GenericPackageDescription where
191-
toNix gpd = mkNonRecSet $ [ "flags" $= (mkNonRecSet . fmap toNixBinding $ genPackageFlags gpd)
192-
, "package" $= (toNix (packageDescription gpd))
193-
, "components" $= components ]
194-
where packageName = fromString . show . disp . pkgName . package . packageDescription $ gpd
195+
toNix gpd = mkNonRecSet [ "flags" $= (mkNonRecSet . fmap toNixBinding $ genPackageFlags gpd)
196+
, "package" $= toNix (packageDescription gpd)
197+
, "components" $= components ]
198+
where _packageName :: IsString a => a
199+
_packageName = fromString . show . disp . pkgName . package . packageDescription $ gpd
195200
component unQualName comp
196201
= quoted name $=
197202
mkNonRecSet ([ "depends" $= toNix deps | Just deps <- [shakeTree . fmap ( targetBuildDepends . getBuildInfo) $ comp ] ] ++
@@ -200,7 +205,12 @@ instance ToNixExpr GenericPackageDescription where
200205
[ "pkgconfig" $= toNix deps | Just deps <- [shakeTree . fmap ( pkgconfigDepends . getBuildInfo) $ comp ] ] ++
201206
[ "build-tools"$= toNix deps | Just deps <- [shakeTree . fmap ( toolDeps . getBuildInfo) $ comp ] ])
202207
where name = fromString $ unUnqualComponentName unQualName
203-
toolDeps bi = [ BuildToolDependency pkg | ExeDependency pkg _ _ <- getAllToolDependencies (packageDescription gpd) bi ]
208+
toolDeps = getToolDependencies (packageDescription gpd)
209+
toBuildToolDep (ExeDependency pkg _ _) = BuildToolDependency pkg
210+
getToolDependencies pkg bi =
211+
map toBuildToolDep (buildToolDepends bi)
212+
<> map (\led -> maybe (guess led) toBuildToolDep $ desugarBuildTool pkg led) (buildTools bi)
213+
guess (LegacyExeDependency n _) = BuildToolDependency (mkPackageName n)
204214
components = mkNonRecSet $
205215
[ component "library" lib | Just lib <- [condLibrary gpd] ] ++
206216
(bindTo "sublibs" . mkNonRecSet <$> filter (not . null) [ uncurry component <$> condSubLibraries gpd ]) ++
@@ -219,10 +229,17 @@ instance ToNixExpr PkgconfigDependency where
219229
toNix (PkgconfigDependency name _versionRange)= (@.) (mkSym pkgconfPkgs) . quoted . fromString . unPkgconfigName $ name
220230

221231
instance ToNixExpr ExeDependency where
222-
toNix (ExeDependency pkgName _unqualCompName _versionRange) = mkSym . fromString . show . pretty $ pkgName
232+
toNix (ExeDependency pkgName' _unqualCompName _versionRange) = mkSym . fromString . show . pretty $ pkgName'
223233

224234
instance ToNixExpr BuildToolDependency where
225-
toNix (BuildToolDependency pkgName) = mkSym hsPkgs @. "buildPackages" @. (fromString . show . pretty $ pkgName)
235+
toNix (BuildToolDependency pkgName') =
236+
-- TODO once https://github.com/haskell-nix/hnix/issues/52
237+
-- is reolved use something like:
238+
-- [nix| hsPkgs.buildPackages.$((pkgName)) or pkgs.buildPackages.$((pkgName)) ]
239+
Fix $ NSelect (mkSym hsPkgs) buildPackagesDotName
240+
(Just . Fix $ NSelect (mkSym pkgs) buildPackagesDotName Nothing)
241+
where
242+
buildPackagesDotName = StaticKey "buildPackages" :| [StaticKey (fromString . show . pretty $ pkgName')]
226243

227244
instance ToNixExpr LegacyExeDependency where
228245
toNix (LegacyExeDependency name _versionRange) = mkSym hsPkgs @. fromString name
@@ -237,22 +254,22 @@ instance ToNixExpr ConfVar where
237254
toNix (OS os) = mkSym "system" @. (fromString . ("is" ++) . capitalize . show . pretty $ os)
238255
toNix (Arch arch) = mkSym "system" @. (fromString . ("is" ++) . capitalize . show . pretty $ arch)
239256
toNix (Flag flag) = mkSym flags @. (fromString . show . pretty $ flag)
240-
toNix (Impl flavour range) = toNix flavour $&& toNix range
257+
toNix (Impl flavour range) = toNix flavour $&& toNix (projectVersionRange range)
241258

242259
instance ToNixExpr CompilerFlavor where
243260
toNix flavour = mkSym "compiler" @. (fromString . ("is" ++) . capitalize . show . pretty $ flavour)
244261

245-
instance ToNixExpr VersionRange where
246-
toNix AnyVersion = mkBool True
247-
toNix (ThisVersion ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (disp ver)))
248-
toNix (LaterVersion ver) = mkSym "compiler" @. "version" @. "gt" @@ mkStr (fromString (show (disp ver)))
249-
toNix (OrLaterVersion ver) = mkSym "compiler" @. "version" @. "ge" @@ mkStr (fromString (show (disp ver)))
250-
toNix (EarlierVersion ver) = mkSym "compiler" @. "version" @. "lt" @@ mkStr (fromString (show (disp ver)))
251-
toNix (OrEarlierVersion ver) = mkSym "compiler" @. "version" @. "le" @@ mkStr (fromString (show (disp ver)))
252-
toNix (WildcardVersion ver) = mkBool False
253-
-- toNix (MajorBoundVersion ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (disp ver)))
254-
toNix (IntersectVersionRanges v1 v2) = toNix v1 $&& toNix v2
255-
toNix x = error $ "ToNixExpr VersionRange for `" ++ (show x) ++ "` not implemented!"
262+
instance ToNixExpr (VersionRangeF VersionRange) where
263+
toNix AnyVersionF = mkBool True
264+
toNix (ThisVersionF ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (disp ver)))
265+
toNix (LaterVersionF ver) = mkSym "compiler" @. "version" @. "gt" @@ mkStr (fromString (show (disp ver)))
266+
toNix (OrLaterVersionF ver) = mkSym "compiler" @. "version" @. "ge" @@ mkStr (fromString (show (disp ver)))
267+
toNix (EarlierVersionF ver) = mkSym "compiler" @. "version" @. "lt" @@ mkStr (fromString (show (disp ver)))
268+
toNix (OrEarlierVersionF ver) = mkSym "compiler" @. "version" @. "le" @@ mkStr (fromString (show (disp ver)))
269+
toNix (WildcardVersionF _ver) = mkBool False
270+
-- toNix (MajorBoundVersionF ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (disp ver)))
271+
toNix (IntersectVersionRangesF v1 v2) = toNix (projectVersionRange v1) $&& toNix (projectVersionRange v2)
272+
toNix x = error $ "ToNixExpr VersionRange for `" ++ show x ++ "` not implemented!"
256273

257274
instance ToNixExpr a => ToNixExpr (Condition a) where
258275
toNix (Var a) = toNix a

0 commit comments

Comments
 (0)