1
1
{-# LANGUAGE LambdaCase #-}
2
2
{-# LANGUAGE OverloadedStrings #-}
3
3
{-# LANGUAGE FlexibleInstances #-}
4
+ {-# LANGUAGE ScopedTypeVariables #-}
4
5
5
6
module Cabal2Nix (cabal2nix , gpd2nix , Src (.. ), CabalFile (.. ), CabalFileGenerator (.. ), cabalFilePath , cabalFilePkgName , CabalDetailLevel (.. )) where
6
7
@@ -12,6 +13,7 @@ import Data.Char (toUpper)
12
13
import System.FilePath
13
14
import Data.ByteString (ByteString )
14
15
import Data.Maybe (catMaybes , maybeToList )
16
+ import Data.Foldable (toList )
15
17
16
18
import Distribution.Types.CondTree
17
19
import Distribution.Types.Library
@@ -22,7 +24,9 @@ import Distribution.Types.ExeDependency
22
24
import Distribution.Types.LegacyExeDependency
23
25
import Distribution.Types.PkgconfigDependency
24
26
import Distribution.Types.PkgconfigName
27
+ import Distribution.Types.Version
25
28
import Distribution.Types.VersionRange
29
+ import Distribution.CabalSpecVersion
26
30
import Distribution.Compiler
27
31
import Distribution.Types.PackageName (PackageName , mkPackageName , unPackageName )
28
32
import Distribution.Simple.BuildToolDepends (desugarBuildTool )
@@ -181,7 +185,7 @@ instance ToNixExpr PackageIdentifier where
181
185
182
186
toNixPackageDescription :: Bool -> CabalDetailLevel -> PackageDescription -> NExpr
183
187
toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
184
- [ " specVersion" $= mkStr (fromString (show (pretty ( specVersion pd) )))
188
+ [ " specVersion" $= mkStr (fromString (showCabalSpecVersion ( specVersion pd)))
185
189
, " identifier" $= toNix (package pd)
186
190
, " license" $= mkStr (fromString (show (pretty (license pd))))
187
191
@@ -199,7 +203,7 @@ toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
199
203
] ++
200
204
[ " isLocal" $= mkBool True | isLocal
201
205
] ++
202
- [ " setup-depends" $= toNix ( SetupDependency . depPkgName <$> deps) | Just deps <- [setupDepends <$> setupBuildInfo pd ]] ++
206
+ [ " setup-depends" $= toNix deps | Just deps <- [( >>= toSetupDepends) . setupDepends <$> setupBuildInfo pd ]] ++
203
207
if detailLevel == MinimalDetails
204
208
then []
205
209
else
@@ -211,6 +215,8 @@ toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
211
215
, " extraTmpFiles" $= toNix (extraTmpFiles pd)
212
216
, " extraDocFiles" $= toNix (extraDocFiles pd)
213
217
]
218
+ where
219
+ toSetupDepends (Dependency pkg _ libs) = SetupDependency pkg <$> toList libs
214
220
215
221
srcToNix :: PackageIdentifier -> Src -> NExpr
216
222
srcToNix _ (Path p) = mkRecSet [ " src" $= applyMkDefault (mkRelPath p) ]
@@ -242,7 +248,8 @@ mkPrivateHackageUrl hackageUrl pi' =
242
248
pkgNameVersion = unPackageName (pkgName pi') <> " -" <> show (pretty (pkgVersion pi'))
243
249
244
250
newtype SysDependency = SysDependency { unSysDependency :: String } deriving (Show , Eq , Ord )
245
- newtype SetupDependency = SetupDependency { unSetupDependency :: PackageName } deriving (Show , Eq , Ord )
251
+ data SetupDependency = SetupDependency PackageName LibraryName deriving (Show , Eq , Ord )
252
+ data HaskellLibDependency = HaskellLibDependency PackageName LibraryName deriving (Show , Eq , Ord )
246
253
data BuildToolDependency = BuildToolDependency PackageName UnqualComponentName deriving (Show , Eq , Ord )
247
254
248
255
mkSysDep :: String -> SysDependency
@@ -259,7 +266,7 @@ toNixGenericPackageDescription isLocal detailLevel gpd = mkNonRecSet
259
266
component unQualName comp
260
267
= quoted name $=
261
268
mkNonRecSet (
262
- [ " depends" $= toNix deps | Just deps <- [shakeTree . fmap ( targetBuildDepends . getBuildInfo) $ comp ] ] ++
269
+ [ " depends" $= toNix deps | Just deps <- [shakeTree . fmap ( ( >>= depends) . targetBuildDepends . getBuildInfo) $ comp ] ] ++
263
270
[ " libs" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . extraLibs . getBuildInfo) $ comp ] ] ++
264
271
[ " frameworks" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . frameworks . getBuildInfo) $ comp ] ] ++
265
272
[ " pkgconfig" $= toNix deps | Just deps <- [shakeTree . fmap ( pkgconfigDepends . getBuildInfo) $ comp ] ] ++
@@ -279,6 +286,7 @@ toNixGenericPackageDescription isLocal detailLevel gpd = mkNonRecSet
279
286
[ " includes" $= toNix dir | Just dir <- [shakeTree . fmap (includes . getBuildInfo) $ comp] ] ++
280
287
[ " mainPath" $= toNix p | Just p <- [shakeTree . fmap (maybeToList . getMainPath) $ comp] ])
281
288
where name = fromString $ unUnqualComponentName unQualName
289
+ depends (Dependency pkg _ libs) = HaskellLibDependency pkg <$> toList libs
282
290
toolDeps = getToolDependencies (packageDescription gpd)
283
291
toBuildToolDep (ExeDependency pkg c _) = BuildToolDependency pkg c
284
292
getToolDependencies pkg bi =
@@ -300,6 +308,22 @@ instance ToNixExpr Dependency where
300
308
where
301
309
pkg = fromString . show . pretty . depPkgName $ d
302
310
311
+ instance ToNixExpr HaskellLibDependency where
312
+ toNix (HaskellLibDependency p LMainLibName ) = selectOr (mkSym hsPkgs) (
313
+ mkSelector (quoted pkg))
314
+ (mkSym errorHandler @. buildDepError @@ mkStr pkg)
315
+ where
316
+ pkg = fromString . show $ pretty p
317
+ toNix (HaskellLibDependency p (LSubLibName l)) = selectOr (mkSym hsPkgs) (
318
+ mkSelector (quoted pkg)
319
+ <> mkSelector " components"
320
+ <> mkSelector " sublibs"
321
+ <> mkSelector lName)
322
+ (mkSym errorHandler @. buildDepError @@ mkStr (pkg <> " :" <> lName))
323
+ where
324
+ pkg = fromString . show $ pretty p
325
+ lName = fromString $ unUnqualComponentName l
326
+
303
327
instance ToNixExpr SysDependency where
304
328
toNix d = selectOr (mkSym pkgs) (mkSelector $ quoted pkg) (mkSym errorHandler @. sysDepError @@ mkStr pkg)
305
329
where
@@ -316,7 +340,7 @@ instance ToNixExpr ExeDependency where
316
340
pkg = fromString . show . pretty $ pkgName'
317
341
318
342
instance ToNixExpr SetupDependency where
319
- toNix (SetupDependency pkgName') =
343
+ toNix (SetupDependency pkgName' LMainLibName ) =
320
344
-- TODO once https://github.com/haskell-nix/hnix/issues/52
321
345
-- is reolved use something like:
322
346
-- [nix| hsPkgs.buildPackages.$((pkgName)) or pkgs.buildPackages.$((pkgName)) ]
@@ -325,6 +349,16 @@ instance ToNixExpr SetupDependency where
325
349
where
326
350
pkg = fromString . show . pretty $ pkgName'
327
351
buildPackagesDotName = mkSelector " buildPackages" <> mkSelector pkg
352
+ toNix (SetupDependency pkgName' (LSubLibName l)) = selectOr (mkSym hsPkgs) (
353
+ mkSelector " buildPackages"
354
+ <> mkSelector (quoted pkg)
355
+ <> mkSelector " components"
356
+ <> mkSelector " sublibs"
357
+ <> mkSelector lName)
358
+ (mkSym errorHandler @. setupDepError @@ mkStr (pkg <> " :" <> lName))
359
+ where
360
+ pkg = fromString . show $ pretty pkgName'
361
+ lName = fromString $ unUnqualComponentName l
328
362
329
363
instance ToNixExpr BuildToolDependency where
330
364
toNix (BuildToolDependency pkgName' componentName') =
@@ -354,21 +388,20 @@ instance {-# OVERLAPS #-} ToNixExpr a => ToNixExpr [a] where
354
388
instance ToNixExpr ConfVar where
355
389
toNix (OS os) = mkSym " system" @. (fromString . (" is" ++ ) . capitalize . show . pretty $ os)
356
390
toNix (Arch arch) = mkSym " system" @. (fromString . (" is" ++ ) . capitalize . show . pretty $ arch)
357
- toNix (Flag flag) = mkSym flags @. (fromString . show . pretty $ flag)
391
+ toNix (PackageFlag flag) = mkSym flags @. (fromString . show . pretty $ flag)
358
392
toNix (Impl flavour range) = toNix flavour $&& toNix (projectVersionRange range)
359
393
360
394
instance ToNixExpr CompilerFlavor where
361
395
toNix flavour = mkSym " compiler" @. (fromString . (" is" ++ ) . capitalize . show . pretty $ flavour)
362
396
363
397
instance ToNixExpr (VersionRangeF VersionRange ) where
364
- toNix AnyVersionF = mkBool True
398
+ toNix ( OrLaterVersionF ver) | ver == version0 = mkBool True
365
399
toNix (ThisVersionF ver) = mkSym " compiler" @. " version" @. " eq" @@ mkStr (fromString (show (pretty ver)))
366
400
toNix (LaterVersionF ver) = mkSym " compiler" @. " version" @. " gt" @@ mkStr (fromString (show (pretty ver)))
367
401
toNix (OrLaterVersionF ver) = mkSym " compiler" @. " version" @. " ge" @@ mkStr (fromString (show (pretty ver)))
368
402
toNix (EarlierVersionF ver) = mkSym " compiler" @. " version" @. " lt" @@ mkStr (fromString (show (pretty ver)))
369
403
toNix (OrEarlierVersionF ver) = mkSym " compiler" @. " version" @. " le" @@ mkStr (fromString (show (pretty ver)))
370
- toNix (WildcardVersionF _ver) = mkBool False
371
- -- toNix (MajorBoundVersionF ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (pretty ver)))
404
+ toNix (MajorBoundVersionF ver) = toNix (IntersectVersionRangesF (orLaterVersion ver) (earlierVersion (majorUpperBound ver)))
372
405
toNix (IntersectVersionRangesF v1 v2) = toNix (projectVersionRange v1) $&& toNix (projectVersionRange v2)
373
406
toNix x = error $ " ToNixExpr VersionRange for `" ++ show x ++ " ` not implemented!"
374
407
@@ -404,5 +437,5 @@ boolTreeToNix (CondNode True _c bs) =
404
437
[] -> mkBool True
405
438
bs' -> foldl1 ($&&) bs'
406
439
407
- instance ToNixBinding Flag where
408
- toNixBinding (MkFlag name _desc def _manual) = (fromString . show . pretty $ name) $= mkBool def
440
+ instance ToNixBinding PackageFlag where
441
+ toNixBinding (MkPackageFlag name _desc def _manual) = (fromString . show . pretty $ name) $= mkBool def
0 commit comments